From e19b773104cf34f9aff6873b57cd3187d038719c Mon Sep 17 00:00:00 2001 From: Simon Sarris Date: Thu, 19 May 2022 13:59:24 -0400 Subject: [PATCH] 2.2.10 --- api/assets/highlight.css | 113 + api/assets/icons.css | 1043 +++ api/assets/icons.png | Bin 0 -> 12658 bytes api/assets/icons@2x.png | Bin 0 -> 33416 bytes api/assets/main.js | 52 + api/assets/search.js | 2 + api/assets/style-tsd.css | 1486 +++ api/assets/widgets.png | Bin 0 -> 480 bytes api/assets/widgets@2x.png | Bin 0 -> 855 bytes api/index.html | 702 +- api/symbols/ActionTool.html | 402 +- api/symbols/Adornment.html | 440 +- api/symbols/Animation.html | 864 +- api/symbols/AnimationManager.html | 865 +- api/symbols/AnimationTrigger.html | 638 +- api/symbols/ArrangingLayout.html | 725 +- api/symbols/BalloonLink.html | 366 +- api/symbols/Binding.html | 1200 +-- api/symbols/Brush.html | 1180 +-- api/symbols/ChangedEvent.html | 1014 +-- api/symbols/CircularEdge.html | 241 +- api/symbols/CircularLayout.html | 1069 +-- api/symbols/CircularNetwork.html | 249 +- api/symbols/CircularVertex.html | 291 +- api/symbols/ClickCreatingTool.html | 466 +- api/symbols/ClickSelectingTool.html | 338 +- api/symbols/ColumnResizingTool.html | 613 +- api/symbols/CommandHandler.html | 3106 ++----- api/symbols/ContextMenuTool.html | 830 +- api/symbols/CurvedLinkReshapingTool.html | 366 +- api/symbols/Diagram.html | 8472 ++++-------------- api/symbols/DiagramEvent.html | 615 +- api/symbols/DiagramFile.html | 288 +- api/symbols/DimensioningLink.html | 455 +- api/symbols/DoubleTreeLayout.html | 541 +- api/symbols/DragCreatingTool.html | 574 +- api/symbols/DragSelectingTool.html | 628 +- api/symbols/DragZoomingTool.html | 566 +- api/symbols/DraggingInfo.html | 283 +- api/symbols/DraggingOptions.html | 376 +- api/symbols/DraggingTool.html | 1693 +--- api/symbols/DrawCommandHandler.html | 764 +- api/symbols/FishboneLayout.html | 463 +- api/symbols/FishboneLink.html | 343 +- api/symbols/ForceDirectedEdge.html | 291 +- api/symbols/ForceDirectedLayout.html | 1383 +-- api/symbols/ForceDirectedNetwork.html | 249 +- api/symbols/ForceDirectedVertex.html | 354 +- api/symbols/FreehandDrawingTool.html | 525 +- api/symbols/Geometry.html | 1258 +-- api/symbols/GeometryReshapingTool.html | 724 +- api/symbols/GoCloudStorage.html | 1074 +-- api/symbols/GoCloudStorageManager.html | 677 +- api/symbols/GoDropBox.html | 826 +- api/symbols/GoGoogleDrive.html | 847 +- api/symbols/GoLocalStorage.html | 694 +- api/symbols/GoOneDrive.html | 834 +- api/symbols/GraphLinksModel.html | 2539 ++---- api/symbols/GraphObject.html | 5326 +++-------- api/symbols/GridLayout.html | 706 +- api/symbols/Group.html | 1252 +-- api/symbols/GuidedDraggingTool.html | 800 +- api/symbols/HTMLInfo.html | 476 +- api/symbols/IncrementalData.html | 332 +- api/symbols/InputEvent.html | 1074 +-- api/symbols/Inspector.html | 939 +- api/symbols/Iterable.html | 308 +- api/symbols/Iterator.html | 555 +- api/symbols/Layer.html | 1202 +-- api/symbols/LayeredDigraphEdge.html | 444 +- api/symbols/LayeredDigraphLayout.html | 1247 +-- api/symbols/LayeredDigraphNetwork.html | 249 +- api/symbols/LayeredDigraphVertex.html | 320 +- api/symbols/Layout.html | 1307 +-- api/symbols/LayoutEdge.html | 466 +- api/symbols/LayoutNetwork.html | 1033 +-- api/symbols/LayoutVertex.html | 1014 +-- api/symbols/Link.html | 3333 ++----- api/symbols/LinkLabelDraggingTool.html | 515 +- api/symbols/LinkLabelOnPathDraggingTool.html | 509 +- api/symbols/LinkReshapingTool.html | 921 +- api/symbols/LinkShiftingTool.html | 543 +- api/symbols/LinkingBaseTool.html | 1265 +-- api/symbols/LinkingTool.html | 841 +- api/symbols/List.html | 1473 +-- api/symbols/LocalStorageCommandHandler.html | 376 +- api/symbols/Map.html | 1146 +-- api/symbols/Margin.html | 729 +- api/symbols/Model.html | 3171 ++----- api/symbols/Node.html | 2231 ++--- api/symbols/NodeLabelDraggingTool.html | 517 +- api/symbols/NonRealtimeDraggingTool.html | 454 +- api/symbols/ObjectData.html | 204 +- api/symbols/OrthogonalLinkReshapingTool.html | 390 +- api/symbols/Overview.html | 449 +- api/symbols/OverviewResizingTool.html | 296 +- api/symbols/PackedLayout.html | 1001 +-- api/symbols/Palette.html | 310 +- api/symbols/Panel.html | 2992 ++----- api/symbols/PanelLayout.html | 733 +- api/symbols/PanelLayoutFlow.html | 437 +- api/symbols/PanningTool.html | 479 +- api/symbols/ParallelLayout.html | 497 +- api/symbols/ParallelRouteLink.html | 325 +- api/symbols/Part.html | 3665 ++------ api/symbols/PathFigure.html | 471 +- api/symbols/PathSegment.html | 976 +- api/symbols/Picture.html | 783 +- api/symbols/Placeholder.html | 290 +- api/symbols/Point.html | 1642 +--- api/symbols/PolygonDrawingTool.html | 656 +- api/symbols/PolylineLinkingTool.html | 447 +- api/symbols/PortShiftingTool.html | 523 +- api/symbols/Quadtree.html | 1061 +-- api/symbols/RadialLayout.html | 621 +- api/symbols/RealtimeDragSelectingTool.html | 446 +- api/symbols/Rect.html | 2029 +---- api/symbols/RelinkingTool.html | 753 +- api/symbols/RescalingTool.html | 684 +- api/symbols/ResizeMultipleTool.html | 296 +- api/symbols/ResizingTool.html | 1182 +-- api/symbols/Robot.html | 608 +- api/symbols/RotateMultipleTool.html | 386 +- api/symbols/RotatingTool.html | 946 +- api/symbols/RowColumnDefinition.html | 1115 +-- api/symbols/RowResizingTool.html | 613 +- api/symbols/SectorReshapingTool.html | 513 +- api/symbols/SerpentineLayout.html | 449 +- api/symbols/Set.html | 1070 +-- api/symbols/Shape.html | 1421 +-- api/symbols/Size.html | 627 +- api/symbols/SnapLinkReshapingTool.html | 433 +- api/symbols/SpiralLayout.html | 440 +- api/symbols/Spot.html | 1369 +-- api/symbols/SpotRotatingTool.html | 402 +- api/symbols/SwimLaneLayout.html | 546 +- api/symbols/TableLayout.html | 692 +- api/symbols/TextBlock.html | 1608 +--- api/symbols/TextEditingTool.html | 1202 +-- api/symbols/Tool.html | 1922 +--- api/symbols/ToolManager.html | 1685 +--- api/symbols/Transaction.html | 511 +- api/symbols/TreeEdge.html | 346 +- api/symbols/TreeLayout.html | 2970 ++---- api/symbols/TreeMapLayout.html | 388 +- api/symbols/TreeModel.html | 725 +- api/symbols/TreeNetwork.html | 249 +- api/symbols/TreeVertex.html | 1092 +-- api/symbols/UndoManager.html | 1216 +-- api/symbols/ZoomSlider.html | 507 +- changelog.html | 14 + package.json | 2 +- release/go-debug-module.js | 934 +- release/go-debug.d.ts | 9 +- release/go-debug.js | 934 +- release/go-debug.mjs | 934 +- release/go-module.d.ts | 9 +- release/go-module.js | 940 +- release/go.d.ts | 9 +- release/go.js | 940 +- release/go.mjs | 940 +- samples/comments.html | 34 +- samples/shopFloorMonitor.html | 48 +- 163 files changed, 30556 insertions(+), 109951 deletions(-) create mode 100644 api/assets/highlight.css create mode 100644 api/assets/icons.css create mode 100644 api/assets/icons.png create mode 100644 api/assets/icons@2x.png create mode 100644 api/assets/main.js create mode 100644 api/assets/search.js create mode 100644 api/assets/style-tsd.css create mode 100644 api/assets/widgets.png create mode 100644 api/assets/widgets@2x.png diff --git a/api/assets/highlight.css b/api/assets/highlight.css new file mode 100644 index 000000000..b2306d6f4 --- /dev/null +++ b/api/assets/highlight.css @@ -0,0 +1,113 @@ +:root { + --light-hl-0: #6A9955; + --dark-hl-0: #6A9955; + --light-hl-1: #569CD6; + --dark-hl-1: #569CD6; + --light-hl-2: #D4D4D4; + --dark-hl-2: #D4D4D4; + --light-hl-3: #4FC1FF; + --dark-hl-3: #4FC1FF; + --light-hl-4: #9CDCFE; + --dark-hl-4: #9CDCFE; + --light-hl-5: #DCDCAA; + --dark-hl-5: #DCDCAA; + --light-hl-6: #CE9178; + --dark-hl-6: #CE9178; + --light-hl-7: #B5CEA8; + --dark-hl-7: #B5CEA8; + --light-hl-8: #C586C0; + --dark-hl-8: #C586C0; + --light-hl-9: #C8C8C8; + --dark-hl-9: #C8C8C8; + --light-hl-10: #808080; + --dark-hl-10: #808080; + --light-hl-11: #4EC9B0; + --dark-hl-11: #4EC9B0; + --light-hl-12: #F44747; + --dark-hl-12: #F44747; + --light-code-background: #1E1E1E; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); + --hl-12: var(--light-hl-12); + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); + --hl-12: var(--dark-hl-12); + --code-background: var(--dark-code-background); +} } + +body.light { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); + --hl-12: var(--light-hl-12); + --code-background: var(--light-code-background); +} + +body.dark { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); + --hl-12: var(--dark-hl-12); + --code-background: var(--dark-code-background); +} + +.hl-0 { color: var(--hl-0); } +.hl-1 { color: var(--hl-1); } +.hl-2 { color: var(--hl-2); } +.hl-3 { color: var(--hl-3); } +.hl-4 { color: var(--hl-4); } +.hl-5 { color: var(--hl-5); } +.hl-6 { color: var(--hl-6); } +.hl-7 { color: var(--hl-7); } +.hl-8 { color: var(--hl-8); } +.hl-9 { color: var(--hl-9); } +.hl-10 { color: var(--hl-10); } +.hl-11 { color: var(--hl-11); } +.hl-12 { color: var(--hl-12); } +pre { background: var(--code-background); diff --git a/api/assets/icons.css b/api/assets/icons.css new file mode 100644 index 000000000..776a3562d --- /dev/null +++ b/api/assets/icons.css @@ -0,0 +1,1043 @@ +.tsd-kind-icon { + display: block; + position: relative; + padding-left: 20px; + text-indent: -20px; +} +.tsd-kind-icon:before { + content: ""; + display: inline-block; + vertical-align: middle; + width: 17px; + height: 17px; + margin: 0 3px 2px 0; + background-image: url(./icons.png); +} +@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { + .tsd-kind-icon:before { + background-image: url(./icons@2x.png); + background-size: 238px 204px; + } +} + +.tsd-signature.tsd-kind-icon:before { + background-position: 0 -153px; +} + +.tsd-kind-object-literal > .tsd-kind-icon:before { + background-position: 0px -17px; +} +.tsd-kind-object-literal.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -17px; +} +.tsd-kind-object-literal.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -17px; +} + +.tsd-kind-class > .tsd-kind-icon:before { + background-position: 0px -34px; +} +.tsd-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -34px; +} +.tsd-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -34px; +} + +.tsd-kind-class.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: 0px -51px; +} +.tsd-kind-class.tsd-has-type-parameter.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -17px -51px; +} +.tsd-kind-class.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -51px; +} + +.tsd-kind-interface > .tsd-kind-icon:before { + background-position: 0px -68px; +} +.tsd-kind-interface.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -68px; +} +.tsd-kind-interface.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -68px; +} + +.tsd-kind-interface.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: 0px -85px; +} +.tsd-kind-interface.tsd-has-type-parameter.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -17px -85px; +} +.tsd-kind-interface.tsd-has-type-parameter.tsd-is-private + > .tsd-kind-icon:before { + background-position: -34px -85px; +} + +.tsd-kind-namespace > .tsd-kind-icon:before { + background-position: 0px -102px; +} +.tsd-kind-namespace.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -102px; +} +.tsd-kind-namespace.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -102px; +} + +.tsd-kind-module > .tsd-kind-icon:before { + background-position: 0px -102px; +} +.tsd-kind-module.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -102px; +} +.tsd-kind-module.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -102px; +} + +.tsd-kind-enum > .tsd-kind-icon:before { + background-position: 0px -119px; +} +.tsd-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -119px; +} +.tsd-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -119px; +} + +.tsd-kind-enum-member > .tsd-kind-icon:before { + background-position: 0px -136px; +} +.tsd-kind-enum-member.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -136px; +} +.tsd-kind-enum-member.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -136px; +} + +.tsd-kind-signature > .tsd-kind-icon:before { + background-position: 0px -153px; +} +.tsd-kind-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -153px; +} +.tsd-kind-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -153px; +} + +.tsd-kind-type-alias > .tsd-kind-icon:before { + background-position: 0px -170px; +} +.tsd-kind-type-alias.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -170px; +} +.tsd-kind-type-alias.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -170px; +} + +.tsd-kind-type-alias.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: 0px -187px; +} +.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -17px -187px; +} +.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-private + > .tsd-kind-icon:before { + background-position: -34px -187px; +} + +.tsd-kind-variable > .tsd-kind-icon:before { + background-position: -136px -0px; +} +.tsd-kind-variable.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -0px; +} +.tsd-kind-variable.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-variable.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -0px; +} +.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -0px; +} +.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-variable.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -0px; +} +.tsd-kind-variable.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -0px; +} + +.tsd-kind-property > .tsd-kind-icon:before { + background-position: -136px -0px; +} +.tsd-kind-property.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -0px; +} +.tsd-kind-property.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-property.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-property.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -0px; +} +.tsd-kind-property.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -0px; +} +.tsd-kind-property.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-property.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -0px; +} +.tsd-kind-property.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -0px; +} + +.tsd-kind-get-signature > .tsd-kind-icon:before { + background-position: -136px -17px; +} +.tsd-kind-get-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -17px; +} +.tsd-kind-get-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -17px; +} + +.tsd-kind-set-signature > .tsd-kind-icon:before { + background-position: -136px -34px; +} +.tsd-kind-set-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -34px; +} +.tsd-kind-set-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -34px; +} + +.tsd-kind-accessor > .tsd-kind-icon:before { + background-position: -136px -51px; +} +.tsd-kind-accessor.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -51px; +} +.tsd-kind-accessor.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -51px; +} + +.tsd-kind-function > .tsd-kind-icon:before { + background-position: -136px -68px; +} +.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -68px; +} +.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -68px; +} +.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -68px; +} +.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -68px; +} +.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -68px; +} + +.tsd-kind-method > .tsd-kind-icon:before { + background-position: -136px -68px; +} +.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -68px; +} +.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -68px; +} +.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -68px; +} +.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -68px; +} +.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -68px; +} + +.tsd-kind-call-signature > .tsd-kind-icon:before { + background-position: -136px -68px; +} +.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -68px; +} +.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -68px; +} + +.tsd-kind-function.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: -136px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -153px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class + > .tsd-kind-icon:before { + background-position: -51px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum + > .tsd-kind-icon:before { + background-position: -170px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -85px; +} + +.tsd-kind-method.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: -136px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -153px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class + > .tsd-kind-icon:before { + background-position: -51px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum + > .tsd-kind-icon:before { + background-position: -170px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -85px; +} + +.tsd-kind-constructor > .tsd-kind-icon:before { + background-position: -136px -102px; +} +.tsd-kind-constructor.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -102px; +} +.tsd-kind-constructor.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -102px; +} + +.tsd-kind-constructor-signature > .tsd-kind-icon:before { + background-position: -136px -102px; +} +.tsd-kind-constructor-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -102px; +} +.tsd-kind-constructor-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -102px; +} + +.tsd-kind-index-signature > .tsd-kind-icon:before { + background-position: -136px -119px; +} +.tsd-kind-index-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -119px; +} +.tsd-kind-index-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -119px; +} + +.tsd-kind-event > .tsd-kind-icon:before { + background-position: -136px -136px; +} +.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -136px; +} +.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -136px; +} +.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -136px; +} +.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -136px; +} +.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -136px; +} +.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -136px; +} +.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -136px; +} +.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -136px; +} + +.tsd-is-static > .tsd-kind-icon:before { + background-position: -136px -153px; +} +.tsd-is-static.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -153px; +} +.tsd-is-static.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -153px; +} +.tsd-is-static.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -153px; +} +.tsd-is-static.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -153px; +} +.tsd-is-static.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -153px; +} +.tsd-is-static.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -153px; +} +.tsd-is-static.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -153px; +} +.tsd-is-static.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -153px; +} + +.tsd-is-static.tsd-kind-function > .tsd-kind-icon:before { + background-position: -136px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -170px; +} + +.tsd-is-static.tsd-kind-method > .tsd-kind-icon:before { + background-position: -136px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -170px; +} + +.tsd-is-static.tsd-kind-call-signature > .tsd-kind-icon:before { + background-position: -136px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -153px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class + > .tsd-kind-icon:before { + background-position: -51px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum + > .tsd-kind-icon:before { + background-position: -170px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -170px; +} + +.tsd-is-static.tsd-kind-event > .tsd-kind-icon:before { + background-position: -136px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -187px; +} diff --git a/api/assets/icons.png b/api/assets/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..cada3e6c11b54f7ce63d4edadf4e92779556b233 GIT binary patch literal 12658 zcmZvDcRW>p{6E)LH?!!HYp1eZ$<7|vuB>E>Yp-NpE=A(nU3;%&E0K&VqOz}9c0xjC zmvH%=t3IF4_xpQ%|2X&F^EmIb-|y%9IbJu~Ku-fq3!x<;ApvV?su}^`KY^u}niBZ* zeVPjezDRwHG?YoI`q@{26>>)XA?Y8?v2-9t_Gu(o8MA2g7iFTKVuoiR*BG{;;)xnohJ!YLf5!>nlHgNe{f~ z_sKq-IvEJaS(a;?B?R~^9uY!jSErUO210TVTdS9)gYcgnrO-kRGn3W5b37hvCiiPD zC_-)__j44dsxPGqd(Qfdd7R%4;a^G}Y+TL>I;a=_*}T(_tUS(NRzqFkd_S35PU0aB7ePg^PTpKEc_o_8{YFPa8XwPN%|zdBoo?n4^{MD{p;qP+7s zZ6c@>dF!lct9~qj{Y1l7IMiw_G@2phJ;Z(PD{NHaP6Hj@$3g_x4O|ABEqRYdX9iR@ zqbu%ir~COs_u9)7^C$xQvRuE3=?QJEBBycjJmpWT^FcFylGNSOBAsO}Q=Iq?+u#F9 z#V#27(g;rR3SM^Fm^IFaWBFP|Xr7fZq7ij?k07qL)_iL`FQD_VJH)mxUQE}Hs&Aam z%_P~A*zQETtpevsmij|BY9gStN=XD7Y+3PJtOT)Ut+>Zewa4*e*4U*Hb(fp5Kr>=X zUQ#8I((ajaBsaLjW3LCN3^pvX>GE{^jf#`tuqdkaOgDcD!}u$Jm=U7KG1GYF?EXt@ zP|y`r5Zy12a>*%dF%vIvo-5!CqzFrpQp4ghJ>+Q+$GuJcm?6Qk(V7uUcr?^S zR>XoY>moKFtGed64rvD5yRZm0e@5u>LKX{mu~!sp3*tm8)=L7TGT8zgWbQ5Iga?04 zZ2iXbq5pXl6@F;B8Ru3AN*3r(DOpR66_BA65C_>7psmJ>;> z{iHWFdZM0Qbobkk((Us6-ZvNvMZJ8TXFFfJ$!ukmxS9RemTxS3wZ4-%5h1<}Vb6C` zPsH|PcCblqcpo`69kTEKL;5P1FAR2{8`Rg#a~KZwYG>EcN}EPt_+ascG#Yy1o0jml-uLBRhr>HPyB~WVI5h3A!I@^p4-j|lbmy?lmO5~++ zDq$IpM&e$jaWKcU`^#6p$n30>Y{JSjFDV5oegUFip4BF@P z_|K-wg_{K5xdJ}iPSR0~E$?m}yEv0~V&;Pw)6({&_4UNyZ|!f@Du%5;;_;e=wGiV( z&1%x1J33TZW_8);vHaGTA#X@sL4E~>tk@!lQGV?P)j&mEyPhq^6)Rt}cOk0$JGR*EGYbZCB51B|+4)dT2Tov8tM(ZEpS z5}kH3A^zxbpE_v&1-a;D-o&tw(apM2Ei5Qx1+i>C>EVoDqe?i}r?Leg-z8q5etavs4^4ZC4W&ip5~hbV*#mawv## zxSI-A;q`AcawCopR@HWV(AOt5t3%?!8+O=Y$7?OcSd&?9Qti$WvO9#_AYbxpipDMQ zhbtP&Jj3P`+DJc86a+A!9`>?KU28M+@DqAE*#qQ}L@rXpp#$7TTJyp|xX5`|VYt&i z=!S&#c`MK^l*Pv*E{LPA&=eFD7r8h>Al~~c+PA#^ARXPtA2iMO+#zM^H6~^e8__JG z;<6JKn8863{KDXc z%@v%eUE|B6o81@bgmI>gIznm?)bhd{62Kk`#+4PcafI;Z0pCOrHSx$FvD0KQg5_~j z-?Za|pNUv@*Q(XYfrRT@7tkdc>oclo+&Bn0cGKK6IUX3V+7Y{TQ>q6>;2tg*-i!ky zx!*3K8O6}|St5Q~prn0(h)h5EaV!XS9?y-0FkL?F(nb}KpVh~)T5`O|FL;c8N78m7 zA1)pdy?cuva^15{x0nC0Yfi5Jp_a4eAdWniPvEj7uhT6E_VRtVx(5QNX+mBMLg0#` z?KtChheP!C#KZKf%kSxOhTOv+HAh)iZYPYh6%-;FXFXC2r6& z>_jwk9i836K|fDj#^6X~EO&V`&&)J*5`!cldbyP`W=rcXNqRYQc8IzU1{jxic2)T%Qn}}U+DEUTS zW$Uin(xswFjl~wx6jOI8ZxyNf(T{AJSa|I@ycC2_LTaE$!&LN30K>9D7;iWfKN+ zC(#Qthvkcq?Y%;H zv^Qcg_C0UixSUH$=^(R*VDFy ze>+gKUS%tT?o|y`^N5QfGA4J>+oW=vk3*Y$uBiu!nZZ?!kbCJ*`-TkghD5MZ3K+5( zDV{}9=4gFf#h=M?O!hH_^5IgQ|AVXNx<$)NrZ@TnF3d>T(yRfvoI?3opw;Ed7Eh6l z7Gi|I2Ks`?Q~(b3))H}fQ}7QN&E>_VI!#~~Dees~8#S&x&^A&D$M9PVDoK}lb*cuY zrbQ-g^Y{q~B_dmpo3TI0qYdXSP7HYUzZ`(A9<`Z1iv(M|u#q|$eM}^`cYi%>-derB z7hMbsi(?_c?8`2R0ec1$cb`V;Fs>Y87vx@lw#w4XEu43`dI-7!sS!qz7=!sRc~gul z-NfGAjgL@xvcQYW^s*2+`ME%6anMPaR}GYnWBa)-bc3u(CLE;+v9JVHdAp z&K;8URs0T--lXN&RYNs2S9cC-pT261#ZGI^;qTt^2APP_{rGq}M5LW@(JSZE2ta7! zd59lpQZ;j54ADZx|1cT5R0K`G>G~sJTPjA=DooBoD6y5~7ti?=F4vk8&{b9IPj(Eb zEAeW7z``|p7aemGUSy(!)q~NJr78XTqPl|7+$cr30+WRHDFVcjl*mr=YcGiQ+%E7H zM9G_Uc>h3}W^|pi;%@mNdSOjBd?T6Dp_V9$# ze z7tj5qT4*z!V_8{QUk=+)Az70rCmzFo?k8ymGD@dNKSVM*r*x2FgTE%#+0+QKo43pl zbbr%x`KWe($e9rz-1VXkx48LPn6{+t1eT&NzJ3+P*JyP1b=Zg{BIgd9|6c(T0w8y#*hnLzXZEc+`@Gq`?h8^aRXiFz&oo7pCJ`URpBtuY zR!eEvgbI9?Nx@nc!x)NPP-Q44w>?J z(kfN25M5e%?FR9h1cPsf}HW`xs|CPnJWG=Jo<;4CMqyHsx7^9hAuij#nQ zc%6w#c!O#ORc=N7$1$PAnSm_vJ3t@YRbs!K*g9~opyaJqY;u~=JF;#5TF2I-oh{Ws z!~x#L3w@irrFp@~NeK<`-wHll_m=aw{g(scLhZZkK?JAhU0GLisN{_P9$bN@X^VxX z$%(s##$wai-)Nej<`ZLM_4;@V@V?EuD2#ZOOBiB2cqI;Ur%B@SC@Fqgu+@d2vXtz1`e>$yYnDH zcu4i2VK)7o#qXjwO8v5$+#wG{={@0;KedlEDIBQTD$2rWhZtA(G+aTH>C|VHB{Cz5 z``kY$3vXYj)r;VpoaFiaA)*w4q<~5GKA6@Y;BK$c!;vfl9)s@U2Fn6dm_8fQ)U4bQ_38`0g3~D`G-F#6Ot( z75R~^SB>(ITQcEg5jYYYVKGEtd^9PfV{>uLjz9PU(u%wnU9i6F4ZZP~c8=)N z!ff~(MhkX)!z-)0Ra*%0*9nGf*bsM zY*D9I|3dKN2gg`_)qviHfO@#sTBnv`+GpRgt%080!X4F$9warEdb9BWw2nti^v?3&l6N zR;^VO^;})>W7z%n_!zP8@S^12)iYyAx2NPTnh_;YJP~lcbwqCA0yzN3Q%;+N*~$ zg9l1S3ZyDZP!gB&p6EF@n{!;o+Cl|}DmXtp`cE!7;J zG>_v%eA1oh8y_P=dQuUj{EaP0cCN~S)$X#QUuqv|EZ&n>NhwKd^vKy;qE+PWV`|P= zY}DI_P^-dtJ@0adPyjX%vVuGDSQE8cEb7^k<%E9A0#L0>WlO&BB9WUMRRBX$-q5%z zpfX`C6s&kDZ7WXJT9S5Fp9*Nj<(&vnCocv7{h!iIM6277Bs&;p3QRMu5MXG43|elH zyTXeUTZwc70D8860E`a@9s38N085CC5?p3@mz&^qYETfB%2mB^7E_PtT~cSJVgyJ1 zsn-Mep8)GpPM)Bd!)Pil(x37xya`|X8KO_%$DYa|Im>C{+eSX`2T#bT=fmlDd-WVm zhz-!?^Wi)s&AAENXNzw{B&b7`cw7r!ea+EeIf5{*q_a%|mkUh$adf%;l+Hg|F5@O4 zQYkv3FNVlvo*rkh)}z>9O5oD2MVlg7_GQHCNqzOq(Q}#eBc9Gv(UB7&dVcgQ58GHp z4!%hrr=(5VX_$|z^vCjbjUE?I@Yw!_*w{jjDi+3{=vJu-j?-0l$?MN5OnuL>1(&(O zVb%h4&QsXfGF!!>*OmAPh?J<^iwU|ix6$}n5&TK#^P|?zbEqs!+{V-lB691w{6{=# zV3Y^TAy@5H@ZE(UF(T46eA3rTCq7x`eDOsy)h$_1r0yq^!CF@)%K z=X%O-`$`AK-_5-VPY_sQKTm%bupQy?A#CIP!VUT(cdTyG9L1Q{oyxI6Y%!kK;5+?% z!3-b%nQbhT^blr!aid^zia;Lgtm#$`!AkpjkiplVL<4Jg3zZ7QH<)%=K~j&ZLKVmno`+IA?Ah<4^kS~QZ)udXi%j>&Z^zw(Ti9uob$v5`gmX!E(!3S$ zIuiD*yk`XV%rP|z_(c%aUHpvHyd}Lv)uHJtxAO86FV}kZ>&~MOxWR`O3QEmwCymztV;B51-6pFaZ;hO@ESQy+L=Kj&Ib#V0$hEDL zoNF+`KXm0fl`W}X{vKcYyIp8CQlG*do*H!6^hp`M9kPlR)2?o8mn1oq$O2WSnKZ8 z%;iC4^G(jkS+IbNd&~dK>ZiYs74m$nJzM_eUdE}K18`P5jUreg(nKg9;v#L0l^ zd!00MZIzbXFa>bZTiQ*7eR#xL9pPw%xon$ z>+7^W`VWk052dT5dKm#_F!ZlJQ`+F}kcK@#rJL}AzMmERN1_dgFW&*!l!LBys70(k z({Y&AnBZrCu=ym-QGo;W(<`|)EQ%o`{Q!sGvvqbkM6SV8mI&bw!B(K4s(-u+BIMO+ zZIWMj77fPXR1XBfQl1y}xlf)sE!%%NmXiaH*tWD7n8=y!q?znrFqFHj7VcZXrTaBn zJ=Bs~H*AS1WyQ4_N(O)ZD|u8mr6l0nseIC#rh^00a_3I+TmXj_^73y=;w^vBDiR@P zN1xfhz|weYVn_jU8AFc1sE6jT(BK5o$IbLGwXoD+qoOsmO(r34`O5A#O4ma8U)@N^ zARid;Njm2g5$A^Q5TLOfY$GN#EXNvcyq>Sr?aEL^-F9ao<}dL*(UIhv*5@K3$0`Wk z1zeHnY$`;4wgYb!cs%rpM^Wzc;1%?sNN(yr1FnW$nGAo2XzAoCk~L$UPJ=|BSs!))F?IRM4(7ble*E=@6pEi7ZVhP6jIeyB z*mDKu09n#l1Mu9mKn{QJlqX?vG>j1ckvNz~J;t6W8YsE{GjABbX{9WagEU->0k*H0 zqN(pWbNM>%yNh*Yv?S}w-v~^_^NUr{#-9@tsZw#|ea=iaQo&mv$LtXapVa1U&V~bW z+!lG0IFp3EStRw5#NRu$uDoS+os*{19rJ)->=L}_@*ZZR(N^28R^7EqyblEEr1*rJ zVD5GZZjFun-e)Q6r~(tp$Tjk1<*3qx0E#2?$Gjn%^~hw{jjcHY16@ z)5J_ZuSQ*lKOy-Rxf9FiNv=3>l`cXgapoNmkX`lmc`4~#7f}$sTZ_H(t>j+P4u`mu z{)w}u!G(gh8^WYn&oo09(7(z|;FRv?mQHs5WN};YSv;KJoOU~1`^{eYp+o;pEiaKh zRdBV4T=pzXVJ>+iHrjT>okP63D+?xDs#zXDzC`7(fjNzfD0*jh2e8V9R$& zS5S@v3Yp7~EPBCTJ;kBdDIsm!m>Tu_bIzZVQ<*Bg_S9|W0;QGzEM{uxOj?UK)L*6w zAL`IpV?GP!bJ2~fs&G7yR)-hO;uu#R_WE~UGCq<6&~)qkWk#0-8X^Bo)vd&ch@N7;v9WUv%k!fV#_A*~8tiJ)3; z|Kpz#rKMOv_=Z|xx*GsSe+0%urj;02Gis756^UzX?_#dyg*)w%$~fI1&BP6oJI$~K zQ@lfZ5}D&0nl*sh{|T-JgGYJ&51_&A1AicpTJo6^nLRagnWS5t(z&3agbXPSl^yn5 zjms+*hMCvWx&3C!PU`|D6u))zdjcM>TfO@8G97Ct^mX#gkqqD&rm%y}py_aEUPL5i z#Yl5RWJP?hff470Y*$P3=Uh)=y{tb46$ib#B4S_{gm1wUDHqzDBO?y;2b?$)6(0Xd z*Ohf0Kq@XUHrFpoDZB;k8!g*O^61-C0Z!@=f?pNoB^hjrMIn*>O!O!%Dzkj^OwD z!#@RljtrJk%DgR)teYzJ5;$vuiH4|S>2h8FNz5I@BhX&?tNRZ?7!T?^{txL6@hq$-CQ&IgzI zsFUm6lp|FA8xSDJg6V3%jfOiAX!C2~$hwrtjci?*--TA)UR zSSspqS9)mapa!|}^`Po z?I@~JfxNwd&P;0^0sZ;KT#A{qJ`kRdEdC@Ei9u-jNHN<#)?H$FkscT)nD6*PwL?u3 z4%%9Oc&y%L48AoGv;W6>g|AKf^9FE@MFCvZLjWCj{Wh9#Y&8MR%a|bv3yz?X4lTv zq++EQHv3idtt$UA7_oZD=e_F}8*xScITQD6>Gt4(fib4aDj9(TOmE?9^GLG_u1#I4 zSTq7)*v#JnUk0!KS`+=>-fDZ-SsNj)bqA}qv0^P{R>w_ijz4UY_+T(=hX(~*hc97) z0tQ`=xg0$$f18U58I&}SI+>pG8`fLphQS_}QL8ksO+NJmq(0-J)M@|P;2a^CKTk7Z zG9#_G40mQlYU`YdxTyIiHr%43+w+s&VFZa%w!>{q0^)!SRd-D52wfQ)^rp= zLa+)#D2o@Q!6xyoYh+B_0ik&f!jVW?qr7GpV3_=S`Vfy0RL|Rmf#?v^aI}6nmqC`f zL{|ZXv4#g+x`f`M6+`|Wcr220C@B^fwNE34{FzYwvEr}u&nlr&crX(<>vcF+puXTD z5v;Yj8>seiDB(fIXv7;LsySh`Iq4vEGibvX(!t7WYPP{`@jd!6UUHpowu;yAJhmR^ z%ZCi=j;z;=`wYHCje7cW_QcC$%94uP)2bz-B7P_O>n-ma5@G|$OtN@HU#Y)r?<#$F zmzVnY#a;mhFj8(m^L-LzdoUJuu+9xex$?`r@^>`Qyq(9xNkO5NKP_Zjo}Wdfm{KBk zKTdtL(q z<~{hQcy_QuE`$%J_&V?IZmcdS6}#qg8}ukPD=BQ98u7tM(kL1SOJ1k50O*|G>qw(&;ZQw)h?oh|E3sVeQ{M}#Q! z%BBL&_T3A~d$LH?F0Gt2vc#wre#c8(n6Gp3c-8kPR!Au z_=6dVLWc}#lQ$pYZzd^?#1Be5E1UnNBAG4SZK%lY^Xz4AZGG>Z5_$nrO#L^f&B}|r zQvqjqNO#nK+q!nex=5y^Kx+ZF$}W1_RGBAgsT=dcaV-sXhF4&Kueg2hV36%z$J@?* zJW3j(9jE@?T>FSf*33$@ckJM!5`GofVtKlQN>I~1<*F{00|)RunP;LJD$$6dD!%Uc zQ&nh@0loVor}pJFlco*Z^2j~tfN5@Ob5+S*q^gto339i5zM3A$^v=b@L5nY&nii6PL#60%HqsH|tDL%mFRO*`{|4${bl z!G(R9t){X;F#EU7l-EozHJ8cX^p~v^2a2Dlk4$d^^*Q|VLVnq`UYY4GoaVr&{^_N5*9medUXS{P!$>E5d#?LNm!RQPxk$T*mB#m zqSpZ0pu1mxddcGx*y5G4wm7%^prl!mTC20`$M0U(T|lcZSlE$0-0gUC?)G}{A^Y&l zu$>#T4nh!g*PAX%cR}j3(e_s&gspr7&pU`4cIZ)vPj~n@meH;;te;&-XuvM@3NW{K zKiaaYm$W8J^_7+hvY<{%eM$&!sDHc@j6m{1c%g^L^&lGbt?<>w)PZF=2A3hz@Ffk( z>z)_=hOD}c_rIL&(u4kZ{n~Si@Ys#dBx29#(p&HD=a|78d_U<6yMz0IJFuh4fL;V* z+@K;~?+8lp6?J?$j5vGmglyc7qZH*ouWewdO!ge@<2mrMngn>LDU`{*A>&40H8eZC zslg7=MH{nZ=)kHqRZ8zf<(<(za}AFWEcO3b*kc zMAEOGWuU5!f~j%F{Om`pvnVs9ve({dqyBMPXed&b_S-t=M0Le3vW1p$q1;v$KsC zBHFhzh&eK}1Q9zwF~qbY1lW2lw!RU7ivOJ3Q!6>u?v4D^nH@s$GXSVfvH20{Yhm|%& zo^JGN+su!A-Zey)Y6Ge_XWcgF2?N<2e3??7j!~aCFc_rs6|ZlGxLg^2w`?bZ%(~~Z zzNFZ8A|2syb8{Ffu}8-H+-u0$!o91s({kKxwDy&{+dDi&(%GyM%J`}nN$+%eZ6m-t z`BHmr_J+y1V#rYjK_uqhkJmpYqSSTY;mswTP5(6BZ{5sK5k%jf`yoQni4@~}tREp( zW*S}xM|TNqnfkY}O1*n8FM`45lmmqj2~0oU0=-Kaf>Ci2I254knIR$wK{A4HYI`5&Zw5$0bWT-adW=MKSPn;nV6*i)yG3=;4*P z^Np6YWaBXk_I&lFA&o9B(*|K9KZG71+!;(t&vP&zETEm~VFa^`3TpM8;cMxJu{NOd zQFo1kjNn&&aG+-qls~yX?)%ZmK$`k#4uu#lhB}762S%k?4D=#O*6ES+L~I@#>^`}> z(J8^qz^-cn)N(G*khO6p$VF243;Ef{RVVx1FQAm)wYtO2|LMlgl661V)y`VrN;wG{6q^b7p#9>%*@EYA#_|=`;cVKgE14&0WE2NyY!x~2_iQEqnJ7k_nWraXm>Zd& zA5&jf^h)X(e~LhfFIKAm)sAWA=&wORhM?4qy`gv3o3eYu2_Qn+1l`kVZsUIfMx9E4 z(X>#bdSF^1pQ)A#w~udn+&fEPF1i^o4wNLH7D@m!7r@YR_OKz3SJa=JY`xx>+zOCOZT%G7jEGxw|ilgUn`aqLDzV7VzeGHH>@ zt^ugQR;-9DBr`*bF1hq^!FiN0ly#-O7q<>SEx0W zl#HAn#*8}u$#rAX3k@H5h-fd5G{kK6lQ64ml`ypg2eZ9n2lExRpCoEe=>1MC%wM}z z_-Lv7f^SStZ46_h`CKrCqZVqLpwet5`li{qgAu36=eoR~h^skmsIe&F2Ry2?bTjAo zajT5`ZS}^+IA$=`Da}{Bh2?@y@bB@e0#@l`)=$?i$&1tsNM~)n!xpP}l z>&TI#L%<`3@)YpS^keOC;OVHdmh#Obd2Jjsz>5=>^6K(Oj^u}**)=~2yrx3lHgrC6 z1XM?U96iUc^7P1&XW%=E@;Yv2^Hnr0g37U@TO&^c62^K$Qy+nw!eDtKwimj z?kM5usaQ9T^K5D^lW$Hwd3fTO?+rSS(0P9m;E(fH>8OWTpNB^tXJa~ZM!Y%E=H@cH`{>faV{@RHT*@< z4{Z-`f6sZpwdd0FZ_K%K(V_g-vKn(6jfq#*ufXrp`@Ij@E9z%%kQG=r&A%wBTH1)> z*Q>h@oL%oHUbt(Zm-3t)yq(_TO@DoSew+BZV~b(FWl-yLHy@9R@{}yB0BB<|(DceW zGyML!oifqhfhJjOX4nj+b&8)vO?IOjyUtaat1?nPriT7HLXd-Z#znA@1d6Awui-9_32}5qd_2U7j2CtrUcLan$F>YqNFJ zcip6zs?nIUhh*u9sM4y2Gp6%2plrdLQ;lZ4>!SH`^d6P{R~lt`*01N^hawW}=7=oV z363`2P>Aqxw#EBFnu3)vSQE?+3GU_?+*#R3TMOa%Dj9ElntW(X(^h+<*#(!3lGd*J zE}noHN(k6EV^0#I@)}xg8B%2!x|pVbq{cgerWj6{PgGJ`RYqux&hD8hDr4($&A>^A zNYpgdO2(_QI77hPf+%SfHKJ#3zkb8-UZCsFpBRSwuOu}jayM0pGPMy*>ds%S<9LR! zI#BunieF6yHcbRJAH0f9fWS|Mhc+JvYiY+`ria6dD~AO~dBt&x1J6Y$&xp;j%n_yLq{M63rf&l$LK^*GDtOF%!jo?r4!dbI z{onvS*rP62C>(6)ZkxXvh=AQx!!u<$&*;@}+(mox0+({pc3zZ}wmc%V{&d4b6D)x7 zDC>`jy01Xjt6GwsCPMC%N&_`wWsjhsOtFD`1JF(Bh%+0Yp-W2jI4!zfd~r73adTRn zLrARirBi9>N6j~*=&umq24aHk?yVXgR}B}8;&fC~4xH&vO){UxYO|r!_ir!-+ox5X zJp2lC`J+2pT!lM_ZApI?B$$;HuJ*%c=iArX|}BJ9@BW_+t<@qF!)d zR5gXY(crM7z2iL(j{MmOzRRIV%w4!?by~do{mrw$B^e)oqxSwNx%+OC&jYwgxNSNi z8QD5_+|h42>}lHXj%MWlI%B9!HLH=kzkw_b@S%!#X%=BGKn*G63$)W5R#g5%=zTYs z$dFDRFvK`}s_Qjg2JZfID((%y*{35yI6cO9ERJezq}o?}5{x7NCi4sT80@O92Qa|g zjw9j+R~lnjUJY=HJ6km6U>?I_zKU7M6qX9@d)qxJ+1Ttqk6;OyPP$(GkPh? z@g+-Z&1Zh?0cNnNQ{EYg%yr#vYWL=?G$nTfS@i{2b>}$V z>@tdd??no^dnZyw*6s;V+I)GQm`!wtctN#F_Nnq0LlT^U;U92neB{?*cVZ2XyD2=> z3uS`ATY4Z9<=<}8e$B9U5%6jFu-aeOY}@kgIRc(lqeaJL&LHlH>U2xGqEr!b38n>N zW?|OaVQlpkVG(h^?2PiP70lGHQ4Yn9dRsgIrT~u%>JxPUd3|Doe547*%J7*{LZV955b5 z?kws|PIr{tn7s0c%5$aPo+lc@a`$m1$7NwmnT#$+;6g)vineG)=qaVq_E>q&Zl!~i1{<2?0H zeEI0e1ts)(f_Y8>&1wwePBLN^ouca7#yZo^Q&xy&aYlWLAZfv59?)zZ?@jh| zc9A^nuJLxRJ>GnQ0%pg09DvQ8YDwYZR$Pp3Q*e<5Y!O zXUe_zATAeGu3?u%V^IEA*rXYAJoVJ*)us}*>ifkV^l6P~fk@8aiSBvG&MP^%fxE5h zbUQQAn9rFs!mSi!P_O=LE>&gmkJO&+a})3tCHAGloWMeKln%n-%!p!73&SP3(*@*p zgc?72@smN*?DVTyMwtN99?kJ`q%4haqL5OJ_%-7*U z2jbQ4i7cQuSq2UK(%@JUp*Pd$Y{4mGO zu-6>yXvgv>;xz0Ud>HwqFM8S%8fgp8xSQmX{nG#tUF-8G;?UiB5rmxe`fOPqlNuw4qnE4{NwRl=UvKwqPv&CA?0rR}-L zvbl{$iCi|d&O-w;FK3YFjO4mY5*BN81|HA6dL^#=z3^4K&y_vj*AHPsvcWU=Iz-b| zo{W~Z7~1rv)>G#1(tl(E+thaPyw!0Z`}A&na`2~iEmR7;m%YJ-dV&EMbA!(&OEMo#k-BsxQxodDHh{4{${fEwzKDZK92^6DOH!qIk zL!d;JgC^G%a&BSh;afZp1!29^ zMqVv=uR6hCul?_1n^8$f$rwc;`AeSyajW0UYhKt$NIa5-~XxfVPrkAVAv!!M#p{{m5LJCQs{Hx%Ts->?{KcbM){DzGx z_iO|^4c+})a;-me^Sy7&b^O9Tm1r7*J?7E|t`FjsMtmwx}ku3D2qwG+whnx_tGZiQ~S$5Q_wv>8~k z??9EnJW~u!24ZIE-w@J2ZlS1QL-e4$uT7o6{ADYlZkY$lzW{RZPn*}$!BB|mR^ACM z$=wJs%M5KuB7G;@dB_xrS)so)vY_14syH5LnNmV92o~W{*gg0wxHNNtB^V zYfcodHokwxGUqo!t1t71Og_3n#Jv~ksSBBzMwg0mm_&!AabK+)vj37%2+F?$atKJ9 zzox280ZTXw>S2$_3m5|sT6{H#q+k{A`QAH-Wi-opI?#OP*YbK>6%4ggN*{j`NJMzT zEryq;hUWc#k9Eo`Q@4P&P+#1dLuR1_a{P&&%tDjR-11sSh@(Aqxp-cMGx?oozIMnV8D&1En)1HsvVe z%1&J>3>es><=fM9Pr`*}4UTzxq7Dl7H`2n#D_`Z@!k=U|L9V|H_k4IAEVtbmo`~)< zb)}h|{#5epZV;q%iwx47YJ89!qfXH9$C0$pOF!(H}n|aAi|nxdDqwvzs4TkS_kWV*GQxEWE@<1{*n-yoIyU`Usb` z!6POVeUAiT>9CPwSiLfns~NXOTJ0rIm{*}HzJCpA6l*gc{`lt*=&h|fUJ}%a6!^^L zvkH+Y?V+KvR5sum%;Urp(gu;G9g6tmdR-^5nf2juoxl$A%Gn~@z%5AswaPl?@s;N_ zNwPK_Hm@!lx8+R-}V033F-apz1^LpF}u{XwAT)o z997$0vS&DRO@+d!SLOo5r|$+*~~s^2u4YZ$sIKIs$3x)gbXTI>gJWpg4gT4Y{2?)1PPIQ!ki8+$=9$<9>|8^8+BjZ4}Ae zN0`!H9JDUlh5Te+7@r}KR;m;9RKs5a|GG=N`eam#)j3{v&PQk+WBc@Wk*)an>d<$K zXD2PLk9${Euh8fddo0y7!HK6RQ6G*5d)5yhb^BU+n`55OIo|G;IIN-5`x<`W(u4Hi z`0(8_x~O$_l3#WDcYXDpC}4g<ilfa*bW|F(D>q*5Np>;wT&y zuIc=D2>uRx>>`@uS^eHKW3Bhz;Vj^qy_Qb^v)@n@*GYW~Y9f8BHgi5ted=c$;Wz#! z4`XMPT9pv48zH!b=v%P{hTx0d8F{pr2xujuy1|r^czv*k_yO@DoT&k}zd{A3!g#BV z$H;>rn6E?L-&*^geF#DXUVyztWjpwO8xW;tRqubIDmD6htrbXBP$_XnZz6{lgIY7k z$4%-U{QSWoreV=|9x-#39hh|?%J^?&;N1I4&P67v>BB0ebpj{UBf&I;wZs!6!_>x0 zJ(Uvh;}6@J6VGvlhaQH`fw=sPi#La za^xwd=A8C{r69jCNp4#eUORUyNb4=_6tH9ieGRIG=&V({uGrk5i1^lNj5FyVggF(O zo}NuM1Ix}u$(GMcmq^RY9ydaS@< z8msl-@oWjZk+J33Xj^g01n&%J3P}|@z*q(ol7scW+`%M%nVHJ)B(je-cR5Z(>SKF5 zyJ<_bXsG{b>HyL05%)Juy=pEf;{k0H9?U$g%Y5gDx6T zf2c`GR4+Fu`s71WGwaoAaT|0gZfU>zce9#2Uefp~?X5zlL}HspIHWz?wElky{4Hoa zJ2S@x_0ZBs$EAA-z0N3;$s9(TPV)$J!M;XR&RJmmXwCQ@PYaH-oc<3E@LILhMqZ^9 zkIHhAxTsRG#t%~uIsSBbLee92GXd?>3PfeewB za|u(VDv^+J%Br-1r1=}i8|r?kc;;F!a_n?#v35t!-Y%O&=*Ic4z2=}2*~GN3)k2Zr zKcIhNeX9nobEz??m9U@JuiWr#CPsRCWcgbD;1z%dfF}XIAXz>~(i$L$_W&&Up z(U|1W+^W^g|AsEq4Li{tN}@y&2*x-@fcJP(8O~pT_gGRgLcfJE9jm%gqz zDe&`1`3Yw^<7cP3%>l5U^XfCN$<#yE=~}K#qWhCGmY*<<)7{)rxU>gUuCK5|3=3pI z)#xg{16QUEVut=&Njfhkz7jSOH)Y^d{W9+sKEfdp@p((>yAeL{RXV67h7I}b^J2}F zsD~C*B{85!T2#ywd`%BpEgQd;9U)l`;30$RYb;&dP1U?AZyNGXfdS4^5iG0BniP|A zE{Uh9Fq)Pui~zdm@YK9cU>{dgeiqgi6Nf~aiet&(ydskWfezGlbkj;LRm>>^(OT4$ z>V-y6 zAzAuBUY%<3U5RbjBCE0=0Qu(M>$MgIXmr4)K+$cGU62W4-n zq_(PDJ(q6e1_4)rTm$?_A05R2h&ZUe717Hr{+ZAUv}`dmeIvuUF2&uitA~y(26y+F zdr^kHUhEO3CmN&wgc+H~Gg?JnNYgrchTd(-k-|GK>;qU{${d9KHKm--iDy0<7TqO4 z6S-2Q~JquHI_RN}KULeQONW!aB!uv~l7%I)Q(yoyt3)R=K? zMnlZB=Vd@ADjSu9VjU#om5aVm3>V|je>4rs%6w1nac}N9d?Q5t`5{+%{b8rWZIma# z*~A1-h1szQmxgUq)RZ~8DUUA&bAuLca}0Ivx$e(&-sRd%9Q@vHgo<|^d7^yRt?n$c zQhD5MxOXcsO@=|)1GPRkkjAyYgt4~~_Z0r2{#XdOFv+E`o5m|uo&SM#9bCV<2B`~Z zx^Pq19ix#twX+G@!M46X1=B$95WIIs1G&2w(hQ zRmn)q982*p@Oum_xAplh)_cj1i({{KG%%TJ%<5pT=3s*_elA09Z{{ub3g_&>XIDlx z;ZW;~FP=HDdhQ;O6l=8QG`3S9d;sx^yMNO{&P0`#(4w%11c2}WZOI$#%ROY=?9z6P zUN__;m;G6=nU6u1v$e_X>d8tjk5NVC6#$fm8V~Nu?3(U+4TaxdT&?eMb2#hayHQaN z%BL~hLuN#Y;iE2M3_`G(yd$x^MoC{ARfezLFc2QjTmK1%gste6*#0@((8$FjSXxWd z({aviFl37s{7zNr0-uw)Vgkzz3Q;$ruAPyR;+YzNc|;W3Ih8+wX;D z>63s5=NF6__B8Gbt*5kpcfsCoI-i@4sCY9>TjGx;lE!;6fGVGc+MFS-)tj1NlI~XR zzwh~pZ}u(?$-umCCmk3G$|$YZn@Y=cOs!!awJehw_D$w!2Rd-Za7K#2Q-##EC(g7y zZrF44%HYat%5INo1enF8R!oH-S+0kEzdH#X47NoDrtLk%7N~zxJBRnBjQ4B$oWt_)YQiJLA*7FS zH&w~N8~w!RO?8vCy4>#LmhTH}AjGJ}567>?g8|>rxr4!C_SQ{eW3AK3I9W}~-rxU& zRcws7|G_Hm(cVR$kEKDFk|x(;5Q)1#_(lbKO_Wcxk$nO~A+kD!phgLFNb>AGxftC` zkHCUroPblH$l><+#D+q)2~8dP8@pR+H5YrOJT&VD{^p*BnMs?5 zdfPoL20%t=Pv@gAXn~iUrbZKhNr0NuKIBh!o@>$&4l&()=#BK^LqfrJ@$w(~WC~50 zQ->QDU(?29BPxCxBh`REn4hHKeDD3)!mne-HTZ0Kwf}4Nm)XQRW-zIFPvI_Z+s9?A zNuv5Cj`-!udyd>RfF4|D0M?Tiz{1lHB)@s)tYav&k!rz{l>x&jF)Y@Ro}^ znLX4xuiC-$W4+-bs(o>d?t5xvn$hsvE>My(X>@gKtGzmIRk1olH#kj)`FiZ5X!C6h zskaN(K=}C77A$$zyU!vQRKhqi8tr8|^pQ#Tr?pTbaU|2z=uEq#WrlLwncBQ@$%VPq zW>o3v+@zVowvGE)wneBrcj7MF8QtlwiQNBm=Nj0a3vl@hPE}9qEHh=p5|21?l8_`x zn2@txaM85Lmk&`SIIK4a;Dwp1pL{hNTSZqh;cjkZ$R<4axivW$``R%-zq8I!Grq5huIky0g;qhWi4ETq7_;EqPdb+Yk zq^qC>KrckIRi5ZCaXt)vdb41jQOriJ=BM9PV~pew;Jo-4$eQwz`9t_|$I^irbCB!T z6v?5{b31_sqbFKWi*B*~^O0N+2Vj7iU@5p&|8oYm%wg~1PBs%X!lOX0b{wzjThoC9 zvOAZq8LIAo@GRFzFLaTm!^DL}B1%~O z6^frPM=_~33@Xol2O#lpt3hLHQZg#u;Vobp|K3#6t z&@bU6!vA+{<4^VW3b^IgSH&ZMsj+lm+z|6V`tuFWg}+Jm=`f!(kVl3K$!iZ)(~xnX9a#4Y+O+e|W5^Hf-tv!q;Ew@9ZaQQR<8B z3LIR-v!W!d+>|{RnQ9yYdP(79Y{EG0CIvGc096}z)S|g_Z1Kj%7#4HdS^jCO3R@Jg zeAr5aJ|1*gQOoR!NJpPjzMUPm>5@1H*^ zDH#@Rf8Fyy2OnJz9P}R%l`4>a?CjDc;2i-YvS*nIko70v2%{hJv+3M9(f0ZtPx51$ zo@D=rKT_&CCJtc}3ge!bqa+~!sS@gmVh1t5nPx$is^ryQnI9_$X1+Y4;I!2_CAnpD z%Gen6onbMxqR6_@yGhrr{>BuhEm_Kmn<8quE#+_H6JXjt=g-_K=^Q!sX1dv>R3)iC z``6Kuh`D1{k!OaTPJ2nH{}0GsEv0=RQ#5QZtbBgZen1g#g~{FoIovs92%dQ3&z+Zt z_Z{*}@*^6rQ4SkxZ94wkJO1Z*w*k9f-P7}e|tTqW|YKHe5%b5&y_jQZVdP?Z<11tV)MunXN8p-w6O!@un9 z)aN;&)7hlbBe2rx3l#(SQMzDO+_VU$!lR*D@~!OHl*lTW9E!8DceYT)cW_d--= zI!}~xKIgiukI0mLi+lgh>Vvl77<7l;UVffb$J87pzlH2~BO~Hcr`>mnV&F`WrIn9N zF1D?`hHGa%P|5G)CjaS-648F{y}8)s+Wq$Y)p?0tieEXJ?}y5}c;Btig`;JCI3;(r zPI|sE>xgJT1=8vWp;8s9t|4lta$pZkBY?vc8!Plr*_8?Y@}*GAcO&`xhEt z4w$UT&Chi>zW@h(g|^O=L$RL=;b2xbTXFQe*;-KYLmF?%!hHsq(XY3R3x6{n?+_es#|0YNPWaYuyD5Sd2oj8ly z&4QX-V_loQ&p={-^jr-!6T&IIk~`lncK68_Z6y-0`sOOk83WOa5!CXIassm6bDcvmHpZKCo9`H$Ys0Qu*`xz=lD(*nsk#Iub9RlT^yci%FJ`Bvx!eK2NBIw%rZ#uD>!Yj4?s^ZwJa zA>O84Uj@caLcE~JeSuiNhKavoKd7MD&F#J#Srv?Pv4}2)7QZ}vQ5V;}b8~FWq>eJ) z}yjO5Nqm$08m*Yyy!=`X?q6Q7&FSCz}~j(gE!^s%zx@|j&i0t&ZitB zkde83jc{yAFfWaSybhP4?;dqdSZL~0`Mj z160&oFiQcPw`ek*;}P5M+Q{Pi3SFG}dTT<>Qlhu>CJoqB1Es`NKBzPkW6;&w`SSR` zEQ!zo;ob1H-{@bGRrKW43fO;pJXsF?>aIS zL`cq*X*lYw9NNW~8zeBq{|AGRHz*@J5{PSSFwY4j4hWS#x*pB>e6`GkHp1k4qQ0ySL0)RZ)=!QJ1D230f zf!3eWKayZ7fXLi+S!Q!&=QJeo<*G66$JXWi_TXW`bi!dAsjB1LY* zavPKeEfPN`#p0IA(rEEUyL({!Ib5#dv6ST($-c|Xc&EMFd=<4tP@o%a(*R;)S1hl0 z$*t4RGRDK|6*fcq(aHtJ98uiKi*we+!YnN46b6)8{Z~Hi3 zP@xv50t6gftd*{E6yr<$1Ghh*TvKl6T1J zpihx1I(%?RvSjEyuZh=l_T2hNWEu>}KD`5(zyEIx507r*4Im~p^RoMHDU+y5Y2(a# z{hF!^W1QnPu@ws$y;s?dR^W(2h=6&L2yNXGH;|CR__SDo0k`k9#QMx#pKbpqp*`kT z>y7e4W(@cM0U(O=Y+#t!tQ3?4w{*r0} z^qVUrdGFcV258}EAYZa@Bqj)h{9{mw_1+^ zxT{6}2kV3qpYfXjc?5h{zt&A)>P|_mOM+ySL#>5bcaHqZeS3|x{X3^_iy0)2vDgtIZ3c2KVgT*rdG)rA0CP8_K&31O8>{;zWcIes1QYo+ z(DKh+7n`F{q|yq}P{j?%cr?5|mN0!wV!LdVC6GVHgj*Arv#cekR{Jgs#A}EP^*b99 zHTFZ1W10$Li%81RszXe2UMj!|8i%~kGL6C|K$GJo#eq{Ab9)lAYQM0eVR=} zj9k=Z1D}1XiQ{ldUcJL*RIP47fr$IUGF4iNO;OSo+b>mCdD9m(p(A+$xP&jWGH_;F zaScQi$k#b|<^{tH8ZL;g)CiTxWRc#CWfO^dQcedH8GPEfW7oQ&^dH{BVQjxwKefSH zlP;)=5%n+E#hY8ngWbRc2$pNvsRU8;)ox_&IDt9w$ef%JzNWHx1;Ch!`V2dP%}hUz zCwbFqYEeve(Oo&oD>P|0r_n&?_aR{aR1fW{!cMBe--wyttVwy#(ylhXj{?_F(HO&T zPH9)D(*NDESD85B;Qnc+>K)b$qq>%Rb#s!%*-fH>gL4oW@R7~=>i1@AMg`c=qL3}A zhg;kTvt!2I!(AK$A~@y8Pi~2wet=b}X3aSNf1z6AEYFs#0~B zD7Ddntw01Lo@j?7-Ynrb?%;^(Pu~_*T0LHae+`(%=&yfc`k1Eo8?7w-38Hk$IbT?Q z*)8c|x^dIZPNgb!gp=4?Sbjv{Yl7E_>FB2cV;% z!Y&d(*>H!pV@gdbw#F2B-g7qp;i`a8s>xkIUrYH=!6I-Bn4?3TyU`hBOmi2C`KdWpZ} zsO;qIpHWBmxuC^3R*`kcaO5hxb@aEYcY~;1ze_OC0O8u3jZF47>GgLuX9_wUCtG4$ zkE~X&B@f?oN|{)lYIHK{StBg=MY#fik{_ruLN&?D-VY_!+MXW_I$d6j({pb?^E(Qf zX3YdnXy#z5+PTzT&=mmuO(y0%w*|OR*C&Uhar%3+^xdl&MTJd3RIo5b`z%HZhc{&BHDHF_Id_W9GiQGCVoE0IDXwR}CcR@R7)wAmg) z0?6v*I>HIXamG(V&BYB+)IQGAo{;ZvfG9%1pt|HY{+H$|am#y0e_Jhls1{VEHW1(9 z7*&Vs!nhc|#tuJorsA=*pzDBICnz_i7QxAm(sYMbT|YU+l|CDoPYa7MZ9P1nu{rDE zkQGFe;HdeP_jF&k*n#@84z(CBVTR=8@duI)j$})|HKWEggQYbA0TPA%69GSq|09oADB|H=s5>)9D0*L|((32Z>6Ws^5x(#1jKnI!;KI%?YAn_JgQ zg!AC0i&utzo{+)1rYYD$z+isU6ikVV*NWP&iVLZe0L$t&3U|2fSpyioO^o0#K(_6& zOhoUN!oZp*8<6XL`^f#?nPEzffmi_)2~Cpj z!QCT%&b$PijB83ktId4`T=);=l3vy8U~gG)fi_ z_v`gkTJp*+?#Xu(2N$NO-nDtvu#94Tmx3^xfzg{sWu|X(!8*@CH}r!w!@!@MrFqO2 zbd5~(0W`@sNVrUo>B9x5&A-Z4P(%ONPca1P2SG=KUZX=%r7Nt9NYb@-0+#oX?)*fD zI+r41BkqcF4BMWT9Lj%~fxnHBin|GNy*e-h8AF~+OmjFZ1*zAdU3K&-FnFKDiYz_7 z{47A*1as{(xuuf8wE3%&_IA!G!LyVc_J?I4%N@TxoGsYpx8c!Au2+)u z>JGDDD>px6yJ4lIWUhhpZjvmwi&yrdzsuLWRTsR#tF>Ly#Ra{SUO%4}13D>_X)k{V znFHTecm65y{TSU;KBy!yjd;xxXAlBPqqZp%N=GCB3>z@#I9O=jy9HeHyuisx9%5fz zoJ0Yh>O|!#80zLXv!CKQbjo6R1F&#fd5!V1(HwdTK2#+e2rLAXCKZC~?c-etmol4H%+D}#$*(l((5+P@? znl8th)S)$^d^vYt!dNz+9pz$5yNfZ1!an02x&!;DTB;h61Lu8L6g7QS=GbI!;g1)u z^)ozII8@stx{9V_ezrPal^nfoOk&aOdT4YbeM6N7T6-^a^qlIo0)JyQ%(YDa5WlmC z50eFODDwrpf!tSF?8~(*>KQu3Cu`SPN=NI)XmC$5v(ry zq0|s31>TB1+_7mpKMnA9UaqD7y^MrKap!MkBr`XFC8BllF~sNN?4Qs?h2r%o5#2;t zyz5QKRxY67BFr8-WS&H!s(m zj)ayS-KvT*e5yO zrhU^>1oFk+NdzIVJUGZ$qseK`}%D49dU&9%)b~^Ekx|8``Tn*9qhlLH0$%NO&E?5x<(Y`>{9Ubr_Nx(+q?@T3N} z*TJ=ZNts6xu^DH86$j**^sU#^0rhu`j2|5SX$tq^Rf%Uh`LbVCo*5{O?f??ti_GxC z65mFkv{tAmJ)#-O;F(k|+(!UP2*1pF!Q;P50*)CXHV5eF$1r5&!Ui2L8Yx7RuXS%6 zKGHNOQPV}&+cBEF?dxrIpAk^{{|ZE+?zaQoEX>pmb@&fHKyg^{%%MOhOY_pLDgAs-xSf7D*+JN5 z03h2(mDojGVm%L`r*r6{%bc4thoJfA?Tdi*n^|8Uz%ld?>{+tL;cx{U>V550HEYd{ ztC5)jBSYl+Xum(lwh_iVz&s)yvJ|?PV=((j{&zJCe-!{p6-JQ~P>gcjhUA-fh}t_& zc{$AHS)hC%-5ugwnTrB4WQZ|AEND>2rzy~TY{Tu9ab1-?5Fr1{EhTkqu2r)h#{q=} zfx4`Iu6~@s>S}wkkyqonNFf2-+bW*zvjprm+IpM+ntbG@aluCg@szoi#cS(dN3bG z$>Mh`pvr$su7UWtP1}k2lGtSG@A(nSWKzjE=+lkONavCQ2)^XrOMC6K!WMPTsJgfc5D}31=a@ zicn$vex-p%cDd~C-uIt*0Kwx$Ed{heo2Nn?WnyR^N@>dX6@OC+F9q@D;Q(-yFCD!0 z0jTY!Vu1J7k7Q7sz1WcBS3Dbz9=;>b9y=8@Q5XdTwNP>5sK=@GDy0<^+D$)n^qu`W zJQJe21%Tr0u(ewCELJs9t6!Nc!H5*`8O~3B7cmF7a!~)YpGH`U+$BzKunxbn;(7h- z-yT#Q%b^D)y_x<)pN&d%idGwNC4SYLAcO>fbif)-LsjQXx7SH^jNsD}U*88W&juE= zR5o_nnu_WN$6LSazZ+sR7V!K}elt-M7^(3e%qqo(-Z9Pmwj90-9Atk-VS4phOYb>S zb%Xf2ri=!;{##>jS$Qv@h*?i3v4_Ms{FOT0AK%f3(xG7#SXri1e)!!ZfcD) zroPsRt9gRzE-9Ad(^kavmuMVx)qJ;Qc`9))%PT@Z5W?!z_H@wG?|k0;gNflSz52(h zMkA0i_nenUBDz!FCGO95vmnsZG(h}Dyyi;=P#8WWio0~<<&`-+4)$=uT4L`9u z+fxe3O2;>HL5tknQBx^lI>hvMZ#aFH1MzBJiQczES-qStX^jnDqbctQMGScwqxXY! zpA+3)ewx{Lux)-&3}Cx_1|eF88bjv|S8=FO{z9OtT4fvAh3Y1p_r69!E_NaA9RHOQ zH|@>yy9_!|kEDL(+^q#}D2a{_Jz-T}R@j>o(N$Z2yop?d4$;MYbU0*4Dgxjy)#=L2 z96oKMx9_|$tmtUjV}X`|=7{rP%RxouJ^}+b-%L=Tt%y|8kQ{ni8@VT_ogw#Ng zx%L~ECB5ShMY4{6E(OYrkIN_xoC6QXSx{OOC7+dA#+u(pe`3o!6NANk0E&|rXCO=# zS5hOw3V7^dUb_b#=;p+NMhRJzMh2Rgy9XDK0p~`3i%Ld`r(3)x(Ao7KY;FP43*q;DFwke4EF;?6e z7r*OZU?%rZB%p=QBKU=y5*`AF4=6c$!3_uPBbFZ=!!li(pLNptC5NQt`9b)OjC7@n;{oj1Di)&)1%nkfJ5be?rSrR zE7o_@GIf81hsYrxFRxBpixma0ZiXmJTWGj9BxaoUG8w(vOR{XB$aL`S+P}s6EhQPl zVDEahx!)i*-|iFp%WF7AlC}Y&h9xG$LYTT=0=t$pSHGob zM2Ds@KFQN6Y8zum7(NHpa0#t-Br&8lw;t(pvmZG1u|IC~+!J|Rqh4$}#{HdCFr z?8qL|cn~uxU2d(-#Us|k9q+V<#FJw5oTTpbAE4#X(u^+aXveSVupiHDKVo(6^sN}k}-Qa2RCD95HG&I6ZmxK|qfH6en&T#QBW2l9~P&`&aD)DVz+E+_vR11v<^>b8U z0otaUKk{zlKzWfhxdtEDTR^_yA1{FJaQ0HYv+1FcAf?aWM=r{53Kjv%Y~DDO0OnEI z_FENpo3Y^VipW!*lb1_AUbreljgS`P-~!n%a^yiPRSklPsiQOFZXiIkV8Nw5s|VwF z@PrXZirk(-MXub34e@fW=2L7Nf%C}wjg&gu7&$e6&UUtmcWN%P>`O%~Y<%Nzs@?$g1R*v4fI8$dvHwQn}x`ymyEnCUqsPn%Tln`b=-yde^j2L$4) z`%(UheOKn=!KwWFj!pPnj|QQ!Bfdb{648oM)wVDV$QVTS0Jc}lj~g?`Q~@UTW652m zFog84@*XJWf4d(*8su2P!cr)(dD5?~KmN5HfQsOcRC2DGlcFT^awM=v!NWUaVka&v zvkE+uynnaFkAzJy=`m5k7yz>(klmYhEMzBd1(KNS_aR837k~4QnjawB=<8c`y{#{J znW6J<*cYG+1d*Hz?Mi}`p@+4dKu!iYbG93h8sV#1JbHDy_+xQdT3I2DNQS}|BF+9u zIP4*_#>wNwRiD81`Bl2DgFP1u(1CU+%6M%x4D>sxQ5@!vLv1eQK0R8>Rkd|)DhW#R z12oT#9SZ!iAZF#A-qt^yr|WCi;k3aJm*qXU*RHCi*DrtVj|~F=>tawJtwx2-7xQJ{ zIAvQQ>{NNb2=@FAtU*h+QoDZ|@SSMjH9)}{6O6nifDRXQC0tS)&*}GniRkGBy|VnF znt)4;2888gbNmCYQS;IKt)3fz_4K%hPve3v+EbvZe6ZJ58VF<>d_)DN5a>|I1t70i zwduFMO@aU&ru`v_`DF5cvsu7Y60BO*DhIcD_|f02>>EsWY|l&wNPFV8^_V=JD-A=B z+}2U=SJ%zV?j3&dZhXRo!`#lg| zXs(g2I5z6T&|)W`-;neMl+c0yr?oQyhq8VD{?kTE6OzOX$r3%bDKf@Z6xp+8mr>cW zk0n_u%aE-idr2DEHQARC!;qaw)+GC$E&F@jqn`9U&+q^Lz3=gM934k;&wbx>FV}UQ z=lT79&VlWcla3V>oDtvJQ1v_1(HjOE{%dfSAl688tcX**g-;{->>}lxE7;glC7~AN z!XXzKk}gauZz_-Q=!cs>QzcE7+JaSgRHq0| zCrZ+tq~=%Z@!`Wx3dcg{k$#bVrCETTu}fsNloK2e)Bjil@W3=Sl(7qF1BGD|{j7vlSx4*%H*Ol1~z*DfLAvb;qEWnErS6>HC*x$u>zC1|M} zQ^4@P9UCX==r=>W2Nl=UzejUNBovwd7KqvzGE%O%BQq(p@6}X^tu(3qDe(eLZ%n!6 zmi(70lK2dvbNEg?OMM}8HmoaEs>A73;LK}`N={(jb|mUNVex`ptD^TaoTdNNQN97E zH0^f6>zPi%7hbB$jktPh1P6^uh)CF$>MaJNk0)+eAg~u%6;xC2(tAlzm{^n%Bn#wo zvtn*GlS9RXkG|8p#4kG}{{w~qi{HiJdM@etxc1yfQyPZ$KAJlz&DIMteq3lbL}p3K zV!&vc-i@c$Z?*6Nf_HeHdp~|D2~XLs#x;uWEXGw_S4gHem6ZkD8l?m;N}!nh-UJoE z(oEk&{w1qg)?xrtgT!kphbdaGT{-bARB18te&n7i<51xJllLr&NNRd!ALL~cj7_>{C8=w2bn05Y^Bb=28^tg ze*U6nY0(a0e^kVWT?;tHw-$3x@8|P!1&4Szs_pl_SK{az9~B~^;OGkE#MN+wMwa5( zf{x;5=Z}()lUwuK{iCFq)3x&+;p*aHZ%L(3PW#NoOpV)jB0J^S1;6-KIT7KRQWUep zYcEk^rK%JtoQpy3gL%`~wc9}>=DBWKBsj}SMcnx~&!bsr)TNJ9-nOrD&I~e^N?ju> z;@XCMVD?3PSaPLKT?;MbFq+4;07=fRDYE_rg+_>2C;Wg8Oe~atnwZq9FBlS=%MUr$7>1;wKhb!_27D2naGZ4JY0K&7F{;mhxi1rD}f6#e2s0H$0M}K zB|u2o>m+q&Ky-Bnh;4B-I#$(7K*Xro?!g2Argi;Ri!+5N4a?8}%mm8T44t$}KHuf# z8^*`-(=X+L#6(0zT~p%xm?YUm#W=s-DJ)KU`jjOab~Rz~tVj3CreeeM2!0+54ZQN7 z7QffxfZWUDvrbixWv)*9++P2A9h`nsi+yyqI-sYi`9bj^K?MkY74Vd>AQ9_l393gc zD@~yb`bouxLJOY4Io5U%{OG1j!?*{Qj3SvhXHw7%yaTY| zHV+Q93chdP>>!fcLQTrI%&H(d8~dADJTnLS4pr{w7V1{Hki9f-)g##V!%*cK!oOAo zg1tnnCbj_jifM+fXIEt7a zbuS7{A6g+Wh~t1Hkq=n*d1(e$QC^j#{r+~?sSDc_mz0}5%>rkB8# zMUM4}LV{%;kOaKh>8t+z5N{~S z_i!XkKMf~d*P|yzX6TOF1*Yse6}7%ujFG)03mZ`Z#2FZ3gKc`=&k7&l6Er_)qBZTR!$H#z&^D4aiyJ2Jv~l44 z5QV99h}77Zos`X1j!VR7G!|3~yg^yt%n zg~hGXon`rU5>0`azDPOJ^f-~!gyBPTp}W5PW!yrVEF8u3ik$heXd5nHQTpPZ&!~0! zw|Z5|9?H$zNXcBJ742CYBs=Yqw_g7<@<9~R}acf1mCX7;^X>r^>CGmWbB>Kdc8+IKRpsvwKGh<*8r2 z$?^7n+Qz2c+OoU+yLA z2fVXX+JR1P#Oohwl5=t|Usg>`8LN*S*GXR!jc}x|IH^?8A(<`7G&6-ESJ#kB%+nP8 zDK}6kepx#uo{kqXvz1fT7fLvt4ETrheG(HIqw>#^k7ZP3I5kv-VH(N!TM_DW-@R_4 zdBIC}>03%Eu^{=v_E#+pWnlgS_#eNN*kOQDgbt>Xb~W%d1H!B^u23cYDz3bg3C*}c z#C6y|T$8163#ri5=lKs&T1aS~TO*%^Og=tmr#p*LqoT^9=TzgZwll897M<_pYqPPH zc&#y-Hiq{HCV1qS(`;BOeQk6fYs&2TPX#odfbGH=_GK9tx*BB=x3^J7|LbW*QPho7 zKx62X^S)=(7CGAYxFR%chV^f-I@4nOSGv)+jBSbC3&(pdk{EG;ZRNL<6V)gXamI9f z#+8` z1SGc~#kTJ=#7$Yq=%r;U+-mwDgmLYKY2-XqfaDvWjlNgoopM;IHtVEacO&2e3bChF)U*hca)@qYLV z`$qaf3}B27ew6BZ?o4~Uw8e%9as4rty0?koNfrNkf7t7Q#K7t`17w#W$W>Gie7ie< zp=C5Q3CF`T&M4q`w~Ud`jh;q(jDDXoqW~3QB=VC(S%rA`8y{>M!0xxOg>QM z?ngKgEQ+C&P|$lh8y|k{>K&u(&qvG(V7M^En+(_&q*ZSPdfc=u*L5c`oy* zoov55*k}Z~vw)B=6oTuBnp2%!JPG9MWD%jMLV;)9wYUKAvgEoQopz|x4Qd$xC^$P7 z*rR$sLS{zLVid2eiqUgWg%j1(2t7`z1v#vOkh5>^zpE4N|1UUjrqu%4J7nys%Wq?i z4^A)+0jX|^6T*PlqW<ZH<&jDUKuRhuY4;CewNOKW%oE49vcJdU$Co`cOsI z1LW~#X5xok1Li4xd|$4c_`&$JUTrnwP@F}*{-nW$u{ImwPcv^A;|t$sxI(Zm zq=dpg!ylyPO4ay_UY#jQ?_ULYCRY`llhNG{N5V!T^wZ?VZ{szaA3bFmErz-|G#Moy zcZ=-|I1VI=p%Z}f;872hrjg77=BO$s?$P7ef)mFM(uTLX%Oy4vjRmI7J(5Oe&vYeI zKbB^(NyPfEj6KSz^m>?!*$I01gtmMcI#S?rI=K!HiMY}f(7fbgJ)WRGbI$4Q*BRKcsBasFs}P;tGK7Gg@@0b-MunmxlRgbN4^ zTtgYB_T={<<+RPS_`d}y*PqxGyK*WgYrjC8l#}}s9JC#(P$(8iW?rNjrBTGo<%M|g zi>CVmXxwtq2X5WWf6^aFQ6m->5d9&{uwv@I>5)Ww-Q0^}#LI}@q=oB2Hp5X}JZ8}42)BQED+)J%ilV^>bxEg<2}2)+8I z9zf_63zVGzbbn5PEIQ-_M7iWS@m?)x2jSC<(S{Qt0lI;}WG2n)j_ z;~0gqkOC7XKvt6nfz!m_xbT>=(WlnUsl|7H z(&2FFm7&?49{L{!Jg2;0@zWMpM#Cn{P#|uh5pm?iC{8rjzgy5ym{NPUj;ejBbaheK zHntUmJp<~U3}dvFWIi*8><$(;mwMa1A6;zO>!;fc>Q}OsetA@)R!)6uC+c2?p-2UIoNz zKD19}V(>Uk+L&vtAa&tVYeN?9vvrV?`W`8jGd#9F#&dZq+v(Ha_jG!B3IwTkcA>Ys zgh!%samO85*qyVxT_$I*>jveH(yYSy>=W5iWzutC4T4^;SB^?kq}*dYb^M`-bi+$U zvT339qy%Q0Kr4-7HOpOd4zFymvs+)f-OP8iF}eW|)I=R`*0k`ys2r5R5bAg37v8WC zBA=8{nC%Y987^IBFx{>Hrf3fmrV_GtlmN5=lE`8I8`4XegV97i$baO3;G5HKX}Kpt zNXt(Gj}k zB2PN#!AXoABqn2af&ihDF!);9z%%eg$DPKx{-O5-ns^+f`AuqCs#9Y|%6+|7oQ0`K z>y(6#0SyQS<-xDETM|gUiJhx_nT`Z|e&_y>6~Dl+^4p&;P9GU@u9OCt@zYNJy(jWs zCi))sAG!|Pr#wTy=7NdLHrdVe>Sn8eYqtZ>->!$jLMdX<&YlT%*hxqv;D#v5-XE^< z;AtxxgJTXJ>#jH1-QBKcaKgFD*-40LL?Ez5AlUNB4waij4O*!2(oFX)T;O~~K<#N2 zpJ_gY)_1q@O((&d4K({(dSJ1y6Q9VJ;+;^n`3zvZitO>d8{dV_Ya>&&rWuMqTI(x7%e&uSl4FIos!zotpJf=sBUonB zN@d!n-b{VC>3!EbtSXJzccL2oS;x*V8_nDFVJ@Di5|}Vl_JH%z>z*!oARKc{_g2qb zca{ppt`T4+5iqL$3}1se`+T|)N{mOwNDW+|J5!Qqmg(>()tSL{LT6UMMnyM+>6;Kn z0NdS<<$uH?vw)9`JY`D%u_aQ~c5cQeEU3fYddoWcWljj&D)zl&ZN{bJ8SIO33Tk>J z8V|HBYF;Ow;YLmfNUJqvEQTE)NnbmMH&vpFq)_-MYQ|80ZmD)WfG&<>36IH+v&Iq7 zl3cQc?2*KhwZ`~nU%ByuPAV0IDO7!HX@VXjQNL?mSZFLONJw;Z6QVc$P;n z*I{SWEY?wrZXh`Ttle}U@fY0yM+o?y_(0+fCMp3AAwi-*@T(jd;Ylk^Ot_S(-rZuu z{d`cGaEECAXqdcMm6VJ*B?@Bdr) zddRu%%rMes($DQu=c!vr=OfZgBMGXgTdB0x22Z_Ik{Ho68w?i8yx}B!LX& z(&*a!hTQc{lk5~2?il2^AE(d4A4N8jdzqfla; z=z6acdVCKV;RN~($ptCBcqp1&oq4-$)qY%24vZMp?9mPY=GuX&xPd_krm(^LeyYL+1dv zAf{Q08PKf;k zKgKL`q-p#)s;pW)EF)Wllyt`nQ$BDiI&MnWX41m9mn?9xo_nG~X*6p~rs$5!nf1V| z!rXJ~LsA|w`uda+EPjML)b;oD5ni4K6F4iVQN}?*yw4g6nPiN)W?9|l{(#Zla5Af^ z^n`5oIGI89MtncwJsm#HhRU*m+)a!V7>F#dm1w_hud&!y0@goieU@Kyb{hqTa4N)l z2GBX@`qYgw|7aRkpHzP2v&nWxis5t}7q>*ZC~`t}q{hAgd($&33LV56*n4v64o3CZ zou43D9I?<*?4tLW>;Ba;59y#%yAo{`BnX)jO0f^BSGr@3^>^5PYuF~5QL#PwGO$Q_ zA1Q&Q(}ehdjeyR0_r0|}26b4PVJOxK8YtWkK(eM# zNC-hUK*uN=CbK6ux$8SOf8UD|o#2peD$sV6KMd*IyyUbXYQVH^z+U}FBbnM%M@e*0 zF#nM)dDRD21Fj?eU$wwISbSB>e)l)|2lErNbn;^q>xlb-zIpr-F!w99L@UHI(cDo>aBKLK5f%f!mKojwU_MAylTfh||r z+>T}J)%E+#jy!bNrgME9_gXT~P$GogcMNPIxCB)5?VIvJAwqt!M9Dw>D#v8ZLTA^` zFPfmiZ-d^l4cm=H?p-b#V&p%zma1cXl*dEk!r@zk?ENh z_s#H8%ILGxN&Q^KK`ShlKhESFEC1kmqf<*G7_S;Xmb_Dv#0HG*CqQ@gBv@7Top#YQt@u{&DwRW>?07<)7_&_Jg2?Y^sD0LJ(wF3t2j)h2lE1vAj&xaU-24(W`L&673*e z>-|3Wn4`*^{z5KC(4jvU+SKN2FETmIG~c={&5awnHO@F-EZer0x0e z`=kOyjih~nmgG2>TgM5#WaL8t8Aof^eARc)+Hgk~|GDbNZFc^D>C9g3?Yxl*yYw+- zb?Qa8`aDnOB}&_etB3G=LB1ZKuC%M=s@IvMonx0L-*Ez}Tp!fO`ymJu+b@!)X#j{(2yOSx3c+llfE(=SkJiEQaiiV#O_cz4KW}0LeASFqR=%_;04az_TEbCy~I_2`YOu6{2jAj?-kPP&&7HAx?D}U zNJh!?8eYM#UX^J-zIRW+k1>s1wLo zwr+59h<2|RY4?#BPB)#|nxRkbf;H`OR}>T$|K0_wcA&MHr~LrvPWkVXcTabfdPXzg z9OmiHEkkVXDau5ppw6ojt>L!A7M^9sTxJ)~;PnUSk~{_W)UClBKwh zuLc@HgC6Nnxyb3fz_#;U$SAyM2E^!?=MlAEv0HOREt>4FxY1AYE07QOYU2(>E&E<%a_!A z(T3`0Pa1rv-I5Rl=>P6+*l%V>5l0jXKxLYH;9Oe^kFItLGQp=?N$ypS?j_QBs;h$r zlcl+I(>9fz4a@!;rJWz@cR_Oy{;b&oco@%`{L6&e02pm~;jasc6>%8H0AJCnqzZTm z;S(-td-@EcI=+){04A*YKq;A^li%qFfuN-2=j%c?>OV;qk};`X+F1w89dixnyqcF5 z1}65qYzV?e;5g%ioh`$ipeVORDOwF1+P0}O&T2v#P1-xQiE9VS>Ag6XKqr`UBZW6u z38)=9z?v@X!lA<}y9ma8nXnfo)MNe|Q($LNTts6X}n474U|>< zN9$U&Ksx(pL&!qe$@I=dk+Lo|O}WfU{NfX1w>r>z5b84eh|=*blGS#CprrhR%b&#V zvvO*NVXe0z%bC9I(S#jOgYr3SZ2_J9 zRwzVYY04U(s)!04i=xo_BtSDrVHrTqB#~p-9*!klr1g!S2fFC$b1`R}!@7yj_?H&J z$A9gzW(YKIz4Lzfsu&k=;NC&GUj+j{Yu~yh?$>_ARVEcN0{!cjByw&lRL}5b_0Mk$ zXcC7V>pFs3O<>D*&vnHbx-EwL=zd*|gkrkhh|$sykL3ZYm4zb6T{_!2CO?0hKSACM ztT`dmRqpjSAsT1R4ubS)Y+hRIqbEj%hEuOvZ(T@qdg*UbAIF!R4D)hkuuY0dpr1@) zZ0NMm6(Ob&CsCepOrGQkSpNzYqJDbL4XGDTdDdg$%AXRlW3z3fx_F?6nNM*kgQj4! zgL>pCm{$Utf^S{8)He8`e-;03;XAAGoN;f=-lgVxiPS{q_||s$Wez>1WoTN?J0YbM zoF4(-#{#8<1*q%g9M^q9W1gtS*4=snZ`K3j;!vXCStIU>Z0eZL*apWL1lhsQ@7 z1Ec>w?=GE`c!||VOSqd&%^x82=mrV}i8c`~Ve6d=Hia&lo>i20z&5wSlD)ms82ecT zJ93STLZjc)p-V?2I9u{NBr*1RplxJ$2=XKT=5{EKYs&lz0jb$i_fT$4bhpd@HQ^?q z4OXwe)to$ht}JhM4NVBFif|}3#g3NX2#?gU-OcU~Ja|*QMJ{jnsqY4>WgyN>Ed$9@ zJT|D1UzprQ=-74_p?H!(p5wMIV&Nlxw|- z&MK%n1Z6D0+n>7~qHJHVAn=~hMf?(^d(4A^h)>St!@=3Lj<=@Ek0quE&0c~PBIU$7 z%wX=1Wb$BM=kGDNdMgUC3C~{Qk)?i~pjmV_q_zWemVtf{YI-Gn9C_F8v9KU1^P89Z zD6I{jl*IZy0lm+lf6QL5&w)m`VgU}DsJfnS#>IH`AwPNX8aI$hwjQ^;lNG4naZ;aD z0dvV+$>FlP?V0ZDQ#qv!`nL?*4XoJI@@`5hiuD*F*49txAEd%{gPI|#D0lR=I}=$; zbQuM-Naj;u=44x}oa)F3Ll#A|FN>AKfA3TYR++nTU+u=q<1BrlX3=2s`ddi*`5}CI z3X`I34y3VN|D1J~HkrwDTly}?0(p~hl1EJ}6S=eA zsnI5#lhq4^*{XD%{95nLY|4jL$Y+^u1pf+PsQZzvmn(Cdb9O?KA6IZ&x4Rw6bkGJm z=764LxINL{w@>TxUn1uiz{5aJ#*>HF?Mys2s#1cQg{xYpY3uSN|2f|C|4c@x04A#iwr&tCLA9I zZ?AOC3E|m6jy>OGlcTZn|2&~|^63jmaxm1v?PB#KWCuCIzR6xbyRswbCFgWgmor3r zHvYRjICS{(SRLcxyT-=`86)t`phzJ=llWj~%S`wiSg_+G=uD?8|B>S62-|$dn6dc# zwQfcoE4FPIm_El!Q&$UrpXL8nW3oTMu+fjoJT6AQ?6Y+p-scwyjJ*FAX#Y0z76esEfq442$1|?vxHOav9WA&r$%545T|ImdYBR>9MU51ZP#E(k1fnfL1np2W zHbByy61@p?@p^vyj)=FrdiqVS#lh>z*=tZsOQbeQ>e!kXM(AaM(d5sx?u(0V;UIT= z)oEvXwH`jbISWUg36LKCehMROt0$#W%?i1l!51*dcMt5;ui6X){g)`*lvp`i6TyR2 zoSMk6BQ-i~w~SNlp)>zdN=~F^n}MOnG#w@zd{5`tMNQ+-Q924C^Hi(_Ok>FdL2h3(4&hQAmvDz5EnXT1*VBbvW{z4!OU zGuwoJm98?N_;1|ZnRf+TnnGY>CxAN@wlk3m>Y<+J4;JBVyM82Sy+!#+_4&GgN>l@= zlPX%_8u`1C56i6h31wb_d~}?RG*iy%ZF6`;6)`Vb1>&DUL9>ZbX2sjAv(+X5NSb0Q zIkUSDRS!r#Ap7b;R4DKx_$GAyOtms^i*b1+WF4^!TYH$a%8nE*+wJ)S{E@$;axqi- H+Wr3nul|`l literal 0 HcmV?d00001 diff --git a/api/assets/main.js b/api/assets/main.js new file mode 100644 index 000000000..11c4cb113 --- /dev/null +++ b/api/assets/main.js @@ -0,0 +1,52 @@ +(()=>{var Oe=Object.create;var ue=Object.defineProperty;var Re=Object.getOwnPropertyDescriptor;var _e=Object.getOwnPropertyNames;var Me=Object.getPrototypeOf,De=Object.prototype.hasOwnProperty;var Fe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Ae=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of _e(e))!De.call(t,i)&&i!==r&&ue(t,i,{get:()=>e[i],enumerable:!(n=Re(e,i))||n.enumerable});return t};var Ve=(t,e,r)=>(r=t!=null?Oe(Me(t)):{},Ae(e||!t||!t.__esModule?ue(r,"default",{value:t,enumerable:!0}):r,t));var me=Fe((fe,pe)=>{(function(){var t=function(e){var r=new t.Builder;return r.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),r.searchPipeline.add(t.stemmer),e.call(r,r),r.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(r){e.console&&console.warn&&console.warn(r)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var r=Object.create(null),n=Object.keys(e),i=0;i0){var h=t.utils.clone(r)||{};h.position=[a,l],h.index=s.length,s.push(new t.Token(n.slice(a,o),h))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,r){r in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+r),e.label=r,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var r=e.label&&e.label in this.registeredFunctions;r||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var r=new t.Pipeline;return e.forEach(function(n){var i=t.Pipeline.registeredFunctions[n];if(i)r.add(i);else throw new Error("Cannot load unregistered function: "+n)}),r},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(r){t.Pipeline.warnIfFunctionNotRegistered(r),this._stack.push(r)},this)},t.Pipeline.prototype.after=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");n=n+1,this._stack.splice(n,0,r)},t.Pipeline.prototype.before=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");this._stack.splice(n,0,r)},t.Pipeline.prototype.remove=function(e){var r=this._stack.indexOf(e);r!=-1&&this._stack.splice(r,1)},t.Pipeline.prototype.run=function(e){for(var r=this._stack.length,n=0;n1&&(oe&&(n=s),o!=e);)i=n-r,s=r+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(oc?h+=2:a==c&&(r+=n[l+1]*i[h+1],l+=2,h+=2);return r},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),r=1,n=0;r0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}if(s.str.length==0&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var h=s.str.charAt(0),p=s.str.charAt(1),v;p in s.node.edges?v=s.node.edges[p]:(v=new t.TokenSet,s.node.edges[p]=v),s.str.length==1&&(v.final=!0),i.push({node:v,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return n},t.TokenSet.fromString=function(e){for(var r=new t.TokenSet,n=r,i=0,s=e.length;i=e;r--){var n=this.uncheckedNodes[r],i=n.child.toString();i in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[i]:(n.child._str=i,this.minimizedNodes[i]=n.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(r){var n=new t.QueryParser(e,r);n.parse()})},t.Index.prototype.query=function(e){for(var r=new t.Query(this.fields),n=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),c=0;c1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,r){var n=e[this._ref],i=Object.keys(this._fields);this._documents[n]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,r;do e=this.next(),r=e.charCodeAt(0);while(r>47&&r<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var r=e.next();if(r==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(r.charCodeAt(0)==92){e.escapeCharacter();continue}if(r==":")return t.QueryLexer.lexField;if(r=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(r=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(r=="+"&&e.width()===1||r=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(r.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,r){this.lexer=new t.QueryLexer(e),this.query=r,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var r=e.peekLexeme();if(r!=null)switch(r.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(n+=" with value '"+r.str+"'"),new t.QueryParseError(n,r.start,r.end)}},t.QueryParser.parsePresence=function(e){var r=e.consumeLexeme();if(r!=null){switch(r.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+r.str+"'";throw new t.QueryParseError(n,r.start,r.end)}var i=e.peekLexeme();if(i==null){var n="expecting term or field, found nothing";throw new t.QueryParseError(n,r.start,r.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(n,i.start,i.end)}}},t.QueryParser.parseField=function(e){var r=e.consumeLexeme();if(r!=null){if(e.query.allFields.indexOf(r.str)==-1){var n=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+r.str+"', possible fields: "+n;throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.fields=[r.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,r.start,r.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var r=e.consumeLexeme();if(r!=null){e.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(n==null){e.nextClause();return}switch(n.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+n.type+"'";throw new t.QueryParseError(i,n.start,n.end)}}},t.QueryParser.parseEditDistance=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="edit distance must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.editDistance=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="boost must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.boost=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,r){typeof define=="function"&&define.amd?define(r):typeof fe=="object"?pe.exports=r():e.lunr=r()}(this,function(){return t})})()});var he=[];function z(t,e){he.push({selector:e,constructor:t})}var Y=class{constructor(){this.createComponents(document.body)}createComponents(e){he.forEach(r=>{e.querySelectorAll(r.selector).forEach(n=>{n.dataset.hasInstance||(new r.constructor({el:n}),n.dataset.hasInstance=String(!0))})})}};var k=class{constructor(e){this.el=e.el}};var J=class{constructor(){this.listeners={}}addEventListener(e,r){e in this.listeners||(this.listeners[e]=[]),this.listeners[e].push(r)}removeEventListener(e,r){if(!(e in this.listeners))return;let n=this.listeners[e];for(let i=0,s=n.length;i{let r=Date.now();return(...n)=>{r+e-Date.now()<0&&(t(...n),r=Date.now())}};var ie=class extends J{constructor(){super();this.scrollTop=0;this.lastY=0;this.width=0;this.height=0;this.showToolbar=!0;this.toolbar=document.querySelector(".tsd-page-toolbar"),this.secondaryNav=document.querySelector(".tsd-navigation.secondary"),window.addEventListener("scroll",ne(()=>this.onScroll(),10)),window.addEventListener("resize",ne(()=>this.onResize(),10)),this.onResize(),this.onScroll()}triggerResize(){let r=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(r)}onResize(){this.width=window.innerWidth||0,this.height=window.innerHeight||0;let r=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(r)}onScroll(){this.scrollTop=window.scrollY||0;let r=new CustomEvent("scroll",{detail:{scrollTop:this.scrollTop}});this.dispatchEvent(r),this.hideShowToolbar()}hideShowToolbar(){var n;let r=this.showToolbar;this.showToolbar=this.lastY>=this.scrollTop||this.scrollTop<=0,r!==this.showToolbar&&(this.toolbar.classList.toggle("tsd-page-toolbar--hide"),(n=this.secondaryNav)==null||n.classList.toggle("tsd-navigation--toolbar-hide")),this.lastY=this.scrollTop}},Q=ie;Q.instance=new ie;var X=class extends k{constructor(r){super(r);this.anchors=[];this.index=-1;Q.instance.addEventListener("resize",()=>this.onResize()),Q.instance.addEventListener("scroll",n=>this.onScroll(n)),this.createAnchors()}createAnchors(){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substr(0,r.indexOf("#"))),this.el.querySelectorAll("a").forEach(n=>{let i=n.href;if(i.indexOf("#")==-1||i.substr(0,r.length)!=r)return;let s=i.substr(i.indexOf("#")+1),o=document.querySelector("a.tsd-anchor[name="+s+"]"),a=n.parentNode;!o||!a||this.anchors.push({link:a,anchor:o,position:0})}),this.onResize()}onResize(){let r;for(let i=0,s=this.anchors.length;ii.position-s.position);let n=new CustomEvent("scroll",{detail:{scrollTop:Q.instance.scrollTop}});this.onScroll(n)}onScroll(r){let n=r.detail.scrollTop+5,i=this.anchors,s=i.length-1,o=this.index;for(;o>-1&&i[o].position>n;)o-=1;for(;o-1&&this.anchors[this.index].link.classList.remove("focus"),this.index=o,this.index>-1&&this.anchors[this.index].link.classList.add("focus"))}};var de=(t,e=100)=>{let r;return(...n)=>{clearTimeout(r),r=setTimeout(()=>t(n),e)}};var ye=Ve(me());function xe(){let t=document.getElementById("tsd-search");if(!t)return;let e=document.getElementById("search-script");t.classList.add("loading"),e&&(e.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),e.addEventListener("load",()=>{t.classList.remove("loading"),t.classList.add("ready")}),window.searchData&&t.classList.remove("loading"));let r=document.querySelector("#tsd-search input"),n=document.querySelector("#tsd-search .results");if(!r||!n)throw new Error("The input field or the result list wrapper was not found");let i=!1;n.addEventListener("mousedown",()=>i=!0),n.addEventListener("mouseup",()=>{i=!1,t.classList.remove("has-focus")}),r.addEventListener("focus",()=>{t.classList.add("has-focus"),r.value="",n.textContent=""}),r.addEventListener("blur",()=>{if(i){i=!1;return}setTimeout(()=>{t.classList.remove("has-focus")},100)});let s={base:t.dataset.base+"/"};He(t,n,r,s)}function He(t,e,r,n){r.addEventListener("input",de(()=>{ve(t,e,r,n)},200));let i=!1;r.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?ze(e,r):s.key=="Escape"?r.blur():s.key=="ArrowUp"?ge(e,-1):s.key==="ArrowDown"?ge(e,1):i=!1}),r.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!r.matches(":focus")&&s.key.length===1&&s.key.match(/[a-zA-Z]/)!==null&&(r.focus(),r.value=s.key,ve(t,e,r,n),s.preventDefault())})}function Ne(t,e){t.index||window.searchData&&(e.classList.remove("loading"),e.classList.add("ready"),t.data=window.searchData,t.index=ye.Index.load(window.searchData.index))}function ve(t,e,r,n){if(Ne(n,t),!n.index||!n.data||(e.textContent="",r.value===""))return;let i=r.value.trim(),s=i?n.index.search(`*${i}*`):[];for(let o=0,a=Math.min(10,s.length);o${se(t.substring(o,o+n.length))}`),s=o+n.length,o=r.indexOf(n,s);return i.push(se(t.substring(s))),i.join("")}var je={"&":"&","<":"<",">":">","'":"'",'"':"""};function se(t){return t.replace(/[&<>"'"]/g,e=>je[e])}var oe=class{constructor(e,r){this.signature=e,this.description=r}addClass(e){return this.signature.classList.add(e),this.description.classList.add(e),this}removeClass(e){return this.signature.classList.remove(e),this.description.classList.remove(e),this}},Z=class extends k{constructor(r){super(r);this.groups=[];this.index=-1;this.createGroups(),this.container&&(this.el.classList.add("active"),Array.from(this.el.children).forEach(n=>{n.addEventListener("touchstart",i=>this.onClick(i)),n.addEventListener("click",i=>this.onClick(i))}),this.container.classList.add("active"),this.setIndex(0))}setIndex(r){if(r<0&&(r=0),r>this.groups.length-1&&(r=this.groups.length-1),this.index==r)return;let n=this.groups[r];if(this.index>-1){let i=this.groups[this.index];i.removeClass("current").addClass("fade-out"),n.addClass("current"),n.addClass("fade-in"),Q.instance.triggerResize(),setTimeout(()=>{i.removeClass("fade-out"),n.removeClass("fade-in")},300)}else n.addClass("current"),Q.instance.triggerResize();this.index=r}createGroups(){let r=this.el.children;if(r.length<2)return;this.container=this.el.nextElementSibling;let n=this.container.children;this.groups=[];for(let i=0;i{n.signature===r.currentTarget&&this.setIndex(i)})}};var C="mousedown",Ee="mousemove",_="mouseup",K={x:0,y:0},Le=!1,ae=!1,qe=!1,A=!1,be=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(be?"is-mobile":"not-mobile");be&&"ontouchstart"in document.documentElement&&(qe=!0,C="touchstart",Ee="touchmove",_="touchend");document.addEventListener(C,t=>{ae=!0,A=!1;let e=C=="touchstart"?t.targetTouches[0]:t;K.y=e.pageY||0,K.x=e.pageX||0});document.addEventListener(Ee,t=>{if(!!ae&&!A){let e=C=="touchstart"?t.targetTouches[0]:t,r=K.x-(e.pageX||0),n=K.y-(e.pageY||0);A=Math.sqrt(r*r+n*n)>10}});document.addEventListener(_,()=>{ae=!1});document.addEventListener("click",t=>{Le&&(t.preventDefault(),t.stopImmediatePropagation(),Le=!1)});var ee=class extends k{constructor(r){super(r);this.className=this.el.dataset.toggle||"",this.el.addEventListener(_,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(C,n=>this.onDocumentPointerDown(n)),document.addEventListener(_,n=>this.onDocumentPointerUp(n))}setActive(r){if(this.active==r)return;this.active=r,document.documentElement.classList.toggle("has-"+this.className,r),this.el.classList.toggle("active",r);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(r){A||(this.setActive(!0),r.preventDefault())}onDocumentPointerDown(r){if(this.active){if(r.target.closest(".col-menu, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(r){if(!A&&this.active&&r.target.closest(".col-menu")){let n=r.target.closest("a");if(n){let i=window.location.href;i.indexOf("#")!=-1&&(i=i.substr(0,i.indexOf("#"))),n.href.substr(0,i.length)==i&&setTimeout(()=>this.setActive(!1),250)}}}};var te=class{constructor(e,r){this.key=e,this.value=r,this.defaultValue=r,this.initialize(),window.localStorage[this.key]&&this.setValue(this.fromLocalStorage(window.localStorage[this.key]))}initialize(){}setValue(e){if(this.value==e)return;let r=this.value;this.value=e,window.localStorage[this.key]=this.toLocalStorage(e),this.handleValueChange(r,e)}},re=class extends te{initialize(){let r=document.querySelector("#tsd-filter-"+this.key);!r||(this.checkbox=r,this.checkbox.addEventListener("change",()=>{this.setValue(this.checkbox.checked)}),this.setValue(this.checkbox.checked),this.checkbox.checked?document.documentElement.classList.remove("toggle-"+this.key):document.documentElement.classList.add("toggle-"+this.key))}handleValueChange(r,n){!this.checkbox||(this.checkbox.checked=this.value,this.checkbox.checked?document.documentElement.classList.remove("toggle-"+this.key):document.documentElement.classList.add("toggle-"+this.key))}fromLocalStorage(r){return r=="true"}toLocalStorage(r){return r?"true":"false"}},le=class extends te{initialize(){document.documentElement.classList.add("toggle-"+this.key+this.value);let r=document.querySelector("#tsd-filter-"+this.key);if(!r)return;this.select=r;let n=()=>{this.select.classList.add("active")},i=()=>{this.select.classList.remove("active")};this.select.addEventListener(C,n),this.select.addEventListener("mouseover",n),this.select.addEventListener("mouseleave",i),this.select.querySelectorAll("li").forEach(s=>{s.addEventListener(_,o=>{r.classList.remove("active"),this.setValue(o.target.dataset.value||"")})}),document.addEventListener(C,s=>{this.select.contains(s.target)||this.select.classList.remove("active")})}handleValueChange(r,n){this.select.querySelectorAll("li.selected").forEach(o=>{o.classList.remove("selected")});let i=this.select.querySelector('li[data-value="'+n+'"]'),s=this.select.querySelector(".tsd-select-label");i&&s&&(i.classList.add("selected"),s.textContent=i.textContent),document.documentElement.classList.remove("toggle-"+r),document.documentElement.classList.add("toggle-"+n)}fromLocalStorage(r){return r}toLocalStorage(r){return r}},B=class extends k{constructor(r){super(r);this.optionVisibility=new le("visibility","private"),this.optionInherited=new re("inherited",!1),this.optionExternals=new re("externals",!0)}static isSupported(){try{return typeof window.localStorage!="undefined"}catch{return!1}}};function Te(t){let e=localStorage.getItem("tsd-theme")||"os";t.value=e,we(e),t.addEventListener("change",()=>{localStorage.setItem("tsd-theme",t.value),we(t.value)})}function we(t){switch(t){case"os":document.body.classList.remove("light","dark");break;case"light":document.body.classList.remove("dark"),document.body.classList.add("light");break;case"dark":document.body.classList.remove("light"),document.body.classList.add("dark");break}}xe();var ce=null;function ke(){var t=document.getElementsByClassName("tsd-panel");for(let n=0;n"); + + /* Dark */ + --dark-color-background: #36393f; + --dark-color-secondary-background: #2f3136; + --dark-color-text: #ffffff; + --dark-color-text-aside: #e6e4e4; + --dark-color-link: #00aff4; + --dark-color-menu-divider: #eee; + --dark-color-menu-divider-focus: #000; + --dark-color-menu-label: #707070; + --dark-color-panel: var(--dark-color-secondary-background); + --dark-color-panel-divider: #818181; + --dark-color-panel-targeted: #24394e; + --dark-color-signature-current: #3d4757; + --dark-color-comment-tag: #dcddde; + --dark-color-comment-tag-text: #2f3136; + --dark-color-ext-background: #505033; + --dark-color-ts: #c97dff; + --dark-color-ts-interface: #9cbe3c; + --dark-color-ts-enum: #d6ab29; + --dark-color-ts-class: #3695f3; + --dark-color-ts-private: #e2e2e2; + --dark-color-toolbar: #34373c; + --dark-color-toolbar-text: #ffffff; + --dark-icon-filter: invert(1); + --dark-external-icon: url("data:image/svg+xml;utf8,"); +} + +@media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-secondary-background: var(--light-color-secondary-background); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + --color-menu-divider: var(--light-color-menu-divider); + --color-menu-divider-focus: var(--light-color-menu-divider-focus); + --color-menu-label: var(--light-color-menu-label); + --color-panel: var(--light-color-panel); + --color-panel-divider: var(--light-color-panel-divider); + --color-panel-targeted: var(--light-color-panel-targeted); + --color-signature-current: var(--light-color-signature-current); + --color-comment-tag: var(--light-color-comment-tag); + --color-comment-tag-text: var(--light-color-comment-tag-text); + --color-ext-background: var(--light-color-ext-background); + --color-ts: var(--light-color-ts); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-class: var(--light-color-ts-class); + --color-ts-private: var(--light-color-ts-private); + --color-toolbar: var(--light-color-toolbar); + --color-toolbar-text: var(--light-color-toolbar-text); + --icon-filter: var(--light-icon-filter); + --external-icon: var(--light-external-icon); + } +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-secondary-background: var(--dark-color-secondary-background); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + --color-menu-divider: var(--dark-color-menu-divider); + --color-menu-divider-focus: var(--dark-color-menu-divider-focus); + --color-menu-label: var(--dark-color-menu-label); + --color-panel: var(--dark-color-panel); + --color-panel-divider: var(--dark-color-panel-divider); + --color-panel-targeted: var(--dark-color-panel-targeted); + --color-signature-current: var(--dark-color-signature-current); + --color-comment-tag: var(--dark-color-comment-tag); + --color-comment-tag-text: var(--dark-color-comment-tag-text); + --color-ext-background: var(--dark-color-ext-background); + --color-ts: var(--dark-color-ts); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-private: var(--dark-color-ts-private); + --color-toolbar: var(--dark-color-toolbar); + --color-toolbar-text: var(--dark-color-toolbar-text); + --icon-filter: var(--dark-icon-filter); + --external-icon: var(--dark-external-icon); + } +} +/* mostly overrides of Tailwind styling */ +.tsd * { + border-style: none; +} +.tsd p:not(.box, .boxrun, .boxread) { + padding-bottom: 0; +} +.tsd ol, .tsd ul { + margin-top: 0; + margin-bottom: 10px; +} +.tsd select { + color: initial; +} + +code[class*="lang"], +pre[class*="lang"], +pre[class*="lang"] code { + background: inherit; + color: inherit; + font-size: inherit; + text-shadow: inherit; + font-family: inherit; + direction: inherit; + text-align: inherit; + white-space: inherit; + word-spacing: inherit; + word-break: inherit; + line-height: inherit; + -moz-tab-size: inherit; + -o-tab-size: inherit; + tab-size: inherit; + -webkit-hyphens: inherit; + -ms-hyphens: inherit; + hyphens: inherit; +} + +code { + background-color: var(--color-signature-current); + border-radius: inherit; +} + +/* Displays a box around text */ +.box, .boxrun, .boxread { + border: 1px solid #BBB; + padding: 0.6em; + background: var(--color-background); +} + +/* Copyright fineprint on right side of header */ +.top-copyright { + float: right; + font-size: 0.7em; +} + +/* Copyright at bottom of page */ +.bottom-copyright { + margin-bottom: 15px; +} + +/* Highlights selected hash */ +.tsd-panel.targeted { + background-color: var(--color-panel-targeted); +} + +/* Header overrides */ +.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 .tsd-index-panel h3 { + font-weight: bold; + line-height: inherit; +} + +.tsd-page-title h1 { + font-size: 2em; + margin: 0.67em 0; +} + +h2 { + font-size: 1.5em; + margin: 0.83em 0; +} + +h3 { + font-size: 1.17em; + margin: 1em 0; +} + +h4, .tsd-index-panel h3 { + font-size: 1em; + margin: 1.33em 0; +} + +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} + +h6 { + font-size: 0.67em; + margin: 2.33em 0; +} + +body { + margin: 0; +} + +body.light { + --color-background: var(--light-color-background); + --color-secondary-background: var(--light-color-secondary-background); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + --color-menu-divider: var(--light-color-menu-divider); + --color-menu-divider-focus: var(--light-color-menu-divider-focus); + --color-menu-label: var(--light-color-menu-label); + --color-panel: var(--light-color-panel); + --color-panel-divider: var(--light-color-panel-divider); + --color-panel-targeted: var(--light-color-panel-targeted); + --color-signature-current: var(--light-color-signature-current); + --color-comment-tag: var(--light-color-comment-tag); + --color-comment-tag-text: var(--light-color-comment-tag-text); + --color-ext-background: var(--light-color-ext-background); + --color-ts: var(--light-color-ts); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-class: var(--light-color-ts-class); + --color-ts-private: var(--light-color-ts-private); + --color-toolbar: var(--light-color-toolbar); + --color-toolbar-text: var(--light-color-toolbar-text); + --icon-filter: var(--light-icon-filter); + --external-icon: var(--light-external-icon); +} + +body.dark { + --color-background: var(--dark-color-background); + --color-secondary-background: var(--dark-color-secondary-background); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + --color-menu-divider: var(--dark-color-menu-divider); + --color-menu-divider-focus: var(--dark-color-menu-divider-focus); + --color-menu-label: var(--dark-color-menu-label); + --color-panel: var(--dark-color-panel); + --color-panel-divider: var(--dark-color-panel-divider); + --color-panel-targeted: var(--dark-color-panel-targeted); + --color-signature-current: var(--dark-color-signature-current); + --color-comment-tag: var(--dark-color-comment-tag); + --color-comment-tag-text: var(--dark-color-comment-tag-text); + --color-ext-background: var(--dark-color-ext-background); + --color-ts: var(--dark-color-ts); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-private: var(--dark-color-ts-private); + --color-toolbar: var(--dark-color-toolbar); + --color-toolbar-text: var(--dark-color-toolbar-text); + --icon-filter: var(--dark-icon-filter); + --external-icon: var(--dark-external-icon); +} + +.row { + position: relative; +} +.row:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +.col-4, +.col-8 { + box-sizing: border-box; + float: left; + padding: 0 5px; +} + +.col-4 { + width: 33.3333333333%; +} +.col-8 { + width: 66.6666666667%; +} + +ul.tsd-descriptions > li > :first-child, +.tsd-panel > :first-child, +.col-8 > :first-child, +.col-4 > :first-child, +ul.tsd-descriptions > li > :first-child > :first-child, +.tsd-panel > :first-child > :first-child, +.col-8 > :first-child > :first-child, +.col-4 > :first-child > :first-child, +ul.tsd-descriptions > li > :first-child > :first-child > :first-child, +.tsd-panel > :first-child > :first-child > :first-child, +.col-8 > :first-child > :first-child > :first-child, +.col-4 > :first-child > :first-child > :first-child { + margin-top: 0; +} +ul.tsd-descriptions > li > :last-child, +.tsd-panel > :last-child, +.col-8 > :last-child, +.col-4 > :last-child, +ul.tsd-descriptions > li > :last-child > :last-child, +.tsd-panel > :last-child > :last-child, +.col-8 > :last-child > :last-child, +.col-4 > :last-child > :last-child, +ul.tsd-descriptions > li > :last-child > :last-child > :last-child, +.tsd-panel > :last-child > :last-child > :last-child, +.col-8 > :last-child > :last-child > :last-child, +.col-4 > :last-child > :last-child > :last-child { + margin-bottom: 0; +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } +} +@keyframes fade-in-delayed { + 0% { + opacity: 0; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes fade-out-delayed { + 0% { + opacity: 1; + visibility: visible; + } + 66% { + opacity: 0; + } + 100% { + opacity: 0; + } +} +@keyframes shift-to-left { + from { + transform: translate(0, 0); + } + to { + transform: translate(-25%, 0); + } +} +@keyframes unshift-to-left { + from { + transform: translate(-25%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } +} +body { + background: var(--color-background); + font-family: "Segoe UI", sans-serif; + font-size: 14px; + color: var(--color-text); +} + +a { + color: var(--color-link); + text-decoration: none; +} +a:hover { + text-decoration: underline; + box-shadow: none; +} +a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; +} + +code, +pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 13px; +} + +pre { + padding: 10px; + border: 1px solid #BBB; +} +pre code { + padding: 0; + font-size: 100%; +} + +blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; +} + +.tsd-typography { + line-height: 1.333em; +} +.tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-typography h4, +.tsd-typography .tsd-index-panel h3, +.tsd-index-panel .tsd-typography h3, +.tsd-typography h5, +.tsd-typography h6 { + font-size: 1em; + margin: 0; +} +.tsd-typography h5, +.tsd-typography h6 { + font-weight: normal; +} +.tsd-typography p, +.tsd-typography ul, +.tsd-typography ol { + margin: 1em 0; +} +.tsd-typography ul ul, +.tsd-typography ul ol, +.tsd-typography ul p, +.tsd-typography ol ul, +.tsd-typography ol ol, +.tsd-typography ol p { + margin: 0 0; +} + +@media (min-width: 1025px) { + html .col-content { + width: 80%; + } + html .col-menu { + width: 20%; + } + } +@media (min-width: 901px) and (max-width: 1024px) { + html .col-content { + width: 72%; + } + html .col-menu { + width: 28%; + } + html .tsd-navigation { + padding-left: 10px; + } +} +@media (max-width: 900px) { + html .col-content { + float: none; + width: 100%; + } + html .col-menu { + position: fixed !important; + overflow: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + width: 100%; + padding: 20px 20px 0 0; + max-width: 450px; + visibility: hidden; + background-color: var(--color-panel); + transform: translate(100%, 0); + } + html .col-menu > *:last-child { + padding-bottom: 20px; + } + html .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu .col-menu { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu .col-menu { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu .col-menu { + visibility: visible; + transform: translate(0, 0); + display: grid; + grid-template-rows: auto 1fr; + max-height: 100vh; + } + .has-menu .tsd-navigation { + max-height: 100%; + } +} + +.tsd-page-header { + position: relative; +} +.tsd-page-title { + padding: 60px 0 20px 0; + margin: 0 0 40px 0; + background: var(--color-panel); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.35); +} +.tsd-page-title h1 { + margin: 0; +} + +.tsd-breadcrumb { + margin: 0; + padding: 0; + color: var(--color-text-aside); +} +.tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; +} +.tsd-breadcrumb a:hover { + text-decoration: underline; +} +.tsd-breadcrumb li { + display: inline; +} +.tsd-breadcrumb li:after { + content: " / "; +} + +dl.tsd-comment-tags { + overflow: hidden; + margin: 1em 0 1em 0; +} +dl.tsd-comment-tags dt { + float: left; + padding: 1px 5px; + margin: 0 10px 0 0; + border-radius: 4px; + border: 1px solid var(--color-comment-tag); + color: var(--color-comment-tag); + font-size: 0.8em; + font-weight: normal; +} +dl.tsd-comment-tags dd { + margin: 0 0 3px 0; +} +dl.tsd-comment-tags dd:before, +dl.tsd-comment-tags dd:after { + display: table; + content: " "; +} +dl.tsd-comment-tags dd pre, +dl.tsd-comment-tags dd:after { + clear: both; +} +dl.tsd-comment-tags p { + margin: 0; +} + +.tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; +} +.tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; +} + +.toggle-protected .tsd-is-private { + display: none; +} + +.toggle-public .tsd-is-private, +.toggle-public .tsd-is-protected, +.toggle-public .tsd-is-private-protected { + display: none; +} + +.toggle-inherited .tsd-is-inherited { + display: none; +} + +.toggle-only-exported .tsd-is-not-exported { + display: none; +} + +.toggle-externals .tsd-is-external { + display: none; +} + +#tsd-filter { + position: relative; + display: inline-block; + height: 40px; + vertical-align: bottom; +} +.no-filter #tsd-filter { + display: none; +} +#tsd-filter .tsd-filter-group { + display: inline-block; + height: 40px; + vertical-align: bottom; + white-space: nowrap; +} +#tsd-filter input { + display: none; +} +@media (max-width: 900px) { + #tsd-filter .tsd-filter-group { + display: block; + position: absolute; + top: 40px; + right: 20px; + height: auto; + background-color: var(--color-panel); + visibility: hidden; + transform: translate(50%, 0); + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); + } + .has-options #tsd-filter .tsd-filter-group { + visibility: visible; + } + .to-has-options #tsd-filter .tsd-filter-group { + animation: fade-in 0.2s; + } + .from-has-options #tsd-filter .tsd-filter-group { + animation: fade-out 0.2s; + } + #tsd-filter label, + #tsd-filter .tsd-select { + display: block; + padding-right: 20px; + } +} + +footer { + border-top: 1px solid var(--color-panel-divider); + background-color: var(--color-panel); +} +footer:after { + content: ""; + display: table; +} +footer.with-border-bottom { + border-bottom: 1px solid var(--color-panel-divider); +} +footer .tsd-legend-group { + font-size: 0; +} +footer .tsd-legend { + display: inline-block; + width: 25%; + padding: 0; + font-size: 14px; + list-style: none; + line-height: 1.333em; + vertical-align: top; +} +@media (max-width: 900px) { + footer .tsd-legend { + width: 50%; + } +} + +.tsd-hierarchy { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-hierarchy .target { + font-weight: bold; +} + +.tsd-index-panel .tsd-index-content { + margin-bottom: 0px !important; +} +.tsd-index-panel .tsd-index-section { + margin-bottom: 0px !important; +} +.tsd-index-panel h3 { + margin: 0 -15px 10px -15px; + padding: 0 15px 10px 15px; + border-bottom: 1px solid var(--color-panel-divider); +} +.tsd-index-panel ul.tsd-index-list { + -webkit-column-count: 3; + -moz-column-count: 3; + -ms-column-count: 3; + -o-column-count: 3; + column-count: 3; + -webkit-column-gap: 15px; + -moz-column-gap: 15px; + -ms-column-gap: 15px; + -o-column-gap: 15px; + column-gap: 15px; + padding: 0; + list-style: none; + line-height: 1.333em; +} +@media (max-width: 640px) { + .tsd-index-panel ul.tsd-index-list { + -webkit-column-count: 1; + -moz-column-count: 1; + -ms-column-count: 1; + -o-column-count: 1; + column-count: 1; + } +} +@media (min-width: 641px) and (max-width: 1024px) { + .tsd-index-panel ul.tsd-index-list { + -webkit-column-count: 2; + -moz-column-count: 2; + -ms-column-count: 2; + -o-column-count: 2; + column-count: 2; + } +} +.tsd-index-panel ul.tsd-index-list li { + -webkit-column-break-inside: avoid; + -moz-column-break-inside: avoid; + -ms-column-break-inside: avoid; + -o-column-break-inside: avoid; + column-break-inside: avoid; + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; +} +.tsd-index-panel a, +.tsd-index-panel .tsd-parent-kind-module a { + color: var(--color-ts); +} +.tsd-index-panel .tsd-parent-kind-interface a { + color: var(--color-ts-interface); +} +.tsd-index-panel .tsd-parent-kind-enum a { + color: var(--color-ts-enum); +} +.tsd-index-panel .tsd-parent-kind-class a { + color: var(--color-ts-class); +} +.tsd-index-panel .tsd-kind-module a { + color: var(--color-ts); +} +.tsd-index-panel .tsd-kind-interface a { + color: var(--color-ts-interface); +} +.tsd-index-panel .tsd-kind-enum a { + color: var(--color-ts-enum); +} +.tsd-index-panel .tsd-kind-class a { + color: var(--color-ts-class); +} +.tsd-index-panel .tsd-is-private a { + color: var(--color-ts-private); +} + +.tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; +} + +.tsd-anchor { + position: absolute; + top: -15px; +} + +.tsd-member { + position: relative; +} +.tsd-member .tsd-anchor + h3 { + margin-top: 0; + margin-bottom: 0; +} +.tsd-member [data-tsd-kind] { + color: var(--color-ts); +} +.tsd-member [data-tsd-kind="Interface"] { + color: var(--color-ts-interface); +} +.tsd-member [data-tsd-kind="Enum"] { + color: var(--color-ts-enum); +} +.tsd-member [data-tsd-kind="Class"] { + color: var(--color-ts-class); +} +.tsd-member [data-tsd-kind="Private"] { + color: var(--color-ts-private); +} + +.tsd-navigation a { + display: block; + padding-top: 2px; + padding-bottom: 2px; + color: var(--color-text); + text-decoration: none; +} +.tsd-navigation a:hover { + text-decoration: underline; +} +.tsd-navigation ul { + margin: 0; + padding: 0; + list-style: none; +} +.tsd-navigation li { + padding: 0; +} + +.tsd-navigation.primary { + padding-bottom: 10px; +} +.tsd-navigation.primary a { + display: block; + padding-top: 6px; + padding-bottom: 6px; +} +.tsd-navigation.primary ul li a { + padding-left: 5px; +} +.tsd-navigation.primary ul li li a { + padding-left: 25px; +} +.tsd-navigation.primary ul li li li a { + padding-left: 45px; +} +.tsd-navigation.primary ul li li li li a { + padding-left: 65px; +} +.tsd-navigation.primary ul li li li li li a { + padding-left: 85px; +} +.tsd-navigation.primary ul li li li li li li a { + padding-left: 105px; +} +.tsd-navigation.primary > ul { + border-bottom: 1px solid var(--color-panel-divider); +} +.tsd-navigation.primary li { + border-top: 1px solid var(--color-panel-divider); +} +.tsd-navigation.primary li.current > a { + font-weight: bold; +} +.tsd-navigation.primary li.globals > a { + font-size: 1.17em; + color: var(--color-link); + } +.tsd-navigation.primary li.label span { + display: block; + padding: 20px 0 6px 5px; + color: var(--color-menu-label); +} +.tsd-navigation.primary li.globals + li > span, +.tsd-navigation.primary li.globals + li > a { + padding-top: 20px; +} + +.tsd-navigation.secondary ul { + transition: opacity 0.2s; +} +.tsd-navigation.secondary ul li a { + padding-left: 25px; +} +.tsd-navigation.secondary ul li li a { + padding-left: 45px; +} +.tsd-navigation.secondary ul li li li a { + padding-left: 65px; +} +.tsd-navigation.secondary ul li li li li a { + padding-left: 85px; +} +.tsd-navigation.secondary ul li li li li li a { + padding-left: 105px; +} +.tsd-navigation.secondary ul li li li li li li a { + padding-left: 125px; +} +.tsd-navigation.secondary li.current > a { + font-weight: bold; +} + +@media (min-width: 901px) { + .menu-sticky-wrap { + position: static; + } + .no-csspositionsticky .menu-sticky-wrap.sticky { + position: fixed; + } + .no-csspositionsticky .menu-sticky-wrap.sticky-current { + position: fixed; + } + .no-csspositionsticky .menu-sticky-wrap.sticky-current ul.before-current, + .no-csspositionsticky .menu-sticky-wrap.sticky-current ul.after-current { + opacity: 0; + } + .no-csspositionsticky .menu-sticky-wrap.sticky-bottom { + position: absolute; + top: auto !important; + left: auto !important; + bottom: 0; + right: 0; + } + .csspositionsticky .menu-sticky-wrap.sticky { + position: sticky; + } + .csspositionsticky .menu-sticky-wrap.sticky-current { + position: sticky; + } + } + +.tsd-panel { + margin: 15px 0; + padding: 15px; + background-color: var(--color-panel); + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +.tsd-panel:empty { + display: none; +} +.tsd-panel > h1, +.tsd-panel > h2, +.tsd-panel > h3 { + margin: 1.5em -15px 10px -15px; + padding: 0 15px 10px 15px; + border-bottom: 1px solid var(--color-panel-divider); +} +.tsd-panel > h1.tsd-before-signature, +.tsd-panel > h2.tsd-before-signature, +.tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: 0; +} +.tsd-panel table { + display: block; + width: 100%; + overflow: auto; + margin-top: 10px; + word-break: normal; + word-break: keep-all; + border-collapse: collapse; +} +.tsd-panel table th { + font-weight: bold; +} +.tsd-panel table th, +.tsd-panel table td { + padding: 6px 13px; + border: 1px solid var(--color-panel-divider); +} +.tsd-panel table tr { + background: var(--color-background); +} +.tsd-panel table tr:nth-child(even) { + background: var(--color-secondary-background); +} +.tsd-panel.tsd-extension { + background-color: rgba(255, 255, 0, 0.33); +} + +.tsd-panel-group { + margin: 20px 0; +} +.tsd-panel-group > h1, +.tsd-panel-group > h2, +.tsd-panel-group > h3 { + padding-left: 20px; + padding-right: 20px; +} + +#tsd-search { + transition: background-color 0.2s; +} +#tsd-search .title { + position: relative; + z-index: 2; +} +#tsd-search .field { + position: absolute; + left: 0; + top: 0; + right: 40px; + height: 40px; +} +#tsd-search .field input { + box-sizing: border-box; + position: relative; + z-index: 1; + width: 100%; + padding: 0 10px; + opacity: 0; + outline: 0; + border: 0; + background: transparent; + color: var(--color-text); +} +#tsd-search .field label { + position: absolute; + overflow: hidden; + right: -40px; +} +#tsd-search .field input, +#tsd-search .title { + transition: opacity 0.2s; +} +#tsd-search .results { + position: absolute; + visibility: hidden; + top: 40px; + width: 100%; + margin: 0; + padding: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +#tsd-search .results li { + padding: 0 10px; + background-color: var(--color-background); +} +#tsd-search .results li:nth-child(even) { + background-color: var(--color-panel); +} +#tsd-search .results li.state { + display: none; +} +#tsd-search .results li.current, +#tsd-search .results li:hover { + background-color: var(--color-panel-divider); +} +#tsd-search .results a { + display: block; +} +#tsd-search .results a:before { + top: 10px; +} +#tsd-search .results span.parent { + color: var(--color-text-aside); + font-weight: normal; +} +#tsd-search .results span.match { + font-weight: 500; +} +#tsd-search.has-focus { + background-color: var(--color-panel-divider); +} +#tsd-search.has-focus .field input { + top: 0; + opacity: 1; +} +#tsd-search.has-focus .title { + z-index: 0; + opacity: 0; +} +#tsd-search.has-focus .results { + visibility: visible; +} +#tsd-search.loading .results li.state.loading { + display: block; +} +#tsd-search.failure .results li.state.failure { + display: block; +} + +.tsd-signature { + margin: 0 0 1em 0; + padding: 10px; + border: 1px solid var(--color-panel-divider); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 13px; + overflow-x: auto; +} +.tsd-signature.tsd-kind-icon { + padding-left: 30px; +} +.tsd-signature.tsd-kind-icon:before { + top: 10px; + left: 10px; +} +.tsd-panel > .tsd-signature { + margin-left: -15px; + margin-right: -15px; + border-width: 1px 0; +} +.tsd-panel > .tsd-signature.tsd-kind-icon { + padding-left: 40px; +} +.tsd-panel > .tsd-signature.tsd-kind-icon:before { + left: 20px; +} + +.tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; +} + +.tsd-signature-type { + font-style: italic; + font-weight: normal; +} + +.tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + border-bottom: 1px solid var(--color-panel-divider); +} +.tsd-signatures .tsd-signature { + margin: 0; + border-width: 1px 0 0 0; + transition: background-color 0.1s; +} +.tsd-signatures .tsd-signature:first-child { + border-top-width: 0; +} +.tsd-signatures .tsd-signature.current { + background-color: var(--color-signature-current); +} +.tsd-signatures.active > .tsd-signature { + cursor: pointer; +} +.tsd-panel > .tsd-signatures { + margin-left: -15px; + margin-right: -15px; + border-width: 1px 0; +} +.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon { + padding-left: 40px; +} +.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon:before { + left: 20px; +} +.tsd-panel > a.anchor + .tsd-signatures { + border-top-width: 0; + margin-top: -20px; +} + +ul.tsd-descriptions { + position: relative; + overflow: hidden; + margin-top: 0; + padding: 0; + padding-top: 10px; + list-style: none; +} +ul.tsd-descriptions.active > .tsd-description { + display: none; +} +ul.tsd-descriptions.active > .tsd-description.current { + display: block; +} +ul.tsd-descriptions.active > .tsd-description.fade-in { + animation: fade-in-delayed 0.3s; +} +ul.tsd-descriptions.active > .tsd-description.fade-out { + animation: fade-out-delayed 0.3s; + position: absolute; + display: block; + top: 0; + left: 0; + right: 0; + opacity: 0; + visibility: hidden; +} +ul.tsd-descriptions h4, +ul.tsd-descriptions .tsd-index-panel h3, +.tsd-index-panel ul.tsd-descriptions h3 { + font-size: 14px; + margin: 0.5em 0; +} + +ul.tsd-parameters, +ul.tsd-type-parameters { + list-style: square; + margin: 0; + padding-left: 20px; + padding-bottom: 0px; +} +ul.tsd-parameters > li.tsd-parameter-signature, +ul.tsd-type-parameters > li.tsd-parameter-signature { + list-style: none; + margin-left: -15px; +} +ul.tsd-parameters h5, +ul.tsd-type-parameters h5 { + font-size: 14px; + margin: 0.5em 0; +} +ul.tsd-parameters .tsd-comment p, +ul.tsd-type-parameters .tsd-comment p { + margin: 0.5em 0; +} + +.tsd-sources { + font-size: 13px; + color: var(--color-text-aside); + margin: 0 0 1em 0; +} +.tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; +} +.tsd-sources ul, +.tsd-sources p { + margin: 0 !important; +} +.tsd-sources ul { + list-style: none; + padding: 0; +} + +.tsd-page-toolbar { + position: absolute; + z-index: 1; + top: 0; + left: 0; + width: 100%; + height: 40px; + color: var(--color-toolbar-text); + background: var(--color-toolbar); + border-bottom: 1px solid var(--color-panel-divider); +} +.tsd-page-toolbar a { + color: var(--color-toolbar-text); + text-decoration: none; +} +.tsd-page-toolbar a.title { + font-weight: bold; +} +.tsd-page-toolbar a.title:hover { + text-decoration: underline; +} +.tsd-page-toolbar .table-wrap { + display: table; + width: 100%; + height: 40px; +} +.tsd-page-toolbar .table-cell { + display: table-cell; + position: relative; + white-space: nowrap; + line-height: 40px; +} +.tsd-page-toolbar .table-cell:first-child { + width: 100%; +} + +.tsd-page-toolbar--hide { + transform: translateY(-100%); +} + +.tsd-select .tsd-select-list li:before, +.tsd-select .tsd-select-label:before, +.tsd-widget:before { + content: ""; + display: inline-block; + width: 40px; + height: 40px; + margin: 0 -8px 0 0; + background-image: url(./widgets.png); + background-repeat: no-repeat; + text-indent: -1024px; + vertical-align: bottom; + filter: var(--icon-filter); +} +@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { + .tsd-select .tsd-select-list li:before, + .tsd-select .tsd-select-label:before, + .tsd-widget:before { + background-image: url(./widgets@2x.png); + background-size: 320px 40px; + } +} + +.tsd-widget { + display: inline-block; + overflow: hidden; + opacity: 0.8; + height: 40px; + transition: opacity 0.1s, background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-widget:hover { + opacity: 0.9; +} +.tsd-widget.active { + opacity: 1; + background-color: var(--color-panel-divider); +} +.tsd-widget.no-caption { + width: 40px; +} +.tsd-widget.no-caption:before { + margin: 0; +} +.tsd-widget.search:before { + background-position: 0 0; +} +.tsd-widget.menu:before { + background-position: -40px 0; +} +.tsd-widget.options:before { + background-position: -80px 0; +} +.tsd-widget.options, +.tsd-widget.menu { + display: none; +} +@media (max-width: 900px) { + .tsd-widget.options, + .tsd-widget.menu { + display: inline-block; + } +} +input[type="checkbox"] + .tsd-widget:before { + background-position: -120px 0; +} +input[type="checkbox"]:checked + .tsd-widget:before { + background-position: -160px 0; +} + +.tsd-select { + position: relative; + display: inline-block; + height: 40px; + transition: opacity 0.1s, background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-select .tsd-select-label { + opacity: 0.6; + transition: opacity 0.2s; +} +.tsd-select .tsd-select-label:before { + background-position: -240px 0; +} +.tsd-select.active .tsd-select-label { + opacity: 0.8; +} +.tsd-select.active .tsd-select-list { + visibility: visible; + opacity: 1; + transition-delay: 0s; +} +.tsd-select .tsd-select-list { + position: absolute; + visibility: hidden; + top: 40px; + left: 0; + margin: 0; + padding: 0; + opacity: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); + transition: visibility 0s 0.2s, opacity 0.2s; +} +.tsd-select .tsd-select-list li { + padding: 0 20px 0 0; + background-color: var(--color-background); +} +.tsd-select .tsd-select-list li:before { + background-position: 40px 0; +} +.tsd-select .tsd-select-list li:nth-child(even) { + background-color: var(--color-panel); +} +.tsd-select .tsd-select-list li:hover { + background-color: var(--color-panel-divider); +} +.tsd-select .tsd-select-list li.selected:before { + background-position: -200px 0; +} +@media (max-width: 900px) { + .tsd-select .tsd-select-list { + top: 0; + left: auto; + right: 100%; + margin-right: -5px; + } + .tsd-select .tsd-select-label:before { + background-position: -280px 0; + } +} + +img { + max-width: 100%; +} + +.tsd-anchor-icon { + margin-left: 10px; + vertical-align: middle; + color: var(--color-text); + display: inline-flex; + height: 1.17em; +} + +.tsd-anchor-icon svg { + width: 1em; + height: 1em; + visibility: hidden; +} + +.tsd-anchor-link:hover > .tsd-anchor-icon svg { + visibility: visible; +} diff --git a/api/assets/widgets.png b/api/assets/widgets.png new file mode 100644 index 0000000000000000000000000000000000000000..c7380532ac1b45400620011c37c4dcb7aec27a4c GIT binary patch literal 480 zcmeAS@N?(olHy`uVBq!ia0y~yU~~YoH8@y+q^jrZML>b&o-U3d6^w6h1+IPUz|;DW zIZ;96kdsD>Qv^q=09&hp0GpEni<1IR%gvP3v%OR9*{MuRTKWHZyIbuBt)Ci`cU_&% z1T+i^Y)o{%281-<3TpPAUTzw5v;RY=>1rvxmPl96#kYc9hX!6V^nB|ad#(S+)}?8C zr_H+lT3B#So$T=?$(w3-{rbQ4R<@nsf$}$hwSO)A$8&`(j+wQf=Jwhb0`CvhR5DCf z^OgI)KQemrUFPH+UynC$Y~QHG%DbTVh-Skz{enNU)cV_hPu~{TD7TPZl>0&K>iuE| z7AYn$7)Jrb9GE&SfQW4q&G*@N|4cHI`VakFa5-C!ov&XD)J(qp$rJJ*9e z-sHv}#g*T7Cv048d1v~BEAzM5FztAse#q78WWC^BUCzQ U&wLp6h6BX&boFyt=akR{0G%$)mH+?% literal 0 HcmV?d00001 diff --git a/api/assets/widgets@2x.png b/api/assets/widgets@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4bbbd57272f3b28f47527d4951ad10f950b8ad43 GIT binary patch literal 855 zcmeAS@N?(olHy`uVBq!ia0y~yU}^xe12~w0Jcmn z@(X6T|9^jgLcx21{)7exgY)a>N6m2F0<`Rqr;B4q1>>88jUdw-7W`c)zLE*mq8W2H z-<&Jl_Hco5BuC5n@AbF5GD82~-e8-v=#zCyUX0F-o}8pPfAv`!GN$ff+TL<~@kgt} z62eO?_|&+>xBmM$@p|z`tIKEdpPf8%qI>4r7@jn<=eta*{3~?g(zz{Ke9zc-G^gr? z-7foa?LcS!hmbwzru}ICvbWLlW8;+l-}!^=c32!^nV`+`C*;0-*Y%l94pC;Cb3GXz zzSf%a!{gVr{Y_lVuUj+a)*Ca+!-Hu%xmP&&X-2CuANY8^i{D7Kg6qzP zXz_ps9+lN8ESH{K4`yu&b~I>N9xGlE&;2u*b?+Go!AhN?m-bxlLvtC#MzDF2kFzfHJ1W7ybqdefSqVhbOykd*Yi%EDuhs z4wF{ft^bv2+DDnKb8gj1FuvcV`M}luS>lO<^)8x>y1#R;a=-ZKwWTQQb)ioBbi;zh zD!f5V)8581to1LL7c9!l^PSC$NBPYif!_vAZhmL4)v4U)4UsrLYiH_9rmQDd?)(e5 z^pcH>qvBg*i0dus2r*mp4;zKvu=P#s-ti;2obl`NjjwoYd>e(oo#j_uyRb<7Pv^If zzZ|mGHmV)8^tbO%^>eqMw(@7(&3g{jEp-Najo7V75xI_ZHK*FA`elF{r5}E*d7+j_R literal 0 HcmV?d00001 diff --git a/api/index.html b/api/index.html index 8b5f718e2..697e0dbad 100644 --- a/api/index.html +++ b/api/index.html @@ -1,652 +1,52 @@ - - - - - - GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

GoJS API

-
-
-
-
-
-
-
-
-
-

GoJS Class Index

-
-
-
-

Diagram Classes

- -
-
-

Geometry Classes

- -
-
-

Model Classes

- -
-
-

Layout Classes

- -
-
-

Tool Classes

- -
-
-

Collection Classes

- -
-
-

Extension Classes

- -
-
-

Layout Extension Classes

- -
-
-

Part Extension Classes

- -
-
-

Tool Extension Classes

- -
-
-

Storage Classes

- -
-
-
-
-
-

Type

-
- -

- BackConversion - : ((val: any, sourceData: any, model: Model) => any) | null

-
-

For bindings: The optional conversion function to convert property values back to data values. - Specifying this function modifies a binding to set its Binding.mode to be Binding.TwoWay. - If you want a two-way binding without a back-conversion function, specify null for a BackConversion. - If you do not want a two-way binding, omit any BackConversion.

-
-
-
- -

- BrushLike - : Brush | string | null

-
-

The BrushLike type is the same as Brush | string | null. - A string in place of a Brush object is treated as a Solid Brush of that color.

-
-
-
- -

- DiagramInitOptions - : Partial<Diagram | {[ P in DiagramEventName]: (e: DiagramEvent) => void } | DiagramInitStrings>

-
-

DiagramInitOptions are used in the Diagram constructor to concisely initialize a Diagram by settings its properties, - and also set properties on its Tools, CommandHandler, AnimationManager, and set DiagramEvents.

-
-
-
- -

- EasingFunction - : (currentTime: number, startValue: number, byValue: number, duration: number) => number

-
-

An EasingFunction describes how much to modify a scalar value based on - the current time, the start value, the change in value, and the duration.

-
-
-

Type declaration

-
    -
-
-
-
- -

- Key - : string | number | undefined

-
-

The Key type is the same as string | number | undefined.

-
-
-
- -

- MarginLike - : Margin | number

-
-

The MarginLike type is the same as Margin | number. - A number in place of a Margin object is treated as a uniform Margin with that thickness.

-
-
-
- -

- TargetConversion - : ((val: any, targetObj: any) => any) | null

-
-

For bindings: A side-effect-free function converting the data property value to the value to set the target property. - If the function is null or not supplied, no conversion takes place.

-
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

GoJS API

GoJS Class Index

Diagram Classes

Geometry Classes

Model Classes

Layout Classes

Tool Classes

Collection Classes

Extension Classes

Layout Extension Classes

Part Extension Classes

Tool Extension Classes

Storage Classes

Type

+

For bindings: The optional conversion function to convert property values back to data values. +Specifying this function modifies a binding to set its Binding.mode to be Binding.TwoWay. +If you want a two-way binding without a back-conversion function, specify null for a BackConversion. +If you do not want a two-way binding, omit any BackConversion.

+
+

The BrushLike type is the same as Brush | string | null. +A string in place of a Brush object is treated as a Solid Brush of that color.

+
+

DiagramInitOptions are used in the Diagram constructor to concisely initialize a Diagram by settings its properties, +and also set properties on its Tools, CommandHandler, AnimationManager, and set DiagramEvents.

+

Type declaration

    • (currentTime: number, startValue: number, byValue: number, duration: number): number
    • +

      An EasingFunction describes how much to modify a scalar value based on +the current time, the start value, the change in value, and the duration.

      +

      Parameters

      • currentTime: number
      • startValue: number
      • byValue: number
      • duration: number

      Returns number

+

The Key type is the same as string | number | undefined.

+
+

The MarginLike type is the same as Margin | number. +A number in place of a Margin object is treated as a uniform Margin with that thickness.

+
+

For bindings: A side-effect-free function converting the data property value to the value to set the target property. +If the function is null or not supplied, no conversion takes place.

+

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/ActionTool.html b/api/symbols/ActionTool.html index 598720124..f26eb4007 100644 --- a/api/symbols/ActionTool.html +++ b/api/symbols/ActionTool.html @@ -1,341 +1,63 @@ - - - - - - ActionTool | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class ActionTool

-
-
-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - Tool -
      -
    • - ActionTool -
    • -
    -
  • -
-
-
-
-

The ActionTool is responsible for handling and dispatching mouse events on GraphObjects - that have GraphObject.isActionable set to true. - This is how one implements "controls", such as buttons or sliders or knobs, as GraphObjects - that can be inside Parts without interfering with the standard tool behaviors.

-

This tool allows individual GraphObjects (usually Panels) to handle mouse-down-move-up events without - having to define new Tools. - It does this by calling GraphObject.actionDown, GraphObject.actionMove, GraphObject.actionUp, - and GraphObject.actionCancel on objects that have GraphObject.isActionable set to true.

-

This tool is a standard mouse-down tool, the ToolManager.actionTool.

-

This tool does not utilize any Adornments or tool handles. - This tool does not modify the model or conduct any transaction, although the actions that this invokes may do so.

-

It would be very unusual to want to customize this tool.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- - -
-
-
-

Methods

-
- -

- Override Virtual - canStart -

-
    -
  • canStart(): boolean
  • -
-
    -
  • -
    -

    This tool can run when there is a mouse-down on an object with GraphObject.isActionable true - or if the object is within a Panel that "isActionable".

    -

    This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Returns boolean

    -
  • -
-
-
- -

- Override - doCancel -

-
    -
  • doCancel(): void
  • -
- -
-
- -

- Override - doMouseDown -

-
    -
  • doMouseDown(): void
  • -
- -
-
- -

- Override - doMouseMove -

-
    -
  • doMouseMove(): void
  • -
-
    -
  • -
    -

    If this tool is active call GraphObject.actionMove, if it exists, on the active object.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doMouseUp -

-
    -
  • doMouseUp(): void
  • -
- -
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class ActionTool

Hierarchy

+

The ActionTool is responsible for handling and dispatching mouse events on GraphObjects +that have GraphObject.isActionable set to true. +This is how one implements "controls", such as buttons or sliders or knobs, as GraphObjects +that can be inside Parts without interfering with the standard tool behaviors.

+

This tool allows individual GraphObjects (usually Panels) to handle mouse-down-move-up events without +having to define new Tools. +It does this by calling GraphObject.actionDown, GraphObject.actionMove, GraphObject.actionUp, +and GraphObject.actionCancel on objects that have GraphObject.isActionable set to true.

+

This tool is a standard mouse-down tool, the ToolManager.actionTool.

+

This tool does not utilize any Adornments or tool handles. +This tool does not modify the model or conduct any transaction, although the actions that this invokes may do so.

+

It would be very unusual to want to customize this tool.

+

Index

Inherited Members

Constructors

Methods

  • canStart(): boolean
  • +

    This tool can run when there is a mouse-down on an object with GraphObject.isActionable true +or if the object is within a Panel that "isActionable".

    +

    This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    +

    Returns boolean

  • doCancel(): void
  • doMouseDown(): void
  • doMouseMove(): void
  • doMouseUp(): void

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Adornment.html b/api/symbols/Adornment.html index 523dc6931..c8f143b17 100644 --- a/api/symbols/Adornment.html +++ b/api/symbols/Adornment.html @@ -1,355 +1,89 @@ - - - - - - Adornment | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class Adornment

-
-
-
-
-
-
-
-
-
-

Hierarchy

- -
-
-
-

An Adornment is a special kind of Part that is associated with another Part, - the Adornment.adornedPart.

-

Adornments are normally associated with a particular GraphObject in the adorned Part -- - that is the value of adornedObject. - However, the adornedObject may be null, in which case the adornedPart will also be null.

-

The area occupied by the adorned object is represented in the Adornment's visual tree by a Placeholder. - The placeholder is always the Part.locationObject, - although you may specify any Spot as the Part.locationSpot. - An adornment need not have a placeholder, but it may have at most one.

-

Adornments can be distinguished by their Part.category. - This property can be an arbitrary string value determined by the code creating the adornment, - typically a tool that wants to be able to tell various adornments apart from each other. - Use the Part.findAdornment method to find an adornment for a part of a given category.

-

For example, one of the Adornments created by Part.updateAdornments when the part - Part.isSelected has the Part.category of "Selection". - Those created by ResizingTool.updateAdornments have a category of "Resize" - and normally contain eight resize handles.

-

Besides the selection Adornment and tool Adornments, Adornments are also used for - context menus and tooltips. - The adornedObject in such cases refers to the GraphObject to which the - the context menu or tooltip applies.

-

There cannot be any links connected to an Adornment, - nor can an Adornment have members or be a member of a group.

-

An Adornment cannot have its own Adornments. - An Adornment cannot be selected.

-

Adornments are not positioned by a Layout because they are normally positioned - according to the Part that they adorn.

-

For more discussion and examples, see Selection, - ToolTips, - Context Menus, and - Tools.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- -
    -
  • -
    -

    Constructs an empty Adornment of the given type. Default type is Panel.Position. - The panel type must be one of the enumerated values defined on the Panel class, including: - Panel.Position, Panel.Vertical, Panel.Horizontal, Panel.Table, - Panel.Auto, Panel.Spot, or Panel.Viewbox. The string value such as "Auto" may also be used.

    -

    Usage example:

    -
    // Constructs an Adornment, sets properties on it,
    -// adds a data binding to it,
    -// and adds two GraphObjects to the Adornment:
    -const a = new go.Adornment("Auto", {
    -  margin: 5,
    -  background: "red"
    -})
    -.add(new go.Shape("RoundedRectangle"))
    -.add(new go.TextBlock("Some Text"))
    +Adornment | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class Adornment

    Hierarchy

    +

    An Adornment is a special kind of Part that is associated with another Part, +the Adornment.adornedPart.

    +

    Adornments are normally associated with a particular GraphObject in the adorned Part -- +that is the value of adornedObject. +However, the adornedObject may be null, in which case the adornedPart will also be null.

    +

    The area occupied by the adorned object is represented in the Adornment's visual tree by a Placeholder. +The placeholder is always the Part.locationObject, +although you may specify any Spot as the Part.locationSpot. +An adornment need not have a placeholder, but it may have at most one.

    +

    Adornments can be distinguished by their Part.category. +This property can be an arbitrary string value determined by the code creating the adornment, +typically a tool that wants to be able to tell various adornments apart from each other. +Use the Part.findAdornment method to find an adornment for a part of a given category.

    +

    For example, one of the Adornments created by Part.updateAdornments when the part +Part.isSelected has the Part.category of "Selection". +Those created by ResizingTool.updateAdornments have a category of "Resize" +and normally contain eight resize handles.

    +

    Besides the selection Adornment and tool Adornments, Adornments are also used for +context menus and tooltips. +The adornedObject in such cases refers to the GraphObject to which the +the context menu or tooltip applies.

    +

    There cannot be any links connected to an Adornment, +nor can an Adornment have members or be a member of a group.

    +

    An Adornment cannot have its own Adornments. +An Adornment cannot be selected.

    +

    Adornments are not positioned by a Layout because they are normally positioned +according to the Part that they adorn.

    +

    For more discussion and examples, see Selection, +ToolTips, +Context Menus, and +Tools.

    +

    Index

    Inherited Members

    Properties

    Methods

    Constructors

    • +

      Constructs an empty Adornment of the given type. Default type is Panel.Position. +The panel type must be one of the enumerated values defined on the Panel class, including: +Panel.Position, Panel.Vertical, Panel.Horizontal, Panel.Table, +Panel.Auto, Panel.Spot, or Panel.Viewbox. The string value such as "Auto" may also be used.

      +

      Usage example:

      +
      // Constructs an Adornment, sets properties on it,
      // adds a data binding to it,
      // and adds two GraphObjects to the Adornment:
      const a = new go.Adornment("Auto", {
      margin: 5,
      background: "red"
      })
      .add(new go.Shape("RoundedRectangle"))
      .add(new go.TextBlock("Some Text"))
      -
      -

      Parameters

      -
        -
      • -
        Optional type: string | PanelLayout
        -
        -

        Panel Type as either a string or PanelLayout. such as "Vertical", "Auto", or Panel.Vertical, Panel.Auto, are accepted. - If not supplied, the default Panel type is "Position".

        -
        -
      • -
      • -
        Optional init: Partial<Adornment>
        -
        -

        Optional initialization properties.

        -
        -
      • -
      -

      Returns Adornment

      -
    • -
    • -
      -

      Constructs an empty Panel. Default type is Panel.Position.

      -
      -

      Parameters

      -
        -
      • -
        Optional init: Partial<Adornment>
        -
        -

        Optional initialization properties.

        -
        -
      • -
      -

      Returns Adornment

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - adornedObject - : GraphObject

    -
      -
    • -
      -

      Gets or sets the GraphObject that is adorned. - Setting this property updates the adorned object's Part by calling Part.addAdornment. - This may be null if the Adornment does not adorn a particular object.

      -
      -
    • -
    -
    -
    - -

    - Read-only - adornedPart - : Part

    -
      -
    • -
      -

      This read-only property returns the Part that contains the adorned object. - This will be null if the adornedObject is null.

      -
      -
    • -
    -
    -
    - -

    - Read-only - placeholder - : Placeholder

    -
      -
    • -
      -

      This read-only property returns a Placeholder that this Adornment may contain in its visual tree. - This may be null if there is no such placeholder object.

      -
      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Animation.html b/api/symbols/Animation.html index 13296c84e..47984fda9 100644 --- a/api/symbols/Animation.html +++ b/api/symbols/Animation.html @@ -1,697 +1,171 @@ - - - - - - Animation | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class Animation

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - Animation -
    • -
    -
    -
    -
    -

    Animations are used to animate GraphObject and Diagram properties.

    -

    This class is useful for creating manual animations. - If you wish to animate particular properties on a GraphObject every time their value changes, - you may want to use AnimationTriggers instead, which automatically create and start Animations.

    -

    The AnimationManager.defaultAnimation is an instance of this class, and carries out the - default animations in GoJS: Model load, layout, expand and collapse, and so on. - See the Introduction Page on Animations for more detail on the different kinds of animations.

    -

    Manual animations are set up by creating an instance of this class, and calling add at least once, then calling start. - The method add specifies which objects and which animation effects/properties to animate, plus start and end values for the property. - As objects are added to an Animation, the Animation infers which Diagram and AnimationManager is relevant.

    -

    Animations are started by calling start, and stopped when the duration is reached, or when stop is called, - or stopped when AnimationManager.stopAnimation is called with true as its argument.

    -

    Animations can continue indefinitely if runCount is set to Infinity. - Animations can act upon temporary copies of an object that will get destroyed by calling addTemporaryPart. - This is useful when crafting cosmetic animations of parts that are about to be deleted: - Since the part will no longer exist, you can instead animate a temporary part disappearing.

    -

    A simple example usage is this:

    -
    var node = myDiagram.nodes.first();
    -var shape = part.findObject("SHAPE"); // assumes this Node contains a go.Shape with .name = "SHAPE"
    -var animation = new go.Animation();
    -// Animate this Node from its current position  to (400, 500)
    -animation.add(node, "position", node.position, new go.Point(400, 500));
    -// Animate the fill of the Shape within the Node, from its current color to blue
    -animation.add(shape, "fill", shape.fill, "blue");
    -// Both of these effects will animate simultaneously when start() is called:
    -animation.start();
    +Animation | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class Animation

    Hierarchy

    • Animation
    +

    Animations are used to animate GraphObject and Diagram properties.

    +

    This class is useful for creating manual animations. +If you wish to animate particular properties on a GraphObject every time their value changes, +you may want to use AnimationTriggers instead, which automatically create and start Animations.

    +

    The AnimationManager.defaultAnimation is an instance of this class, and carries out the +default animations in GoJS: Model load, layout, expand and collapse, and so on. +See the Introduction Page on Animations for more detail on the different kinds of animations.

    +

    Manual animations are set up by creating an instance of this class, and calling add at least once, then calling start. +The method add specifies which objects and which animation effects/properties to animate, plus start and end values for the property. +As objects are added to an Animation, the Animation infers which Diagram and AnimationManager is relevant.

    +

    Animations are started by calling start, and stopped when the duration is reached, or when stop is called, +or stopped when AnimationManager.stopAnimation is called with true as its argument.

    +

    Animations can continue indefinitely if runCount is set to Infinity. +Animations can act upon temporary copies of an object that will get destroyed by calling addTemporaryPart. +This is useful when crafting cosmetic animations of parts that are about to be deleted: +Since the part will no longer exist, you can instead animate a temporary part disappearing.

    +

    A simple example usage is this:

    +
    var node = myDiagram.nodes.first();
    var shape = part.findObject("SHAPE"); // assumes this Node contains a go.Shape with .name = "SHAPE"
    var animation = new go.Animation();
    // Animate this Node from its current position to (400, 500)
    animation.add(node, "position", node.position, new go.Point(400, 500));
    // Animate the fill of the Shape within the Node, from its current color to blue
    animation.add(shape, "fill", shape.fill, "blue");
    // Both of these effects will animate simultaneously when start() is called:
    animation.start();
    -

    See the Introduction Page on Animations and the Custom Animations sample - for more example usage of the Animation class.

    -

    Unlike the AnimationManager.defaultAnimation, Animations can be started any time, - and do not stop automatically when a new transaction begins.

    -
    -
    since
    -

    2.1

    -
    -
    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -

    Constants

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      The constructor creates an Animation. - A single Animation can animate multiple objects via multiple calls to add. - When you are ready to begin the animation, call start.

      -
      -

      Parameters

      -
        -
      • -
        Optional init: Partial<Animation>
        -
        -

        Optional properties to initialize.

        -
        -
      • -
      -

      Returns Animation

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - duration - : number

    -
      -
    • -
      -

      Gets or sets the duration for animations, in milliseconds.

      -

      The default value is NaN, which means it inherits the default value from the AnimationManager.duration, - which defaults to 600 milliseconds.

      -

      The value must be a number greater than or equal to 1, or NaN. - Setting this property does not raise any events.

      -
      -
    • -
    -
    -
    - -

    - easing - : EasingFunction

    - -
    -
    - -

    - finished - : (animation: Animation) => void

    -
      -
    • -
      -

      Gets or sets the function to execute when the user Animation finishes.

      -

      By default this property is null.

      -
      -
    • -
    -
    -
    - -

    - Read-only - isAnimating - : boolean

    -
      -
    • -
      -

      This read-only property is true when the Animation is currently running.

      -

      This value cannot be set, but Animation can be stopped by calling stop.

      -
      -
    • -
    -
    -
    - -

    - isViewportUnconstrained - : boolean

    -
      -
    • -
      -

      Gets or sets whether this Animation should allow an unconstrained viewport during the runtime of the animation. - This temporarily sets the Diagram.scrollMode to Diagram.InfiniteScroll, and restores the value at the end of the animation. - This is done so that animating objects can move out of the viewport temporarily during the animation and not trigger scrollbars.

      -

      This may be useful to set for animations that have objects or the Diagram bounds animate from outside the viewport into the view. - The default value is true.

      -
      -
    • -
    -
    -
    - -

    - reversible - : boolean

    -
      -
    • -
      -

      Gets or sets whether this Animation will repeat its animation in reverse at the end of the duration. Default false.

      -

      A reversible Animation, if stopped early, will end at its original state. - Setting this to true doubles the effective duration of the Animation.

      -

      This property should not be set on the AnimationManager.defaultAnimation

      -
      -
    • -
    -
    -
    - -

    - runCount - : number

    -
      -
    • -
      -

      Gets or sets whether this Animation should be repeat, and how many times. The default is 1, which means the animation does not repeat.

      -

      This can be set to any non-zero positive integer, or Infinity. Setting this to Infinity will repeat an animation forever.

      -

      This property should not be set on the AnimationManager.defaultAnimation

      -
      -
      see
      -

      reversible

      -
      -
      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - add -

    - -
      -
    • -
      -

      Add an object (GraphObject or Diagram) and effect name, with specified start and end values, to this Animation.

      -
      -

      Parameters

      -
        -
      • -
        obj: GraphObject | Diagram
        -
        -

        GraphObject or Diagram to animate.

        -
        -
      • -
      • -
        effectName: string
        -
        -

        Animation effect name, such as "scale" to change GraphObject.scale. - By default the supported properties are, for GraphObjects:

        -
          -
        • "position"
        • -
        • "location" (on Parts)
        • -
        • "scale"
        • -
        • "opacity"
        • -
        • "angle"
        • -
        • "desiredSize"
        • -
        • "width"
        • -
        • "height"
        • -
        • "background"
        • -
        • "fill" (on Shapes)
        • -
        • "strokeWidth" (on Shapes)
        • -
        • "strokeDashOffset" (on Shapes)
        • -
        • "stroke" (on Shapes, TextBlocks)
        • -
        -

        For Diagrams:

        -
          -
        • "position"
        • -
        • "scale"
        • -
        • "opacity"
        • -
        -

        More properties can be supported by defining new effects with AnimationManager.defineAnimationEffect.

        -
        -
      • -
      • -
        startValue: any
        -
        -

        The starting value for the animated property. Often this is the current value of the property.

        -
        -
      • -
      • -
        endValue: any
        -
        -

        The ending value for the animated property. Even if the animation is just cosmetic, this must be a valid value for the property. - For instance, for GraphObject.scale, you cannot animate to 0, as this is an invalid scale value. - Instead you would animate to a very small (but still valid) value, such as 0.001.

        -
        -
      • -
      • -
        Optional cosmetic: boolean
        -
        -

        Determines if the animation should revert the property value to the start value at the end of animation. - Default false. This is commonly used when animating opacity or scale of "disappearing" nodes during collapse. - Even though the node may appear to go to scale 0.001, the programmer usually wants the scale to reflect its prior value, once hidden.

        -
        -
      • -
      -

      Returns Animation

      -

      this Animation

      -
    • -
    -
    -
    - -

    - addTemporaryPart -

    - -
      -
    • -
      -
      -

      Parameters

      -
        -
      • -
        part: Part
        -
        -

        A part to add to the Diagram at the start of the animation and remove at the end. - This is typically either a copied Part already in the Diagram, to animate its deletion, - or a Part created programmatically to be used for some effect.

        -
        -
      • -
      • -
        diagram: Diagram
        -
        -

        The Diagram to add the temporary part to, and remove it from, at the start and end of animation, respectively.

        -
        -
      • -
      -

      Returns Animation

      -

      this Animation

      -
    • -
    -
    -
    - -

    - getTemporaryState -

    - -
      -
    • -
      -

      Gets the ObjectData associated with this GraphObject or Diagram. - If no state exists, this creates and returns a new ObjectData.

      -

      This can be used to store temporary information per animated object during the course of an animation. - This state is cleared at the end of an animation.

      -
      -

      Parameters

      - -

      Returns ObjectData

      -
    • -
    -
    -
    - -

    - start -

    - -
      -
    • -
      -

      Start this animation.

      -

      This adds the Animation to its AnimationManager's list of active animations. - The AnimationManager is inferred from the list of objects to be animated, by inspecting their Diagram.

      -

      This does nothing if there are no objects to animate.

      -
      -

      Returns Animation

      -

      this Animation

      -
    • -
    -
    -
    - -

    - stop -

    - -
      -
    • -
      -

      Stops a running Animation and updates the animating objects to their final state.

      -

      If an animation was about to begin, it is cancelled.

      -
      -

      Returns Animation

      -

      this Animation

      -
    • -
    -
    -
    -
    -

    Constants

    -
    - -

    - Static - EaseInExpo - : EasingFunction

    -
    -

    Built-in static function for computing interpolated values. Can be used as a value for Animation.easing.

    -
    -
    -
    - -

    - Static - EaseInOutQuad - : EasingFunction

    -
    -

    Built-in static function for computing interpolated values. Can be used as a value for Animation.easing. - This is the default value for Animation.easing.

    -
    -
    -
    - -

    - Static - EaseInQuad - : EasingFunction

    -
    -

    Built-in static function for computing interpolated values. Can be used as a value for Animation.easing.

    -
    -
    -
    - -

    - Static - EaseLinear - : EasingFunction

    -
    -

    Built-in static function for computing interpolated values. Can be used as a value for Animation.easing.

    -
    -
    -
    - -

    - Static - EaseOutExpo - : EasingFunction

    -
    -

    Built-in static function for computing interpolated values. Can be used as a value for Animation.easing.

    -
    -
    -
    - -

    - Static - EaseOutQuad - : EasingFunction

    -
    -

    Built-in static function for computing interpolated values. Can be used as a value for Animation.easing.

    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/AnimationManager.html b/api/symbols/AnimationManager.html index f77c0d1bb..eff92fe24 100644 --- a/api/symbols/AnimationManager.html +++ b/api/symbols/AnimationManager.html @@ -1,691 +1,182 @@ - - - - - - AnimationManager | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class AnimationManager

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - AnimationManager -
    • -
    -
    -
    -
    -

    AnimationManager handles animations in a Diagram. Each Diagram has one, Diagram.animationManager. - Setting the Model, performing a Layout, Group expansion and Tree expansion automatically start animations through - the defaultAnimation. Animations can be manually started by creating Animations, which are associated with an - AnimationManager.

    -

    Animation is enabled by default, setting the isEnabled property to false will turn off animations for a Diagram.

    -

    When the defaultAnimation begins it raises the "AnimationStarting" Diagram event, - upon completion it raises the "AnimationFinished" Diagram event.

    -

    The defaultAnimation, if running, will stop if a new transaction is started, if an undo or redo is called, - if a layout is invalidated, or if a model is replaced. - When an Animation is stopped, the Diagram immediately finishes the animation and draws the final state. - Animations can be stopped programmatically with the methods AnimationManager.stopAnimation or Animation.stop.

    -
    -
    since
    -

    1.4

    -
    -
    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -

    Constants

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - Read-only - activeAnimations - : Set<Animation>

    -
      -
    • -
      -

      Gets the set of currently animating Animations being managed by this AnimationManager, including any running defaultAnimation.

      -
      -
      since
      -

      2.1

      -
      -
      -
      -
    • -
    -
    -
    - -

    - Read-only - defaultAnimation - : Animation

    -
      -
    • -
      -

      This read-only property gets the Animation that carries out the default built-in GoJS animations. - This animation is usually only referenced to modify default animation properties, - such as the Animation.easing or Animation.duration.

      -

      You should not add anything to or start the default animation, GoJS does so automatically, internally. - When the default animation begins it raises the "AnimationStarting" Diagram event, - upon completion it raises the "AnimationFinished" Diagram event. - You should not modify the properties Animation.runCount or Animation.reversible on the default animation.

      -

      See the Introduction Page on Animations for more detail.

      -
      -
      since
      -

      2.1

      -
      -
      -
      -
    • -
    -
    -
    - -

    - duration - : number

    -
      -
    • -
      -

      Gets or sets the default duration, in milliseconds, used as the duration for the defaultAnimation - and for animations that have their Animation.duration set to NaN.

      -

      Typically these values are short. The default value is 600 milliseconds. - The value must be a number greater than or equal to 1. - Setting this property does not raise any events.

      -
      -
      see
      -

      Animation.duration

      -
      -
      -
      -
    • -
    -
    -
    - -

    - initialAnimationStyle - : EnumValue

    -
      -
    • -
      -

      Gets or sets the initial animation style that is set up by the defaultAnimation. - This can be AnimationManager.Default, AnimationManager.AnimateLocations, or AnimationManager.None.

      - -

      An example custom initial animation, which zooms the Diagram into view:

      -
      myDiagram.animationManager.initialAnimationStyle = go.AnimationManager.None;
      -myDiagram.addDiagramListener('InitialAnimationStarting', function(e) {
      -  var animation = e.subject.defaultAnimation;
      -  animation.easing = go.Animation.EaseOutExpo;
      -  animation.duration = 900;
      -  animation.add(e.diagram, 'scale', 0.1, 1);
      -  animation.add(e.diagram, 'opacity', 0, 1);
      -});
      +AnimationManager | GoJS API
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class AnimationManager

      Hierarchy

      • AnimationManager
      +

      AnimationManager handles animations in a Diagram. Each Diagram has one, Diagram.animationManager. +Setting the Model, performing a Layout, Group expansion and Tree expansion automatically start animations through +the defaultAnimation. Animations can be manually started by creating Animations, which are associated with an +AnimationManager.

      +

      Animation is enabled by default, setting the isEnabled property to false will turn off animations for a Diagram.

      +

      When the defaultAnimation begins it raises the "AnimationStarting" Diagram event, +upon completion it raises the "AnimationFinished" Diagram event.

      +

      The defaultAnimation, if running, will stop if a new transaction is started, if an undo or redo is called, +if a layout is invalidated, or if a model is replaced. +When an Animation is stopped, the Diagram immediately finishes the animation and draws the final state. +Animations can be stopped programmatically with the methods AnimationManager.stopAnimation or Animation.stop.

      +
      since

      1.4

      +

      Index

      Constructors

      Properties

      • +

        Gets the set of currently animating Animations being managed by this AnimationManager, including any running defaultAnimation.

        +
        since

        2.1

        +
      • +

        This read-only property gets the Animation that carries out the default built-in GoJS animations. +This animation is usually only referenced to modify default animation properties, +such as the Animation.easing or Animation.duration.

        +

        You should not add anything to or start the default animation, GoJS does so automatically, internally. +When the default animation begins it raises the "AnimationStarting" Diagram event, +upon completion it raises the "AnimationFinished" Diagram event. +You should not modify the properties Animation.runCount or Animation.reversible on the default animation.

        +

        See the Introduction Page on Animations for more detail.

        +
        since

        2.1

        +
      • +

        Gets or sets the default duration, in milliseconds, used as the duration for the defaultAnimation +and for animations that have their Animation.duration set to NaN.

        +

        Typically these values are short. The default value is 600 milliseconds. +The value must be a number greater than or equal to 1. +Setting this property does not raise any events.

        +
        see

        Animation.duration

        +
      • +

        Gets or sets the initial animation style that is set up by the defaultAnimation. +This can be AnimationManager.Default, AnimationManager.AnimateLocations, or AnimationManager.None.

        + +

        An example custom initial animation, which zooms the Diagram into view:

        +
        myDiagram.animationManager.initialAnimationStyle = go.AnimationManager.None;
        myDiagram.addDiagramListener('InitialAnimationStarting', function(e) {
        var animation = e.subject.defaultAnimation;
        animation.easing = go.Animation.EaseOutExpo;
        animation.duration = 900;
        animation.add(e.diagram, 'scale', 0.1, 1);
        animation.add(e.diagram, 'opacity', 0, 1);
        });
        -
        -
        since
        -

        2.1

        -
        -
        -
        -
      • -
      -
      -
      - -

      - Read-only - isAnimating - : boolean

      -
        -
      • -
        -

        This read-only property is true when the animation manager is currently animating any animation, - including the defaultAnimation.

        -

        This value cannot be set, but animation can be stopped by calling stopAnimation, - and it can be prevented by setting isEnabled.

        -
        -
      • -
      -
      -
      - -

      - isEnabled - : boolean

      -
        -
      • -
        -

        Gets or sets whether this AnimationManager operates.

        -

        The default value is true. - Setting this to false does not stop an animation, it only stops future animations. - To stop any ongoing animation, use stopAnimation. - To disable only the default animations, set canStart to a function that always returns false.

        -

        If any indefinite animations (animations with Animation.runCount set to Infinity) were running - when this is set to false, they will be resumed when this is set to true.

        -

        Setting this property does not raise any events.

        -
        -
        see
        -

        canStart

        -
        -
        -
        -
      • -
      -
      -
      - -

      - isInitial - : boolean

      -
        -
      • -
        -

        Gets or sets whether a default animation is performed on an initial layout.

        -

        The default value is true. - Changing the value does not affect any ongoing animation. - Setting this property does not raise any events.

        -
        -
        since
        -

        1.6

        -
        -
        -
        -
      • -
      -
      -
      - -

      - Read-only - isTicking - : boolean

      -
        -
      • -
        -

        This read-only property is true when the animation manager is in the middle of an animation tick. - Animation only operates on GraphObjects during ticks, but code outside of AnimationManager's control may execute between ticks.

        -

        isTicking can only be true when isAnimating is also true.

        -
        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - canStart -

      -
        -
      • canStart(reason: string): boolean
      • -
      -
        -
      • -
        -

        This method is passed the reason a default animation is to begin, - and must return true or false based on whether or not the animation is to be allowed. - Returning true means the animation will occur, returning false will stop the animation's setup.

        -

        By default, this method always returns true. - Setting this to a function that always returns false will disable all default animations, - but allow other animations, such as AnimationTriggers, to run.

        -

        These are the possible reasons GoJS will begin an animation:

        -

        Called by CommandHandler:

        -
          -
        • "Collapse SubGraph"
        • -
        • "Expand SubGraph"
        • -
        • "Collapse Tree"
        • -
        • "Expand Tree"
        • -
        • "Scroll To Part"
        • -
        • "Zoom To Fit"
        • -
        -

        Called by Diagram:

        -
          -
        • "Model"
        • -
        • "Layout"
        • -
        -

        Called by AnimationTriggers:

        -
          -
        • "Trigger"
        • -
        -

        Example usage:

        -
        // disallow expand/collapse animations, but allow all other default animations:
        -myDiagram.animationManager.canStart = function(reason) {
        -  if (reason === "Expand Tree") return false;
        -  return true;
        -}
        -
        -// disallow all default animations:
        -myDiagram.animationManager.canStart = function(reason) {
        -  return false;
        -}
        +
        since

        2.1

        +
    • +

      This read-only property is true when the animation manager is currently animating any animation, +including the defaultAnimation.

      +

      This value cannot be set, but animation can be stopped by calling stopAnimation, +and it can be prevented by setting isEnabled.

      +
    • +

      Gets or sets whether this AnimationManager operates.

      +

      The default value is true. +Setting this to false does not stop an animation, it only stops future animations. +To stop any ongoing animation, use stopAnimation. +To disable only the default animations, set canStart to a function that always returns false.

      +

      If any indefinite animations (animations with Animation.runCount set to Infinity) were running +when this is set to false, they will be resumed when this is set to true.

      +

      Setting this property does not raise any events.

      +
      see

      canStart

      +
    • +

      Gets or sets whether a default animation is performed on an initial layout.

      +

      The default value is true. +Changing the value does not affect any ongoing animation. +Setting this property does not raise any events.

      +
      since

      1.6

      +
    • +

      This read-only property is true when the animation manager is in the middle of an animation tick. +Animation only operates on GraphObjects during ticks, but code outside of AnimationManager's control may execute between ticks.

      +

      isTicking can only be true when isAnimating is also true.

      +

    Methods

    • canStart(reason: string): boolean
    • +

      This method is passed the reason a default animation is to begin, +and must return true or false based on whether or not the animation is to be allowed. +Returning true means the animation will occur, returning false will stop the animation's setup.

      +

      By default, this method always returns true. +Setting this to a function that always returns false will disable all default animations, +but allow other animations, such as AnimationTriggers, to run.

      +

      These are the possible reasons GoJS will begin an animation:

      +

      Called by CommandHandler:

      +
        +
      • "Collapse SubGraph"
      • +
      • "Expand SubGraph"
      • +
      • "Collapse Tree"
      • +
      • "Expand Tree"
      • +
      • "Scroll To Part"
      • +
      • "Zoom To Fit"
      • +
      +

      Called by Diagram:

      +
        +
      • "Model"
      • +
      • "Layout"
      • +
      +

      Called by AnimationTriggers:

      +
        +
      • "Trigger"
      • +
      +

      Example usage:

      +
      // disallow expand/collapse animations, but allow all other default animations:
      myDiagram.animationManager.canStart = function(reason) {
      if (reason === "Expand Tree") return false;
      return true;
      }

      // disallow all default animations:
      myDiagram.animationManager.canStart = function(reason) {
      return false;
      }
      -
      -
      since
      -

      2.1

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        reason: string
        -
        -

        Reason for starting the animation

        -
        -
      • -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Static - defineAnimationEffect -

    -
      -
    • defineAnimationEffect(effectName: string, animationFunction: (obj: GraphObject | Diagram, startValue: any, endValue: any, easing: EasingFunction, currentTime: number, duration: number, animation: Animation) => void): void
    • -
    -
      -
    • -
      -

      Defines a new named effect to be used in animation, along with a function that tells the AnimationManager how to modify that property.

      -

      Effect names do not need to reflect GraphObject properties, and you can define an effect with a function that modifies several properties for convenience.

      -

      For example, one could define an animation effect named "moveAndSpin" which modifies the object's position and angle.

      -

      Most commonly, an effect is defined with one GraphObject property in mind to be animated, - and the function uses the start and end values, an easing function, and the times to determine a new value for each tick of animation. - Here is an example for animating the fill of GraphObjects:

      -
      // This presumes the object to be animated is a Shape
      -go.AnimationManager.defineAnimationEffect('fill', function(obj, startValue, endValue, easing, currentTime, duration, animation) {
      -  var hueValue = easing(currentTime, startValue, endValue - startValue, duration);
      -  obj.fill = 'hsl(' + hueValue + ', 100%, 80%)';
      -});
      +
      since

      2.1

      +

    Parameters

    • reason: string
      +

      Reason for starting the animation

      +

    Returns boolean

  • stopAnimation(stopsAllAnimations?: boolean): void
  • +

    Stops the defaultAnimation and updates the Diagram to its final state.

    +

    If the argument is true, this stops all running animations. +If an Animation was about to begin, it will be cancelled.

    +

    If the AnimationManager.defaultAnimation is running, this will raise the "AnimationFinished" Diagram event.

    +

    Parameters

    • Optional stopsAllAnimations: boolean
      +

      Whether to stop all animations, instead of just the defaultAnimation. Default false.

      +

    Returns void

  • defineAnimationEffect(effectName: string, animationFunction: (obj: GraphObject | Diagram, startValue: any, endValue: any, easing: EasingFunction, currentTime: number, duration: number, animation: Animation) => void): void
  • +

    Defines a new named effect to be used in animation, along with a function that tells the AnimationManager how to modify that property.

    +

    Effect names do not need to reflect GraphObject properties, and you can define an effect with a function that modifies several properties for convenience.

    +

    For example, one could define an animation effect named "moveAndSpin" which modifies the object's position and angle.

    +

    Most commonly, an effect is defined with one GraphObject property in mind to be animated, +and the function uses the start and end values, an easing function, and the times to determine a new value for each tick of animation. +Here is an example for animating the fill of GraphObjects:

    +
    // This presumes the object to be animated is a Shape
    go.AnimationManager.defineAnimationEffect('fill', function(obj, startValue, endValue, easing, currentTime, duration, animation) {
    var hueValue = easing(currentTime, startValue, endValue - startValue, duration);
    obj.fill = 'hsl(' + hueValue + ', 100%, 80%)';
    });
    -
    -
    since
    -

    2.1

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      effectName: string
      -
      -

      Named effect to animate

      -
      -
    • -
    • -
      animationFunction: (obj: GraphObject | Diagram, startValue: any, endValue: any, easing: EasingFunction, currentTime: number, duration: number, animation: Animation) => void
      -
      -

      Function - that transforms the property values. It takes the animated object, start value, end value, - easing function (the Animation.easing), current time, duration, and animation state. It should modify one or more properties on the object.

      -
      -
        -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- stopAnimation -

-
    -
  • stopAnimation(stopsAllAnimations?: boolean): void
  • -
-
    -
  • -
    -

    Stops the defaultAnimation and updates the Diagram to its final state.

    -

    If the argument is true, this stops all running animations. - If an Animation was about to begin, it will be cancelled.

    -

    If the AnimationManager.defaultAnimation is running, this will raise the "AnimationFinished" Diagram event.

    -
    -

    Parameters

    -
      -
    • -
      Optional stopsAllAnimations: boolean
      -
      -

      Whether to stop all animations, instead of just the defaultAnimation. Default false.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
-
-

Constants

-
- -

- Static - AnimateLocations - : EnumValue

-
-

Used as a value for initialAnimationStyle. - This value will cause initial animations to capture Part locations and animate them from (0, 0) to those location values. - This was the default initial animation behavior in GoJS 2.0 and prior. - See initialAnimationStyle for details and examples.

-
-
since
-

2.1

-
-
-
-
-
- -

- Static - Default - : EnumValue

-
-

Used as the default value for initialAnimationStyle. - The default initial animation style will "fade up" and in the Diagram's contents by animating the Diagram.position and Diagram.opacity. - To make the default initial animation behave like GoJS 2.0, set initialAnimationStyle to AnimationManager.AnimateLocations. - To customize the default initial animation, set initialAnimationStyle to AnimationManager.None - and define a "InitialAnimationStarting" DiagramEvent listener with Diagram.addDiagramListener. - See initialAnimationStyle for details and examples.

-
-
since
-

2.1

-
-
-
-
-
- -

- Static - None - : EnumValue

-
-

Used as a value for initialAnimationStyle. - This will turn off the initial animation, but also allows for customizing the initial animation by adding your own properties - if you define a "InitialAnimationStarting" listener with Diagram.addDiagramListener. - See initialAnimationStyle for details and examples.

-
-
since
-

2.1

-
-
-
-
-
-
- -
-
-
- -
-
- - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/AnimationTrigger.html b/api/symbols/AnimationTrigger.html index b0248694e..71ba3d39a 100644 --- a/api/symbols/AnimationTrigger.html +++ b/api/symbols/AnimationTrigger.html @@ -1,495 +1,149 @@ - - - - - - AnimationTrigger | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class AnimationTrigger

-
-
-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - AnimationTrigger -
  • -
-
-
-
-

An AnimationTrigger describes how to automatically animate a property on a GraphObject - when it changes value. - The target property name is a string, and all name matching is case-sensitive.

-

Triggers will be shared by all copies of the template's GraphObjects. - You can include AnimationTriggers in your templates just like Bindings are included:

-
$(go.Panel, "Vertical",
-  // This trigger uses the default value of AnimationTrigger.startCondition:
-  // If a transaction is ongoing and Panel.position is changed, this trigger will animate
-  // all changes to Panel.position at the end of the next transaction, in one bundled Animation.
-  // If no transaction is ongoing, then it will animate this value immediately.
-  new go.AnimationTrigger("position"),
-  {
-    // ... Panel properties
-  },
-  $(go.Shape,
-    // Animate all changes to Shape.opacity immediately
-    new go.AnimationTrigger("opacity", null, go.AnimationTrigger.Immediate),
-    {
-     // ... Shape properties
-    }
-  )
+AnimationTrigger | GoJS API
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class AnimationTrigger

Hierarchy

  • AnimationTrigger
+

An AnimationTrigger describes how to automatically animate a property on a GraphObject +when it changes value. +The target property name is a string, and all name matching is case-sensitive.

+

Triggers will be shared by all copies of the template's GraphObjects. +You can include AnimationTriggers in your templates just like Bindings are included:

+
$(go.Panel, "Vertical",
// This trigger uses the default value of AnimationTrigger.startCondition:
// If a transaction is ongoing and Panel.position is changed, this trigger will animate
// all changes to Panel.position at the end of the next transaction, in one bundled Animation.
// If no transaction is ongoing, then it will animate this value immediately.
new go.AnimationTrigger("position"),
{
// ... Panel properties
},
$(go.Shape,
// Animate all changes to Shape.opacity immediately
new go.AnimationTrigger("opacity", null, go.AnimationTrigger.Immediate),
{
// ... Shape properties
}
)
-

When the startCondition is AnimationTrigger.Default, - GoJS will attempt to AnimationTrigger.Bundled or AnimationTrigger.Immediate based on the state of the transaction. - If no transaction is ongoing, this trigger will treat the default as using AnimationTrigger.Immediate. - Otherwise it will work as AnimationTrigger.Bundled.

-

When the startCondition is AnimationTrigger.Bundled, - the AnimationManager will use the default animation to prepare a single Animation that begins when the current transaction has ended. - This animation may be canceled if a new transaction is started.

-

When the startCondition is AnimationTrigger.Immediate, - a new animation will be created for every instance of the property changed, and started immediately, - and run until completion. This may be useful for cosmetic changes, such as animating - the opacity or color of an object on mouseEnter or mouseLeave.

-

You can only specify properties that exist on the GraphObject, and are also registered with AnimationManager.defineAnimationEffect. - By default these properties are:

-
    -
  • "position"
  • -
  • "location" (on Parts)
  • -
  • "scale"
  • -
  • "opacity"
  • -
  • "angle"
  • -
  • "desiredSize"
  • -
  • "width"
  • -
  • "height"
  • -
  • "background"
  • -
  • "fill" (on Shapes)
  • -
  • "strokeWidth" (on Shapes)
  • -
  • "strokeDashOffset" (on Shapes)
  • -
  • "stroke" (on Shapes, TextBlocks)
  • -
-

Examples of defining additional animation properties are given in the Introduction Page on Animations.

-
-
since
-

2.1

-
-
-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-

Constants

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

-
    -
  • new AnimationTrigger(propertyName: string, animationSettings?: { duration?: number; easing?: EasingFunction; finished?: (animation: Animation) => void }, startCondition?: EnumValue): AnimationTrigger
  • -
-
    -
  • -
    -

    This constructor creates an AnimationTrigger. These are typically constructed within Part templates. - Using GraphObject.make it might look like:

    -
     var $ = go.GraphObject.make;
    -
    -   // ...
    -   $(go.Shape,
    -     // Animate all changes to Shape.opacity immediately
    -     new go.AnimationTrigger("opacity", null, go.AnimationTrigger.Immediate),
    -     {
    -      // ...
    -     }
    -   )
    +

    When the startCondition is AnimationTrigger.Default, +GoJS will attempt to AnimationTrigger.Bundled or AnimationTrigger.Immediate based on the state of the transaction. +If no transaction is ongoing, this trigger will treat the default as using AnimationTrigger.Immediate. +Otherwise it will work as AnimationTrigger.Bundled.

    +

    When the startCondition is AnimationTrigger.Bundled, +the AnimationManager will use the default animation to prepare a single Animation that begins when the current transaction has ended. +This animation may be canceled if a new transaction is started.

    +

    When the startCondition is AnimationTrigger.Immediate, +a new animation will be created for every instance of the property changed, and started immediately, +and run until completion. This may be useful for cosmetic changes, such as animating +the opacity or color of an object on mouseEnter or mouseLeave.

    +

    You can only specify properties that exist on the GraphObject, and are also registered with AnimationManager.defineAnimationEffect. +By default these properties are:

    +
      +
    • "position"
    • +
    • "location" (on Parts)
    • +
    • "scale"
    • +
    • "opacity"
    • +
    • "angle"
    • +
    • "desiredSize"
    • +
    • "width"
    • +
    • "height"
    • +
    • "background"
    • +
    • "fill" (on Shapes)
    • +
    • "strokeWidth" (on Shapes)
    • +
    • "strokeDashOffset" (on Shapes)
    • +
    • "stroke" (on Shapes, TextBlocks)
    • +
    +

    Examples of defining additional animation properties are given in the Introduction Page on Animations.

    +
    since

    2.1

    +

Index

Constructors

  • new AnimationTrigger(propertyName: string, animationSettings?: { duration?: number; easing?: EasingFunction; finished?: any }, startCondition?: EnumValue): AnimationTrigger
  • +

    This constructor creates an AnimationTrigger. These are typically constructed within Part templates. +Using GraphObject.make it might look like:

    +
     var $ = go.GraphObject.make;

    // ...
    $(go.Shape,
    // Animate all changes to Shape.opacity immediately
    new go.AnimationTrigger("opacity", null, go.AnimationTrigger.Immediate),
    {
    // ...
    }
    )
    -
    -

    Parameters

    -
      -
    • -
      propertyName: string
      -
      -

      A string naming the target property to animate. - This should not be the empty string.

      -
      -
    • -
    • -
      Optional animationSettings: { duration?: number; easing?: EasingFunction; finished?: (animation: Animation) => void }
      -
      -

      An optional Object describing properties to set on animations created by this AnimationTrigger. - See the animationSettings property for detail. - If specified, this also sets the startCondition to AnimationTrigger.Immediate.

      -
      -
        -
      • -
        Optional duration?: number
        -
      • -
      • -
        Optional easing?: EasingFunction
        -
      • -
      • -
        Optional finished?: (animation: Animation) => void
        -
          -
        -
      • -
      -
    • -
    • -
      Optional startCondition: EnumValue
      -
      -

      An optional EnumValue to set the startCondition property.

      -
      -
    • -
    -

    Returns AnimationTrigger

    -
  • -
-
-
-
-

Properties

-
- -

- animationSettings - : { duration?: number; easing?: EasingFunction; finished?: (animation: Animation) => void }

- -
-
- -

- propertyName - : string

-
    -
  • -
    -

    Gets or sets the name of the property to animate on the target GraphObject. - The default value is set during constructor initialization.

    -

    You can only specify properties that exist on the GraphObject, and are also registered with AnimationManager.defineAnimationEffect. - By default these properties are the same as the list of possible Animation effects:

    -
      -
    • "position"
    • -
    • "location" (on Parts)
    • -
    • "scale"
    • -
    • "opacity"
    • -
    • "angle"
    • -
    • "desiredSize"
    • -
    • "width"
    • -
    • "height"
    • -
    • "background"
    • -
    • "fill" (on Shapes)
    • -
    • "strokeWidth" (on Shapes)
    • -
    • "strokeDashOffset" (on Shapes)
    • -
    • "stroke" (on Shapes, TextBlocks)
    • -
    -

    Examples of defining additional properties by adding animation effects are given in the Introduction Page on Animations.

    -
    -
  • -
-
-
- -

- startCondition - : EnumValue

-
    -
  • -
    -

    Gets or sets the starting condition for this trigger.

    -

    AnimationTriggers can invoke an animation immediately, - starting a new animation with each property of each GraphObject that has been modified, - or they can (more efficiently) be bundled together into the default animation (AnimationManager.defaultAnimation) - and begin only one animation, at the end of the next transaction.

    -

    It is useful for the startCondition to be AnimationTrigger.Immediate when changing GraphObject properties - on GraphObject.mouseEnter or GraphObject.mouseLeave. - It is useful for the startCondition to be AnimationTrigger.Bundled when changing several GraphObject properties together, - such as when highlighting multiple parts, on selection changes, and during transactions, or when performance is a consideration.

    -

    These behaviors can be set with the values AnimationTrigger.Immediate and AnimationTrigger.Bundled, respectively. - The default value, AnimationTrigger.Default, attempts to infer which is best: - It will start immediately if there is no ongoing transaction - or if Diagram.skipsUndoManager is true, and otherwise bundle them.

    -
    -
  • -
-
-
-
-

Methods

-
- -

- Virtual - copy -

- -
    -
  • -
    -

    Create a copy of this AnimationTrigger, with the same property values.

    -
    -

    Returns AnimationTrigger

    -
  • -
-
-
-
-

Constants

-
- -

- Static - Bundled - : EnumValue

-
-

Used as a value for startCondition. - The AnimationManager will use the default animation to prepare a single Animation that begins when the current transaction has ended. - This animation may be canceled if a new transaction is started.

-
-
-
- -

- Static - Default - : EnumValue

-
-

Used as a value for startCondition. - GoJS will attempt to AnimationTrigger.Bundled or AnimationTrigger.Immediate based on the state of the transaction. - If no transaction is ongoing, this trigger will be treated as using AnimationTrigger.Immediate, - otherwise it will work as AnimationTrigger.Bundled.

-
-
-
- -

- Static - Immediate - : EnumValue

-
-

Used as a value for startCondition. - A new animation will be created for every instance of the property changed, and started immediately, - and run until completion. This may be useful for cosmetic changes, such as animating - the opacity or color of an object on mouseEnter or mouseLeave. - However, using AnimationTrigger.Bundled may be more efficient, as it will create fewer

-
-
-
-
- -
-
-
- -
-
- - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/ArrangingLayout.html b/api/symbols/ArrangingLayout.html index 8559c385f..21b892ad7 100644 --- a/api/symbols/ArrangingLayout.html +++ b/api/symbols/ArrangingLayout.html @@ -1,587 +1,140 @@ - - - - - - ArrangingLayout | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class ArrangingLayout

-
-
-
-
-
-
-
-
-
-

- This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

-
-
-

Hierarchy

-
    -
  • - Layout -
      -
    • - ArrangingLayout -
    • -
    -
  • -
-
-
-
-

A custom Layout that provides one way to have a layout of layouts. - It partitions nodes and links into separate subgraphs, applies a primary - layout to each subgraph, and then arranges those results by an - arranging layout. Any disconnected nodes are laid out later by a - side layout, by default in a grid underneath the main body of subgraphs.

-

If you want to experiment with this extension, try the Arranging Layout sample.

-

This layout uses three separate Layouts.

-

One is used for laying out nodes and links that are connected together: primaryLayout. - This defaults to null and must be set to an instance of a Layout, - such as a TreeLayout or a ForceDirectedLayout or a custom Layout.

-

One is used to arrange separate subnetworks of the main graph: arrangingLayout. - This defaults to an instance of GridLayout.

-

One is used for laying out the additional nodes along one of the sides of the main graph: sideLayout. - This also defaults to an instance of GridLayout. - A filter predicate, filter, splits up the collection of nodes and links into two subsets, - one for the main layout and one for the side layout. - By default, when there is no filter, it puts all nodes that have no link connections into the - subset to be processed by the side layout.

-

If all pairs of nodes in the main graph can be reached by some path of undirected links, - there are no separate subnetworks, so the arrangingLayout need not be used and - the primaryLayout would apply to all of those nodes and links.

-

But if there are disconnected subnetworks, the primaryLayout is applied to each subnetwork, - and then all of those results are arranged by the arrangingLayout.

-

In either case if there are any nodes in the side graph, those are arranged by the sideLayout - to be on the side of the arrangement of the main graph of nodes and links.

-

Note: if you do not want to have singleton nodes be arranged by sideLayout, - set filter to function(part) { return true; }. - That will cause all singleton nodes to be arranged by arrangingLayout as if they - were each their own subgraph.

-

If you both don't want to use sideLayout and you don't want to use arrangingLayout - to lay out connected subgraphs, don't use this ArrangingLayout at all -- - just use whatever Layout you would have assigned to primaryLayout.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- - -
-
-
-

Properties

-
- -

- arrangingLayout - : Layout

-
    -
  • -
    -

    Gets or sets the Layout used to arrange multiple separate connected subgraphs of the main graph. - The default value is an instance of GridLayout. - Set this property to null in order to get the default behavior of the @{link #primaryLayout} - when dealing with multiple connected graphs as a whole.

    -
    -
  • -
-
-
- -

- filter - : (part: Part) => boolean

-
    -
  • -
    -

    Gets or sets the predicate function to call on each non-Link. - If the predicate returns true, the part will be laid out by the main layouts, - the primaryLayouts and the arrangingLayout, otherwise by the sideLayout. - The default value is a function that is true when there are any links connecting with the node. - Such default behavior will have the sideLayout position all of the singleton nodes.

    -
    -
  • -
-
-
- -

- primaryLayout - : Layout

-
    -
  • -
    -

    Gets or sets the Layout used for the main part of the diagram. - The default value is an instance of GridLayout. - Any new value must not be null.

    -
    -
  • -
-
-
- -

- side - : Spot

-
    -
  • -
    -

    Gets or sets the side Spot where the side nodes and links should be laid out, - relative to the results of the main Layout. - The default value is Spot.BottomSide. - Currently only handles a single side.

    -
    -
  • -
-
-
- -

- sideLayout - : Layout

-
    -
  • -
    -

    Gets or sets the Layout used to arrange the "side" nodes and links -- those outside of the main layout. - The default value is an instance of GridLayout. - Any new value must not be null.

    -
    -
  • -
-
-
- -

- spacing - : Size

-
    -
  • -
    -

    Gets or sets the space between the main layout and the side layout. - The default value is Size(20, 20).

    -
    -
  • -
-
-
-
-

Methods

-
- -

- moveSideCollection -

-
    -
  • moveSideCollection(sidecoll: Set<Part>, mainbounds: Rect, sidebounds: Rect): void
  • -
-
    -
  • -
    -

    This method is called just after the sideLayout has been performed in order to move - its parts to the desired area relative to the results of the main layouts. - By default this calls Diagram.moveParts on the sidecoll collection to the side of the mainbounds. - This won't get called if there are no Parts in the sidecoll collection.

    -
    -

    Parameters

    -
      -
    • -
      sidecoll: Set<Part>
      -
      -

      a collection of Parts that were laid out by the sideLayout

      -
      -
    • -
    • -
      mainbounds: Rect
      -
      -

      the area occupied by the results of the main layouts

      -
      -
    • -
    • -
      sidebounds: Rect
      -
      -

      the area occupied by the results of the sideLayout

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- moveSubgraph -

-
    -
  • moveSubgraph(subColl: Set<Part>, subbounds: Rect, bounds: Rect): void
  • -
-
    -
  • -
    -

    Move a Set of Nodes and Links to the given area.

    -
    -

    Parameters

    -
      -
    • -
      subColl: Set<Part>
      -
      -

      the Set of Nodes and Links that form a separate connected subgraph

      -
      -
    • -
    • -
      subbounds: Rect
      -
      -

      the area occupied by the subColl

      -
      -
    • -
    • -
      bounds: Rect
      -
      -

      the area where they should be moved according to the arrangingLayout

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- preparePrimaryLayout -

-
    -
  • preparePrimaryLayout(primaryLayout: Layout, mainColl: Set<Part>): void
  • -
-
    -
  • -
    -

    This method is called just before the primaryLayout is performed so that - there can be adjustments made to the primaryLayout, if desired. - By default this method makes no adjustments to the primaryLayout.

    -
    -

    Parameters

    -
      -
    • -
      primaryLayout: Layout
      -
      -

      the sideLayout that may be modified for the results of the primaryLayout

      -
      -
    • -
    • -
      mainColl: Set<Part>
      -
      -

      the Nodes and Links to be laid out by primaryLayout after being separated into subnetworks

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- prepareSideLayout -

-
    -
  • prepareSideLayout(sideLayout: Layout, sideColl: Set<Part>, mainBounds: Rect): void
  • -
-
    -
  • -
    -

    This method is called just after the main layouts (the primaryLayouts and arrangingLayout) - have been performed and just before the sideLayout is performed so that there can be - adjustments made to the sideLayout, if desired. - By default this method makes no adjustments to the sideLayout.

    -
    -

    Parameters

    -
      -
    • -
      sideLayout: Layout
      -
      -

      the sideLayout that may be modified for the results of the main layouts

      -
      -
    • -
    • -
      sideColl: Set<Part>
      -
      -

      the Nodes and Links filtered out to be laid out by sideLayout

      -
      -
    • -
    • -
      mainBounds: Rect
      -
      -

      the area occupied by the nodes and links of the main layout, after it was performed

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- splitParts -

- -
    -
  • -
    -

    Assign all of the Parts in the given collection into either the - set of Nodes and Links for the main graph or the set of Nodes and Links - for the side graph.

    -

    By default this just calls the filter on each non-Link to decide, - and then looks at each Link's connected Nodes to decide.

    -

    A null filter assigns all Nodes that have connected Links to the main graph, and - all Links will be assigned to the main graph, and the side graph will only contain - Parts with no connected Links.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class ArrangingLayout Extension

This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

Hierarchy

+

A custom Layout that provides one way to have a layout of layouts. +It partitions nodes and links into separate subgraphs, applies a primary +layout to each subgraph, and then arranges those results by an +arranging layout. Any disconnected nodes are laid out later by a +side layout, by default in a grid underneath the main body of subgraphs.

+

If you want to experiment with this extension, try the Arranging Layout sample.

+

This layout uses three separate Layouts.

+

One is used for laying out nodes and links that are connected together: primaryLayout. +This defaults to null and must be set to an instance of a Layout, +such as a TreeLayout or a ForceDirectedLayout or a custom Layout.

+

One is used to arrange separate subnetworks of the main graph: arrangingLayout. +This defaults to an instance of GridLayout.

+

One is used for laying out the additional nodes along one of the sides of the main graph: sideLayout. +This also defaults to an instance of GridLayout. +A filter predicate, filter, splits up the collection of nodes and links into two subsets, +one for the main layout and one for the side layout. +By default, when there is no filter, it puts all nodes that have no link connections into the +subset to be processed by the side layout.

+

If all pairs of nodes in the main graph can be reached by some path of undirected links, +there are no separate subnetworks, so the arrangingLayout need not be used and +the primaryLayout would apply to all of those nodes and links.

+

But if there are disconnected subnetworks, the primaryLayout is applied to each subnetwork, +and then all of those results are arranged by the arrangingLayout.

+

In either case if there are any nodes in the side graph, those are arranged by the sideLayout +to be on the side of the arrangement of the main graph of nodes and links.

+

Note: if you do not want to have singleton nodes be arranged by sideLayout, +set filter to function(part) { return true; }. +That will cause all singleton nodes to be arranged by arrangingLayout as if they +were each their own subgraph.

+

If you both don't want to use sideLayout and you don't want to use arrangingLayout +to lay out connected subgraphs, don't use this ArrangingLayout at all -- +just use whatever Layout you would have assigned to primaryLayout.

+

Index

Inherited Members

Constructors

  • +

    Create a minimal layout that only positions Nodes that do not have a location.

    +

    Returns ArrangingLayout

Properties

  • +

    Gets or sets the Layout used to arrange multiple separate connected subgraphs of the main graph. +The default value is an instance of GridLayout. +Set this property to null in order to get the default behavior of the @{link #primaryLayout} +when dealing with multiple connected graphs as a whole.

    +
  • +

    Gets or sets the predicate function to call on each non-Link. +If the predicate returns true, the part will be laid out by the main layouts, +the primaryLayouts and the arrangingLayout, otherwise by the sideLayout. +The default value is a function that is true when there are any links connecting with the node. +Such default behavior will have the sideLayout position all of the singleton nodes.

    +
  • +

    Gets or sets the Layout used for the main part of the diagram. +The default value is an instance of GridLayout. +Any new value must not be null.

    +
  • +

    Gets or sets the side Spot where the side nodes and links should be laid out, +relative to the results of the main Layout. +The default value is Spot.BottomSide. +Currently only handles a single side.

    +
  • +

    Gets or sets the Layout used to arrange the "side" nodes and links -- those outside of the main layout. +The default value is an instance of GridLayout. +Any new value must not be null.

    +
  • +

    Gets or sets the space between the main layout and the side layout. +The default value is Size(20, 20).

    +

Methods

  • moveSideCollection(sidecoll: Set<Part>, mainbounds: Rect, sidebounds: Rect): void
  • +

    This method is called just after the sideLayout has been performed in order to move +its parts to the desired area relative to the results of the main layouts. +By default this calls Diagram.moveParts on the sidecoll collection to the side of the mainbounds. +This won't get called if there are no Parts in the sidecoll collection.

    +

    Parameters

    • sidecoll: Set<Part>
      +

      a collection of Parts that were laid out by the sideLayout

      +
    • mainbounds: Rect
      +

      the area occupied by the results of the main layouts

      +
    • sidebounds: Rect
      +

      the area occupied by the results of the sideLayout

      +

    Returns void

  • +

    Move a Set of Nodes and Links to the given area.

    +

    Parameters

    • subColl: Set<Part>
      +

      the Set of Nodes and Links that form a separate connected subgraph

      +
    • subbounds: Rect
      +

      the area occupied by the subColl

      +
    • bounds: Rect
      +

      the area where they should be moved according to the arrangingLayout

      +

    Returns void

  • preparePrimaryLayout(primaryLayout: Layout, mainColl: Set<Part>): void
  • +

    This method is called just before the primaryLayout is performed so that +there can be adjustments made to the primaryLayout, if desired. +By default this method makes no adjustments to the primaryLayout.

    +

    Parameters

    • primaryLayout: Layout
      +

      the sideLayout that may be modified for the results of the primaryLayout

      +
    • mainColl: Set<Part>
      +

      the Nodes and Links to be laid out by primaryLayout after being separated into subnetworks

      +

    Returns void

  • +

    This method is called just after the main layouts (the primaryLayouts and arrangingLayout) +have been performed and just before the sideLayout is performed so that there can be +adjustments made to the sideLayout, if desired. +By default this method makes no adjustments to the sideLayout.

    +

    Parameters

    • sideLayout: Layout
      +

      the sideLayout that may be modified for the results of the main layouts

      +
    • sideColl: Set<Part>
      +

      the Nodes and Links filtered out to be laid out by sideLayout

      +
    • mainBounds: Rect
      +

      the area occupied by the nodes and links of the main layout, after it was performed

      +

    Returns void

  • +

    Assign all of the Parts in the given collection into either the +set of Nodes and Links for the main graph or the set of Nodes and Links +for the side graph.

    +

    By default this just calls the filter on each non-Link to decide, +and then looks at each Link's connected Nodes to decide.

    +

    A null filter assigns all Nodes that have connected Links to the main graph, and +all Links will be assigned to the main graph, and the side graph will only contain +Parts with no connected Links.

    +

    Parameters

    Returns void

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/BalloonLink.html b/api/symbols/BalloonLink.html index 55bacde0d..0c6dc9230 100644 --- a/api/symbols/BalloonLink.html +++ b/api/symbols/BalloonLink.html @@ -1,320 +1,48 @@ - - - - - - BalloonLink | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class BalloonLink

-
-
-
-
-
-
-
-
-
-

- This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

-
-
-

Hierarchy

- -
-
-
-

This custom Link class customizes its Shape to surround the comment node (the from node). - If the Shape is filled, it will obscure the comment itself unless the Link is behind the comment node. - Thus the default layer for BalloonLinks is "Background".

-

The "corner" property controls the radius of the curves at the corners of the rectangular area surrounding the comment node, - rather than the curve at corners along the route, which is always straight. - The default value is 10.

-

If you want to experiment with this extension, try the Balloon Links sample.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- - -
-
-
-

Properties

-
- -

- base - : number

-
    -
  • -
    -

    Gets or sets width of the base of the triangle at the center point of the Link.fromNode.

    -

    The default value is 15.

    -
    -
  • -
-
-
-
-

Methods

-
- -

- Protected Override - cloneProtected -

- -
    -
  • -
    -

    Copies properties to a cloned BalloonLink.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- Override - makeGeometry -

- -
    -
  • -
    -

    Produce a Geometry from the Link's route that draws a "balloon" shape around the Link.fromNode - and has a triangular shape with the base at the fromNode and the top at the toNode.

    -
    -

    Returns Geometry

    -
  • -
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class BalloonLink Extension

This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

Hierarchy

+

This custom Link class customizes its Shape to surround the comment node (the from node). +If the Shape is filled, it will obscure the comment itself unless the Link is behind the comment node. +Thus the default layer for BalloonLinks is "Background".

+

The "corner" property controls the radius of the curves at the corners of the rectangular area surrounding the comment node, +rather than the curve at corners along the route, which is always straight. +The default value is 10.

+

If you want to experiment with this extension, try the Balloon Links sample.

+

Index

Constructors

Properties

Methods

Inherited Members

Properties

Methods

Constructors

Properties

  • +

    Gets or sets width of the base of the triangle at the center point of the Link.fromNode.

    +

    The default value is 15.

    +

Methods

  • +

    Copies properties to a cloned BalloonLink.

    +

    Parameters

    Returns void

  • +

    Produce a Geometry from the Link's route that draws a "balloon" shape around the Link.fromNode +and has a triangular shape with the base at the fromNode and the top at the toNode.

    +

    Returns Geometry

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Binding.html b/api/symbols/Binding.html index e25a46104..4864d7ff3 100644 --- a/api/symbols/Binding.html +++ b/api/symbols/Binding.html @@ -1,881 +1,351 @@ - - - - - - Binding | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class Binding

-
-
-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - Binding -
  • -
-
-
-
-

A Binding describes how to automatically set a property on a GraphObject - to a value of a property of data in the model. - The target property name and the data source property name are strings. - All name matching is case-sensitive.

-

Register bindings by calling GraphObject.bind with a new Binding. - Existing bindings become read-only, and no new bindings may be added, - when a template (a Part) is copied. - Bindings will be shared by all copies of the template's GraphObjects.

-

For example, your node data might be like:

-
{ key: 23, say: "hello!" }
+Binding | GoJS API
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class Binding

Hierarchy

  • Binding
+

A Binding describes how to automatically set a property on a GraphObject +to a value of a property of data in the model. +The target property name and the data source property name are strings. +All name matching is case-sensitive.

+

Register bindings by calling GraphObject.bind with a new Binding. +Existing bindings become read-only, and no new bindings may be added, +when a template (a Part) is copied. +Bindings will be shared by all copies of the template's GraphObjects.

+

For example, your node data might be like:

+
{ key: 23, say: "hello!" }
 
-

Your simple node template might be like:

-
  var template = new go.Node(go.Panel.Auto);
-  // . . . define the rest of the Node's visual tree . . .
-  var txt = new go.TextBlock();
-  txt.bind(new go.Binding("text", "say"));
-  template.add(txt);
-  myDiagram.nodeTemplate = template;
+

Your simple node template might be like:

+
  var template = new go.Node(go.Panel.Auto);
// . . . define the rest of the Node's visual tree . . .
var txt = new go.TextBlock();
txt.bind(new go.Binding("text", "say"));
template.add(txt);
myDiagram.nodeTemplate = template;
-

Using GraphObject.make it might look like:

-
  var $ = go.GraphObject.make;
-  myDiagram.nodeTemplate =
-    $(go.Node, "Auto",
-      . . .
-      $(go.TextBlock, new go.Binding("text", "say"))
-    )
+

Using GraphObject.make it might look like:

+
  var $ = go.GraphObject.make;
myDiagram.nodeTemplate =
$(go.Node, "Auto",
. . .
$(go.TextBlock, new go.Binding("text", "say"))
)
-

The data binding causes the TextBlock.text property of - the TextBlock to be set to the value of the data's "say" property. - If the value of the "say" property of a particular data object is undefined, - the binding is not evaluated: the target property is not set. - If there is an error with the binding, you may see a message in the console log. - For this reason you may want to explicitly set the initial value for a property - when defining the GraphObject, since that value will remain as the default value - if the Binding is not evaluated.

-

Bindings are not necessarily evaluated in any particular order. - Binding sources should not be (or depend in a conversion function on) the category of the data - if you might be modifying the category (e.g. by calling Model.setCategoryForNodeData), - because then some bindings might be evaluated before or after the category has been changed.

-

Conversions

- Sometimes the data value needs to be modified or converted in order - to be used as the new value of a GraphObject property. - The most common conversion functions are provided for you -- - they convert a string to a geometric class: - Point.parse, Size.parse, Rect.parse, - Margin.parse, Spot.parse, and Geometry.parse. - But you can easily define your own conversion function. -

As an example of a conversion function, let's use a function that adds some - text prefixing the data property value:

-
  new go.Binding("text", "say", function(v) { return "I say: " + v; })
+

The data binding causes the TextBlock.text property of +the TextBlock to be set to the value of the data's "say" property. +If the value of the "say" property of a particular data object is undefined, +the binding is not evaluated: the target property is not set. +If there is an error with the binding, you may see a message in the console log. +For this reason you may want to explicitly set the initial value for a property +when defining the GraphObject, since that value will remain as the default value +if the Binding is not evaluated.

+

Bindings are not necessarily evaluated in any particular order. +Binding sources should not be (or depend in a conversion function on) the category of the data +if you might be modifying the category (e.g. by calling Model.setCategoryForNodeData), +because then some bindings might be evaluated before or after the category has been changed.

+

Conversions

+Sometimes the data value needs to be modified or converted in order +to be used as the new value of a GraphObject property. +The most common conversion functions are provided for you -- +they convert a string to a geometric class: +Point.parse, Size.parse, Rect.parse, +Margin.parse, Spot.parse, and Geometry.parse. +But you can easily define your own conversion function. + +

As an example of a conversion function, let's use a function that adds some +text prefixing the data property value:

+
  new go.Binding("text", "say", function(v) { return "I say: " + v; })
 
-

Although simple conversions cover almost all binding cases, there are some infrequent uses - that are covered by "Advanced Conversions", discussed below. - Conversion functions must not have any side-effects. - Conversion functions may be called frequently, so they should be fast and avoid allocating memory. - The order in which conversion functions are called is not specified and may vary.

-

OneWay and TwoWay Bindings

- By default bindings are Binding.OneWay. - OneWay bindings are evaluated when the Panel.data property is set - or when you call Panel.updateTargetBindings or Model.setDataProperty. - OneWay bindings only transfer values from the source to the target. -

TwoWay bindings are evaluated in the source-to-target direction just as OneWay - bindings are evaluated. - However when the GraphObject target property is set, the TwoWay - bindings are evaluated in the target-to-source direction. - There is no point in having a TwoWay binding on a GraphObject property that cannot be set. - For efficiency, avoid TwoWay bindings on GraphObject properties that do not change value in your app.

-

You should not have a TwoWay binding with a source that is a node data object's key property, - i.e. on the data property whose name is the same as the value of Model.nodeKeyProperty. - Unintentionally changing the node key value to be the same as another node data's key value - may cause indeterminate behavior. - Furthermore, changing a node data key without changing any references to that node - using the key value will result in "dangling" references and inconsistent relationships. - You can make that change safely by calling Model.setKeyForNodeData, - but not via a data binding.

-

The target-to-source update can also go through a conversion function. - The most common back-conversion functions are provided for you. - They convert a geometric class to a string: - Point.stringify, Size.stringify, Rect.stringify, - Margin.stringify, Spot.stringify, and Geometry.stringify.

-

It is common to want to update some data properties based on changes to the diagram. - For example, as the user changes the Part.location by dragging a Node, - you can automatically keep the node's model data in sync using a TwoWay binding.

-
  new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify)
+

Although simple conversions cover almost all binding cases, there are some infrequent uses +that are covered by "Advanced Conversions", discussed below. +Conversion functions must not have any side-effects. +Conversion functions may be called frequently, so they should be fast and avoid allocating memory. +The order in which conversion functions are called is not specified and may vary.

+

OneWay and TwoWay Bindings

+By default bindings are Binding.OneWay. +OneWay bindings are evaluated when the Panel.data property is set +or when you call Panel.updateTargetBindings or Model.setDataProperty. +OneWay bindings only transfer values from the source to the target. + +

TwoWay bindings are evaluated in the source-to-target direction just as OneWay +bindings are evaluated. +However when the GraphObject target property is set, the TwoWay +bindings are evaluated in the target-to-source direction. +There is no point in having a TwoWay binding on a GraphObject property that cannot be set. +For efficiency, avoid TwoWay bindings on GraphObject properties that do not change value in your app.

+

You should not have a TwoWay binding with a source that is a node data object's key property, +i.e. on the data property whose name is the same as the value of Model.nodeKeyProperty. +Unintentionally changing the node key value to be the same as another node data's key value +may cause indeterminate behavior. +Furthermore, changing a node data key without changing any references to that node +using the key value will result in "dangling" references and inconsistent relationships. +You can make that change safely by calling Model.setKeyForNodeData, +but not via a data binding.

+

The target-to-source update can also go through a conversion function. +The most common back-conversion functions are provided for you. +They convert a geometric class to a string: +Point.stringify, Size.stringify, Rect.stringify, +Margin.stringify, Spot.stringify, and Geometry.stringify.

+

It is common to want to update some data properties based on changes to the diagram. +For example, as the user changes the Part.location by dragging a Node, +you can automatically keep the node's model data in sync using a TwoWay binding.

+
  new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify)
 
-

The call to Binding.makeTwoWay changes the Binding.mode - to be Binding.TwoWay and specifies the Binding.backConverter - function to be the Point.stringify static function.

-

Because the Binding is on the whole node (template), - the target object is the whole Node and the target property is "location". - The value of data.loc will be a string representation of the Node.location value.

-

Binding Sources

- The target of a Binding is always a property of a GraphObject or a RowColumnDefinition. - The source of a Binding is normally a property of a data object in the model. - But it is also possible to have the source of a Binding be the shared JavaScript object that is the value of Model.modelData. - You can specify such a binding by calling Binding.ofModel, meaning "a binding of a source that is a property of the Model.modelData". -

As an example, you might want all Nodes to use the same color. - It would be possible but not natural to bind to a property on the node data object, because that property would have to be - duplicated on all of the node data objects in the model, and updating the property would mean calling Model.setDataProperty - on each node data object with the same new value. Furthermore if there happened to be no nodes at all in the model, - there would be no place to save the data. Hence using the shared Model.modelData object - would be the sensible place for that shared information.

-
  new go.Binding("stroke", "strokeColor").ofModel()
+

The call to Binding.makeTwoWay changes the Binding.mode +to be Binding.TwoWay and specifies the Binding.backConverter +function to be the Point.stringify static function.

+

Because the Binding is on the whole node (template), +the target object is the whole Node and the target property is "location". +The value of data.loc will be a string representation of the Node.location value.

+

Binding Sources

+The target of a Binding is always a property of a GraphObject or a RowColumnDefinition. +The source of a Binding is normally a property of a data object in the model. +But it is also possible to have the source of a Binding be the shared JavaScript object that is the value of Model.modelData. +You can specify such a binding by calling Binding.ofModel, meaning "a binding of a source that is a property of the Model.modelData". + +

As an example, you might want all Nodes to use the same color. +It would be possible but not natural to bind to a property on the node data object, because that property would have to be +duplicated on all of the node data objects in the model, and updating the property would mean calling Model.setDataProperty +on each node data object with the same new value. Furthermore if there happened to be no nodes at all in the model, +there would be no place to save the data. Hence using the shared Model.modelData object +would be the sensible place for that shared information.

+
  new go.Binding("stroke", "strokeColor").ofModel()
 
-

and to set or modify that color one would just call, within a transaction:

-
  model.setDataProperty(model.modelData, "strokeColor", "red");
+

and to set or modify that color one would just call, within a transaction:

+
  model.setDataProperty(model.modelData, "strokeColor", "red");
 
-

That would cause all nodes with that model data binding to be re-evaluated. - It is not commonplace to have a TwoWay Binding on "ofModel" Bindings, but that should work. - Converters also work with "ofModel" Bindings.

-

And it is also possible to have the source of a Binding be another GraphObject that is in the same Part. - You can enable such a binding by calling Binding.ofObject, meaning "a binding of a source that is a property of a GraphObject". - You just have to make sure that object has a unique GraphObject.name or is the Part itself. - The source property on the GraphObject has to be settable, and the Part must have a value for Panel.data. - (If the source property setter does not notify about property value changes, the binding mechanism will not be invoked. - Similarly, if there is no Panel.data, the binding mechanism is not active.)

-

As a common kind of example of data binding between two properties of GraphObjects, - consider this Binding on a Shape which changes the color of the Shape.stroke - depending on whether the Node is selected (Part.isSelected):

-
  new go.Binding("stroke", "isSelected", function(s) { return s ? "dodgerblue" : "gray"; }).ofObject()
+

That would cause all nodes with that model data binding to be re-evaluated. +It is not commonplace to have a TwoWay Binding on "ofModel" Bindings, but that should work. +Converters also work with "ofModel" Bindings.

+

And it is also possible to have the source of a Binding be another GraphObject that is in the same Part. +You can enable such a binding by calling Binding.ofObject, meaning "a binding of a source that is a property of a GraphObject". +You just have to make sure that object has a unique GraphObject.name or is the Part itself. +The source property on the GraphObject has to be settable, and the Part must have a value for Panel.data. +(If the source property setter does not notify about property value changes, the binding mechanism will not be invoked. +Similarly, if there is no Panel.data, the binding mechanism is not active.)

+

As a common kind of example of data binding between two properties of GraphObjects, +consider this Binding on a Shape which changes the color of the Shape.stroke +depending on whether the Node is selected (Part.isSelected):

+
  new go.Binding("stroke", "isSelected", function(s) { return s ? "dodgerblue" : "gray"; }).ofObject()
 
-

Note the call to Binding.ofObject, which tells the Binding that it should use as the source - a GraphObject with a particular name. However that name argument is optional -- supplying no name - (or supplying an empty string) will cause the binding to operate with the root GraphObject. - In this case that would be the Node itself. - Now with this binding whenever the value of Part.isSelected changes, this Shape's stroke changes color. - The conversion function is what changes the boolean "isSelected" value to a brush color specifier.

-

Advanced Conversions

- The binding functionality also has more advanced features for less common situations. - The source property name may be an empty string, to convert the object as a whole. - Conversion functions may take a second argument that takes the object that is bound. - For source-to-target conversions, the second argument will be the GraphObject whose property is bound. - For target-to-source (back-)conversions, the second argument will be the source data object and - the third argument will be the Model. -

Here's an example of a two-way data-binding using two custom conversion functions working with two separate data properties. - First we define the two conversion functions.

-
  function toLocation(data, node) {
-    return new go.Point(data.x, data.y);
-  }
-
-  function fromLocation(loc, data, model) {
-    model.setDataProperty(data, "x", loc.x);
-    model.setDataProperty(data, "y", loc.y);
-  }
+

Note the call to Binding.ofObject, which tells the Binding that it should use as the source +a GraphObject with a particular name. However that name argument is optional -- supplying no name +(or supplying an empty string) will cause the binding to operate with the root GraphObject. +In this case that would be the Node itself. +Now with this binding whenever the value of Part.isSelected changes, this Shape's stroke changes color. +The conversion function is what changes the boolean "isSelected" value to a brush color specifier.

+

Advanced Conversions

+The binding functionality also has more advanced features for less common situations. +The source property name may be an empty string, to convert the object as a whole. +Conversion functions may take a second argument that takes the object that is bound. +For source-to-target conversions, the second argument will be the GraphObject whose property is bound. +For target-to-source (back-)conversions, the second argument will be the source data object and +the third argument will be the Model. +

Here's an example of a two-way data-binding using two custom conversion functions working with two separate data properties. +First we define the two conversion functions.

+
  function toLocation(data, node) {
return new go.Point(data.x, data.y);
}

function fromLocation(loc, data, model) {
model.setDataProperty(data, "x", loc.x);
model.setDataProperty(data, "y", loc.y);
}
-

Then to data-bind the default template's Part.location property - to two separate data properties, "x" and "y":

-
  new go.Binding("location", "", toLocation).makeTwoWay(fromLocation)
+

Then to data-bind the default template's Part.location property +to two separate data properties, "x" and "y":

+
  new go.Binding("location", "", toLocation).makeTwoWay(fromLocation)
 
-

An empty string argument for the sourceprop parameter indicates - that the whole data object should be passed to the toLocation function, - rather than the value of some property of that data. - The return value is used as the new value for the Part.location property. - In almost all cases the second argument is not used. - Caution: for efficiency reasons you should try to avoid using an empty source property name. - Such bindings will be evaluated much more frequently than ones whose source is a particular property name.

-

The binding works normally for the source-to-target direction. - But when the target property is modified it is the source property that is - set with the back-converted property value from the target object. - Because in this example the source property name is the empty string, - and because one cannot replace the whole source data object, - any return value from the conversion function is ignored. - Instead the conversion function has to modify the data object directly, - as this example fromLocation function does.

-

Note that because the source property name is the empty string, the binding system will not know - which properties are modified in the call to fromLocation. - Hence to support undo and redo, in order to make the data changes we have to call - Model.setDataProperty so that the UndoManager can record the change, - including the previous value.

-

Replacing Items in Arrays

- However, although a TwoWay Binding cannot replace the node data object in the Model.nodeDataArray, - it is possible to replace an item in an Panel.itemArray. - So if your node data were: -
  { key: 1, items: ["one", "two", "three"] }
+

An empty string argument for the sourceprop parameter indicates +that the whole data object should be passed to the toLocation function, +rather than the value of some property of that data. +The return value is used as the new value for the Part.location property. +In almost all cases the second argument is not used. +Caution: for efficiency reasons you should try to avoid using an empty source property name. +Such bindings will be evaluated much more frequently than ones whose source is a particular property name.

+

The binding works normally for the source-to-target direction. +But when the target property is modified it is the source property that is +set with the back-converted property value from the target object. +Because in this example the source property name is the empty string, +and because one cannot replace the whole source data object, +any return value from the conversion function is ignored. +Instead the conversion function has to modify the data object directly, +as this example fromLocation function does.

+

Note that because the source property name is the empty string, the binding system will not know +which properties are modified in the call to fromLocation. +Hence to support undo and redo, in order to make the data changes we have to call +Model.setDataProperty so that the UndoManager can record the change, +including the previous value.

+

Replacing Items in Arrays

+However, although a TwoWay Binding cannot replace the node data object in the Model.nodeDataArray, +it is possible to replace an item in an Panel.itemArray. +So if your node data were: + +
  { key: 1, items: ["one", "two", "three"] }
 
-

And if your node template included something like:

-
    $(go.Panel, "Vertical",
-      new go.Binding("itemArray", "items"),
-      {
-        itemTemplate:
-          $(go.Panel,
-            $(go.TextBlock, { editable: true },
-              new go.Binding("text", "").makeTwoWay())
-          )
-      }
-    )
+

And if your node template included something like:

+
    $(go.Panel, "Vertical",
new go.Binding("itemArray", "items"),
{
itemTemplate:
$(go.Panel,
$(go.TextBlock, { editable: true },
new go.Binding("text", "").makeTwoWay())
)
}
)
-

Then the user would be able to edit any of the TextBlocks, causing the item Array to be modified, - for example resulting in this node data:

-
  { key: 1, items: ["one", "SOME NEW TEXT HERE", "three"] }
+

Then the user would be able to edit any of the TextBlocks, causing the item Array to be modified, +for example resulting in this node data:

+
  { key: 1, items: ["one", "SOME NEW TEXT HERE", "three"] }
 
-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-

Constants

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

-
    -
  • new Binding(targetprop?: string, sourceprop?: string, conv?: (val: any, targetObj: any) => any, backconv?: (val: any, sourceData: any, model: Model) => any): Binding
  • -
-
    -
  • -
    -

    The constructor creates a one-way binding.

    -
    -

    Parameters

    -
      -
    • -
      Optional targetprop: string
      -
      -

      A string naming the target property on the target object. - This should not be the empty string.

      -
      -
    • -
    • -
      Optional sourceprop: string
      -
      -

      A string naming the source property on the bound data object. - If this is the empty string, the whole Panel.data object is used. - If this argument is not supplied, the source property is assumed to be the same as the target property.

      -
      -
    • -
    • -
      Optional conv: (val: any, targetObj: any) => any
      -
      -

      A side-effect-free function converting the data property value to the value to set the target property. - If the function is null or not supplied, no conversion takes place.

      -
      -
        -
      -
    • -
    • -
      Optional backconv: (val: any, sourceData: any, model: Model) => any
      -
      -

      An optional conversion function to convert property values back to data values. - Specifying this function or specifying null modifies this binding to set its mode to be Binding.TwoWay. - If you do not want a two-way binding, leave this argument unspecified (undefined).

      -
      -
        -
      -
    • -
    -

    Returns Binding

    -
  • -
-
-
-
-

Properties

-
- -

- backConverter - : (val: any, sourceData: any, model: Model) => any

-
    -
  • -
    -

    Gets or sets a converter function to apply to the GraphObject property value - in order to produce the value to set to a data property. - This conversion function is only used in a TwoWay binding, - when transferring a value from the target to the source. - The default value is null -- no conversion takes place. - Otherwise the value should be a function that takes one or two arguments - and returns the desired value. - However, the return value is ignored when the sourceProperty - is the empty string.

    -

    Conversion functions must not have any side-effects other than setting - the source property.

    -

    The function is passed the value from the target - (the first argument), the source Panel.data object (the second argument), - and the Model (the third argument). - If the sourceProperty is a property name, that property is set to - the function's return value. - If the sourceProperty is the empty string, the function should - modify the second argument, which will be the source data object.

    -
    -
  • -
-
-
- -

- converter - : (val: any, targetObj: any) => any

-
    -
  • -
    -

    Gets or sets a converter function to apply to the data property value - in order to produce the value to set to the target property. - This conversion function is used in both OneWay and TwoWay bindings, - when transferring a value from the source to the target. - The default value is null -- no conversion takes place. - Otherwise the value should be a function that takes one or two arguments - and returns the desired value. - However, the return value is ignored when the targetProperty - is the empty string.

    -

    Conversion functions must not have any side-effects other than setting - the target property. In particular you should not try to modify the - structure of the visual tree in the target GraphObject's Part's visual tree.

    -

    The function is passed the value from the source - (the first argument) and the target GraphObject (the second argument). - If the targetProperty is a property name, that property is set to - the function's return value. - If the targetProperty is the empty string, the function should - set a property on the second argument, which will be the target GraphObject.

    -
    -
  • -
-
-
- -

- isToModel - : boolean

-
    -
  • -
    -

    Gets or sets whether the source data is Model.modelData rather than a node data or link data object in the model. - The default value is false -- the source data object will not be the shared Model.modelData object.

    -
    -
    see
    -

    ofModel

    -
    -
    since
    -

    1.7

    -
    -
    -
    -
  • -
-
-
- -

- mode - : EnumValue

-
    -
  • -
    -

    Gets or sets the directions and frequency in which the binding may be evaluated. - The default value is Binding.OneWay. - Binding.TwoWay is the other choice.

    -

    Use OneWay bindings to initialize GraphObject properties based on model data, - or to modify GraphObject properties when the model data changes with a call to Model.setDataProperty. - Use TwoWay bindings to keep model data in sync with changes to GraphObject properties. - For efficiency, avoid TwoWay bindings on GraphObject properties that do not change value in your app.

    -

    You should not have a TwoWay binding on a node data object's key property.

    -
    -
  • -
-
-
- -

- sourceName - : string

-
    -
  • -
    -

    Gets or sets the name of the GraphObject that should act as a source object - whose property should be gotten by this data binding. - The default value is null, which uses the bound Panel.data as the source. - If the value is a string, it should be the name of a GraphObject in the - visual tree of the Panel that is bound to the data. - Use the empty string to refer to the root panel, which is typically the whole Node or Link, - but will be a Panel if used in a Panel.itemTemplate. - The name must not contain a period.

    -

    Binding only works if the source property is settable, not on computed or read-only properties, - and if it supports notification. - The documentation for the GraphObject (or subclass of GraphObject) property will indicate if the property is settable - and if it does not notify.

    -
    -
  • -
-
-
- -

- sourceProperty - : string

-
    -
  • -
    -

    Gets or sets the name of the property to get from the bound data object, - the value of Panel.data. - The default value is the empty string, which results in setting the target - property to the whole data object, rather than to a property value of the data object. - If sourceName is not null, then this property names the settable - property on the GraphObject or RowColumnDefinition - that acts as the source.

    -
    -
  • -
-
-
- -

- targetProperty - : string

-
    -
  • -
    -

    Gets or sets the name of the property to be set on the target GraphObject. - The default value is the empty string; you should set this to be the name of a property.

    -
    -
  • -
-
-
-
-

Methods

-
- -

- Virtual - copy -

- -
    -
  • -
    -

    Create a copy of this Binding, with the same property values.

    -
    -

    Returns Binding

    -
  • -
-
-
- -

- makeTwoWay -

-
    -
  • makeTwoWay(backconv?: (val: any, sourceData: any, model: Model) => any): Binding
  • -
-
    -
  • -
    -

    Modify this Binding to set its mode to be Binding.TwoWay, and - provide an optional conversion function to convert GraphObject property - values back to data values, as the value of backConverter.

    -

    Use TwoWay bindings to keep model data in sync with changes to GraphObject properties. - For efficiency, avoid TwoWay bindings on GraphObject properties that do not change value in your app. - It is typical only to use TwoWay bindings on properties that are modified by tools or commands. - Examples include Part.location by DraggingTool and - TextBlock.text by TextEditingTool (only if TextBlock.editable is true).

    -

    You should not have a TwoWay binding on a node data object's key property.

    -
    -

    Parameters

    -
      -
    • -
      Optional backconv: (val: any, sourceData: any, model: Model) => any
      -
        -
      -
    • -
    -

    Returns Binding

    -

    this two-way Binding.

    -
  • -
-
-
- -

- ofModel -

- - -
-
- -

- ofObject -

-
    -
  • ofObject(srcname?: string): Binding
  • -
-
    -
  • -
    -

    Modify this Binding to set its sourceName property so as to identify - a GraphObject in the visual tree of the bound Panel as the data source, - instead of the Panel.data as the data source.

    -

    This permits data binding on GraphObject properties, such as Part.isSelected. - Remember that you can reliably data bind only on settable properties, not on read-only or computed properties.

    -
    -
    see
    -

    sourceName, ofModel

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      Optional srcname: string
      -
      -

      the GraphObject.name of an element in the visual tree of the bound Panel; - use an empty string to refer to the root panel of that visual tree, whose Panel.data is the bound data.

      -
      -
    • -
    -

    Returns Binding

    -

    this Binding to another GraphObject.

    -
  • -
-
-
- -

- Static - parseEnum -

-
    -
  • parseEnum(ctor: any, defval: EnumValue): (name: string) => EnumValue
  • -
-
    -
  • -
    -

    This static function can be used to create a function that parses - a string into an enumerated value, given the class that the enumeration values - are defined on and a default value if the string cannot be parsed successfully.

    -

    The normal usage is to pass the result of this function as the conversion function of a Binding.

    -
    linktemplate.bind(new go.Binding('routing', 'dataPropName', go.Binding.parseEnum(go.Link, go.Link.Normal)));
    +

Index

Constructors

  • new Binding(targetprop?: string, sourceprop?: string, conv?: (val: any, targetObj: any) => any, backconv?: (val: any, sourceData: any, model: Model) => any): Binding
  • +

    The constructor creates a one-way binding.

    +

    Parameters

    • Optional targetprop: string
      +

      A string naming the target property on the target object. + This should not be the empty string.

      +
    • Optional sourceprop: string
      +

      A string naming the source property on the bound data object. + If this is the empty string, the whole Panel.data object is used. + If this argument is not supplied, the source property is assumed to be the same as the target property.

      +
    • Optional conv: (val: any, targetObj: any) => any
      +

      A side-effect-free function converting the data property value to the value to set the target property. + If the function is null or not supplied, no conversion takes place.

      +
        • (val: any, targetObj: any): any
        • Parameters

          • val: any
          • targetObj: any

          Returns any

    • Optional backconv: (val: any, sourceData: any, model: Model) => any
      +

      An optional conversion function to convert property values back to data values. +Specifying this function or specifying null modifies this binding to set its mode to be Binding.TwoWay. +If you do not want a two-way binding, leave this argument unspecified (undefined).

      +
        • (val: any, sourceData: any, model: Model): any
        • Parameters

          • val: any
          • sourceData: any
          • model: Model

          Returns any

    Returns Binding

Properties

  • +

    Gets or sets a converter function to apply to the GraphObject property value +in order to produce the value to set to a data property. +This conversion function is only used in a TwoWay binding, +when transferring a value from the target to the source. +The default value is null -- no conversion takes place. +Otherwise the value should be a function that takes one or two arguments +and returns the desired value. +However, the return value is ignored when the sourceProperty +is the empty string.

    +

    Conversion functions must not have any side-effects other than setting +the source property.

    +

    The function is passed the value from the target +(the first argument), the source Panel.data object (the second argument), +and the Model (the third argument). +If the sourceProperty is a property name, that property is set to +the function's return value. +If the sourceProperty is the empty string, the function should +modify the second argument, which will be the source data object.

    +
  • +

    Gets or sets a converter function to apply to the data property value +in order to produce the value to set to the target property. +This conversion function is used in both OneWay and TwoWay bindings, +when transferring a value from the source to the target. +The default value is null -- no conversion takes place. +Otherwise the value should be a function that takes one or two arguments +and returns the desired value. +However, the return value is ignored when the targetProperty +is the empty string.

    +

    Conversion functions must not have any side-effects other than setting +the target property. In particular you should not try to modify the +structure of the visual tree in the target GraphObject's Part's visual tree.

    +

    The function is passed the value from the source +(the first argument) and the target GraphObject (the second argument). +If the targetProperty is a property name, that property is set to +the function's return value. +If the targetProperty is the empty string, the function should +set a property on the second argument, which will be the target GraphObject.

    +
  • +

    Gets or sets whether the source data is Model.modelData rather than a node data or link data object in the model. +The default value is false -- the source data object will not be the shared Model.modelData object.

    +
    see

    ofModel

    +
    since

    1.7

    +
  • +

    Gets or sets the directions and frequency in which the binding may be evaluated. +The default value is Binding.OneWay. +Binding.TwoWay is the other choice.

    +

    Use OneWay bindings to initialize GraphObject properties based on model data, +or to modify GraphObject properties when the model data changes with a call to Model.setDataProperty. +Use TwoWay bindings to keep model data in sync with changes to GraphObject properties. +For efficiency, avoid TwoWay bindings on GraphObject properties that do not change value in your app.

    +

    You should not have a TwoWay binding on a node data object's key property.

    +
  • +

    Gets or sets the name of the GraphObject that should act as a source object +whose property should be gotten by this data binding. +The default value is null, which uses the bound Panel.data as the source. +If the value is a string, it should be the name of a GraphObject in the +visual tree of the Panel that is bound to the data. +Use the empty string to refer to the root panel, which is typically the whole Node or Link, +but will be a Panel if used in a Panel.itemTemplate. +The name must not contain a period.

    +

    Binding only works if the source property is settable, not on computed or read-only properties, +and if it supports notification. +The documentation for the GraphObject (or subclass of GraphObject) property will indicate if the property is settable +and if it does not notify.

    +
  • +

    Gets or sets the name of the property to get from the bound data object, +the value of Panel.data. +The default value is the empty string, which results in setting the target +property to the whole data object, rather than to a property value of the data object. +If sourceName is not null, then this property names the settable +property on the GraphObject or RowColumnDefinition +that acts as the source.

    +
  • +

    Gets or sets the name of the property to be set on the target GraphObject. +The default value is the empty string; you should set this to be the name of a property.

    +

Methods

  • +

    Create a copy of this Binding, with the same property values.

    +

    Returns Binding

  • makeTwoWay(backconv?: (val: any, sourceData: any, model: Model) => any): Binding
  • +

    Modify this Binding to set its mode to be Binding.TwoWay, and +provide an optional conversion function to convert GraphObject property +values back to data values, as the value of backConverter.

    +

    Use TwoWay bindings to keep model data in sync with changes to GraphObject properties. +For efficiency, avoid TwoWay bindings on GraphObject properties that do not change value in your app. +It is typical only to use TwoWay bindings on properties that are modified by tools or commands. +Examples include Part.location by DraggingTool and +TextBlock.text by TextEditingTool (only if TextBlock.editable is true).

    +

    You should not have a TwoWay binding on a node data object's key property.

    +

    Parameters

    • Optional backconv: (val: any, sourceData: any, model: Model) => any
        • (val: any, sourceData: any, model: Model): any
        • Parameters

          • val: any
          • sourceData: any
          • model: Model

          Returns any

    Returns Binding

    this two-way Binding.

    +
  • ofObject(srcname?: string): Binding
  • +

    Modify this Binding to set its sourceName property so as to identify +a GraphObject in the visual tree of the bound Panel as the data source, +instead of the Panel.data as the data source.

    +

    This permits data binding on GraphObject properties, such as Part.isSelected. +Remember that you can reliably data bind only on settable properties, not on read-only or computed properties.

    +
    see

    sourceName, ofModel

    +

    Parameters

    • Optional srcname: string
      +

      the GraphObject.name of an element in the visual tree of the bound Panel; + use an empty string to refer to the root panel of that visual tree, whose Panel.data is the bound data.

      +

    Returns Binding

    this Binding to another GraphObject.

    +
  • parseEnum(ctor: any, defval: EnumValue): (name: string) => EnumValue
  • +

    This static function can be used to create a function that parses +a string into an enumerated value, given the class that the enumeration values +are defined on and a default value if the string cannot be parsed successfully.

    +

    The normal usage is to pass the result of this function as the conversion function of a Binding.

    +
    linktemplate.bind(new go.Binding('routing', 'dataPropName', go.Binding.parseEnum(go.Link, go.Link.Normal)));
     
    -

    This binding will try to parse the string that is the value of the bound data's "dataPropName" property. - If it is a legitimate enumerated value defined on the Link class, the conversion - function will return that value. - If the bound data's "dataPropName" property is not present or has an unrecognized value, - the Link.routing property gets the default value, Link.Normal.

    -
    -

    Parameters

    -
      -
    • -
      ctor: any
      -
      -

      the class constructor that defines the enumerated values that are being parsed.

      -
      -
    • -
    • -
      defval: EnumValue
      -
      -

      the default enumerated value to return if it fails to parse the given string.

      -
      -
    • -
    -

    Returns (name: string) => EnumValue

    -

    a function that takes a string and returns an enumerated value.

    -
      -
    -
  • -
-
-
- -

- Static - toString -

-
    -
  • toString(val?: any): string
  • -
-
    -
  • -
    -

    This static function can be used to convert an object to a string, - looking for commonly defined data properties, such as "text", "name", "key", or "id". - If none are found, this just calls toString() on it.

    -
    -

    Parameters

    -
      -
    • -
      Optional val: any
      -
    • -
    -

    Returns string

    -
  • -
-
-
-
-

Constants

-
- -

- Static - OneWay - : EnumValue

-
-

This value for Binding.mode uses data source values and sets GraphObject properties. - Bindings are evaluated when Panel.updateTargetBindings is called.

-
-
-
- -

- Static - TwoWay - : EnumValue

-
-

This value for Binding.mode uses data source values and GraphObject properties and keeps them in sync. - When Panel.updateTargetBindings is called, the GraphObject properties are set. - When GraphObject properties are modified, the Panel.data properties are set.

-
-
-
-
- -
-
-
- -
-
- - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Brush.html b/api/symbols/Brush.html index 680b28436..39276c660 100644 --- a/api/symbols/Brush.html +++ b/api/symbols/Brush.html @@ -1,1000 +1,184 @@ - - - - - - Brush | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class Brush

-
-
-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - Brush -
  • -
-
-
-
-

A Brush holds color information and describes how to draw the inside - of a Shape or the stroke of a shape or a TextBlock or the - background of any GraphObject.

-

A Brush must not be modified once it has been assigned to a GraphObject, - such as the Shape.fill or TextBlock.stroke - or GraphObject.background. - However, a Brush may be shared by multiple GraphObjects.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-

Constants

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

-
    -
  • new Brush(type?: string | EnumValue, init?: Partial<Brush>): Brush
  • -
-
    -
  • -
    -

    Construct a Brush class that holds the given color information.

    -
    -

    Parameters

    -
      -
    • -
      Optional type: string | EnumValue
      -
      -

      Optional, one of the values Brush.Solid, Brush.Linear, Brush.Radial, Brush.Pattern, - or a well-formed CSS string describing a solid color brush. No parameter - defaults to a Brush.Solid with a color description of 'black'.

      -
      -
    • -
    • -
      Optional init: Partial<Brush>
      -
      -

      Optional initialization properties.

      -
      -
    • -
    -

    Returns Brush

    -
  • -
-
-
-
-

Properties

-
- -

- color - : string

-
    -
  • -
    -

    Gets or sets the color of a solid Brush. - The default value is 'black'. - The value must be a valid CSS color string.

    -
    -
  • -
-
-
- -

- colorStops - : Map<number, string>

-
    -
  • -
    -

    Gets or sets a Map holding all of the color stops used in this gradient, - where the key is a number, the fractional distance between 0 and 1 (inclusive), - and where the corresponding value is a color string.

    -

    Call addColorStop in order to add color stops to this brush. - This property value may be null if no gradient stops have been defined.

    -
    -
  • -
-
-
- -

- end - : Spot

- -
-
- -

- endRadius - : number

-
    -
  • -
    -

    Gets or sets the radius of a radial brush at the end location. - The default value is NaN.

    -
    -
  • -
-
-
- -

- pattern - : HTMLCanvasElement | HTMLImageElement

-
    -
  • -
    -

    Gets or sets the pattern of a brush of type Brush.Pattern.

    -
    -
  • -
-
-
- -

- start - : Spot

- -
-
- -

- startRadius - : number

-
    -
  • -
    -

    Gets or sets the radius of a radial brush at the start location. - The default value is 0.

    -
    -
  • -
-
-
- -

- type - : EnumValue

-
    -
  • -
    -

    Gets or sets the type of brush. - The default value is Brush.Solid. - The value must be one of: Brush.Solid, Brush.Linear, Brush.Radial, Brush.Pattern. - If the new value is a linear or radial brush type, - and if the start or end spots are not specific spots, - they are changed to be specific spots, depending on the type of brush.

    -
    -
  • -
-
-
-
-

Methods

-
- -

- addColorStop -

-
    -
  • addColorStop(loc: number, color: string): Brush
  • -
-
    -
  • -
    -

    Specify a particular color at a particular fraction of the distance. - If the type is Brush.Solid, change the type to Brush.Linear. - You should not have duplicate color stop values at the same fractional distance.

    -
    -

    Parameters

    -
      -
    • -
      loc: number
      -
      -

      A number between 0 and 1 (inclusive).

      -
      -
    • -
    • -
      color: string
      -
      -

      A valid CSS color string.

      -
      -
    • -
    -

    Returns Brush

    -

    this Brush

    -
  • -
-
-
- -

- copy -

- -
    -
  • -
    -

    Create a copy of this Brush with the same values.

    -
    -

    Returns Brush

    -
  • -
-
-
- -

- Static - darken -

-
    -
  • darken(color: string): string
  • -
-
    -
  • -
    -

    This static function takes a color and darkens it by 20% in the Lab color space. - This is a convenience function which calls Brush.darkenBy.

    -
    -
    since
    -

    1.7

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      color: string
      -
      -

      A valid CSS color string.

      -
      -
    • -
    -

    Returns string

    -

    A CSS string for the darkened color in RGBA.

    -
  • -
-
-
- -

- darkenBy -

-
    -
  • darkenBy(fraction?: number, mode?: EnumValue): Brush
  • -
-
    -
  • -
    -

    Modifies all colors within this Brush, darkening them by some fraction.

    -
    -
    since
    -

    1.7

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      Optional fraction: number
      -
      -

      Fraction to darken the colors by. Defaults to 0.2, must be between 0 and 1 (inclusive).

      -
      -
    • -
    • -
      Optional mode: EnumValue
      -
      -

      Color space to use for adjusting. Must be Brush.Lab or Brush.HSL, defaults to Brush.Lab.

      -
      -
    • -
    -

    Returns Brush

    -

    This Brush with modified color values.

    -
  • -
-
-
- -

- Static - darkenBy -

-
    -
  • darkenBy(color: string, fraction?: number, mode?: EnumValue): string
  • -
-
    -
  • -
    -

    This static function takes a color and darkens it.

    -
    -
    since
    -

    1.7

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      color: string
      -
      -

      A valid CSS color string

      -
      -
    • -
    • -
      Optional fraction: number
      -
      -

      Fraction to darken the color by. Defaults to 0.2, must be between 0 and 1 (inclusive).

      -
      -
    • -
    • -
      Optional mode: EnumValue
      -
      -

      Color space to use for adjusting. Must be Brush.Lab or Brush.HSL, defaults to Brush.Lab.

      -
      -
    • -
    -

    Returns string

    -

    A CSS string for the darkened color in RGBA or HSLA.

    -
  • -
-
-
- -

- isDark -

-
    -
  • isDark(): boolean
  • -
-
    -
  • -
    -

    This function determines whether this Brush is "dark."

    -
    -
    since
    -

    2.0

    -
    -
    -
    -

    Returns boolean

    -
  • -
-
-
- -

- Static - isDark -

- -
    -
  • -
    -

    This static function takes a color and determines whether it is "dark." Does not account for transparency.

    -

    Example usage:

    -
    myDiagram.nodeTemplate =
    -  $(go.Node, "Auto",
    -    $(go.Shape, "RoundedRectangle", { strokeWidth: 0 },
    -      new go.Binding("fill", "color")),
    -    $(go.TextBlock,
    -      { margin: 8 },
    -      new go.Binding("stroke", "color", function (c) {
    -        // Dark nodes use white text, light nodes use black text
    -        return go.Brush.isDark(c) ? "white" : "black";
    -      }),
    -      new go.Binding("text", "key")
    -    )
    -  );
    +Brush | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class Brush

    Hierarchy

    • Brush
    +

    A Brush holds color information and describes how to draw the inside +of a Shape or the stroke of a shape or a TextBlock or the +background of any GraphObject.

    +

    A Brush must not be modified once it has been assigned to a GraphObject, +such as the Shape.fill or TextBlock.stroke +or GraphObject.background. +However, a Brush may be shared by multiple GraphObjects.

    +

    Index

    Constructors

    • new Brush(type?: string | EnumValue, init?: Partial<Brush>): Brush
    • +

      Construct a Brush class that holds the given color information.

      +

      Parameters

      • Optional type: string | EnumValue
        +

        Optional, one of the values Brush.Solid, Brush.Linear, Brush.Radial, Brush.Pattern, +or a well-formed CSS string describing a solid color brush. No parameter +defaults to a Brush.Solid with a color description of 'black'.

        +
      • Optional init: Partial<Brush>
        +

        Optional initialization properties.

        +

      Returns Brush

    Properties

    • +

      Gets or sets the color of a solid Brush. +The default value is 'black'. +The value must be a valid CSS color string.

      +
    • +

      Gets or sets a Map holding all of the color stops used in this gradient, +where the key is a number, the fractional distance between 0 and 1 (inclusive), +and where the corresponding value is a color string.

      +

      Call addColorStop in order to add color stops to this brush. +This property value may be null if no gradient stops have been defined.

      +
    • +

      Gets or sets the radius of a radial brush at the end location. +The default value is NaN.

      +
    • +

      Gets or sets the radius of a radial brush at the start location. +The default value is 0.

      +

    Methods

    • addColorStop(loc: number, color: string): Brush
    • +

      Specify a particular color at a particular fraction of the distance. +If the type is Brush.Solid, change the type to Brush.Linear. +You should not have duplicate color stop values at the same fractional distance.

      +

      Parameters

      • loc: number
        +

        A number between 0 and 1 (inclusive).

        +
      • color: string
        +

        A valid CSS color string.

        +

      Returns Brush

      this Brush

      +
    • +

      Create a copy of this Brush with the same values.

      +

      Returns Brush

    • darkenBy(fraction?: number, mode?: EnumValue): Brush
    • +

      Modifies all colors within this Brush, darkening them by some fraction.

      +
      since

      1.7

      +

      Parameters

      • Optional fraction: number
        +

        Fraction to darken the colors by. Defaults to 0.2, must be between 0 and 1 (inclusive).

        +
      • Optional mode: EnumValue
        +

        Color space to use for adjusting. Must be Brush.Lab or Brush.HSL, defaults to Brush.Lab.

        +

      Returns Brush

      This Brush with modified color values.

      +
    • isDark(): boolean
    • +

      This function determines whether this Brush is "dark."

      +
      since

      2.0

      +

      Returns boolean

    • lightenBy(fraction?: number, mode?: EnumValue): Brush
    • +

      Modifies all colors within this Brush, lightening them by some fraction.

      +
      since

      1.7

      +

      Parameters

      • Optional fraction: number
        +

        Fraction to lighten the colors by. Defaults to 0.2, must be between 0 and 1 (inclusive).

        +
      • Optional mode: EnumValue
        +

        Color space to use for adjusting. Must be Brush.Lab or Brush.HSL, defaults to Brush.Lab.

        +

      Returns Brush

      This Brush with modified color values.

      +
    • darken(color: string): string
    • +

      This static function takes a color and darkens it by 20% in the Lab color space. +This is a convenience function which calls Brush.darkenBy.

      +
      since

      1.7

      +

      Parameters

      • color: string
        +

        A valid CSS color string.

        +

      Returns string

      A CSS string for the darkened color in RGBA.

      +
    • darkenBy(color: string, fraction?: number, mode?: EnumValue): string
    • +

      This static function takes a color and darkens it.

      +
      since

      1.7

      +

      Parameters

      • color: string
        +

        A valid CSS color string

        +
      • Optional fraction: number
        +

        Fraction to darken the color by. Defaults to 0.2, must be between 0 and 1 (inclusive).

        +
      • Optional mode: EnumValue
        +

        Color space to use for adjusting. Must be Brush.Lab or Brush.HSL, defaults to Brush.Lab.

        +

      Returns string

      A CSS string for the darkened color in RGBA or HSLA.

      +
    • +

      This static function takes a color and determines whether it is "dark." Does not account for transparency.

      +

      Example usage:

      +
      myDiagram.nodeTemplate =
      $(go.Node, "Auto",
      $(go.Shape, "RoundedRectangle", { strokeWidth: 0 },
      new go.Binding("fill", "color")),
      $(go.TextBlock,
      { margin: 8 },
      new go.Binding("stroke", "color", function (c) {
      // Dark nodes use white text, light nodes use black text
      return go.Brush.isDark(c) ? "white" : "black";
      }),
      new go.Binding("text", "key")
      )
      );
      -
      -
      since
      -

      2.0

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        color: BrushLike
        -
        -

        A valid CSS color string or a Brush.

        -
        -
      • -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Static - isValidColor -

    -
      -
    • isValidColor(color: string): boolean
    • -
    -
      -
    • -
      -

      This static function returns true if a given color string is well-formed for drawing.

      -
      -
      since
      -

      1.7

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        color: string
        -
        -

        A color string to validate.

        -
        -
      • -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Static - lighten -

    -
      -
    • lighten(color: string): string
    • -
    -
      -
    • -
      -

      This static function takes a color and lightens it by 20% in the Lab color space. - This is a convenience function which calls Brush.lightenBy.

      -
      -
      since
      -

      1.7

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        color: string
        -
        -

        A valid CSS color string.

        -
        -
      • -
      -

      Returns string

      -

      A CSS string for the lightened color in RGBA.

      -
    • -
    -
    -
    - -

    - lightenBy -

    -
      -
    • lightenBy(fraction?: number, mode?: EnumValue): Brush
    • -
    -
      -
    • -
      -

      Modifies all colors within this Brush, lightening them by some fraction.

      -
      -
      since
      -

      1.7

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        Optional fraction: number
        -
        -

        Fraction to lighten the colors by. Defaults to 0.2, must be between 0 and 1 (inclusive).

        -
        -
      • -
      • -
        Optional mode: EnumValue
        -
        -

        Color space to use for adjusting. Must be Brush.Lab or Brush.HSL, defaults to Brush.Lab.

        -
        -
      • -
      -

      Returns Brush

      -

      This Brush with modified color values.

      -
    • -
    -
    -
    - -

    - Static - lightenBy -

    -
      -
    • lightenBy(color: string, fraction?: number, mode?: EnumValue): string
    • -
    -
      -
    • -
      -

      This static function takes a color and lightens it.

      -
      -
      since
      -

      1.7

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        color: string
        -
        -

        A valid CSS color string.

        -
        -
      • -
      • -
        Optional fraction: number
        -
        -

        Fraction to lighten the colors by. Defaults to 0.2, must be between 0 and 1 (inclusive).

        -
        -
      • -
      • -
        Optional mode: EnumValue
        -
        -

        Color space to use for adjusting. Must be Brush.Lab or Brush.HSL, defaults to Brush.Lab.

        -
        -
      • -
      -

      Returns string

      -

      A CSS string for the lightened color in RGBA or HSLA.

      -
    • -
    -
    -
    - -

    - Static - mix -

    -
      -
    • mix(color1: string, color2: string, fraction?: number): string
    • -
    -
      -
    • -
      -

      This static function takes two colors and mixes them together, using the (optionally) specified amount of the second color.

      -
      -
      since
      -

      2.0

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        color1: string
        -
        -

        A valid CSS color string.

        -
        -
      • -
      • -
        color2: string
        -
        -

        Another valid CSS color string to mix.

        -
        -
      • -
      • -
        Optional fraction: number
        -
        -

        Fraction specifying how much color2 to mix into color1. Defaults to .5, must be between 0 and 1 (inclusive).

        -
        -
      • -
      -

      Returns string

      -
    • -
    -
    -
    - -

    - Static - randomColor -

    -
      -
    • randomColor(min?: number, max?: number): string
    • -
    -
      -
    • -
      -

      This static function can be used to generate a random color.

      -
      -

      Parameters

      -
        -
      • -
        Optional min: number
        -
        -

        A number between 0 and 255, defaults to 128.

        -
        -
      • -
      • -
        Optional max: number
        -
        -

        A number between 0 and 255, defaults to 255.

        -
        -
      • -
      -

      Returns string

      -

      A color value in # hexadecimal format.

      -
    • -
    -
    -
    -
    -

    Constants

    -
    - -

    - Static - HSL - : EnumValue

    -
    -

    For lightening and darkening, used as a color-space value.

    -
    -
    -
    - -

    - Static - Lab - : EnumValue

    -
    -

    For lightening and darkening, used as a color-space value.

    -
    -
    -
    - -

    - Static - Linear - : EnumValue

    -
    -

    For linear gradient brushes, used as the value for Brush.type.

    -
    -
    -
    - -

    - Static - Pattern - : EnumValue

    -
    -

    For pattern brushes, used as the value for Brush.type.

    -
    -
    -
    - -

    - Static - Radial - : EnumValue

    -
    -

    For radial gradient brushes, used as the value for Brush.type.

    -
    -
    -
    - -

    - Static - Solid - : EnumValue

    -
    -

    For simple, solid color brushes, used as the value for Brush.type.

    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/ChangedEvent.html b/api/symbols/ChangedEvent.html index 4d62dffe3..7d9a43416 100644 --- a/api/symbols/ChangedEvent.html +++ b/api/symbols/ChangedEvent.html @@ -1,795 +1,223 @@ - - - - - - ChangedEvent | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class ChangedEvent

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - ChangedEvent -
    • -
    -
    -
    -
    -

    A ChangedEvent represents a change to an object, typically a GraphObject, - but also for model data, a Model, or a Diagram. - The most common case is for remembering the name of a property - and the before-and-after values for that property.

    -

    You can listen for changed events on the model using Model.addChangedListener - or Diagram.addModelChangedListener, and on the Diagram using Diagram.addChangedListener.

    -

    There are four kinds of changes, represented by enumerated values: - ChangedEvent.Property (the most common), ChangedEvent.Insert and ChangedEvent.Remove - (to represent inserting or removing objects from collections), - and ChangedEvent.Transaction (to notify about beginning or ending transactions or undo or redo).

    -

    The most common kind of ChangedEvent is a Property change. - The name of the property is given by propertyName. - The modified object is given by object. - Use the oldValue and newValue properties for the before and after property values.

    -

    For an Insert ChangedEvent, the modified collection (often an Array) is a property value on the object. - The propertyName helps distinguish between different collections on the object. - Use the newValue property to indicate the value that was inserted. - Use the newParam property to indicate where or how, such as an array index or dictionary key.

    -

    For a Remove ChangedEvent, the modified collection is a property value on the object. - The propertyName helps distinguish between different collections on the object. - Use the oldValue property to indicate the value that was removed. - Use the oldParam property to indicate where or how, such as an array index or dictionary key.

    -

    Transaction ChangedEvents are generated by the UndoManager. - The propertyName names the nature of the ChangedEvent. - For the very first transaction, the property name is "StartingFirstTransaction". - This ChangedEvent precedes a ChangedEvent whose property name is "StartedTransaction", - which occurs for every top-level transaction.

    -

    When ending a transaction, there is first a ChangedEvent whose name is "ComittingTransaction". - This is followed by one with either "CommittedTransaction" or "RolledBackTransaction", - depending on how the transaction is ending. - The oldValue provides the transaction name and the object is the Transaction being finished. - (Note that the Transaction value may be null if no Transaction is available at that time, - perhaps because there were no changes made during the transaction.) - That Transaction can be scanned to look for ChangedEvents that you may wish to record in a database, - all within a single database transaction.

    -

    There are also Transaction ChangedEvents corresponding to "StartingUndo", "FinishedUndo", - "StartingRedo", and "FinishedRedo". - The object property provides the Transaction that is about-to-be or just-was undone or redone.

    -

    Non-Transaction ChangedEvents are remembered by the UndoManager, if UndoManager.isEnabled, - and held in the UndoManager.history as Transactions which hold lists of ChangedEvents. - That is why ChangedEvent implements undo and redo of the change that it remembers.

    -

    When the ChangedEvent represents a change to a Model, the value of model is non-null - and the value of diagram is meaningless. - If the change is a structural change to the model, - the value of modelChange indicates the kind of change. - Currently defined model changed event names include:

    - -

    The value of ChangedEvent.propertyName indicates the actual name of the property that was modified. - ChangedEvent.modelChange is a non-empty string only when there is a known structural change to the model, - not just the setting of some property on some object.

    -

    When the ChangedEvent represents a change to a Diagram or a GraphObject within a diagram, - the value of diagram is non-null and - the values of model and modelChange are meaningless.

    -

    Please note that ChangedEvents can be raised for many different causes. - You may not be interested in changes to temporary objects -- in that case ignore the ChangedEvent when - Model.skipsUndoManager or Diagram.skipsUndoManager is true.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -

    Constants

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      The ChangedEvent class constructor produces an empty ChangedEvent object.

      -
      -

      Returns ChangedEvent

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - change - : EnumValue

    - -
    -
    - -

    - diagram - : Diagram

    -
      -
    • -
      -

      Gets or sets the Diagram that was modified. - When this property is non-null, the model property will be null. - However this property and the model property may both be null simultaneously, - when no particular model or diagram applies.

      -
      -
    • -
    -
    -
    - -

    - Read-only - isTransactionFinished - : boolean

    -
      -
    • -
      -

      This read-only property is true when this ChangedEvent is of type ChangedEvent.Transaction and represents the end of a transactional change. - It is implemented as:

      -
      return (this.change === ChangedEvent.Transaction &&
      -        (this.propertyName === "CommittedTransaction" ||
      -         this.propertyName === "FinishedUndo" ||
      -         this.propertyName === "FinishedRedo"));
      +ChangedEvent | GoJS API
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class ChangedEvent

      Hierarchy

      • ChangedEvent
      +

      A ChangedEvent represents a change to an object, typically a GraphObject, +but also for model data, a Model, or a Diagram. +The most common case is for remembering the name of a property +and the before-and-after values for that property.

      +

      You can listen for changed events on the model using Model.addChangedListener +or Diagram.addModelChangedListener, and on the Diagram using Diagram.addChangedListener.

      +

      There are four kinds of changes, represented by enumerated values: +ChangedEvent.Property (the most common), ChangedEvent.Insert and ChangedEvent.Remove +(to represent inserting or removing objects from collections), +and ChangedEvent.Transaction (to notify about beginning or ending transactions or undo or redo).

      +

      The most common kind of ChangedEvent is a Property change. +The name of the property is given by propertyName. +The modified object is given by object. +Use the oldValue and newValue properties for the before and after property values.

      +

      For an Insert ChangedEvent, the modified collection (often an Array) is a property value on the object. +The propertyName helps distinguish between different collections on the object. +Use the newValue property to indicate the value that was inserted. +Use the newParam property to indicate where or how, such as an array index or dictionary key.

      +

      For a Remove ChangedEvent, the modified collection is a property value on the object. +The propertyName helps distinguish between different collections on the object. +Use the oldValue property to indicate the value that was removed. +Use the oldParam property to indicate where or how, such as an array index or dictionary key.

      +

      Transaction ChangedEvents are generated by the UndoManager. +The propertyName names the nature of the ChangedEvent. +For the very first transaction, the property name is "StartingFirstTransaction". +This ChangedEvent precedes a ChangedEvent whose property name is "StartedTransaction", +which occurs for every top-level transaction.

      +

      When ending a transaction, there is first a ChangedEvent whose name is "ComittingTransaction". +This is followed by one with either "CommittedTransaction" or "RolledBackTransaction", +depending on how the transaction is ending. +The oldValue provides the transaction name and the object is the Transaction being finished. +(Note that the Transaction value may be null if no Transaction is available at that time, +perhaps because there were no changes made during the transaction.) +That Transaction can be scanned to look for ChangedEvents that you may wish to record in a database, +all within a single database transaction.

      +

      There are also Transaction ChangedEvents corresponding to "StartingUndo", "FinishedUndo", +"StartingRedo", and "FinishedRedo". +The object property provides the Transaction that is about-to-be or just-was undone or redone.

      +

      Non-Transaction ChangedEvents are remembered by the UndoManager, if UndoManager.isEnabled, +and held in the UndoManager.history as Transactions which hold lists of ChangedEvents. +That is why ChangedEvent implements undo and redo of the change that it remembers.

      +

      When the ChangedEvent represents a change to a Model, the value of model is non-null +and the value of diagram is meaningless. +If the change is a structural change to the model, +the value of modelChange indicates the kind of change. +Currently defined model changed event names include:

      + +

      The value of ChangedEvent.propertyName indicates the actual name of the property that was modified. +ChangedEvent.modelChange is a non-empty string only when there is a known structural change to the model, +not just the setting of some property on some object.

      +

      When the ChangedEvent represents a change to a Diagram or a GraphObject within a diagram, +the value of diagram is non-null and +the values of model and modelChange are meaningless.

      +

      Please note that ChangedEvents can be raised for many different causes. +You may not be interested in changes to temporary objects -- in that case ignore the ChangedEvent when +Model.skipsUndoManager or Diagram.skipsUndoManager is true.

      +

      Index

      Constructors

      • +

        The ChangedEvent class constructor produces an empty ChangedEvent object.

        +

        Returns ChangedEvent

      Properties

      • +

        Gets or sets the Diagram that was modified. +When this property is non-null, the model property will be null. +However this property and the model property may both be null simultaneously, +when no particular model or diagram applies.

        +
      • +

        This read-only property is true when this ChangedEvent is of type ChangedEvent.Transaction and represents the end of a transactional change. +It is implemented as:

        +
        return (this.change === ChangedEvent.Transaction &&
        (this.propertyName === "CommittedTransaction" ||
        this.propertyName === "FinishedUndo" ||
        this.propertyName === "FinishedRedo"));
        -
        -
      • -
      -
      -
      - -

      - model - : Model

      -
        -
      • -
        -

        Gets or sets the Model or TreeModel or GraphLinksModel that was modified. - When this property is non-null, the diagram property will be null. - However this property and the diagram property may both be null simultaneously, - when no particular model or diagram applies.

        -
        -
      • -
      -
      -
      - -

      - modelChange - : string

      -
        -
      • -
        -

        Gets or sets the name of the model change, reflecting a change to - model data in addition to a change to the model itself.

        -

        The default is an empty string, which indicates that this is just - a regular change to some object's state, probably its property. - For a list of possible model change names, see the documentation for ChangedEvent. - The names are compared in a case-sensitive manner.

        -
        -
      • -
      -
      -
      - -

      - newParam - : any

      -
        -
      • -
        -

        Gets or sets an optional value associated with the new value. - Most properties do not require any parameter to describe the change. - This is typically a value that helps distinguish the new value, such as an index into an array. - It is null if it is not used. - The default is null.

        -
        -
      • -
      -
      -
      - -

      - newValue - : any

      -
        -
      • -
        -

        Gets or sets the next or current value that the property has. - The default is null.

        -
        -
      • -
      -
      -
      - -

      - object - : ObjectData

      - -
      -
      - -

      - oldParam - : any

      -
        -
      • -
        -

        Gets or sets an optional value associated with the old value. - Most properties do not require any parameter to describe the change. - This is typically a value that helps distinguish the old value, such as an index into an array. - It is null if it is not used. - The default is null.

        -
        -
      • -
      -
      -
      - -

      - oldValue - : any

      -
        -
      • -
        -

        Gets or sets the previous or old value that the property had. - The default is null.

        -
        -
      • -
      -
      -
      - -

      - propertyName - : string | ((a: ObjectData, b: any) => any)

      - -
      -
      -
      -

      Methods

      -
      - -

      - canRedo -

      -
        -
      • canRedo(): boolean
      • -
      -
        -
      • -
        -

        This predicate returns true if you can call redo().

        -
        -

        Returns boolean

        -

        True if ready for redo() to be called.

        -
      • -
      -
      -
      - -

      - canUndo -

      -
        -
      • canUndo(): boolean
      • -
      -
        -
      • -
        -

        This predicate returns true if you can call undo().

        -
        -

        Returns boolean

        -

        True if ready for undo() to be called.

        -
      • -
      -
      -
      - -

      - clear -

      -
        -
      • clear(): void
      • -
      -
        -
      • -
        -

        Forget any object references that this ChangedEvent may have.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - copy -

      - - -
      -
      - -

      - getParam -

      -
        -
      • getParam(undo: boolean): any
      • -
      -
        -
      • -
        -

        This is a convenient method to get the right parameter value, depending on the value of undo, - when implementing a state change as part of an undo or a redo.

        -
        -

        Parameters

        -
          -
        • -
          undo: boolean
          -
          -

          If true, returns the oldParam, otherwise returns the newParam.

          -
          -
        • -
        -

        Returns any

        -

        Either the oldParam or the newParam.

        -
      • -
      -
      -
      - -

      - getValue -

      -
        -
      • getValue(undo: boolean): any
      • -
      -
        -
      • -
        -

        This is a convenient method to get the right value, depending on the value of undo, - when implementing a state change as part of an undo or a redo.

        -
        -

        Parameters

        -
          -
        • -
          undo: boolean
          -
          -

          If true, returns the oldValue, otherwise returns the newValue.

          -
          -
        • -
        -

        Returns any

        -

        Either the oldValue or the newValue.

        -
      • -
      -
      -
      - -

      - redo -

      -
        -
      • redo(): void
      • -
      -
        -
      • -
        -

        Re-perform this object change after an undo(). - canRedo() must be true for this method to have any effect.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - undo -

      -
        -
      • undo(): void
      • -
      -
        -
      • -
        -

        Reverse the effects of this object change. - canUndo() must be true for this method to have any effect.

        -
        -

        Returns void

        -
      • -
      -
      -
      -
      -

      Constants

      -
      - -

      - Static - Insert - : EnumValue

      -
      -

      For inserting into collections, - and used as the value for ChangedEvent.change. - The modified object is given by ChangedEvent.object. - Use the optional ChangedEvent.propertyName to distinguish between different collections on the object. - Use the ChangedEvent.newValue property to indicate the value that was inserted. - Use the optional ChangedEvent.newParam property to indicate where or how, such as an array index or dictionary key.

      -
      -
      -
      - -

      - Static - Property - : EnumValue

      -
      -

      For simple property changes, - and used as the value for ChangedEvent.change. - The name of the property is given by ChangedEvent.propertyName. - The modified object is given by ChangedEvent.object. - Use the ChangedEvent.oldValue and ChangedEvent.newValue properties for the previous and next property values.

      -

      For model changes, the ChangedEvent.modelChange may be non-empty, indicating a structural change to the model.

      -
      -
      -
      - -

      - Static - Remove - : EnumValue

      -
      -

      For removing from collections, - and used as the value for ChangedEvent.change. - The modified object is given by ChangedEvent.object. - Use the optional ChangedEvent.propertyName to distinguish between different collections on the object. - Use the ChangedEvent.oldValue property to indicate the value that was removed. - Use the optional ChangedEvent.oldParam property to indicate where or how, such as an array index or dictionary key.

      -
      -
      -
      - -

      - Static - Transaction - : EnumValue

      -
      -

      For informational events, such as transactions and undo/redo operations, - and used as the value for ChangedEvent.change. - The ChangedEvent.object refers to the Transaction affected, if any. - The ChangedEvent.propertyName distinguishes the different transaction or undo or redo stages. - The ChangedEvent.oldValue may provide the transaction name, if available, as given to UndoManager.commitTransaction.

      -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/CircularEdge.html b/api/symbols/CircularEdge.html index 420598dea..7f6fddfd0 100644 --- a/api/symbols/CircularEdge.html +++ b/api/symbols/CircularEdge.html @@ -1,208 +1,35 @@ - - - - - - CircularEdge | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class CircularEdge

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      Hierarchy

      - -
      -
      -
      -

      This holds CircularLayout-specific information about Links.

      -

      This class inherits from LayoutEdge.

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - - -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class CircularEdge

      Hierarchy

      +

      This holds CircularLayout-specific information about Links.

      +

      This class inherits from LayoutEdge.

      +

      Index

      Constructors

      Inherited Members

      Constructors

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/CircularLayout.html b/api/symbols/CircularLayout.html index 6f5bcdf20..72d45ebf6 100644 --- a/api/symbols/CircularLayout.html +++ b/api/symbols/CircularLayout.html @@ -1,887 +1,184 @@ - - - - - - CircularLayout | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class CircularLayout

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      Hierarchy

      -
        -
      • - Layout -
          -
        • - CircularLayout -
        • -
        -
      • -
      -
      -
      -
      -

      This layout positions nodes in a circular arrangement. - There are several samples that use CircularLayout. - The layout cannot guarantee that it provides optimal positioning of nodes when trying to minimize link crossings.

      -

      - If you want to experiment interactively with most of the properties, try the Circular Layout sample. - See samples that make use of CircularLayout in the samples index. -

      This layout makes use of a LayoutNetwork of - CircularVertexes and CircularEdges that normally - correspond to the Nodes and Links of the Diagram.

      -
      -
      -
      -

      Index

      -
      - -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - - -
      -
      -
      -

      Properties

      -
      - -

      - Read-only - actualCenter - : Point

      -
        -
      • -
        -

        This read-only property is the coordinates of the center of the laid-out ellipse immediately after the layout.

        -
        -
      • -
      -
      -
      - -

      - Read-only - actualSpacing - : number

      -
        -
      • -
        -

        This read-only property is the effective spacing that may have been calculated by the layout.

        -
        -
      • -
      -
      -
      - -

      - Read-only - actualXRadius - : number

      -
        -
      • -
        -

        This read-only property is the effective X radius that may have been calculated by the layout.

        -
        -
      • -
      -
      -
      - -

      - Read-only - actualYRadius - : number

      -
        -
      • -
        -

        This read-only property is the effective Y radius that may have been calculated by the layout.

        -
        -
      • -
      -
      -
      - -

      - arrangement - : EnumValue

      - -
      -
      - -

      - aspectRatio - : number

      -
        -
      • -
        -

        Gets or sets the ratio of the arrangement's height to its width - (1 for a circle, >1 for a vertically elongated ellipse).

        -

        This is 1 by default. - The value must be a positive number.

        -

        Modifying this value changes the height, but keeps the width and the radius constant.

        -
        -
      • -
      -
      -
      - -

      - comparer - : (a: CircularVertex, b: CircularVertex) => number

      - -
      -
      - -

      - direction - : EnumValue

      -
        -
      • -
        -

        Gets or sets whether the nodes are arranged clockwise or counterclockwise.

        -

        The default value is CircularLayout.Clockwise.

        -
        -
      • -
      -
      -
      - -

      - nodeDiameterFormula - : EnumValue

      -
        -
      • -
        -

        Specifies how the diameter of nodes will be calculated. - When a node is not circular, it is not clear what its diameter is.

        -

        The default is CircularLayout.Pythagorean.

        -
        -
      • -
      -
      -
      - -

      - radius - : number

      -
        -
      • -
        -

        Gets or sets the horizontal radius of the elliptical arrangement.

        -

        The default value is NaN. - NaN indicates that the spacing will determine the size of the ring. - If spacing is also NaN, the effective spacing will be 6. - If spacing is a number, the effective radius will be > radius if and only if - the spacing between elements would otherwise be less than spacing. - The specified value for radius will be ignored if arrangement === CircularLayout.Packed. - This property must always be positive or NaN.

        -
        -
      • -
      -
      -
      - -

      - sorting - : EnumValue

      - -
      -
      - -

      - spacing - : number

      -
        -
      • -
        -

        Gets or sets the distance between nodes (if radius is NaN) - or the minimum distance between nodes (if radius is a number).

        -

        The default value is 6. - The value may be NaN.

        -

        If spacing is NaN, there is no minimum spacing, allowing nodes to overlap, - unless radius is NaN, - in which case the effective spacing will be 6 to determine an effective radius. - If spacing is a number but radius isn't, - the effective spacing will be spacing, and this will determine the effective radius. - If both spacing and radius are numbers, - the effective radius will be at least radius, - but may be larger so that the minimum spacing between nodes is spacing.

        -
        -
      • -
      -
      -
      - -

      - startAngle - : number

      -
        -
      • -
        -

        Gets or sets the angle (in degrees, clockwise from the positive side of the X axis) of the first element.

        -

        The default value is 0.

        -
        -
      • -
      -
      -
      - -

      - sweepAngle - : number

      -
        -
      • -
        -

        Gets or sets the absolute angle (in degrees) between the first and last node.

        -

        The default value is 360. - The value must be greater than zero and less than or equal to 360. - If it is not in this range, it will be automatically set to 360.

        -

        Whether the arrangement is clockwise or counterclockwise does not depend on the sign of this value. - The direction can be controlled by setting direction. - If 360 is the specified value, the actual value will be less to keep the first and last - elements from overlapping, and the spacing between the first and last nodes will be determined - the same way as for all other adjacent nodes.

        -
        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - Protected Override - commitLayout -

      -
        -
      • commitLayout(): void
      • -
      -
        -
      • -
        -

        Position each Node according to the Vertex position, and then position the Links.

        -

        You should not call this method -- it is a "protected virtual" method.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Protected Virtual - commitLinks -

      -
        -
      • commitLinks(): void
      • -
      -
        -
      • -
        -

        Commit the position and routing of all edge links. - This is called by commitLayout. - This is only called if Layout.isRouting is true. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Protected Virtual - commitNodes -

      -
        -
      • commitNodes(): void
      • -
      -
        -
      • -
        -

        Commit the position of all vertex nodes. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - createNetwork -

      - - -
      -
      - -

      - Override - doLayout -

      - - -
      -
      -
      -

      Constants

      -
      - -

      - Static - Ascending - : EnumValue

      -
      -

      Nodes are sorted using the comparer, in ascending order; - This value is used for CircularLayout.sorting.

      -
      -
      -
      - -

      - Static - BidirectionalLeft - : EnumValue

      -
      -

      The ring is filled by alternating sides; the second node is counterclockwise from the first node; - This value is used for CircularLayout.direction.

      -
      -
      -
      - -

      - Static - BidirectionalRight - : EnumValue

      -
      -

      The ring is filled by alternating sides; the second node is clockwise from the first node; - This value is used for CircularLayout.direction.

      -
      -
      -
      - -

      - Static - Circular - : EnumValue

      -
      -

      The effective diameter is either the width or height of the node, whichever is larger; - This will cause circular nodes to touch when CircularLayout.spacing is 0; - This is ideal when the nodes are circular. - This value is used for CircularLayout.nodeDiameterFormula.

      -
      -
      -
      - -

      - Static - Clockwise - : EnumValue

      -
      -

      Rings are filled clockwise; - This value is used for CircularLayout.direction.

      -
      -
      -
      - -

      - Static - ConstantAngle - : EnumValue

      -
      -

      The angular distance between the nodes is constant; - This value is used for CircularLayout.arrangement.

      -
      -
      -
      - -

      - Static - ConstantDistance - : EnumValue

      -
      -

      The distance between the centers of the nodes is constant; - This value is used for CircularLayout.arrangement.

      -
      -
      -
      - -

      - Static - ConstantSpacing - : EnumValue

      -
      -

      The spacing between the idealized boundaries of the nodes is constant; - This value is used for CircularLayout.arrangement.

      -
      -
      -
      - -

      - Static - Counterclockwise - : EnumValue

      -
      -

      Rings are filled counterclockwise; - This value is used for CircularLayout.direction.

      -
      -
      -
      - -

      - Static - Descending - : EnumValue

      -
      -

      Nodes are sorted using the comparer, in reverse ascending (descending) order; - This value is used for CircularLayout.sorting.

      -
      -
      -
      - -

      - Static - Forwards - : EnumValue

      -
      -

      Nodes are arranged in the order given; - This value is used for CircularLayout.sorting.

      -
      -
      -
      - -

      - Static - Optimized - : EnumValue

      -
      -

      Nodes are ordered to reduce link crossings; - This value is used for CircularLayout.sorting.

      -
      -
      -
      - -

      - Static - Packed - : EnumValue

      -
      -

      The vertices are arranged as close together as possible considering the CircularLayout.spacing, - assuming the nodes are rectangular; - This value is used for CircularLayout.arrangement.

      -
      -
      -
      - -

      - Static - Pythagorean - : EnumValue

      -
      -

      The effective diameter is sqrt(width^2+height^2); - The corners of square nodes will touch at 45 degrees when CircularLayout.spacing is 0; - This value is used for CircularLayout.nodeDiameterFormula.

      -
      -
      -
      - -

      - Static - Reverse - : EnumValue

      -
      -

      Nodes are arranged in the reverse of the order given; - This value is used for CircularLayout.sorting.

      -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class CircularLayout

      Hierarchy

      +

      This layout positions nodes in a circular arrangement. +There are several samples that use CircularLayout. +The layout cannot guarantee that it provides optimal positioning of nodes when trying to minimize link crossings.

      +

      +If you want to experiment interactively with most of the properties, try the Circular Layout sample. +See samples that make use of CircularLayout in the samples index.

      This layout makes use of a LayoutNetwork of +CircularVertexes and CircularEdges that normally +correspond to the Nodes and Links of the Diagram.

      +

      Index

      Inherited Members

      Constructors

      Properties

      • +

        This read-only property is the coordinates of the center of the laid-out ellipse immediately after the layout.

        +
      • +

        This read-only property is the effective spacing that may have been calculated by the layout.

        +
      • +

        This read-only property is the effective X radius that may have been calculated by the layout.

        +
      • +

        This read-only property is the effective Y radius that may have been calculated by the layout.

        +
      • +

        Gets or sets the ratio of the arrangement's height to its width +(1 for a circle, >1 for a vertically elongated ellipse).

        +

        This is 1 by default. +The value must be a positive number.

        +

        Modifying this value changes the height, but keeps the width and the radius constant.

        +
      • +

        Gets or sets whether the nodes are arranged clockwise or counterclockwise.

        +

        The default value is CircularLayout.Clockwise.

        +
      • +

        Specifies how the diameter of nodes will be calculated. +When a node is not circular, it is not clear what its diameter is.

        +

        The default is CircularLayout.Pythagorean.

        +
      • +

        Gets or sets the horizontal radius of the elliptical arrangement.

        +

        The default value is NaN. +NaN indicates that the spacing will determine the size of the ring. +If spacing is also NaN, the effective spacing will be 6. +If spacing is a number, the effective radius will be > radius if and only if +the spacing between elements would otherwise be less than spacing. +The specified value for radius will be ignored if arrangement === CircularLayout.Packed. +This property must always be positive or NaN.

        +
      • +

        Gets or sets the distance between nodes (if radius is NaN) +or the minimum distance between nodes (if radius is a number).

        +

        The default value is 6. +The value may be NaN.

        +

        If spacing is NaN, there is no minimum spacing, allowing nodes to overlap, +unless radius is NaN, +in which case the effective spacing will be 6 to determine an effective radius. +If spacing is a number but radius isn't, +the effective spacing will be spacing, and this will determine the effective radius. +If both spacing and radius are numbers, +the effective radius will be at least radius, +but may be larger so that the minimum spacing between nodes is spacing.

        +
      • +

        Gets or sets the angle (in degrees, clockwise from the positive side of the X axis) of the first element.

        +

        The default value is 0.

        +
      • +

        Gets or sets the absolute angle (in degrees) between the first and last node.

        +

        The default value is 360. +The value must be greater than zero and less than or equal to 360. +If it is not in this range, it will be automatically set to 360.

        +

        Whether the arrangement is clockwise or counterclockwise does not depend on the sign of this value. +The direction can be controlled by setting direction. +If 360 is the specified value, the actual value will be less to keep the first and last +elements from overlapping, and the spacing between the first and last nodes will be determined +the same way as for all other adjacent nodes.

        +

      Methods

      • commitLayout(): void
      • +

        Position each Node according to the Vertex position, and then position the Links.

        +

        You should not call this method -- it is a "protected virtual" method.

        +

        Returns void

      • commitLinks(): void
      • +

        Commit the position and routing of all edge links. +This is called by commitLayout. +This is only called if Layout.isRouting is true. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Returns void

      • commitNodes(): void
      • +

        Commit the position of all vertex nodes. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Returns void

      Constants

      +

      Nodes are sorted using the comparer, in ascending order; +This value is used for CircularLayout.sorting.

      +
      +

      The ring is filled by alternating sides; the second node is counterclockwise from the first node; +This value is used for CircularLayout.direction.

      +
      +

      The ring is filled by alternating sides; the second node is clockwise from the first node; +This value is used for CircularLayout.direction.

      +
      +

      The effective diameter is either the width or height of the node, whichever is larger; +This will cause circular nodes to touch when CircularLayout.spacing is 0; +This is ideal when the nodes are circular. +This value is used for CircularLayout.nodeDiameterFormula.

      +
      +

      Rings are filled clockwise; +This value is used for CircularLayout.direction.

      +
      +

      The angular distance between the nodes is constant; +This value is used for CircularLayout.arrangement.

      +
      +

      The distance between the centers of the nodes is constant; +This value is used for CircularLayout.arrangement.

      +
      +

      The spacing between the idealized boundaries of the nodes is constant; +This value is used for CircularLayout.arrangement.

      +
      +

      Rings are filled counterclockwise; +This value is used for CircularLayout.direction.

      +
      +

      Nodes are sorted using the comparer, in reverse ascending (descending) order; +This value is used for CircularLayout.sorting.

      +
      +

      Nodes are arranged in the order given; +This value is used for CircularLayout.sorting.

      +
      +

      Nodes are ordered to reduce link crossings; +This value is used for CircularLayout.sorting.

      +
      +

      The vertices are arranged as close together as possible considering the CircularLayout.spacing, +assuming the nodes are rectangular; +This value is used for CircularLayout.arrangement.

      +
      +

      The effective diameter is sqrt(width^2+height^2); +The corners of square nodes will touch at 45 degrees when CircularLayout.spacing is 0; +This value is used for CircularLayout.nodeDiameterFormula.

      +
      +

      Nodes are arranged in the reverse of the order given; +This value is used for CircularLayout.sorting.

      +

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/CircularNetwork.html b/api/symbols/CircularNetwork.html index a88231bf3..457d3d34e 100644 --- a/api/symbols/CircularNetwork.html +++ b/api/symbols/CircularNetwork.html @@ -1,211 +1,40 @@ - - - - - - CircularNetwork | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class CircularNetwork

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      Hierarchy

      - -
      -
      -
      -

      This class represents an abstract graph of CircularVertexes and CircularEdges - that can be constructed based on the Nodes and Links of a Diagram - so that the CircularLayout can operate independently of the diagram until it - is time to commit any node positioning or link routing.

      -

      This class inherits from LayoutNetwork.

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - - -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class CircularNetwork

      Hierarchy

      +

      This class represents an abstract graph of CircularVertexes and CircularEdges +that can be constructed based on the Nodes and Links of a Diagram +so that the CircularLayout can operate independently of the diagram until it +is time to commit any node positioning or link routing.

      +

      This class inherits from LayoutNetwork.

      +

      Index

      Constructors

      Inherited Members

      Constructors

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/CircularVertex.html b/api/symbols/CircularVertex.html index f079bcdfb..04071cdcf 100644 --- a/api/symbols/CircularVertex.html +++ b/api/symbols/CircularVertex.html @@ -1,252 +1,41 @@ - - - - - - CircularVertex | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class CircularVertex

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      Hierarchy

      - -
      -
      -
      -

      This holds CircularLayout-specific information about Nodes.

      -

      This class inherits from LayoutVertex.

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -

      Properties

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - - -
      -
      -
      -

      Properties

      -
      - -

      - actualAngle - : number

      -
        -
      • -
        -

        Gets or sets the value used as the vertex's angle.

        -
        -
      • -
      -
      -
      - -

      - diameter - : number

      -
        -
      • -
        -

        Gets or sets the value used as the vertex's diameter.

        -

        By default the value depends on the CircularLayout.arrangement property. - Any computed value is cached, to avoid unnecessary expensive computations.

        -
        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class CircularVertex

      Hierarchy

      +

      This holds CircularLayout-specific information about Nodes.

      +

      This class inherits from LayoutVertex.

      +

      Index

      Constructors

      Properties

      Inherited Members

      Constructors

      Properties

      • +

        Gets or sets the value used as the vertex's angle.

        +
      • +

        Gets or sets the value used as the vertex's diameter.

        +

        By default the value depends on the CircularLayout.arrangement property. +Any computed value is cached, to avoid unnecessary expensive computations.

        +

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/ClickCreatingTool.html b/api/symbols/ClickCreatingTool.html index da5a750c2..b64c80efa 100644 --- a/api/symbols/ClickCreatingTool.html +++ b/api/symbols/ClickCreatingTool.html @@ -1,385 +1,83 @@ - - - - - - ClickCreatingTool | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class ClickCreatingTool

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      Hierarchy

      -
        -
      • - Tool -
          -
        • - ClickCreatingTool -
        • -
        -
      • -
      -
      -
      -
      -

      The ClickCreatingTool lets the user create a node by clicking where they want the new node to be. - By default a double-click is required to start this tool; - set isDoubleClick to false if you want a single-click to create a node.

      -

      This tool is a standard mouse-up tool, the ToolManager.clickCreatingTool. - However, it will not be able to start running unless you have set the - archetypeNodeData property to an object that can be copied and added to the diagram's model.

      -

      If you set isGridSnapEnabled to true, newly created parts will be snapped to points on a grid.

      -

      This tool does not utilize any Adornments or tool handles. - This tool does conduct a transaction when inserting the new node.

      -

      If you want to programmatically create a Part, you can call insertPart.

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -

      Properties

      - -
      -
      -

      Methods

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - - -
      -
      -
      -

      Properties

      -
      - -

      - archetypeNodeData - : ObjectData

      -
        -
      • -
        -

        Gets or sets a data object that will be copied and added to the diagram's model each time this tool executes. - The default value is null. - The value must be non-null for this tool to be able to run. - Setting this property does not raise any events.

        -
        -
      • -
      -
      -
      - -

      - isDoubleClick - : boolean

      -
        -
      • -
        -

        Gets or sets whether a double click rather than a single-click is required - to insert a new Part at the mouse-up point. - The default value is true -- only a double-click will cause a node to be created. - Setting this property does not raise any events.

        -
        -
      • -
      -
      -
      - -

      - isGridSnapEnabled - : boolean

      -
        -
      • -
        -

        Gets or sets whether the ClickCreatingTool snaps object sizes to the diagram's background grid during creation. - By default this property is false. - Setting this property does not raise any events.

        -
        -
        since
        -

        2.0

        -
        -
        -
        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - Override Virtual - canStart -

      -
        -
      • canStart(): boolean
      • -
      -
        -
      • -
        -

        This tool can run when the diagram is not read-only and supports creating new nodes, - and when there has been a click (or double-click if isDoubleClick is true) - in the background of the diagram (not on a Part), - and archetypeNodeData is an object that can be copied and added to the model.

        -

        This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Returns boolean

        -
      • -
      -
      -
      - -

      - Override - doMouseUp -

      -
        -
      • doMouseUp(): void
      • -
      -
        -
      • -
        -

        Upon a click, call insertPart and stop this tool.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - insertPart -

      - -
        -
      • -
        -

        Create a node by adding a copy of the archetypeNodeData object - to the diagram's model, assign its Part.location - to be the given point, and select the new part.

        -

        This starts and commits a transaction and also raises the "PartCreated" DiagramEvent. - The actual part that is added to the diagram may be a Part, a Node, - or even a Group, depending on the properties of the archetypeNodeData - and the type of the template that is copied to create the part.

        -

        This method also raises the "ChangingSelection" and "ChangedSelection" diagram events outside the transaction.

        -

        This method may be overridden, although it is usually much easier to just set archetypeNodeData. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Parameters

        -
          -
        • -
          loc: Point
          -
          -

          a Point in document coordinates.

          -
          -
        • -
        -

        Returns Part

        -

        the newly created Part, or null if it failed.

        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class ClickCreatingTool

      Hierarchy

      • Tool
        • ClickCreatingTool
      +

      The ClickCreatingTool lets the user create a node by clicking where they want the new node to be. +By default a double-click is required to start this tool; +set isDoubleClick to false if you want a single-click to create a node.

      +

      This tool is a standard mouse-up tool, the ToolManager.clickCreatingTool. +However, it will not be able to start running unless you have set the +archetypeNodeData property to an object that can be copied and added to the diagram's model.

      +

      If you set isGridSnapEnabled to true, newly created parts will be snapped to points on a grid.

      +

      This tool does not utilize any Adornments or tool handles. +This tool does conduct a transaction when inserting the new node.

      +

      If you want to programmatically create a Part, you can call insertPart.

      +

      Index

      Inherited Members

      Constructors

      Properties

      • +

        Gets or sets a data object that will be copied and added to the diagram's model each time this tool executes. +The default value is null. +The value must be non-null for this tool to be able to run. +Setting this property does not raise any events.

        +
      • +

        Gets or sets whether a double click rather than a single-click is required +to insert a new Part at the mouse-up point. +The default value is true -- only a double-click will cause a node to be created. +Setting this property does not raise any events.

        +
      • +

        Gets or sets whether the ClickCreatingTool snaps object sizes to the diagram's background grid during creation. +By default this property is false. +Setting this property does not raise any events.

        +
        since

        2.0

        +

      Methods

      • canStart(): boolean
      • +

        This tool can run when the diagram is not read-only and supports creating new nodes, +and when there has been a click (or double-click if isDoubleClick is true) +in the background of the diagram (not on a Part), +and archetypeNodeData is an object that can be copied and added to the model.

        +

        This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Returns boolean

      • doMouseUp(): void
      • +

        Upon a click, call insertPart and stop this tool.

        +

        Returns void

      • +

        Create a node by adding a copy of the archetypeNodeData object +to the diagram's model, assign its Part.location +to be the given point, and select the new part.

        +

        This starts and commits a transaction and also raises the "PartCreated" DiagramEvent. +The actual part that is added to the diagram may be a Part, a Node, +or even a Group, depending on the properties of the archetypeNodeData +and the type of the template that is copied to create the part.

        +

        This method also raises the "ChangingSelection" and "ChangedSelection" diagram events outside the transaction.

        +

        This method may be overridden, although it is usually much easier to just set archetypeNodeData. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Parameters

        • loc: Point
          +

          a Point in document coordinates.

          +

        Returns Part

        the newly created Part, or null if it failed.

        +

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/ClickSelectingTool.html b/api/symbols/ClickSelectingTool.html index e7acc9e56..ba222d01d 100644 --- a/api/symbols/ClickSelectingTool.html +++ b/api/symbols/ClickSelectingTool.html @@ -1,279 +1,61 @@ - - - - - - ClickSelectingTool | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class ClickSelectingTool

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      Hierarchy

      -
        -
      • - Tool -
          -
        • - ClickSelectingTool -
        • -
        -
      • -
      -
      -
      -
      -

      The ClickSelectingTool selects and deselects Parts when there is a click. - It does this by calling Tool.standardMouseSelect. - It is also responsible for handling and dispatching click events on GraphObjects - by calling Tool.standardMouseClick.

      -

      Note that this tool avoids raising click events on objects that are in temporary layers. - This is to prevent parts such as selection adornments from interfering with clicking on selected nodes or links. - (Adornments are in the "Adornment" Layer, which Layer.isTemporary.) - However this means that if you add a GraphObject.click event handler on a GraphObject in an Adornment, - it will not be called. - You can get it to be called by setting GraphObject.isActionable to true on that object in the adornment.

      -

      This tool is a standard mouse-up tool, the ToolManager.clickSelectingTool.

      -

      This tool does not utilize any Adornments or tool handles. - This tool does not modify the model or conduct any transaction.

      -

      An example customization of this tool is shown in the Tree Map sample, - where the Tool.standardMouseSelect method is overridden to permit the user to cycle through - the chain of containing groups, changing the selection on each click to the next containing group.

      -

      If you want to programmatically select a Part, you can set Part.isSelected or call Diagram.select. - If you want to know which Part is at a particular point, you can call Diagram.findPartAt.

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -

      Methods

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - - -
      -
      -
      -

      Methods

      -
      - -

      - Override Virtual - canStart -

      -
        -
      • canStart(): boolean
      • -
      -
        -
      • -
        -

        This tool can run whenever a click occurs.

        -

        This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Returns boolean

        -
      • -
      -
      -
      - -

      - Override - doMouseUp -

      -
        -
      • doMouseUp(): void
      • -
      - -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class ClickSelectingTool

      Hierarchy

      • Tool
        • ClickSelectingTool
      +

      The ClickSelectingTool selects and deselects Parts when there is a click. +It does this by calling Tool.standardMouseSelect. +It is also responsible for handling and dispatching click events on GraphObjects +by calling Tool.standardMouseClick.

      +

      Note that this tool avoids raising click events on objects that are in temporary layers. +This is to prevent parts such as selection adornments from interfering with clicking on selected nodes or links. +(Adornments are in the "Adornment" Layer, which Layer.isTemporary.) +However this means that if you add a GraphObject.click event handler on a GraphObject in an Adornment, +it will not be called. +You can get it to be called by setting GraphObject.isActionable to true on that object in the adornment.

      +

      This tool is a standard mouse-up tool, the ToolManager.clickSelectingTool.

      +

      This tool does not utilize any Adornments or tool handles. +This tool does not modify the model or conduct any transaction.

      +

      An example customization of this tool is shown in the Tree Map sample, +where the Tool.standardMouseSelect method is overridden to permit the user to cycle through +the chain of containing groups, changing the selection on each click to the next containing group.

      +

      If you want to programmatically select a Part, you can set Part.isSelected or call Diagram.select. +If you want to know which Part is at a particular point, you can call Diagram.findPartAt.

      +

      Index

      Constructors

      Methods

      Inherited Members

      Constructors

      Methods

      • canStart(): boolean
      • +

        This tool can run whenever a click occurs.

        +

        This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Returns boolean

      • doMouseUp(): void

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/ColumnResizingTool.html b/api/symbols/ColumnResizingTool.html index 2cc5d5092..717f9ac5b 100644 --- a/api/symbols/ColumnResizingTool.html +++ b/api/symbols/ColumnResizingTool.html @@ -1,536 +1,79 @@ - - - - - - ColumnResizingTool | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class ColumnResizingTool

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

      -
      -
      -

      Hierarchy

      -
        -
      • - Tool -
          -
        • - ColumnResizingTool -
        • -
        -
      • -
      -
      -
      -
      -

      The ColumnResizingTool class lets the user resize each column of a named Table Panel in a selected Part.

      -

      If you want to experiment with this extension, try the Column Resizing sample.

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -

      Properties

      - -
      -
      -

      Methods

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - -
        -
      • -
        -

        Constructs a ColumnResizingTool and sets the handle and name of the tool.

        -
        -

        Returns ColumnResizingTool

        -
      • -
      -
      -
      -
      -

      Properties

      -
      - -

      - Read-only - adornedTable - : Panel

      -
        -
      • -
        -

        This read-only property returns the Panel of type Panel.Table whose columns are being resized. - This must be contained within the selected Part.

        -
        -
      • -
      -
      -
      - -

      - Read-only - handle - : GraphObject

      - -
      -
      - -

      - handleArchetype - : Shape

      -
        -
      • -
        -

        Gets or sets small GraphObject that is copied as a resize handle for each column. - This tool expects that this object's GraphObject.desiredSize (a.k.a width and height) has been set to real numbers.

        -

        The default value is a Shape that is a narrow rectangle.

        -
        -
      • -
      -
      -
      - -

      - tableName - : string

      -
        -
      • -
        -

        Gets or sets the name of the Table Panel to be resized.

        -

        The default value is the name "TABLE".

        -
        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - Override - canStart -

      -
        -
      • canStart(): boolean
      • -
      -
        -
      • -
        -

        This tool may run when there is a mouse-down event on a "ColumnResizing" handle, - the diagram is not read-only, the left mouse button is being used, - and this tool's adornment's resize handle is at the current mouse point.

        -
        -

        Returns boolean

        -
      • -
      -
      -
      - -

      - Virtual - computeResize -

      - -
        -
      • -
        -

        This can be overridden in order to customize the resizing process.

        -
        -

        Parameters

        -
          -
        • -
          p: Point
          -
          -

          the point where the handle is being dragged

          -
          -
        • -
        -

        Returns Point

        -
      • -
      -
      -
      - -

      - Override - doActivate -

      -
        -
      • doActivate(): void
      • -
      -
        -
      • -
        -

        Find the handle, ensure type Panel.Table, capture the mouse, and start a transaction.

        -

        If the call to Tool.findToolHandleAt finds no "ColumnResizing" tool handle, this method returns without activating this tool.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doDeactivate -

      -
        -
      • doDeactivate(): void
      • -
      -
        -
      • -
        -

        Stop the current transaction and release the mouse.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doKeyDown -

      -
        -
      • doKeyDown(): void
      • -
      -
        -
      • -
        -

        Pressing the Delete key removes any column width setting and stops this tool.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doMouseMove -

      -
        -
      • doMouseMove(): void
      • -
      -
        -
      • -
        -

        Call resize with a new size determined by the current mouse point. - This determines the new bounds by calling computeResize.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doMouseUp -

      -
        -
      • doMouseUp(): void
      • -
      -
        -
      • -
        -

        Call resize with the final bounds based on the most recent mouse point, and commit the transaction. - This determines the new bounds by calling computeResize.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - resize -

      -
        -
      • resize(newPoint: Point): void
      • -
      -
        -
      • -
        -

        Change the RowColumnDefinition.width of the column being resized - to a value corresponding to the given mouse point.

        -
        -

        Parameters

        - -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - updateAdornments -

      -
        -
      • updateAdornments(part: Part): void
      • -
      - -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class ColumnResizingTool Extension

      This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

      Hierarchy

      • Tool
        • ColumnResizingTool
      +

      The ColumnResizingTool class lets the user resize each column of a named Table Panel in a selected Part.

      +

      If you want to experiment with this extension, try the Column Resizing sample.

      +

      Index

      Inherited Members

      Constructors

      • +

        Constructs a ColumnResizingTool and sets the handle and name of the tool.

        +

        Returns ColumnResizingTool

      Properties

      • +

        This read-only property returns the Panel of type Panel.Table whose columns are being resized. +This must be contained within the selected Part.

        +
      • +

        Gets or sets small GraphObject that is copied as a resize handle for each column. +This tool expects that this object's GraphObject.desiredSize (a.k.a width and height) has been set to real numbers.

        +

        The default value is a Shape that is a narrow rectangle.

        +
      • +

        Gets or sets the name of the Table Panel to be resized.

        +

        The default value is the name "TABLE".

        +

      Methods

      • canStart(): boolean
      • +

        This tool may run when there is a mouse-down event on a "ColumnResizing" handle, +the diagram is not read-only, the left mouse button is being used, +and this tool's adornment's resize handle is at the current mouse point.

        +

        Returns boolean

      • +

        This can be overridden in order to customize the resizing process.

        +

        Parameters

        • p: Point
          +

          the point where the handle is being dragged

          +

        Returns Point

      • doActivate(): void
      • +

        Find the handle, ensure type Panel.Table, capture the mouse, and start a transaction.

        +

        If the call to Tool.findToolHandleAt finds no "ColumnResizing" tool handle, this method returns without activating this tool.

        +

        Returns void

      • doDeactivate(): void
      • +

        Stop the current transaction and release the mouse.

        +

        Returns void

      • doKeyDown(): void
      • +

        Pressing the Delete key removes any column width setting and stops this tool.

        +

        Returns void

      • doMouseMove(): void
      • +

        Call resize with a new size determined by the current mouse point. +This determines the new bounds by calling computeResize.

        +

        Returns void

      • doMouseUp(): void
      • +

        Call resize with the final bounds based on the most recent mouse point, and commit the transaction. +This determines the new bounds by calling computeResize.

        +

        Returns void

      • resize(newPoint: Point): void
      • updateAdornments(part: Part): void

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/CommandHandler.html b/api/symbols/CommandHandler.html index 2550eb17f..f8711b7d9 100644 --- a/api/symbols/CommandHandler.html +++ b/api/symbols/CommandHandler.html @@ -1,2432 +1,676 @@ - - - - - - CommandHandler | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class CommandHandler

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      Hierarchy

      - -
      -
      -
      -

      The Diagram.commandHandler implements various - commands such as CommandHandler.deleteSelection or CommandHandler.redo. - The CommandHandler includes keyboard event handling to interpret - key presses as commands.

      -

      CommandHandlers cannot be shared amongst multiple Diagrams.

      -

      You may define a CommandHandler subclass and override methods. - However you must seriously consider calling the base method in order to get its default behavior. - There may be situations where not calling the base method may cause subtle bugs, - but that depends on the method. - Please read the Introduction page on Extensions for how to override methods and how to call a base method.

      -

      There is an example custom CommandHandler in the extensions directory: DrawCommandHandler.js, - which provides alignment commands and additional behaviors for the arrow keys.

      -

      - For additional discussion, please read the Introduction page on Commands. -

      Keyboard Shortcuts

      -

      The CommandHandler implements the following command bindings for keyboard input in doKeyDown:

      - -

      On a Macintosh the Command key is used as the modifier instead of the Control key.

      -

      On touch devices there is a default context menu that shows many commonly-used commands - when you hold a finger down on the diagram.

      -
      -
      -
      -

      Index

      -
      - -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - -
        -
      • -
        -

        The constructor produces a CommandHandler with the default key bindings.

        -
        -

        Returns CommandHandler

        -
      • -
      -
      -
      -
      -

      Properties

      -
      - -

      - archetypeGroupData - : ObjectData

      -
        -
      • -
        -

        Gets or sets a data object that is copied by groupSelection - when creating a new Group.

        -

        The default value is null. - If you set this to an Object, be sure that GraphLinksModel.isGroupForNodeData is true for that object. - Setting this property does not raise any events.

        -
        -
      • -
      -
      -
      - -

      - copiesConnectedLinks - : boolean

      -
        -
      • -
        -

        Gets or sets whether copySelection should also copy Links that connect with selected Nodes. - The default value is true. - Setting this property does not raise any events.

        -

        The DraggingTool.copiesEffectiveCollection property serves a similar role for the DraggingTool - when the user holds down the control key to modify the drag into a copy operation.

        -
        -
        since
        -

        1.5

        -
        -
        -
        -
      • -
      -
      -
      - -

      - copiesGroupKey - : boolean

      -
        -
      • -
        -

        Gets or sets whether copySelection and copyToClipboard copy the node data property - whose value is the containing group data's key.

        -

        Set this property to true if you want a copy/paste of a node to automatically have the new node be a member of the original group. - Caution: this only has an effect if the Diagram's Diagram.model is a GraphLinksModel.

        -

        The default value is false.

        -
        -
        since
        -

        1.3

        -
        -
        -
        -
      • -
      -
      -
      - -

      - copiesParentKey - : boolean

      -
        -
      • -
        -

        Gets or sets whether copySelection and copyToClipboard copy the node data property - whose value is the tree-parent node data's key.

        -

        Set this property to true if you want a copy/paste of a node to automatically have the new node be a tree-child of the original tree-parent node. - Caution: this only has an effect if the Diagram's Diagram.model is a TreeModel.

        -

        The default value is false.

        -
        -
        since
        -

        1.3

        -
        -
        -
        -
      • -
      -
      -
      - -

      - copiesTree - : boolean

      -
        -
      • -
        -

        Gets or sets whether copySelection should also copy subtrees. - The default value is false. - Setting this property does not raise any events.

        -

        The DraggingTool.dragsTree property serves a similar role for the DraggingTool - for both moving and copying operations.

        -
        -
      • -
      -
      -
      - -

      - deletesConnectedLinks - : boolean

      -
        -
      • -
        -

        Gets or sets whether deleteSelection should also delete links that are connected to nodes that are deleted. - The default value is true. - Setting this property does not raise any events.

        -
        -
        since
        -

        1.6

        -
        -
        -
        -
      • -
      -
      -
      - -

      - deletesTree - : boolean

      -
        -
      • -
        -

        Gets or sets whether deleteSelection should also delete subtrees. - The default value is false. - Setting this property does not raise any events.

        -
        -
      • -
      -
      -
      - -

      - Read-only - diagram - : Diagram

      -
        -
      • -
        -

        This read-only property returns the Diagram that is using this CommandHandler, - after Diagram.commandHandler has been set to this object.

        -
        -
      • -
      -
      -
      - -

      - isZoomToFitRestoreEnabled - : boolean

      -
        -
      • -
        -

        Gets or sets whether the zoomToFit command ever restores the previous - Diagram scale and position. - When this property is false, this command always calls Diagram.zoomToFit.

        -

        The default value is true. - Setting this property does not raise any events.

        -
        -
        since
        -

        2.2

        -
        -
        -
        -
      • -
      -
      -
      - -

      - memberValidation - : (aGroup: Group, somePart: Part) => boolean

      -
        -
      • -
        -

        Gets or sets the predicate that determines whether or not a node may become a member of a group. - This predicate is called in addition to any existing group's Group.memberValidation predicate. - The default predicate is null, which is equivalent to simply returning true. - The predicate may be called passing null as the first argument (the Group) -- - this asks whether it is OK to make the second argument (the Part, but not a Link) a top-level Part of the diagram.

        -

        - For a more general discussion of validation, see Introduction to Validation. -

        The function, if supplied, must not have any side-effects.

        -
        -
      • -
      -
      -
      - -

      - zoomFactor - : number

      -
        -
      • -
        -

        Gets or sets the amount by which decreaseZoom and increaseZoom change - the Diagram.scale.

        -

        The default value is 1.05 (5%). - The value must be a number larger than 1.0. - Setting this property does not raise any events.

        -
        -
        since
        -

        1.1

        -
        -
        -
        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - Virtual - addTopLevelParts -

      -
        -
      • addTopLevelParts(coll: Iterable<Part>, check?: boolean): boolean
      • -
      -
        -
      • -
        -

        Make sure all of the unnested Parts in the given collection - are removed from any containing Groups.

        -

        This sets Part.containingGroup to null on each Part that is - not a member of another Part in the argument collection. - If the check argument to this method is supplied and true, - this will call isValidMember on each part, passing null as the first argument.

        -

        This functionality is similar to ungroupSelection, - except that this is not a command (there is no transaction and this does not raise a DiagramEvent) - and the parts are necessarily becoming top-level parts - (whereas ungrouping would add them to the Group containing the Group being ungrouped).

        -

        This function is typically called in a Diagram.mouseDrop event handler - in order to remove the selected Parts from whatever Group they had been in.

        -

        If you want to add Parts to be members of a Group, call Group.addMembers. - If you want to remove Parts completely from a Diagram, call Diagram.removeParts.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Parameters

        -
          -
        • -
          coll: Iterable<Part>
          -
          -

          a collection of Parts.

          -
          -
        • -
        • -
          Optional check: boolean
          -
          -

          whether to call isValidMember to confirm that changing the Part to be a top-level Part is valid.

          -
          -
        • -
        -

        Returns boolean

        -

        true if all non-Links were changed to be top-level Parts in this Diagram; false if some Parts or Nodes were not able to be added.

        -
      • -
      -
      -
      - -

      - Virtual - canCollapseSubGraph -

      -
        -
      • canCollapseSubGraph(group?: Group): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether the user can collapse expanded Groups.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        collapseSubGraph

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional group: Group
          -
          -

          if supplied, ignore the selection and consider collapsing this particular Group.

          -
          -
        • -
        -

        Returns boolean

        -
      • -
      -
      -
      - -

      - Virtual - canCollapseTree -

      -
        -
      • canCollapseTree(node?: Node): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether the user can collapse expanded subtrees of Nodes.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        collapseTree

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional node: Node
          -
          -

          if supplied, ignore the selection and consider collapsing this particular Node.

          -
          -
        • -
        -

        Returns boolean

        -
      • -
      -
      -
      - -

      - Virtual - canCopySelection -

      -
        -
      • canCopySelection(): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether or not the user can invoke the copySelection command.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        copySelection

        -
        -
        -
        -

        Returns boolean

        -

        This returns true: - if Diagram.allowCopy is true, - if Diagram.allowClipboard is true, and - if there are some selected Parts.

        -
      • -
      -
      -
      - -

      - Virtual - canCutSelection -

      -
        -
      • canCutSelection(): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether or not the user can invoke the cutSelection command.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        cutSelection

        -
        -
        -
        -

        Returns boolean

        -

        This returns true: - if the diagram is not Diagram.isReadOnly, - if Diagram.allowCopy is true, - if Diagram.allowDelete is true, - if Diagram.allowClipboard is true, and - if there are some selected Parts.

        -
      • -
      -
      -
      - -

      - Virtual - canDecreaseZoom -

      -
        -
      • canDecreaseZoom(factor?: number): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether or not the user can invoke the decreaseZoom command.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        decreaseZoom

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional factor: number
          -
          -

          This defaults to 1/zoomFactor. The value should be less than one and greater than zero.

          -
          -
        • -
        -

        Returns boolean

        -

        This returns true if Diagram.allowZoom is true - and if the new scale is within the range of Diagram.minScale and Diagram.maxScale.

        -
      • -
      -
      -
      - -

      - Virtual - canDeleteSelection -

      -
        -
      • canDeleteSelection(): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether or not the user can invoke the deleteSelection command.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        deleteSelection

        -
        -
        -
        -

        Returns boolean

        -

        This returns true: - if the diagram is not Diagram.isReadOnly, - if Diagram.allowDelete is true, and - if there are some selected Parts.

        -
      • -
      -
      -
      - -

      - Virtual - canEditTextBlock -

      -
        -
      • canEditTextBlock(textblock?: TextBlock): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether or not the user can invoke the editTextBlock command.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        editTextBlock

        -
        -
        -
        -

        Parameters

        - -

        Returns boolean

        -

        This returns true: - if the diagram is not Diagram.isReadOnly, - if Diagram.allowTextEdit is true, - if there is a ToolManager.textEditingTool, and - if there is any selected Part for which Part.canEdit is true.

        -
      • -
      -
      -
      - -

      - Virtual - canExpandSubGraph -

      -
        -
      • canExpandSubGraph(group?: Group): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether the user can expand collapsed Groups.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        expandSubGraph

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional group: Group
          -
          -

          if supplied, ignore the selection and consider expanding this particular Group.

          -
          -
        • -
        -

        Returns boolean

        -
      • -
      -
      -
      - -

      - Virtual - canExpandTree -

      -
        -
      • canExpandTree(node?: Node): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether the user can expand collapsed subtrees of Nodes.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        expandTree

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional node: Node
          -
          -

          if supplied, ignore the selection and consider expanding this particular Node.

          -
          -
        • -
        -

        Returns boolean

        -
      • -
      -
      -
      - -

      - Virtual - canGroupSelection -

      -
        -
      • canGroupSelection(): boolean
      • -
      - -
      -
      - -

      - Virtual - canIncreaseZoom -

      -
        -
      • canIncreaseZoom(factor?: number): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether or not the user can invoke the increaseZoom command.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        increaseZoom

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional factor: number
          -
          -

          This defaults to zoomFactor. The value should be greater than one.

          -
          -
        • -
        -

        Returns boolean

        -

        This returns true if Diagram.allowZoom is true - and if the new scale is within the range of Diagram.minScale and Diagram.maxScale.

        -
      • -
      -
      -
      - -

      - Virtual - canPasteSelection -

      -
        -
      • canPasteSelection(pos?: Point): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether or not the user can invoke the pasteSelection command.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        pasteSelection

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional pos: Point
          -
          -

          Point at which to center the newly pasted parts; if not present the parts would not be moved.

          -
          -
        • -
        -

        Returns boolean

        -

        This returns true: - if the diagram is not Diagram.isReadOnly, - if Diagram.allowInsert is true, - if Diagram.allowClipboard is true, and - if the clipboard has parts in it.

        -
      • -
      -
      -
      - -

      - Virtual - canRedo -

      -
        -
      • canRedo(): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether or not the user can invoke the redo command.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        redo

        -
        -
        -
        -

        Returns boolean

        -

        This returns true: - if the diagram is not Diagram.isReadOnly, - if Diagram.allowUndo is true, and - if the UndoManager.canRedo predicate returns true.

        -
      • -
      -
      -
      - -

      - Virtual - canResetZoom -

      -
        -
      • canResetZoom(newscale?: number): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether or not the user can invoke the resetZoom command.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        resetZoom

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional newscale: number
          -
          -

          This defaults to Diagram.defaultScale, which is normally 1.0. The value should be greater than zero.

          -
          -
        • -
        -

        Returns boolean

        -

        This returns true if Diagram.allowZoom is true. - and if the new scale is within the range of Diagram.minScale and Diagram.maxScale.

        -
      • -
      -
      -
      - -

      - Virtual - canScrollToPart -

      -
        -
      • canScrollToPart(part?: Part): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether or not the user can invoke the scrollToPart command. - This returns false if there is no argument Part and there are no selected Parts.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        scrollToPart

        -
        -
        since
        -

        1.6

        -
        -
        -
        -

        Parameters

        - -

        Returns boolean

        -

        This returns true if Diagram.allowHorizontalScroll and Diagram.allowVerticalScroll are true.

        -
      • -
      -
      -
      - -

      - Virtual - canSelectAll -

      -
        -
      • canSelectAll(): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether or not the user can invoke the selectAll command.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        selectAll

        -
        -
        -
        -

        Returns boolean

        -

        This returns true if Diagram.allowSelect is true.

        -
      • -
      -
      -
      - -

      - Virtual - canShowContextMenu -

      - -
        -
      • -
        -

        This predicate controls whether or not the user can invoke the showContextMenu command.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        showContextMenu

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional obj: GraphObject | Diagram
          -
          -

          a GraphObject or Diagram with a contextMenu defined. - If none is given, this method will use the first selected object, or else the Diagram.

          -
          -
        • -
        -

        Returns boolean

        -
      • -
      -
      -
      - -

      - Virtual - canStopCommand -

      -
        -
      • canStopCommand(): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether the user may stop the current tool. - This just returns true.

        -

        This method may be overridden, but probably should not be overridden. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        stopCommand

        -
        -
        -
        -

        Returns boolean

        -

        true.

        -
      • -
      -
      -
      - -

      - Virtual - canUndo -

      -
        -
      • canUndo(): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether or not the user can invoke the undo command.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        undo

        -
        -
        -
        -

        Returns boolean

        -

        This returns true: - if the diagram is not Diagram.isReadOnly, - if Diagram.allowUndo is true, and - if the UndoManager.canUndo predicate returns true.

        -
      • -
      -
      -
      - -

      - Virtual - canUngroupSelection -

      -
        -
      • canUngroupSelection(group?: Group): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether or not the user can invoke the ungroupSelection command.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        ungroupSelection

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional group: Group
          -
          -

          if supplied, ignore the selection and consider ungrouping this particular Group.

          -
          -
        • -
        -

        Returns boolean

        -

        This returns true: - if the diagram is not Diagram.isReadOnly, - if Diagram.allowDelete is true, - if Diagram.allowUngroup is true, - if Diagram.model is a GraphLinksModel, and - if there are any selected Groups that are Group.ungroupable.

        -
      • -
      -
      -
      - -

      - Virtual - canZoomToFit -

      -
        -
      • canZoomToFit(): boolean
      • -
      -
        -
      • -
        -

        This predicate controls whether or not the user can invoke the zoomToFit command.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - This method must not have any side-effects. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        zoomToFit

        -
        -
        since
        -

        1.1

        -
        -
        -
        -

        Returns boolean

        -

        This returns true if Diagram.allowZoom is true.

        -
      • -
      -
      -
      - -

      - Virtual - collapseSubGraph -

      -
        -
      • collapseSubGraph(group?: Group): void
      • -
      -
        -
      • -
        -

        This command collapses all expanded selected Groups. - This operation is performed within a "Collapse SubGraph" transaction. - Just before the end of the transaction this raises the "SubGraphCollapsed" DiagramEvent, - with a collection of collapsed Groups as the subject. - This currently has no default keyboard shortcut.

        -

        This calls Group.collapseSubGraph to perform the collapse, which will set Group.isSubGraphExpanded to false. - You may want to save the collapsed/expanded state to the model by using a TwoWay Binding on the "isSubGraphExpanded" property of your Groups, - and perhaps also on the Group.wasSubGraphExpanded property.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canCollapseSubGraph

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional group: Group
          -
          -

          if supplied, ignore the selection and collapse this particular Group.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - collapseTree -

      -
        -
      • collapseTree(node?: Node): void
      • -
      -
        -
      • -
        -

        This command collapses all expanded selected Nodes. - This operation is performed within a "Collapse Tree" transaction. - Just before the end of the transaction this raises the "TreeCollapsed" DiagramEvent, - with a collection of collapsed Nodes as the subject. - This currently has no default keyboard shortcut.

        -

        This calls Node.collapseTree to perform the collapse, which will set Node.isTreeExpanded to false. - You may want to save the collapsed/expanded state to the model by using a TwoWay Binding on the "isTreeExpanded" property of your Nodes, - and perhaps also on the Node.wasTreeExpanded property.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canCollapseTree

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional node: Node
          -
          -

          if supplied, ignore the selection and collapse this particular Node subtree.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - computeEffectiveCollection -

      - -
        -
      • -
        -

        Find the actual collection of nodes and links to be moved or copied, - given an initial collection. - This includes links that connected at both ends to nodes being moved or copied, - members of Groups, and if DraggingTool.dragsTree is true, - this includes nodes and links that are "tree" descendants from selected nodes.

        -

        Note that this does not return a simple collection of Parts, - but a Map associating a chosen Part - with an Object holding its original location Points as the value of the "point" property.

        -

        This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -

        This was moved to CommandHandler from DraggingTool in 2.0.

        -
        -
        since
        -

        2.0

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          parts: Iterable<Part>
          -
          -

          A Set or List of Parts.

          -
          -
        • -
        • -
          Optional options: DraggingOptions
          -
          -

          Potential options for the collection computation. If not specified, this uses the DraggingTool's drag options.

          -
          -
        • -
        -

        Returns Map<Part, DraggingInfo>

        -

        a Map mapping Parts to DraggingInfo Objects - that have a "point" property remembering the original location of that Part.

        -
      • -
      -
      -
      - -

      - Virtual - copySelection -

      -
        -
      • copySelection(): void
      • -
      -
        -
      • -
        -

        This command copies the currently selected parts, Diagram.selection, from the Diagram into the clipboard. - This is normally invoked by the Ctrl-C keyboard shortcut.

        -

        This makes a copy of the current selection by calling copyToClipboard. - This also raises the "ClipboardChanged" diagram event.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canCopySelection

        -
        -
        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - copyToClipboard -

      - -
        -
      • -
        -

        Make a copy of the given collection of Parts - and stores it in a static variable acting as the clipboard.

        -

        The clipboard is initially null. - It can hold a collection of copied Parts. - It also remembers the Model.dataFormat of the diagram - from which the parts were copied.

        -

        This calls Diagram.copyParts in order to make a copy of the Parts for the clipboard. - The values of copiesParentKey and copiesGroupKey affect whether - a copied node data remembers its tree parent node (if in a TreeModel) or - its containing group (if in a GraphLinksModel).

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        pasteFromClipboard

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          coll: Iterable<Part>
          -
          -

          A collection of Parts. - If the value is null, the clipboard is cleared of all data.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - cutSelection -

      -
        -
      • cutSelection(): void
      • -
      -
        -
      • -
        -

        This command executes a copySelection followed by a deleteSelection. - This is normally invoked by the Ctrl-X keyboard shortcut.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canCutSelection

        -
        -
        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - decreaseZoom -

      -
        -
      • decreaseZoom(factor?: number): void
      • -
      -
        -
      • -
        -

        This command decreases the Diagram.scale by a given factor. - This is normally invoked by the Ctrl-- and Keypad-- keyboard shortcuts.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canDecreaseZoom

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional factor: number
          -
          -

          This defaults to 1/zoomFactor. The value should be less than one and greater than zero.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - deleteSelection -

      -
        -
      • deleteSelection(): void
      • -
      -
        -
      • -
        -

        This command deletes the currently selected parts from the diagram. - This is normally invoked by the Del keyboard shortcut.

        -

        This will first start a "Delete" transaction, then - raise the "SelectionDeleting" DiagramEvent, - call Diagram.removeParts on a perhaps extended collection of selected Parts, - raise the "SelectionDeleted" diagram event, - and finally commit the transaction.

        -

        Because this command changes the selection, - this method also raises the "ChangingSelection" and "ChangedSelection" diagram events. - Changes are performed within a transaction, but the selection events are raised outside the transaction.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canDeleteSelection

        -
        -
        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - doKeyDown -

      -
        -
      • doKeyDown(): void
      • -
      -
        -
      • -
        -

        This is called by tools to handle keyboard commands. - For most commands, this calls the "can..." predicate; if that returns true it calls the command method. - If GoJS handles a key-down event as a keyboard command, the underlying event will not bubble.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -

        There is an example custom CommandHandler in the extensions directory: DrawCommandHandler.js, - which implements additional behaviors for the arrow keys by overriding this method. - For additional discussion, please read the Introduction page on Commands.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - doKeyUp -

      -
        -
      • doKeyUp(): void
      • -
      -
        -
      • -
        -

        This is called by tools to handle keyboard commands.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - editTextBlock -

      -
        -
      • editTextBlock(textblock?: TextBlock): void
      • -
      -
        -
      • -
        -

        This command starts in-place editing of a TextBlock in the selected Part. - This is normally invoked by the F2 keyboard shortcut.

        -

        This starts the TextEditingTool to have the user enter or modify the text string and finally set the TextBlock.text. - You may want to save the new string to the model by using a TwoWay Binding on the "text" property of your TextBlock.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canEditTextBlock

        -
        -
        -
        -

        Parameters

        - -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - expandSubGraph -

      -
        -
      • expandSubGraph(group?: Group): void
      • -
      -
        -
      • -
        -

        This command expands all collapsed selected Groups. - This operation is performed within an "Expand SubGraph" transaction. - Just before the end of the transaction this raises the "SubGraphExpanded" DiagramEvent, - with a collection of expanded Groups as the subject. - This currently has no default keyboard shortcut.

        -

        This calls Group.expandSubGraph to perform the collapse, which will set Group.isSubGraphExpanded to true. - You may want to save the collapsed/expanded state to the model by using a TwoWay Binding on the "isSubGraphExpanded" property of your Groups, - and perhaps also on the Group.wasSubGraphExpanded property.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canExpandSubGraph

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional group: Group
          -
          -

          if supplied, ignore the selection and expand this particular Group.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - expandTree -

      -
        -
      • expandTree(node?: Node): void
      • -
      -
        -
      • -
        -

        This command expands all collapsed selected Nodes. - This operation is performed within an "Expand Tree" transaction. - Just before the end of the transaction this raises the "TreeExpanded" DiagramEvent, - with a collection of expanded Nodes as the subject. - This currently has no default keyboard shortcut.

        -

        This calls Node.expandTree to perform the expand, which will set Node.isTreeExpanded to true. - You may want to save the collapsed/expanded state to the model by using a TwoWay Binding on the "isTreeExpanded" property of your Nodes, - and perhaps also on the Node.wasTreeExpanded property.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canExpandTree

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional node: Node
          -
          -

          if supplied, ignore the selection and collapse this particular Node subtree.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - groupSelection -

      -
        -
      • groupSelection(): void
      • -
      -
        -
      • -
        -

        This command adds a copy of archetypeGroupData to the diagram's model - to create a new Group and then adds the selected Parts to that new group. - This is normally invoked by the Ctrl-G keyboard shortcut.

        -

        This creates a new Group by adding a copy of the archetypeGroupData to the model. - Each of the selected parts for which Part.canGroup is true - and for which isValidMember is true - is made a member of that new group. - If all of the selected groupable parts were members of a pre-existing group, - the new group also becomes a member of that pre-existing group, - if isValidMember is true for that existing group with the new group. - The new group becomes the only selected part. - This raises the "SelectionGrouped" diagram event. - This method also raises the "ChangingSelection" and "ChangedSelection" diagram events. - Changes are performed in a "Group" transaction, but the selection events are raised outside the transaction.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canGroupSelection

        -
        -
        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - increaseZoom -

      -
        -
      • increaseZoom(factor?: number): void
      • -
      -
        -
      • -
        -

        This command increases the Diagram.scale by a given factor. - This is normally invoked by the Ctrl-+ and Keypad-+ keyboard shortcuts.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canIncreaseZoom

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional factor: number
          -
          -

          This defaults to zoomFactor. The value should be greater than one.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - isValidMember -

      -
        -
      • isValidMember(group: Group, part: Part): boolean
      • -
      -
        -
      • -
        -

        This predicate is called to determine whether a Node may be added as a member of a Group. - This always checks to make sure no group might become a member of itself, either directly or indirectly. - If the Group has a Group.memberValidation predicate and if it returns false, this method returns false. - If this CommandHandler has a memberValidation predicate and if it returns false, this method returns false. - Otherwise this will return true.

        -

        - For a more general discussion of validation, see Introduction to Validation. -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Parameters

        -
          -
        • -
          group: Group
          -
          -

          this may be null if the node is being added as a top-level node.

          -
          -
        • -
        • -
          part: Part
          -
          -

          a Part, usually a Node, possibly another Group, but not a Link or an Adornment.

          -
          -
        • -
        -

        Returns boolean

        -

        true if OK to add the node to the group.

        -
      • -
      -
      -
      - -

      - Virtual - pasteFromClipboard -

      -
        -
      • pasteFromClipboard(): Set<Part>
      • -
      -
        -
      • -
        -

        If the clipboard holds a collection of Parts, - and if the Model.dataFormat matches that stored in the clipboard, - this makes a copy of the clipboard's parts and adds the copies to this Diagram.

        -

        This calls Diagram.copyParts in order to make a copy of the Parts in the clipboard and add them to this diagram.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        copyToClipboard

        -
        -
        -
        -

        Returns Set<Part>

        -

        a collection of the newly pasted Parts, - or an empty Set if there was no data in the clipboard.

        -
      • -
      -
      -
      - -

      - Virtual - pasteSelection -

      -
        -
      • pasteSelection(pos?: Point): void
      • -
      -
        -
      • -
        -

        This command copies the contents of the clipboard into this diagram and makes those new parts the new selection. - This is normally invoked by the Ctrl-V keyboard shortcut.

        -

        This calls pasteFromClipboard to add copies of Parts - into this diagram, and then selects all of the newly created parts. - This also raises the "ClipboardPasted" diagram event. - This method raises the "ChangingSelection" and "ChangedSelection" diagram events. - Changes are performed in a transaction, but the selection events are raised outside the transaction.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canPasteSelection

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional pos: Point
          -
          -

          Point at which to center the newly pasted parts; if not present the parts are not moved.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - redo -

      -
        -
      • redo(): void
      • -
      -
        -
      • -
        -

        This command calls UndoManager.redo. - This is normally invoked by the Ctrl-Y keyboard shortcut.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canRedo

        -
        -
        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - resetZoom -

      -
        -
      • resetZoom(newscale?: number): void
      • -
      -
        -
      • -
        -

        This command sets the Diagram.scale to a new scale value, by default 1. - This is normally invoked by the Ctrl-0 keyboard shortcut.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canResetZoom

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional newscale: number
          -
          -

          This defaults to Diagram.defaultScale, which is normally 1.0. The value should be greater than zero.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - scrollToPart -

      -
        -
      • scrollToPart(part?: Part): void
      • -
      -
        -
      • -
        -

        This command scrolls the diagram to make a highlighted or selected Part visible in the viewport. - Call this command repeatedly to cycle through the Diagram.highlighteds collection, - if there are any Parts in that collection, or else in the Diagram.selection collection, - scrolling to each one in turn by calling Diagram.centerRect.

        -

        This method animates to the scrolled part, and Diagram.scrollToRect does not.

        -

        This is normally invoked by the Space keyboard shortcut. - If there is no argument and there is no highlighted or selected Part, this command does nothing.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canScrollToPart, Diagram.scrollToRect

        -
        -
        since
        -

        1.6

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional part: Part
          -
          -

          This defaults to the first highlighted Part of Diagram.highlighteds, - or, if there are no highlighted Parts, the first selected Part.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - selectAll -

      -
        -
      • selectAll(): void
      • -
      -
        -
      • -
        -

        This command selects all of the selectable Parts in the diagram by setting Part.isSelected to true on each one. - This is normally invoked by the Ctrl-A keyboard shortcut.

        -

        This method raises the "ChangingSelection" and "ChangedSelection" diagram events. - This ignores all parts in temporary layers.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canSelectAll

        -
        -
        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - showContextMenu -

      - -
        -
      • -
        -

        This command opens the context menu for a selected Part or given GraphObject, or else for the whole Diagram. - This is normally invoked by the Menu keyboard shortcut.

        -

        The given GraphObject must have a GraphObject.contextMenu - defined in order to show anything.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canShowContextMenu

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional obj: GraphObject | Diagram
          -
          -

          a GraphObject or Diagram with a contextMenu defined. - If none is given, this method will use the first selected object, or else the Diagram. - The method will simulate a right-button click at the middle of the GraphObject or, - if a Diagram, at the current mouse position if it is in the viewport.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - stopCommand -

      -
        -
      • stopCommand(): void
      • -
      -
        -
      • -
        -

        This command cancels the operation of the current tool. - This is typically called when the user presses ESCAPE.

        -

        If the current tool is a ToolManager, this clears the diagram's selection. - This then calls Tool.doCancel on the current tool.

        -
        -
        see
        -

        canStopCommand

        -
        -
        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - undo -

      -
        -
      • undo(): void
      • -
      -
        -
      • -
        -

        This command calls UndoManager.undo. - This is normally invoked by the Ctrl-Z keyboard shortcut.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canUndo

        -
        -
        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - ungroupSelection -

      -
        -
      • ungroupSelection(group?: Group): void
      • -
      -
        -
      • -
        -

        This command removes selected groups from the diagram without removing their members from the diagram. - This is normally invoked by the Ctrl-Shift-G keyboard shortcut.

        -

        For the given group, or if not supplied, each selected Group that is Group.ungroupable, - expand the subgraph and change all of its member parts to be members of the group that the selected group node is in. - (If the selected group is a top-level node, i.e. not a member of any group node, its members become top-level parts too.) - All of those selected groups are deleted. - All of the reparented member parts are selected.

        -

        This raises the "SelectionUngrouped" diagram event. - This method also raises the "ChangingSelection" and "ChangedSelection" diagram events. - Changes are performed in an "Ungroup" transaction, but the selection events are raised outside the transaction.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canUngroupSelection

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          Optional group: Group
          -
          -

          if supplied, ignore the selection and consider ungrouping this particular Group.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - zoomToFit -

      -
        -
      • zoomToFit(): void
      • -
      -
        -
      • -
        -

        This command changes the Diagram.scale so that the Diagram.documentBounds fits within the viewport. - If this command had been called before without any other zooming since then, - the original Diagram scale and position are restored. - This is normally invoked by the Shift-Z keyboard shortcut.

        -

        As of 2.1, this animates zooming by default. Diagram.zoomToFit does not animate.

        -

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -
        see
        -

        canZoomToFit

        -
        -
        since
        -

        1.1

        -
        -
        -
        -

        Returns void

        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class CommandHandler

      Hierarchy

      +

      The Diagram.commandHandler implements various +commands such as CommandHandler.deleteSelection or CommandHandler.redo. +The CommandHandler includes keyboard event handling to interpret +key presses as commands.

      +

      CommandHandlers cannot be shared amongst multiple Diagrams.

      +

      You may define a CommandHandler subclass and override methods. +However you must seriously consider calling the base method in order to get its default behavior. +There may be situations where not calling the base method may cause subtle bugs, +but that depends on the method. +Please read the Introduction page on Extensions for how to override methods and how to call a base method.

      +

      There is an example custom CommandHandler in the extensions directory: DrawCommandHandler.js, +which provides alignment commands and additional behaviors for the arrow keys.

      +

      +For additional discussion, please read the Introduction page on Commands. +

      Keyboard Shortcuts

      - // topnav - var topButton = document.getElementById("topnavButton"); - var topnavList = document.getElementById("topnavList"); - topButton.addEventListener("click", function() { - this.classList.toggle("active"); - topnavList.classList.toggle("hidden"); - document.getElementById("topnavOpen").classList.toggle("hidden"); - document.getElementById("topnavClosed").classList.toggle("hidden"); - }); - - - \ No newline at end of file +

      The CommandHandler implements the following command bindings for keyboard input in doKeyDown:

      + +

      On a Macintosh the Command key is used as the modifier instead of the Control key.

      +

      On touch devices there is a default context menu that shows many commonly-used commands +when you hold a finger down on the diagram.

      +

      Index

      Constructors

      • +

        The constructor produces a CommandHandler with the default key bindings.

        +

        Returns CommandHandler

      Properties

      • +

        Gets or sets a data object that is copied by groupSelection +when creating a new Group.

        +

        The default value is null. +If you set this to an Object, be sure that GraphLinksModel.isGroupForNodeData is true for that object. +Setting this property does not raise any events.

        +
      • +

        Gets or sets whether copySelection should also copy Links that connect with selected Nodes. +The default value is true. +Setting this property does not raise any events.

        +

        The DraggingTool.copiesEffectiveCollection property serves a similar role for the DraggingTool +when the user holds down the control key to modify the drag into a copy operation.

        +
        since

        1.5

        +
      • +

        Gets or sets whether copySelection and copyToClipboard copy the node data property +whose value is the containing group data's key.

        +

        Set this property to true if you want a copy/paste of a node to automatically have the new node be a member of the original group. +Caution: this only has an effect if the Diagram's Diagram.model is a GraphLinksModel.

        +

        The default value is false.

        +
        since

        1.3

        +
      • +

        Gets or sets whether copySelection and copyToClipboard copy the node data property +whose value is the tree-parent node data's key.

        +

        Set this property to true if you want a copy/paste of a node to automatically have the new node be a tree-child of the original tree-parent node. +Caution: this only has an effect if the Diagram's Diagram.model is a TreeModel.

        +

        The default value is false.

        +
        since

        1.3

        +
      • +

        Gets or sets whether copySelection should also copy subtrees. +The default value is false. +Setting this property does not raise any events.

        +

        The DraggingTool.dragsTree property serves a similar role for the DraggingTool +for both moving and copying operations.

        +
      • +

        Gets or sets whether deleteSelection should also delete links that are connected to nodes that are deleted. +The default value is true. +Setting this property does not raise any events.

        +
        since

        1.6

        +
      • +

        Gets or sets whether deleteSelection should also delete subtrees. +The default value is false. +Setting this property does not raise any events.

        +
      • +

        Gets or sets whether the zoomToFit command ever restores the previous +Diagram scale and position. +When this property is false, this command always calls Diagram.zoomToFit.

        +

        The default value is true. +Setting this property does not raise any events.

        +
        since

        2.2

        +
      • +

        Gets or sets the predicate that determines whether or not a node may become a member of a group. +This predicate is called in addition to any existing group's Group.memberValidation predicate. +The default predicate is null, which is equivalent to simply returning true. +The predicate may be called passing null as the first argument (the Group) -- +this asks whether it is OK to make the second argument (the Part, but not a Link) a top-level Part of the diagram.

        +

        +For a more general discussion of validation, see Introduction to Validation.

        The function, if supplied, must not have any side-effects.

        +
      • +

        Gets or sets the amount by which decreaseZoom and increaseZoom change +the Diagram.scale.

        +

        The default value is 1.05 (5%). +The value must be a number larger than 1.0. +Setting this property does not raise any events.

        +
        since

        1.1

        +

      Methods

      • addTopLevelParts(coll: Iterable<Part>, check?: boolean): boolean
      • +

        Make sure all of the unnested Parts in the given collection +are removed from any containing Groups.

        +

        This sets Part.containingGroup to null on each Part that is +not a member of another Part in the argument collection. +If the check argument to this method is supplied and true, +this will call isValidMember on each part, passing null as the first argument.

        +

        This functionality is similar to ungroupSelection, +except that this is not a command (there is no transaction and this does not raise a DiagramEvent) +and the parts are necessarily becoming top-level parts +(whereas ungrouping would add them to the Group containing the Group being ungrouped).

        +

        This function is typically called in a Diagram.mouseDrop event handler +in order to remove the selected Parts from whatever Group they had been in.

        +

        If you want to add Parts to be members of a Group, call Group.addMembers. +If you want to remove Parts completely from a Diagram, call Diagram.removeParts.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Parameters

        • coll: Iterable<Part>
          +

          a collection of Parts.

          +
        • Optional check: boolean
          +

          whether to call isValidMember to confirm that changing the Part to be a top-level Part is valid.

          +

        Returns boolean

        true if all non-Links were changed to be top-level Parts in this Diagram; false if some Parts or Nodes were not able to be added.

        +
      • canCollapseSubGraph(group?: Group): boolean
      • +

        This predicate controls whether the user can collapse expanded Groups.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        collapseSubGraph

        +

        Parameters

        • Optional group: Group
          +

          if supplied, ignore the selection and consider collapsing this particular Group.

          +

        Returns boolean

      • canCollapseTree(node?: Node): boolean
      • +

        This predicate controls whether the user can collapse expanded subtrees of Nodes.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        collapseTree

        +

        Parameters

        • Optional node: Node
          +

          if supplied, ignore the selection and consider collapsing this particular Node.

          +

        Returns boolean

      • canCopySelection(): boolean
      • +

        This predicate controls whether or not the user can invoke the copySelection command.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        copySelection

        +

        Returns boolean

        This returns true: +if Diagram.allowCopy is true, +if Diagram.allowClipboard is true, and +if there are some selected Parts.

        +
      • canCutSelection(): boolean
      • +

        This predicate controls whether or not the user can invoke the cutSelection command.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        cutSelection

        +

        Returns boolean

        This returns true: +if the diagram is not Diagram.isReadOnly, +if Diagram.allowCopy is true, +if Diagram.allowDelete is true, +if Diagram.allowClipboard is true, and +if there are some selected Parts.

        +
      • canDecreaseZoom(factor?: number): boolean
      • +

        This predicate controls whether or not the user can invoke the decreaseZoom command.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        decreaseZoom

        +

        Parameters

        • Optional factor: number
          +

          This defaults to 1/zoomFactor. The value should be less than one and greater than zero.

          +

        Returns boolean

        This returns true if Diagram.allowZoom is true +and if the new scale is within the range of Diagram.minScale and Diagram.maxScale.

        +
      • canDeleteSelection(): boolean
      • +

        This predicate controls whether or not the user can invoke the deleteSelection command.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        deleteSelection

        +

        Returns boolean

        This returns true: +if the diagram is not Diagram.isReadOnly, +if Diagram.allowDelete is true, and +if there are some selected Parts.

        +
      • canEditTextBlock(textblock?: TextBlock): boolean
      • +

        This predicate controls whether or not the user can invoke the editTextBlock command.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        editTextBlock

        +

        Parameters

        Returns boolean

        This returns true: +if the diagram is not Diagram.isReadOnly, +if Diagram.allowTextEdit is true, +if there is a ToolManager.textEditingTool, and +if there is any selected Part for which Part.canEdit is true.

        +
      • canExpandSubGraph(group?: Group): boolean
      • +

        This predicate controls whether the user can expand collapsed Groups.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        expandSubGraph

        +

        Parameters

        • Optional group: Group
          +

          if supplied, ignore the selection and consider expanding this particular Group.

          +

        Returns boolean

      • canExpandTree(node?: Node): boolean
      • +

        This predicate controls whether the user can expand collapsed subtrees of Nodes.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        expandTree

        +

        Parameters

        • Optional node: Node
          +

          if supplied, ignore the selection and consider expanding this particular Node.

          +

        Returns boolean

      • canGroupSelection(): boolean
      • canIncreaseZoom(factor?: number): boolean
      • +

        This predicate controls whether or not the user can invoke the increaseZoom command.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        increaseZoom

        +

        Parameters

        • Optional factor: number
          +

          This defaults to zoomFactor. The value should be greater than one.

          +

        Returns boolean

        This returns true if Diagram.allowZoom is true +and if the new scale is within the range of Diagram.minScale and Diagram.maxScale.

        +
      • canPasteSelection(pos?: Point): boolean
      • +

        This predicate controls whether or not the user can invoke the pasteSelection command.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        pasteSelection

        +

        Parameters

        • Optional pos: Point
          +

          Point at which to center the newly pasted parts; if not present the parts would not be moved.

          +

        Returns boolean

        This returns true: +if the diagram is not Diagram.isReadOnly, +if Diagram.allowInsert is true, +if Diagram.allowClipboard is true, and +if the clipboard has parts in it.

        +
      • canRedo(): boolean
      • +

        This predicate controls whether or not the user can invoke the redo command.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        redo

        +

        Returns boolean

        This returns true: +if the diagram is not Diagram.isReadOnly, +if Diagram.allowUndo is true, and +if the UndoManager.canRedo predicate returns true.

        +
      • canResetZoom(newscale?: number): boolean
      • +

        This predicate controls whether or not the user can invoke the resetZoom command.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        resetZoom

        +

        Parameters

        • Optional newscale: number
          +

          This defaults to Diagram.defaultScale, which is normally 1.0. The value should be greater than zero.

          +

        Returns boolean

        This returns true if Diagram.allowZoom is true. +and if the new scale is within the range of Diagram.minScale and Diagram.maxScale.

        +
      • canScrollToPart(part?: Part): boolean
      • +

        This predicate controls whether or not the user can invoke the scrollToPart command. +This returns false if there is no argument Part and there are no selected Parts.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        scrollToPart

        +
        since

        1.6

        +

        Parameters

        Returns boolean

        This returns true if Diagram.allowHorizontalScroll and Diagram.allowVerticalScroll are true.

        +
      • canSelectAll(): boolean
      • +

        This predicate controls whether or not the user can invoke the selectAll command.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        selectAll

        +

        Returns boolean

        This returns true if Diagram.allowSelect is true.

        +
      • +

        This predicate controls whether or not the user can invoke the showContextMenu command.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        showContextMenu

        +

        Parameters

        • Optional obj: GraphObject | Diagram
          +

          a GraphObject or Diagram with a contextMenu defined. +If none is given, this method will use the first selected object, or else the Diagram.

          +

        Returns boolean

      • canStopCommand(): boolean
      • +

        This predicate controls whether the user may stop the current tool. +This just returns true.

        +

        This method may be overridden, but probably should not be overridden. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        stopCommand

        +

        Returns boolean

        true.

        +
      • canUndo(): boolean
      • +

        This predicate controls whether or not the user can invoke the undo command.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        undo

        +

        Returns boolean

        This returns true: +if the diagram is not Diagram.isReadOnly, +if Diagram.allowUndo is true, and +if the UndoManager.canUndo predicate returns true.

        +
      • canUngroupSelection(group?: Group): boolean
      • canZoomToFit(): boolean
      • +

        This predicate controls whether or not the user can invoke the zoomToFit command.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +This method must not have any side-effects. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        zoomToFit

        +
        since

        1.1

        +

        Returns boolean

        This returns true if Diagram.allowZoom is true.

        +
      • collapseSubGraph(group?: Group): void
      • +

        This command collapses all expanded selected Groups. +This operation is performed within a "Collapse SubGraph" transaction. +Just before the end of the transaction this raises the "SubGraphCollapsed" DiagramEvent, +with a collection of collapsed Groups as the subject. +This currently has no default keyboard shortcut.

        +

        This calls Group.collapseSubGraph to perform the collapse, which will set Group.isSubGraphExpanded to false. +You may want to save the collapsed/expanded state to the model by using a TwoWay Binding on the "isSubGraphExpanded" property of your Groups, +and perhaps also on the Group.wasSubGraphExpanded property.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canCollapseSubGraph

        +

        Parameters

        • Optional group: Group
          +

          if supplied, ignore the selection and collapse this particular Group.

          +

        Returns void

      • collapseTree(node?: Node): void
      • +

        This command collapses all expanded selected Nodes. +This operation is performed within a "Collapse Tree" transaction. +Just before the end of the transaction this raises the "TreeCollapsed" DiagramEvent, +with a collection of collapsed Nodes as the subject. +This currently has no default keyboard shortcut.

        +

        This calls Node.collapseTree to perform the collapse, which will set Node.isTreeExpanded to false. +You may want to save the collapsed/expanded state to the model by using a TwoWay Binding on the "isTreeExpanded" property of your Nodes, +and perhaps also on the Node.wasTreeExpanded property.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canCollapseTree

        +

        Parameters

        • Optional node: Node
          +

          if supplied, ignore the selection and collapse this particular Node subtree.

          +

        Returns void

      • +

        Find the actual collection of nodes and links to be moved or copied, +given an initial collection. +This includes links that connected at both ends to nodes being moved or copied, +members of Groups, and if DraggingTool.dragsTree is true, +this includes nodes and links that are "tree" descendants from selected nodes.

        +

        Note that this does not return a simple collection of Parts, +but a Map associating a chosen Part +with an Object holding its original location Points as the value of the "point" property.

        +

        This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        This was moved to CommandHandler from DraggingTool in 2.0.

        +
        since

        2.0

        +

        Parameters

        • parts: Iterable<Part>
          +

          A Set or List of Parts.

          +
        • Optional options: DraggingOptions
          +

          Potential options for the collection computation. If not specified, this uses the DraggingTool's drag options.

          +

        Returns Map<Part, DraggingInfo>

        a Map mapping Parts to DraggingInfo Objects + that have a "point" property remembering the original location of that Part.

        +
      • copySelection(): void
      • +

        This command copies the currently selected parts, Diagram.selection, from the Diagram into the clipboard. +This is normally invoked by the Ctrl-C keyboard shortcut.

        +

        This makes a copy of the current selection by calling copyToClipboard. +This also raises the "ClipboardChanged" diagram event.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canCopySelection

        +

        Returns void

      • +

        Make a copy of the given collection of Parts +and stores it in a static variable acting as the clipboard.

        +

        The clipboard is initially null. +It can hold a collection of copied Parts. +It also remembers the Model.dataFormat of the diagram +from which the parts were copied.

        +

        This calls Diagram.copyParts in order to make a copy of the Parts for the clipboard. +The values of copiesParentKey and copiesGroupKey affect whether +a copied node data remembers its tree parent node (if in a TreeModel) or +its containing group (if in a GraphLinksModel).

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        pasteFromClipboard

        +

        Parameters

        • coll: Iterable<Part>
          +

          A collection of Parts. +If the value is null, the clipboard is cleared of all data.

          +

        Returns void

      • cutSelection(): void
      • +

        This command executes a copySelection followed by a deleteSelection. +This is normally invoked by the Ctrl-X keyboard shortcut.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canCutSelection

        +

        Returns void

      • decreaseZoom(factor?: number): void
      • +

        This command decreases the Diagram.scale by a given factor. +This is normally invoked by the Ctrl-- and Keypad-- keyboard shortcuts.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canDecreaseZoom

        +

        Parameters

        • Optional factor: number
          +

          This defaults to 1/zoomFactor. The value should be less than one and greater than zero.

          +

        Returns void

      • deleteSelection(): void
      • +

        This command deletes the currently selected parts from the diagram. +This is normally invoked by the Del keyboard shortcut.

        +

        This will first start a "Delete" transaction, then +raise the "SelectionDeleting" DiagramEvent, +call Diagram.removeParts on a perhaps extended collection of selected Parts, +raise the "SelectionDeleted" diagram event, +and finally commit the transaction.

        +

        Because this command changes the selection, +this method also raises the "ChangingSelection" and "ChangedSelection" diagram events. +Changes are performed within a transaction, but the selection events are raised outside the transaction.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canDeleteSelection

        +

        Returns void

      • doKeyDown(): void
      • +

        This is called by tools to handle keyboard commands. +For most commands, this calls the "can..." predicate; if that returns true it calls the command method. +If GoJS handles a key-down event as a keyboard command, the underlying event will not bubble.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        There is an example custom CommandHandler in the extensions directory: DrawCommandHandler.js, +which implements additional behaviors for the arrow keys by overriding this method. +For additional discussion, please read the Introduction page on Commands.

        +

        Returns void

      • doKeyUp(): void
      • +

        This is called by tools to handle keyboard commands.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Returns void

      • +

        This command starts in-place editing of a TextBlock in the selected Part. +This is normally invoked by the F2 keyboard shortcut.

        +

        This starts the TextEditingTool to have the user enter or modify the text string and finally set the TextBlock.text. +You may want to save the new string to the model by using a TwoWay Binding on the "text" property of your TextBlock.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canEditTextBlock

        +

        Parameters

        Returns void

      • expandSubGraph(group?: Group): void
      • +

        This command expands all collapsed selected Groups. +This operation is performed within an "Expand SubGraph" transaction. +Just before the end of the transaction this raises the "SubGraphExpanded" DiagramEvent, +with a collection of expanded Groups as the subject. +This currently has no default keyboard shortcut.

        +

        This calls Group.expandSubGraph to perform the collapse, which will set Group.isSubGraphExpanded to true. +You may want to save the collapsed/expanded state to the model by using a TwoWay Binding on the "isSubGraphExpanded" property of your Groups, +and perhaps also on the Group.wasSubGraphExpanded property.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canExpandSubGraph

        +

        Parameters

        • Optional group: Group
          +

          if supplied, ignore the selection and expand this particular Group.

          +

        Returns void

      • expandTree(node?: Node): void
      • +

        This command expands all collapsed selected Nodes. +This operation is performed within an "Expand Tree" transaction. +Just before the end of the transaction this raises the "TreeExpanded" DiagramEvent, +with a collection of expanded Nodes as the subject. +This currently has no default keyboard shortcut.

        +

        This calls Node.expandTree to perform the expand, which will set Node.isTreeExpanded to true. +You may want to save the collapsed/expanded state to the model by using a TwoWay Binding on the "isTreeExpanded" property of your Nodes, +and perhaps also on the Node.wasTreeExpanded property.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canExpandTree

        +

        Parameters

        • Optional node: Node
          +

          if supplied, ignore the selection and collapse this particular Node subtree.

          +

        Returns void

      • groupSelection(): void
      • +

        This command adds a copy of archetypeGroupData to the diagram's model +to create a new Group and then adds the selected Parts to that new group. +This is normally invoked by the Ctrl-G keyboard shortcut.

        +

        This creates a new Group by adding a copy of the archetypeGroupData to the model. +Each of the selected parts for which Part.canGroup is true +and for which isValidMember is true +is made a member of that new group. +If all of the selected groupable parts were members of a pre-existing group, +the new group also becomes a member of that pre-existing group, +if isValidMember is true for that existing group with the new group. +The new group becomes the only selected part. +This raises the "SelectionGrouped" diagram event. +This method also raises the "ChangingSelection" and "ChangedSelection" diagram events. +Changes are performed in a "Group" transaction, but the selection events are raised outside the transaction.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canGroupSelection

        +

        Returns void

      • increaseZoom(factor?: number): void
      • +

        This command increases the Diagram.scale by a given factor. +This is normally invoked by the Ctrl-+ and Keypad-+ keyboard shortcuts.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canIncreaseZoom

        +

        Parameters

        • Optional factor: number
          +

          This defaults to zoomFactor. The value should be greater than one.

          +

        Returns void

      • isValidMember(group: Group, part: Part): boolean
      • +

        This predicate is called to determine whether a Node may be added as a member of a Group. +This always checks to make sure no group might become a member of itself, either directly or indirectly. +If the Group has a Group.memberValidation predicate and if it returns false, this method returns false. +If this CommandHandler has a memberValidation predicate and if it returns false, this method returns false. +Otherwise this will return true.

        +

        +For a more general discussion of validation, see Introduction to Validation.

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Parameters

        • group: Group
          +

          this may be null if the node is being added as a top-level node.

          +
        • part: Part
          +

          a Part, usually a Node, possibly another Group, but not a Link or an Adornment.

          +

        Returns boolean

        true if OK to add the node to the group.

        +
      • +

        If the clipboard holds a collection of Parts, +and if the Model.dataFormat matches that stored in the clipboard, +this makes a copy of the clipboard's parts and adds the copies to this Diagram.

        +

        This calls Diagram.copyParts in order to make a copy of the Parts in the clipboard and add them to this diagram.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        copyToClipboard

        +

        Returns Set<Part>

        a collection of the newly pasted Parts, +or an empty Set if there was no data in the clipboard.

        +
      • pasteSelection(pos?: Point): void
      • +

        This command copies the contents of the clipboard into this diagram and makes those new parts the new selection. +This is normally invoked by the Ctrl-V keyboard shortcut.

        +

        This calls pasteFromClipboard to add copies of Parts +into this diagram, and then selects all of the newly created parts. +This also raises the "ClipboardPasted" diagram event. +This method raises the "ChangingSelection" and "ChangedSelection" diagram events. +Changes are performed in a transaction, but the selection events are raised outside the transaction.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canPasteSelection

        +

        Parameters

        • Optional pos: Point
          +

          Point at which to center the newly pasted parts; if not present the parts are not moved.

          +

        Returns void

      • redo(): void
      • +

        This command calls UndoManager.redo. +This is normally invoked by the Ctrl-Y keyboard shortcut.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canRedo

        +

        Returns void

      • resetZoom(newscale?: number): void
      • +

        This command sets the Diagram.scale to a new scale value, by default 1. +This is normally invoked by the Ctrl-0 keyboard shortcut.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canResetZoom

        +

        Parameters

        • Optional newscale: number
          +

          This defaults to Diagram.defaultScale, which is normally 1.0. The value should be greater than zero.

          +

        Returns void

      • scrollToPart(part?: Part): void
      • +

        This command scrolls the diagram to make a highlighted or selected Part visible in the viewport. +Call this command repeatedly to cycle through the Diagram.highlighteds collection, +if there are any Parts in that collection, or else in the Diagram.selection collection, +scrolling to each one in turn by calling Diagram.centerRect.

        +

        This method animates to the scrolled part, and Diagram.scrollToRect does not.

        +

        This is normally invoked by the Space keyboard shortcut. +If there is no argument and there is no highlighted or selected Part, this command does nothing.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canScrollToPart, Diagram.scrollToRect

        +
        since

        1.6

        +

        Parameters

        • Optional part: Part
          +

          This defaults to the first highlighted Part of Diagram.highlighteds, + or, if there are no highlighted Parts, the first selected Part.

          +

        Returns void

      • selectAll(): void
      • +

        This command selects all of the selectable Parts in the diagram by setting Part.isSelected to true on each one. +This is normally invoked by the Ctrl-A keyboard shortcut.

        +

        This method raises the "ChangingSelection" and "ChangedSelection" diagram events. +This ignores all parts in temporary layers.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canSelectAll

        +

        Returns void

      • +

        This command opens the context menu for a selected Part or given GraphObject, or else for the whole Diagram. +This is normally invoked by the Menu keyboard shortcut.

        +

        The given GraphObject must have a GraphObject.contextMenu +defined in order to show anything.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canShowContextMenu

        +

        Parameters

        • Optional obj: GraphObject | Diagram
          +

          a GraphObject or Diagram with a contextMenu defined. +If none is given, this method will use the first selected object, or else the Diagram. +The method will simulate a right-button click at the middle of the GraphObject or, +if a Diagram, at the current mouse position if it is in the viewport.

          +

        Returns void

      • stopCommand(): void
      • +

        This command cancels the operation of the current tool. +This is typically called when the user presses ESCAPE.

        +

        If the current tool is a ToolManager, this clears the diagram's selection. +This then calls Tool.doCancel on the current tool.

        +
        see

        canStopCommand

        +

        Returns void

      • undo(): void
      • +

        This command calls UndoManager.undo. +This is normally invoked by the Ctrl-Z keyboard shortcut.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canUndo

        +

        Returns void

      • ungroupSelection(group?: Group): void
      • +

        This command removes selected groups from the diagram without removing their members from the diagram. +This is normally invoked by the Ctrl-Shift-G keyboard shortcut.

        +

        For the given group, or if not supplied, each selected Group that is Group.ungroupable, +expand the subgraph and change all of its member parts to be members of the group that the selected group node is in. +(If the selected group is a top-level node, i.e. not a member of any group node, its members become top-level parts too.) +All of those selected groups are deleted. +All of the reparented member parts are selected.

        +

        This raises the "SelectionUngrouped" diagram event. +This method also raises the "ChangingSelection" and "ChangedSelection" diagram events. +Changes are performed in an "Ungroup" transaction, but the selection events are raised outside the transaction.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canUngroupSelection

        +

        Parameters

        • Optional group: Group
          +

          if supplied, ignore the selection and consider ungrouping this particular Group.

          +

        Returns void

      • zoomToFit(): void
      • +

        This command changes the Diagram.scale so that the Diagram.documentBounds fits within the viewport. +If this command had been called before without any other zooming since then, +the original Diagram scale and position are restored. +This is normally invoked by the Shift-Z keyboard shortcut.

        +

        As of 2.1, this animates zooming by default. Diagram.zoomToFit does not animate.

        +

        This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        see

        canZoomToFit

        +
        since

        1.1

        +

        Returns void

      Settings

      Theme

      + \ No newline at end of file diff --git a/api/symbols/ContextMenuTool.html b/api/symbols/ContextMenuTool.html index 05aff5fb7..172382953 100644 --- a/api/symbols/ContextMenuTool.html +++ b/api/symbols/ContextMenuTool.html @@ -1,668 +1,166 @@ - - - - - - ContextMenuTool | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class ContextMenuTool

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      Hierarchy

      -
        -
      • - Tool -
          -
        • - ContextMenuTool -
        • -
        -
      • -
      -
      -
      -
      -

      The ContextMenuTool is used to create and show a context menu. - It automatically disables any browser context menu.

      -

      Define context menus on individual GraphObjects by setting GraphObject.contextMenu. - Define a context menu for the diagram background by setting Diagram.contextMenu.

      -

      This tool is a standard mouse-down tool, the ToolManager.contextMenuTool.

      -

      This tool does not utilize any tool handles. - This tool does not modify the model or conduct any transaction, - although any code invoked by context menu commands might do so.

      -

      There are examples of customizing this tool in the - Custom Context Menu and - HTML LightBox Context Menu samples.

      -

      If you want to programmatically show a context menu for a particular GraphObject or for the - whole diagram, call CommandHandler.showContextMenu. - That command method is also invoked by the Menu key on the keyboard.

      -

      Normally this shows a context menu (if available) on a right-mouse-up event. - If you want it to happen on a right-mouse-down event, you'll need to move this tool - from the ToolManager.mouseUpTools list to the ToolManager.mouseDownTools list:

      -
      myDiagram.toolManager.mouseDownTools.add(myDiagram.toolManager.replaceTool("ContextMenu", null));
      +ContextMenuTool | GoJS API
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class ContextMenuTool

      Hierarchy

      +

      The ContextMenuTool is used to create and show a context menu. +It automatically disables any browser context menu.

      +

      Define context menus on individual GraphObjects by setting GraphObject.contextMenu. +Define a context menu for the diagram background by setting Diagram.contextMenu.

      +

      This tool is a standard mouse-down tool, the ToolManager.contextMenuTool.

      +

      This tool does not utilize any tool handles. +This tool does not modify the model or conduct any transaction, +although any code invoked by context menu commands might do so.

      +

      There are examples of customizing this tool in the +Custom Context Menu and +HTML LightBox Context Menu samples.

      +

      If you want to programmatically show a context menu for a particular GraphObject or for the +whole diagram, call CommandHandler.showContextMenu. +That command method is also invoked by the Menu key on the keyboard.

      +

      Normally this shows a context menu (if available) on a right-mouse-up event. +If you want it to happen on a right-mouse-down event, you'll need to move this tool +from the ToolManager.mouseUpTools list to the ToolManager.mouseDownTools list:

      +
      myDiagram.toolManager.mouseDownTools.add(myDiagram.toolManager.replaceTool("ContextMenu", null));
       
      -
      -
      -
      -

      Index

      -
      - -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - - -
      -
      -
      -

      Properties

      -
      - -

      - currentContextMenu - : Adornment | HTMLInfo

      -
        -
      • -
        -

        Gets or sets the currently showing context menu, or null if there is none. - This is typically only set in showContextMenu and not by the user. - It is also typically set to null in hideContextMenu.

        -
        -
      • -
      -
      -
      - -

      - currentObject - : GraphObject

      -
        -
      • -
        -

        Gets or sets the GraphObject found at the mouse point that has a context menu. - This property remembers the result returned by findObjectWithContextMenu if it is a GraphObject. - This value is passed to showContextMenu as the second argument. - The value will be null if the context menu is for the diagram rather than for a particular GraphObject.

        -
        -
        since
        -

        1.4

        -
        -
        -
        -
      • -
      -
      -
      - -

      - defaultTouchContextMenu - : Adornment | HTMLInfo

      -
        -
      • -
        -

        Gets or sets the HTMLInfo or Adornment that acts as the default touch context menu. - On touch devices, this context menu will appear even there is no context menu defined.

        -

        You can disable this functionality by setting this property to null.

        -

        By default shows a set of HTML elements acting as a context menu.

        -
        -
        since
        -

        1.7

        -
        -
        -
        -
      • -
      -
      -
      - -

      - Read-only - mouseDownPoint - : Point

      -
        -
      • -
        -

        This read-only property returns the original mouse-down point in document coordinates.

        -
        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - Override Virtual - canStart -

      -
        -
      • canStart(): boolean
      • -
      -
        -
      • -
        -

        Return true if it's a single mouse right click that hasn't moved Tool.isBeyondDragSize - and that is on a GraphObject with a GraphObject.contextMenu. - This is also true if the mouse right click is in the diagram background - and the diagram's Diagram.contextMenu is non-null.

        -

        On touch devices, a special default context menu will appear even if no object with a context menu is found.

        -

        This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Returns boolean

        -
      • -
      -
      -
      - -

      - Override - doActivate -

      -
        -
      • doActivate(): void
      • -
      -
        -
      • -
        -

        Do nothing, activation is special and relies on doMouseUp

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doMouseDown -

      -
        -
      • doMouseDown(): void
      • -
      - -
      -
      - -

      - Override - doMouseMove -

      -
        -
      • doMouseMove(): void
      • -
      -
        -
      • -
        -

        Handle mouse-enter, mouse-over, and mouse-leave events, as well as tooltips.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doMouseUp -

      -
        -
      • doMouseUp(): void
      • -
      - -
      -
      - -

      - Virtual - findObjectWithContextMenu -

      - -
        -
      • -
        -

        Find a GraphObject at the current mouse point with a GraphObject.contextMenu, - or return the Diagram if there is a Diagram.contextMenu.

        -

        This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Parameters

        -
          -
        • -
          Optional obj: GraphObject | Diagram
          -
          -

          Optional GraphObject with which to start searching for a context menu. - If null, the Diagram will be used. If no argument is specified, this method will look for an object at the current mouse point.

          -
          -
        • -
        -

        Returns GraphObject | Diagram

        -

        something with a contextMenu, - or null if nothing can be found with a context menu at the current mouse point.

        -
      • -
      -
      -
      - -

      - Virtual - hideContextMenu -

      -
        -
      • hideContextMenu(): void
      • -
      -
        -
      • -
        -

        Hide any context menu.

        -

        This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - hideDefaultContextMenu -

      -
        -
      • hideDefaultContextMenu(): void
      • -
      -
        -
      • -
        -

        This is the HTMLInfo.hide method for the defaultTouchContextMenu.

        -

        This method may be overridden. - Please read the Introduction page on Extensions - for how to override methods and how to call this base method.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - positionContextMenu -

      - -
        -
      • -
        -

        This is called by showContextMenu to position the context menu within the viewport. - It normally goes just below the cursor. - But if the mouse is too close to the right edge or the bottom edge of the viewport, - it is positioned left and/or above the cursor.

        -

        This method only operates if the context menu, an Adornment, does not have a Adornment.placeholder. - When there is a Placeholder in the context menu, that Adornment is automatically positioned - so that the Placeholder is positioned at the adorned object, the second argument to this method.

        -

        This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -

        If you override this method to position the context menu, - the context menu has already been measured but not arranged, - so you can use its GraphObject.measuredBounds width and height - but not its GraphObject.actualBounds.

        -
        -

        Parameters

        -
          -
        • -
          contextmenu: Adornment
          -
        • -
        • -
          obj: GraphObject
          -
          -

          The GraphObject getting the context menu, - or null if the context menu is for the diagram background.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - showContextMenu -

      - -
        -
      • -
        -

        Show an Adornment or HTMLInfo as a context menu.

        -

        This method is called by the context click (Tool.doMouseDown) and CommandHandler.showContextMenu. - If you want to programmatically show a context menu for a particular GraphObject or for the - whole diagram, do not call this method, which only does one small piece of the process of - bringing up a context menu. - Instead call CommandHandler.showContextMenu, which will start this tool - and eventually call this method and handle additional input events.

        -

        For Adornment context menus: If the object's containing Part is data-bound, - this sets the contextmenu's Part.data to the same value. - The Adornment.adornedObject property is set to the GraphObject for which the menu is being shown.

        -

        This method sets the currentContextMenu.

        -

        This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Parameters

        -
          -
        • -
          contextmenu: Adornment | HTMLInfo
          -
        • -
        • -
          obj: GraphObject
          -
          -

          the GraphObject for which the context menu is being shown; - this is null if the contextmenu is being shown for the diagram background.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - showDefaultContextMenu -

      -
        -
      • showDefaultContextMenu(): void
      • -
      -
        -
      • -
        -

        This is the HTMLInfo.show method for the defaultTouchContextMenu.

        -

        If the object's containing Part is data-bound, - set the contextmenu's Part.data to the same value. - The Adornment.adornedObject property is set to the GraphObject - for which the menu is being shown.

        -

        The menu carries some default CSS styling and uses the following CSS classes:

        -
          -
        • goCXforeground for the DIV containing the buttons
        • -
        • goCXbackground for the darker DIV behind the context menu
        • -
        • goCXul for the HTML ul items
        • -
        • goCXli for the HTML li tag items
        • -
        • goCXa for the HTML a tag items
        • -
        -

        This method may be overridden. - Please read the Introduction page on Extensions - for how to override methods and how to call this base method.

        -
        -

        Returns void

        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/CurvedLinkReshapingTool.html b/api/symbols/CurvedLinkReshapingTool.html index 3412cfae8..4f0bb992e 100644 --- a/api/symbols/CurvedLinkReshapingTool.html +++ b/api/symbols/CurvedLinkReshapingTool.html @@ -1,314 +1,54 @@ - - - - - - CurvedLinkReshapingTool | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class CurvedLinkReshapingTool

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

      -
      -
      -

      Hierarchy

      - -
      -
      -
      -

      This CurvedLinkReshapingTool class allows for a Link's path to be modified by the user - via the dragging of a single tool handle at the middle of the link. - Dragging the handle changes the value of Link.curviness.

      -

      If you want to experiment with this extension, try the Curved Link Reshaping sample.

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -

      Methods

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - - -
      -
      -
      -

      Methods

      -
      - -

      - Override - doActivate -

      -
        -
      • doActivate(): void
      • -
      -
        -
      • -
        -

        Start reshaping, if findToolHandleAt finds a reshape handle at the mouse down point.

        -

        If successful this sets handle to be the reshape handle that it finds - and adornedLink to be the Link being routed. - It also remembers the original link route (a list of Points) and curviness in case this tool is cancelled. - And it starts a transaction.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doCancel -

      -
        -
      • doCancel(): void
      • -
      -
        -
      • -
        -

        Restore the link route to be the original points and curviness and stop this tool.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - reshape -

      -
        -
      • reshape(newpt: Point): void
      • -
      - -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class CurvedLinkReshapingTool Extension

      This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

      Hierarchy

      +

      This CurvedLinkReshapingTool class allows for a Link's path to be modified by the user +via the dragging of a single tool handle at the middle of the link. +Dragging the handle changes the value of Link.curviness.

      +

      If you want to experiment with this extension, try the Curved Link Reshaping sample.

      +

      Index

      Inherited Members

      Constructors

      Methods

      • doActivate(): void
      • +

        Start reshaping, if findToolHandleAt finds a reshape handle at the mouse down point.

        +

        If successful this sets handle to be the reshape handle that it finds +and adornedLink to be the Link being routed. +It also remembers the original link route (a list of Points) and curviness in case this tool is cancelled. +And it starts a transaction.

        +

        Returns void

      • doCancel(): void
      • +

        Restore the link route to be the original points and curviness and stop this tool.

        +

        Returns void

      • reshape(newpt: Point): void

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Diagram.html b/api/symbols/Diagram.html index ab08f05e5..56485f1e4 100644 --- a/api/symbols/Diagram.html +++ b/api/symbols/Diagram.html @@ -1,6591 +1,1935 @@ - - - - - - Diagram | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class Diagram

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      Hierarchy

      - -
      -
      -
      -

      A Diagram is associated with an HTML DIV element. Constructing a Diagram creates - an HTML Canvas element which it places inside of the given DIV element, in addition to several helper DIVs. - GoJS will manage the contents of this DIV -- you should not modify the contents of the DIV, - although you may style the given DIV (background, border, etc) and position and size it as needed.

      -

      Minimal Diagram construction looks like this. HTML:

      -
      <div id="myDiagramDiv" style="border: solid 1px black; width:400px; height:400px"></div>
      +Diagram | GoJS API
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class Diagram

      Hierarchy

      +

      A Diagram is associated with an HTML DIV element. Constructing a Diagram creates +an HTML Canvas element which it places inside of the given DIV element, in addition to several helper DIVs. +GoJS will manage the contents of this DIV -- you should not modify the contents of the DIV, +although you may style the given DIV (background, border, etc) and position and size it as needed.

      +

      Minimal Diagram construction looks like this. HTML:

      +
      <div id="myDiagramDiv" style="border: solid 1px black; width:400px; height:400px"></div>
       
      -

      JavaScript:

      -
      
      -myDiagram = new go.Diagram("myDiagramDiv",  // create a Diagram for the DIV HTML element
      -              {
      -                "undoManager.isEnabled": true  // enable undo & redo
      -              });
      +

      JavaScript:

      +

      myDiagram = new go.Diagram("myDiagramDiv", // create a Diagram for the DIV HTML element
      {
      "undoManager.isEnabled": true // enable undo & redo
      });
      -

      The diagram will draw onto an HTML Canvas element, created inside the Diagram DIV.

      -

      Each Diagram holds a set of Layers each of which holds some number of Parts - such as Nodes and Links. - Each Part consists of GraphObjects such as TextBlocks and Shapes - and Panels holding yet more GraphObjects.

      -

      A Diagram and its Parts provide the visual representation of a Model that holds JavaScript - data objects for the nodes and the links. - The model provides the way to recognize the relationships between the data.

      -

      - Two Diagrams can display and manipulate the same Model. (Example) -

      A diagram will automatically create Nodes and Links corresponding to the model data. - The diagram has a number of named templates it uses to create the actual parts: - nodeTemplateMap, groupTemplateMap, and linkTemplateMap. - Each template may have some data Bindings that set the part's GraphObjects' properties - based on the value of properties of the data.

      -

      A simple Node template and Model data (both nodes and links) may look like this:

      -
      var $ = go.GraphObject.make;  // for conciseness
      +

      The diagram will draw onto an HTML Canvas element, created inside the Diagram DIV.

      +

      Each Diagram holds a set of Layers each of which holds some number of Parts +such as Nodes and Links. +Each Part consists of GraphObjects such as TextBlocks and Shapes +and Panels holding yet more GraphObjects.

      +

      A Diagram and its Parts provide the visual representation of a Model that holds JavaScript +data objects for the nodes and the links. +The model provides the way to recognize the relationships between the data.

      +

      +Two Diagrams can display and manipulate the same Model. (Example) -// define a simple Node template -myDiagram.nodeTemplate = - $(go.Node, "Auto", // the Shape will go around the TextBlock - $(go.Shape, "RoundedRectangle", - // Shape.fill is bound to Node.data.color - new go.Binding("fill", "color")), - $(go.TextBlock, - { margin: 3 }, // some room around the text - // TextBlock.text is bound to Node.data.key - new go.Binding("text", "key")) - ); +

      A diagram will automatically create Nodes and Links corresponding to the model data. +The diagram has a number of named templates it uses to create the actual parts: +nodeTemplateMap, groupTemplateMap, and linkTemplateMap. +Each template may have some data Bindings that set the part's GraphObjects' properties +based on the value of properties of the data.

      +

      A simple Node template and Model data (both nodes and links) may look like this:

      +
      var $ = go.GraphObject.make;  // for conciseness

      // define a simple Node template
      myDiagram.nodeTemplate =
      $(go.Node, "Auto", // the Shape will go around the TextBlock
      $(go.Shape, "RoundedRectangle",
      // Shape.fill is bound to Node.data.color
      new go.Binding("fill", "color")),
      $(go.TextBlock,
      { margin: 3 }, // some room around the text
      // TextBlock.text is bound to Node.data.key
      new go.Binding("text", "key"))
      );

      // create the model data that will be represented by Nodes and Links
      myDiagram.model = new go.GraphLinksModel(
      [
      { key: "Alpha", color: "lightblue" },
      { key: "Beta", color: "orange" },
      { key: "Gamma", color: "lightgreen" },
      { key: "Delta", color: "pink" }
      ],
      [
      { from: "Alpha", to: "Beta" },
      { from: "Alpha", to: "Gamma" },
      { from: "Beta", to: "Beta" },
      { from: "Gamma", to: "Delta" },
      { from: "Delta", to: "Alpha" }
      ]); +
      +

      +The above code is used to make the Minimal sample, a simple example of +creating a Diagram and setting its model. +

      +Read about models on the Using Models page in the introduction. +A diagram is responsible for scrolling (position) and zooming (scale) all of the parts that it shows. +Each Part occupies some area given by its GraphObject.actualBounds. + +

      The union of all of the parts' bounds constitutes the documentBounds. +The document bounds determines the area that the diagram can be scrolled to. +There are several properties that you can set, such as initialContentAlignment, +that control the initial size and position of the diagram contents.

      +

      At any later time you can also explicitly set the position and/or scale to +get the appearance that you want. But you may find it easier to call methods to get the desired effect. +For example, if you want to make a particular Node be centered in the viewport, +call either centerRect or scrollToRect with the Node's GraphObject.actualBounds, +depending on whether or not you want the view to be scrolled if the node is already in view.

      +

      +Read in the Introduction about Viewports +and the Initial Viewport. +You can have the diagram perform automatic layouts of its nodes and links by setting +layout to an instance of the Layout subclass of your choice. +The default layout is an instance of the Layout base class that ignores links and +only positions Nodes that do not have a location. +This default layout will allow you to programmatically position nodes (including by loading +from a database) and will also allow the user to manually position nodes using the DraggingTool. + +

      If you do supply a particular layout as the layout, you can control which Parts it operates +on by setting Part.isLayoutPositioned. +Normally, of course, it works on all top-level nodes and links. +The layout is performed both after the model is first loaded as well as after any part is added or removed +or changes visibility or size. +You can disable the initial layout by setting Layout.isInitial to false. +You can disable later automatic layouts by setting Layout.isOngoing to false.

      +

      +See the Layouts page in the Introduction for a summary of layout behavior. + +

      A diagram maintains a collection of selected parts, the Diagram.selection. +To select a Part you set its Part.isSelected property to true.

      +

      There are many properties, named "allow...", that control what operations the user +may perform on the parts in the diagram. These correspond to the same named +properties on Layer that govern the behavior for those parts in a particular layer. +Furthermore for some of these properties there are corresponding properties on +Part, named "...able", that govern the behavior for that individual part. +For example, the allowCopy property corresponds to Layer.allowCopy and +to the property Part.copyable. +The Part.canCopy predicate is false if any of these properties is false.

      +

      +See the Permissions page for a more thorough discussion. + +

      The commandHandler implements various standard commands, +such as the CommandHandler.deleteSelection method and the +CommandHandler.canDeleteSelection predicate.

      +

      +See the Commands page for a listing of keyboard commands and +the use of commands in general. -// create the model data that will be represented by Nodes and Links -myDiagram.model = new go.GraphLinksModel( -[ - { key: "Alpha", color: "lightblue" }, - { key: "Beta", color: "orange" }, - { key: "Gamma", color: "lightgreen" }, - { key: "Delta", color: "pink" } -], -[ - { from: "Alpha", to: "Beta" }, - { from: "Alpha", to: "Gamma" }, - { from: "Beta", to: "Beta" }, - { from: "Gamma", to: "Delta" }, - { from: "Delta", to: "Alpha" } -]); +

      The diagram supports modular behavior for mouse events by implementing "tools". +All mouse and keyboard events are represented by InputEvents and redirected +to the currentTool. +The default tool is an instance of ToolManager which keeps three lists of mode-less tools: +ToolManager.mouseDownTools, ToolManager.mouseMoveTools, and ToolManager.mouseUpTools. +The ToolManager searches these lists when a mouse event happens to find the first tool that can run. +It then makes that tool the new currentTool, where it can continue to process input events. +When the tool is done, it stops itself, causing the defaultTool to be the new currentTool.

      +

      Mouse-down tools include:

      + +

      Mouse-move tools include:

      + +

      Mouse-up tools include:

      + +

      You can also run a tool in a modal fashion by explicitly setting currentTool. +That tool will keep running until some code replaces the currentTool. +This normally happens when the current tool calls Tool.stopTool, such as on a mouse-up event.

      +

      +See the Tools page for a listing of predefined tools and how they operate. + +

      A diagram raises various DiagramEvents when interesting things happen that may have affected the whole diagram. +See the documentation for DiagramEvent for a complete listing.

      +

      When you need to display multiple Models, but not at the same time, you can do so by using only one Diagram and setting the model to a different one. +You can also have two Diagrams share a DIV by swapping the div to null on one Diagram and setting it on the other. +When permanently removing a Diagram,t o clear any memory used, +set the div to null and remove all references to the Diagram. These scenarios are discussed more on the +Replacing Diagrams and Models intro page.

      +

      Index

      Constructors

      Properties

      Methods

      Constants

      Constructors

      • +

        Construct an empty Diagram for a particular DIV HTML element.

        +

        You will normally initialize properties of the Diagram that control its appearance and behavior. +These properties include:

        + +

        Then you will need to construct a Model (usually a GraphLinksModel) for the Diagram, +initialize its data by setting its Model.nodeDataArray and other properties, +and then set the diagram's model.

        +

        Finally, if you want to disassociate the Diagram from the HTML Div element, set Diagram.div to null. +If you remove a part of the HTML DOM containing a Div with a Diagram, you will need to +set div to null in order for the page to recover the memory.

        +

        Unlike GraphObject, the Diagram constructor passes its init options to GraphObject.make. +This allows you to quickly set sub-properties when initializing a Diagram, such as setting properties +on the Diagram's undoManager or commandHandler. For example:

        +
        var diagram = new go.Diagram("myDiagramDiv",
        {
        allowZoom: false,
        "animationManager.isEnabled": false, // turn off automatic animations
        "grid.visible": true, // display a background grid for the whole diagram
        "grid.gridCellSize": new go.Size(20, 20),
        // allow double-click in background to create a new node
        "clickCreatingTool.archetypeNodeData": { text: "Node" },
        // allow Ctrl-G to call the groupSelection command
        "commandHandler.archetypeGroupData":
        { text: "Group", isGroup: true, color: "blue" },
        "commandHandler.copiesTree": true, // for the copy command
        "commandHandler.deletesTree": true, // for the delete command
        "toolManager.hoverDelay": 100, // how quickly tooltips are shown
        // mouse wheel zooms instead of scrolls
        "toolManager.mouseWheelBehavior": go.ToolManager.WheelZoom,
        "draggingTool.dragsTree": true, // dragging for both move and copy
        "draggingTool.isGridSnapEnabled": true,
        layout: new go.TreeLayout(
        { angle: 90, sorting: go.TreeLayout.SortingAscending }),
        "undoManager.isEnabled": true, // enable undo & redo
        // a Changed listener on the Diagram.model
        "ModelChanged": function(e) { if (e.isTransactionFinished) saveModel(); }
        });
        -

        - The above code is used to make the Minimal sample, a simple example of - creating a Diagram and setting its model. -

        - Read about models on the Using Models page in the introduction. - A diagram is responsible for scrolling (position) and zooming (scale) all of the parts that it shows. - Each Part occupies some area given by its GraphObject.actualBounds. -

        The union of all of the parts' bounds constitutes the documentBounds. - The document bounds determines the area that the diagram can be scrolled to. - There are several properties that you can set, such as initialContentAlignment, - that control the initial size and position of the diagram contents.

        -

        At any later time you can also explicitly set the position and/or scale to - get the appearance that you want. But you may find it easier to call methods to get the desired effect. - For example, if you want to make a particular Node be centered in the viewport, - call either centerRect or scrollToRect with the Node's GraphObject.actualBounds, - depending on whether or not you want the view to be scrolled if the node is already in view.

        -

        - Read in the Introduction about Viewports - and the Initial Viewport. - You can have the diagram perform automatic layouts of its nodes and links by setting - layout to an instance of the Layout subclass of your choice. - The default layout is an instance of the Layout base class that ignores links and - only positions Nodes that do not have a location. - This default layout will allow you to programmatically position nodes (including by loading - from a database) and will also allow the user to manually position nodes using the DraggingTool. -

        If you do supply a particular layout as the layout, you can control which Parts it operates - on by setting Part.isLayoutPositioned. - Normally, of course, it works on all top-level nodes and links. - The layout is performed both after the model is first loaded as well as after any part is added or removed - or changes visibility or size. - You can disable the initial layout by setting Layout.isInitial to false. - You can disable later automatic layouts by setting Layout.isOngoing to false.

        -

        - See the Layouts page in the Introduction for a summary of layout behavior. -

        A diagram maintains a collection of selected parts, the Diagram.selection. - To select a Part you set its Part.isSelected property to true.

        -

        There are many properties, named "allow...", that control what operations the user - may perform on the parts in the diagram. These correspond to the same named - properties on Layer that govern the behavior for those parts in a particular layer. - Furthermore for some of these properties there are corresponding properties on - Part, named "...able", that govern the behavior for that individual part. - For example, the allowCopy property corresponds to Layer.allowCopy and - to the property Part.copyable. - The Part.canCopy predicate is false if any of these properties is false.

        -

        - See the Permissions page for a more thorough discussion. -

        The commandHandler implements various standard commands, - such as the CommandHandler.deleteSelection method and the - CommandHandler.canDeleteSelection predicate.

        -

        - See the Commands page for a listing of keyboard commands and - the use of commands in general. -

        The diagram supports modular behavior for mouse events by implementing "tools". - All mouse and keyboard events are represented by InputEvents and redirected - to the currentTool. - The default tool is an instance of ToolManager which keeps three lists of mode-less tools: - ToolManager.mouseDownTools, ToolManager.mouseMoveTools, and ToolManager.mouseUpTools. - The ToolManager searches these lists when a mouse event happens to find the first tool that can run. - It then makes that tool the new currentTool, where it can continue to process input events. - When the tool is done, it stops itself, causing the defaultTool to be the new currentTool.

        -

        Mouse-down tools include:

        - -

        Mouse-move tools include:

        - -

        Mouse-up tools include:

        - -

        You can also run a tool in a modal fashion by explicitly setting currentTool. - That tool will keep running until some code replaces the currentTool. - This normally happens when the current tool calls Tool.stopTool, such as on a mouse-up event.

        -

        - See the Tools page for a listing of predefined tools and how they operate. -

        A diagram raises various DiagramEvents when interesting things happen that may have affected the whole diagram. - See the documentation for DiagramEvent for a complete listing.

        -

        When you need to display multiple Models, but not at the same time, you can do so by using only one Diagram and setting the model to a different one. - You can also have two Diagrams share a DIV by swapping the div to null on one Diagram and setting it on the other. - When permanently removing a Diagram,t o clear any memory used, - set the div to null and remove all references to the Diagram. These scenarios are discussed more on the - Replacing Diagrams and Models intro page.

        -
        -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -

      Properties

      - -
      -
      -

      Methods

      - -
      -
      -

      Constants

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - -
        -
      • -
        -

        Construct an empty Diagram for a particular DIV HTML element.

        -

        You will normally initialize properties of the Diagram that control its appearance and behavior. - These properties include:

        - -

        Then you will need to construct a Model (usually a GraphLinksModel) for the Diagram, - initialize its data by setting its Model.nodeDataArray and other properties, - and then set the diagram's model.

        -

        Finally, if you want to disassociate the Diagram from the HTML Div element, set Diagram.div to null. - If you remove a part of the HTML DOM containing a Div with a Diagram, you will need to - set div to null in order for the page to recover the memory.

        -

        Unlike GraphObject, the Diagram constructor passes its init options to GraphObject.make. - This allows you to quickly set sub-properties when initializing a Diagram, such as setting properties - on the Diagram's undoManager or commandHandler. For example:

        -
        var diagram = new go.Diagram("myDiagramDiv",
        -    {
        -      allowZoom: false,
        -      "animationManager.isEnabled": false,  // turn off automatic animations
        -      "grid.visible": true,  // display a background grid for the whole diagram
        -      "grid.gridCellSize": new go.Size(20, 20),
        -      // allow double-click in background to create a new node
        -      "clickCreatingTool.archetypeNodeData": { text: "Node" },
        -      // allow Ctrl-G to call the groupSelection command
        -      "commandHandler.archetypeGroupData":
        -        { text: "Group", isGroup: true, color: "blue" },
        -      "commandHandler.copiesTree": true,  // for the copy command
        -      "commandHandler.deletesTree": true, // for the delete command
        -      "toolManager.hoverDelay": 100,  // how quickly tooltips are shown
        -      // mouse wheel zooms instead of scrolls
        -      "toolManager.mouseWheelBehavior": go.ToolManager.WheelZoom,
        -      "draggingTool.dragsTree": true,  // dragging for both move and copy
        -      "draggingTool.isGridSnapEnabled": true,
        -      layout: new go.TreeLayout(
        -        { angle: 90, sorting: go.TreeLayout.SortingAscending }),
        -      "undoManager.isEnabled": true,  // enable undo & redo
        -      // a Changed listener on the Diagram.model
        -      "ModelChanged": function(e) { if (e.isTransactionFinished) saveModel(); }
        -    });
        +

      Parameters

      • Optional div: string | Element
        +

        A reference to a DIV HTML element or its ID as a string. +If no DIV is supplied, a Diagram will be created in memory. The Diagram's Diagram.div property +can then be set later on.

        +
      • Optional init: DiagramInitOptions
        +

        A JavaScript object specifying optional initialization properties object. +Can specify Diagram properties, Diagram sub-properties such as "undoManager.isEnabled": true, +and DiagramEvent listeners. Example:

        +
        {
        allowZoom: false,
        "animationManager.isEnabled": false,
        "ModelChanged": function(e) { if (e.isTransactionFinished) saveModel(); }
        }
        -
        -

        Parameters

        -
          -
        • -
          Optional div: string | Element
          -
          -

          A reference to a DIV HTML element or its ID as a string. - If no DIV is supplied, a Diagram will be created in memory. The Diagram's Diagram.div property - can then be set later on.

          -
          -
        • -
        • -
          Optional init: DiagramInitOptions
          -
          -

          A JavaScript object specifying optional initialization properties object. - Can specify Diagram properties, Diagram sub-properties such as "undoManager.isEnabled": true, - and DiagramEvent listeners. Example:

          -
          {
          -  allowZoom: false,
          -  "animationManager.isEnabled": false,
          -  "ModelChanged": function(e) { if (e.isTransactionFinished) saveModel(); }
          -}
          +

        Returns Diagram

      • Parameters

        • Optional init: DiagramInitOptions
          +

          A JavaScript object specifying optional initialization properties object. +Can specify Diagram properties, Diagram sub-properties such as "undoManager.isEnabled": true, +and DiagramEvent listeners. Example:

          +
          {
          allowZoom: false,
          "animationManager.isEnabled": false,
          "ModelChanged": function(e) { if (e.isTransactionFinished) saveModel(); }
          }
          -
          -
        • -
        -

        Returns Diagram

        -
      • -
      • -

        Parameters

        -
          -
        • -
          Optional init: DiagramInitOptions
          -
          -

          A JavaScript object specifying optional initialization properties object. - Can specify Diagram properties, Diagram sub-properties such as "undoManager.isEnabled": true, - and DiagramEvent listeners. Example:

          -
          {
          -  allowZoom: false,
          -  "animationManager.isEnabled": false,
          -  "ModelChanged": function(e) { if (e.isTransactionFinished) saveModel(); }
          -}
          +

        Returns Diagram

      Properties

      • +

        Gets or sets whether the user may copy objects. +The initial value is true.

        +
      • +

        Gets or sets whether the user may delete objects from the Diagram. +The initial value is true.

        +
      • +

        Gets or sets whether the user may start a drag-and-drop in this Diagram, +possibly dropping in a different element. +The initial value is false.

        +
      • +

        Gets or sets whether the user may end a drag-and-drop operation in this Diagram. +This is typically set to true when a Diagram is used with a Palette.

        +

        The initial value is true.

        +
      • +

        Gets or sets whether the user may group parts together. +The initial value is true.

        +
      • +

        Gets or sets whether the user may add parts to the Diagram. +The initial value is true.

        +
      • +

        Gets or sets whether the user may draw new links. +The initial value is true.

        +
      • +

        Gets or sets whether the user may move objects. +The initial value is true.

        +
      • +

        Gets or sets whether the user may reconnect existing links. +The initial value is true.

        +
      • +

        Gets or sets whether the user may reshape parts. +The initial value is true.

        +
      • +

        Gets or sets whether the user may resize parts. +The initial value is true.

        +
      • +

        Gets or sets whether the user may rotate parts. +The initial value is true.

        +
      • +

        Gets or sets whether the user may select objects. +The initial value is true.

        +
      • +

        Gets or sets whether the user may do in-place text editing. +The initial value is true.

        +
      • +

        Gets or sets whether the user may undo or redo any changes. +The initial value is true.

        +
      • +

        Gets or sets whether the user may ungroup existing groups. +The initial value is true.

        +
      • +

        Gets or sets whether the user may zoom into or out of the Diagram. +The initial value is true.

        +
      • +

        This read-only property returns the AnimationManager for this Diagram.

        +
        since

        1.4

        +
      • +

        Gets or sets the autoScale behavior of the Diagram, controlling whether or not the +Diagram's bounds automatically scale to fit the view.

        +

        The only accepted values are the constant properties of Diagram, +Diagram.None, Diagram.Uniform, or Diagram.UniformToFill. +Setting this will change the Diagram's Diagram.scale and Diagram.position, if appropriate.

        +

        The default value is Diagram.None - the scale and position are not automatically adjusted +according to the area covered by the document. +When the value is not None, any value for initialAutoScale or initialScale is ignored.

        +

        +When autoScale is set to a non-Diagram.None value, +the user will not be able to zoom, and setting scale will do nothing. +If you only want to scale automatically on initialization, use initialAutoScale. + +

        Setting this property to Diagram.Uniform is basically the same as calling zoomToFit +all the time, or just disabling interactive zooming.

        +

        Note that depending on the values of maxScale and minScale, the actual value for scale +might be limited.

        +
      • +

        Gets or sets number of milliseconds between autoscroll events. +The default value is 250.

        +
        since

        2.2

        +
      • +

        Gets or sets the Margin that describes the area along the inside edges of the viewport, +in viewport coordinates, where autoscrolling will occur while the mouse (pointer) is held there +during dragging or linking or drag-selecting.

        +

        The default value is a Margin of 16 on all sides. +Increase this value in order to make it easier for the user to autoscroll by having +a larger area in which to hold the mouse (pointer) down during a dragging operation.

        +

        When the mouse (pointer) drag point is within this region on the left or right sides, +the view will automatically scroll horizontally in that direction. +When the point is within the region on the top or bottom, the view will automatically scroll +vertically in that direction. +You can specify a Margin side of zero to disable autoscrolling in a particular direction; +a value of Margin(0,0,0,0) turns off autoscrolling in all four directions.

        +
      • +

        Gets or sets the function to execute when the user single-primary-clicks +on the background of the Diagram. +This typically involves a mouse-down followed by a prompt mouse-up +at approximately the same position using the left (primary) mouse button. +This property is used by the ClickSelectingTool +when the user clicks on no object. +The function is called in addition to the DiagramEvent +that is raised with the name "BackgroundSingleClicked".

        +

        If this property value is a function, it is called with an InputEvent. +By default this property is null.

        +

        If you do provide a function that makes changes to the diagram or to its model, +you should do so within a transaction -- call startTransaction and commitTransaction, +or call commit.

        +
        see

        doubleClick, contextClick, GraphObject.click

        +
      • +

        Gets or sets the CommandHandler for this Diagram.

        +

        This is set to a new instance of CommandHandler on Diagram instantiation.

        +

        Setting this property does not notify about any changed event. +The value cannot be null and must not be shared with other Diagrams.

        +
      • +

        Gets or sets the content alignment Spot of this Diagram, to be used in determining +how parts are positioned when the viewportBounds width or height is larger than the documentBounds.

        +

        For instance a spot of Spot.Center would ensure that the Diagram's +contents are always centered in the viewport.

        +

        If you want the content to be aligned only initially, use initialContentAlignment instead.

        +

        The default value is Spot.Default, which causes no automatic scrolling or positioning. +When the value is not Default, any value for initialContentAlignment or initialPosition is ignored.

        +

        Setting this property has the same effect as implementing +a "LayoutCompleted" DiagramEvent listener that scrolls the viewport to align the content.

        +
      • +

        Gets or sets the function to execute when the user single-secondary-clicks +on the background of the Diagram. +This typically involves a mouse-down followed by a prompt mouse-up +at approximately the same position using the right (secondary) mouse button. +This property is used by the ClickSelectingTool +when the user clicks on no object. +The function is called in addition to the DiagramEvent +that is raised with the name "BackgroundContextClicked".

        +

        If this property value is a function, it is called with an InputEvent. +By default this property is null.

        +

        If you do provide a function that makes changes to the diagram or to its model, +you should do so within a transaction -- call startTransaction and commitTransaction, +or call commit.

        +
        see

        click, doubleClick, GraphObject.contextClick

        +
      • +

        This Adornment or HTMLInfo is shown when the use context clicks in the background. +The default value is null, which means no context menu is shown. +On touch devices, a special default context menu will appear even there is no context menu defined. +See ContextMenuTool.defaultTouchContextMenu for details.

        +
         diagram.contextMenu =
        $("ContextMenu",
        $("ContextMenuButton",
        $(go.TextBlock, "Undo"),
        { click: function(e, obj) { e.diagram.commandHandler.undo(); } },
        new go.Binding("visible", "", function(o) {
        return o.diagram.commandHandler.canUndo();
        }).ofObject()),
        $("ContextMenuButton",
        $(go.TextBlock, "Redo"),
        { click: function(e, obj) { e.diagram.commandHandler.redo(); } },
        new go.Binding("visible", "", function(o) {
        return o.diagram.commandHandler.canRedo();
        }).ofObject())
        );
        -
        -
      • -
      -

      Returns Diagram

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - allowClipboard - : boolean

    - -
    -
    - -

    - allowCopy - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may copy objects. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowDelete - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may delete objects from the Diagram. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowDragOut - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may start a drag-and-drop in this Diagram, - possibly dropping in a different element. - The initial value is false.

      -
      -
    • -
    -
    -
    - -

    - allowDrop - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may end a drag-and-drop operation in this Diagram. - This is typically set to true when a Diagram is used with a Palette.

      -

      The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowGroup - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may group parts together. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowHorizontalScroll - : boolean

    - -
    -
    - -

    - allowInsert - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may add parts to the Diagram. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowLink - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may draw new links. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowMove - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may move objects. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowRelink - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may reconnect existing links. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowReshape - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may reshape parts. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowResize - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may resize parts. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowRotate - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may rotate parts. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowSelect - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may select objects. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowTextEdit - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may do in-place text editing. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowUndo - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may undo or redo any changes. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowUngroup - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may ungroup existing groups. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowVerticalScroll - : boolean

    - -
    -
    - -

    - allowZoom - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may zoom into or out of the Diagram. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - Read-only - animationManager - : AnimationManager

    -
      -
    • -
      -

      This read-only property returns the AnimationManager for this Diagram.

      -
      -
      since
      -

      1.4

      -
      -
      -
      -
    • -
    -
    -
    - -

    - autoScale - : EnumValue

    -
      -
    • -
      -

      Gets or sets the autoScale behavior of the Diagram, controlling whether or not the - Diagram's bounds automatically scale to fit the view.

      -

      The only accepted values are the constant properties of Diagram, - Diagram.None, Diagram.Uniform, or Diagram.UniformToFill. - Setting this will change the Diagram's Diagram.scale and Diagram.position, if appropriate.

      -

      The default value is Diagram.None - the scale and position are not automatically adjusted - according to the area covered by the document. - When the value is not None, any value for initialAutoScale or initialScale is ignored.

      -

      - When autoScale is set to a non-Diagram.None value, - the user will not be able to zoom, and setting scale will do nothing. - If you only want to scale automatically on initialization, use initialAutoScale. -

      Setting this property to Diagram.Uniform is basically the same as calling zoomToFit - all the time, or just disabling interactive zooming.

      -

      Note that depending on the values of maxScale and minScale, the actual value for scale - might be limited.

      -
      -
    • -
    -
    -
    - -

    - autoScrollInterval - : number

    -
      -
    • -
      -

      Gets or sets number of milliseconds between autoscroll events. - The default value is 250.

      -
      -
      since
      -

      2.2

      -
      -
      -
      -
    • -
    -
    -
    - -

    - autoScrollRegion - : MarginLike

    -
      -
    • -
      -

      Gets or sets the Margin that describes the area along the inside edges of the viewport, - in viewport coordinates, where autoscrolling will occur while the mouse (pointer) is held there - during dragging or linking or drag-selecting.

      -

      The default value is a Margin of 16 on all sides. - Increase this value in order to make it easier for the user to autoscroll by having - a larger area in which to hold the mouse (pointer) down during a dragging operation.

      -

      When the mouse (pointer) drag point is within this region on the left or right sides, - the view will automatically scroll horizontally in that direction. - When the point is within the region on the top or bottom, the view will automatically scroll - vertically in that direction. - You can specify a Margin side of zero to disable autoscrolling in a particular direction; - a value of Margin(0,0,0,0) turns off autoscrolling in all four directions.

      -
      -
    • -
    -
    -
    - -

    - click - : (e: InputEvent) => void

    -
      -
    • -
      -

      Gets or sets the function to execute when the user single-primary-clicks - on the background of the Diagram. - This typically involves a mouse-down followed by a prompt mouse-up - at approximately the same position using the left (primary) mouse button. - This property is used by the ClickSelectingTool - when the user clicks on no object. - The function is called in addition to the DiagramEvent - that is raised with the name "BackgroundSingleClicked".

      -

      If this property value is a function, it is called with an InputEvent. - By default this property is null.

      -

      If you do provide a function that makes changes to the diagram or to its model, - you should do so within a transaction -- call startTransaction and commitTransaction, - or call commit.

      -
      -
      see
      -

      doubleClick, contextClick, GraphObject.click

      -
      -
      -
      -
    • -
    -
    -
    - -

    - commandHandler - : CommandHandler

    -
      -
    • -
      -

      Gets or sets the CommandHandler for this Diagram.

      -

      This is set to a new instance of CommandHandler on Diagram instantiation.

      -

      Setting this property does not notify about any changed event. - The value cannot be null and must not be shared with other Diagrams.

      -
      -
    • -
    -
    -
    - -

    - contentAlignment - : Spot

    -
      -
    • -
      -

      Gets or sets the content alignment Spot of this Diagram, to be used in determining - how parts are positioned when the viewportBounds width or height is larger than the documentBounds.

      -

      For instance a spot of Spot.Center would ensure that the Diagram's - contents are always centered in the viewport.

      -

      If you want the content to be aligned only initially, use initialContentAlignment instead.

      -

      The default value is Spot.Default, which causes no automatic scrolling or positioning. - When the value is not Default, any value for initialContentAlignment or initialPosition is ignored.

      -

      Setting this property has the same effect as implementing - a "LayoutCompleted" DiagramEvent listener that scrolls the viewport to align the content.

      -
      -
    • -
    -
    -
    - -

    - contextClick - : (e: InputEvent) => void

    -
      -
    • -
      -

      Gets or sets the function to execute when the user single-secondary-clicks - on the background of the Diagram. - This typically involves a mouse-down followed by a prompt mouse-up - at approximately the same position using the right (secondary) mouse button. - This property is used by the ClickSelectingTool - when the user clicks on no object. - The function is called in addition to the DiagramEvent - that is raised with the name "BackgroundContextClicked".

      -

      If this property value is a function, it is called with an InputEvent. - By default this property is null.

      -

      If you do provide a function that makes changes to the diagram or to its model, - you should do so within a transaction -- call startTransaction and commitTransaction, - or call commit.

      -
      -
      see
      -

      click, doubleClick, GraphObject.contextClick

      -
      -
      -
      -
    • -
    -
    -
    - -

    - contextMenu - : Adornment | HTMLInfo

    -
      -
    • -
      -

      This Adornment or HTMLInfo is shown when the use context clicks in the background. - The default value is null, which means no context menu is shown. - On touch devices, a special default context menu will appear even there is no context menu defined. - See ContextMenuTool.defaultTouchContextMenu for details.

      -
       diagram.contextMenu =
      -   $("ContextMenu",
      -     $("ContextMenuButton",
      -       $(go.TextBlock, "Undo"),
      -       { click: function(e, obj) { e.diagram.commandHandler.undo(); } },
      -       new go.Binding("visible", "", function(o) {
      -           return o.diagram.commandHandler.canUndo();
      -         }).ofObject()),
      -     $("ContextMenuButton",
      -       $(go.TextBlock, "Redo"),
      -       { click: function(e, obj) { e.diagram.commandHandler.redo(); } },
      -       new go.Binding("visible", "", function(o) {
      -           return o.diagram.commandHandler.canRedo();
      -         }).ofObject())
      -   );
      +
      see

      GraphObject.contextMenu, ContextMenuTool

      +
  • +

    Gets or sets the current cursor for the Diagram, overriding the defaultCursor.

    +

    Valid CSS cursors are accepted, +such as "auto", "default", "none", "context-menu", "help", "pointer", "progress", "wait", etc.

    +

    It is possible to use custom cursors with the syntax "url(path_to_image), default". +A fallback (like default here) is necessary for a custom cursor to work.

    +

    To read more about cursor syntax, go to: +CSS cursors (mozilla.org).

    +

    If the specified cursor is not accepted by the platform, GoJS will append +-webkit- or -moz- prefixes.

    +

    Setting this property does not notify about any changed event. +Setting this value to the empty string ('') returns the Diagram's cursor to the defaultCursor.

    +
    see

    defaultCursor, GraphObject.cursor

    +
  • +

    Gets or sets the current tool for this Diagram that handles all input events. +This value is frequently replaced by the toolManager as different tools run.

    +

    Each Diagram has a number of tools that define its behavior when responding to mouse events. +These include ClickSelectingTool, DraggingTool, DragSelectingTool, LinkingTool, and ResizingTool, among others.

    +

    Initially this is set to the value of defaultTool. +Setting this to a null value is treated as if it were set to the defaultTool, +because there should always be a currently running tool, except when the diagram is being initialized.

    +

    A ToolManager is the default tool used by a Diagram - it chooses to run one of the other tools +depending on the circumstances.

    +

    Setting this property to a new tool stops the previous current tool

    +

    Setting this property does not notify about any changed event.

    +
    see

    defaultTool, toolManager

    +
  • +

    Gets or sets the cursor to be used for the Diagram +when no GraphObject specifies a different cursor.

    +

    Valid CSS cursors are accepted, +such as "auto", "default", "none", "context-menu", "help", "pointer", "progress", "wait", etc.

    +

    It is possible to use custom cursors with the syntax "url(path_to_image), default". +A fallback (like default here) is necessary for a custom cursor to work.

    +

    To read more about cursor syntax, go to: +CSS cursors (mozilla.org). +The default value is "auto".

    +
    see

    currentCursor, GraphObject.cursor

    +
  • +

    Gets or sets the default tool for this Diagram that becomes the current tool when the current tool stops. +Initially this value is the same tool as toolManager, which is an instance of ToolManager.

    +

    Setting this property also sets the currentTool if the old default tool is the currently running tool.

    +

    Setting this property does not notify about any changed event. +The value cannot be null and must not be shared with other Diagrams.

    +
    see

    currentTool, toolManager

    +
  • +

    Gets or sets the Diagram's HTMLDivElement, via an HTML Element ID. +This is typically set automatically when a Div is supplied as an argument to Diagram's constructor.

    +

    Setting this property to a new value will clobber any HTML and +inner DOM elements inside of both the new and the old divs. +It will then populate the Div with the elements +(inner Divs, Canvases) needed for the Diagram to function.

    +

    If you want to disassociate the Diagram from the HTML Div element, set Diagram.div to null. +If you remove a part of the HTML DOM containing a Div with a Diagram, you will need to +set div to null in order for the page to recover the memory.

    +

    You should not attempt to manually modify the contents of this Div. +Changing this property value does not raise a Changed event.

    +
  • +

    This read-only property returns the bounds of the diagram's contents, in document coordinates.

    +

    This is normally computed and set by computeBounds during Diagram updates +that can occur for any number of relevant reasons, such as a Part changing size.

    +

    The Diagram's documentBounds can have an unvarying specific value +by setting the fixedBounds property.

    +

    If the documentBounds are larger than the viewportBounds, +scrollbars will appear on desktop browsers. You can disable scrolling with the +allowHorizontalScroll and allowVerticalScroll properties, and +you can disable scrollbars themselves with the hasHorizontalScrollbar +and hasVerticalScrollbar properties.

    +
  • +

    Gets or sets the function to execute when the user double-primary-clicks +on the background of the Diagram. +This typically involves a mouse-down/up/down/up in rapid succession +at approximately the same position using the left (primary) mouse button. +This property is used by the ClickSelectingTool +when the user clicks on no object. +The function is called in addition to the DiagramEvent +that is raised with the name "BackgroundDoubleClicked".

    +

    If this property value is a function, it is called with an InputEvent. +By default this property is null.

    +

    If you do provide a function that makes changes to the diagram or to its model, +you should do so within a transaction -- call startTransaction and commitTransaction, +or call commit.

    +
    see

    click, contextClick, GraphObject.doubleClick

    +
  • +

    Gets or sets the most recent mouse-down InputEvent that occurred.

    +

    Setting this property does not notify about any changed event.

    +
    see

    lastInput

    +
  • +

    Gets or sets a fixed bounding rectangle to be returned by documentBounds +and computeBounds. +By default this has NaN values, meaning that computeBounds +will compute the union of all of the parts in the Diagram to determine the documentBounds. +If all x/y/width/height values are real numbers, this value is used as the documentBounds.

    +
  • +

    Gets or sets a Panel of type Panel.Grid acting as the background grid +extending across the whole viewport of this diagram.

    +
  • +

    Gets or sets the default selection Adornment template, used to adorn selected Groups.

    +

    Each Group can have its own Part.selectionAdornmentTemplate, which if non-null will take precedence over this Diagram property.

    +

    This Adornment must not be in the visual tree of any Diagram.

    +
  • +

    Gets or sets the default Group template used as the archetype +for group data that is added to the model.

    +

    Setting this property just modifies the groupTemplateMap +by replacing the entry named with the empty string. +The value must not be null and must be a Group, not a Node or simple Part. +This Part must not be in the visual tree of any Diagram.

    +
  • +

    Gets or sets a Map mapping template names to Groups. +These groups are copied for each group data that is added to the model.

    +

    The new value must not be null, nor may it contain a Node or Link or simple Part. +The Links must not be in the visual tree of any Diagram. +Replacing this Map will automatically call rebuildParts.

    +

    If you modify this Map, by replacing a Group in it or by adding or +removing a map entry, you need to explicitly call rebuildParts afterwards.

    +
  • +

    This read-only property returns the read-only collection of highlighted parts.

    +

    Do not modify this collection. +If you want to highlight or remove the highlight for a particular Part in a Diagram, +set the Part.isHighlighted property. +If you want to highlight a collection of Parts, call highlightCollection. +If you want to remove all highlights and highlight a single object, call highlight. +If you want to remove all highlights, call clearHighlighteds.

    +

    Note that highlighteds collection and Part.isHighlighted property are completely independent +of the selection collection and the Part.isSelected property. +No predefined command or tool operates on this highlighteds collection.

    +
  • +

    Gets or sets how the scale of the diagram is automatically +set at the time of the "InitialLayoutCompleted" DiagramEvent, after the model has been replaced.

    +

    The only accepted values are listed as constant properties of Diagram, +such as Diagram.None, Diagram.Uniform, or Diagram.UniformToFill. +Setting this will change the Diagram's Diagram.scale and Diagram.position, if appropriate.

    +

    If you want to always automatically scale the Diagram, set autoScale instead. +If you want to set the scale to a specific value on initialization (each time the model is replaced), +set initialScale.

    +

    The default value is Diagram.None -- the scale and position are not automatically adjusted +according to the area covered by the document.

    +

    Setting this property to Diagram.Uniform is basically the same as calling zoomToFit +in an "InitialLayoutCompleted" DiagramEvent listener.

    +

    Note that depending on the values of maxScale and minScale, the actual value for scale +might be limited.

    +
  • +

    Gets or sets the initial content alignment Spot of this Diagram, to be used in determining +how parts are positioned initially relative to the viewport, when the viewportBounds width or height is larger than the documentBounds.

    +

    For instance a spot of Spot.Center would ensure that the Diagram's contents are initially centered in the viewport.

    +

    To initially align the document when the documentBounds are larger than the viewport, use initialDocumentSpot and initialViewportSpot.

    +

    If you want the content to be constantly aligned with a spot, use contentAlignment instead.

    +

    The default value is Spot.Default, which causes no automatic scrolling or positioning.

    +

    Setting this property has the same effect as implementing +an "InitialLayoutCompleted" DiagramEvent listener that scrolls the viewport to align the content.

    +
    see

    initialDocumentSpot, initialViewportSpot

    +
  • +

    Gets or sets the initial coordinates of this Diagram in the viewport, eventually setting the position. +This value is relevant on initialization of a model or if delayInitialization is called. +Value must be of type Point in document coordinates. +The default is Point(NaN, NaN).

    +

    Setting this property has the same effect as implementing +an "InitialLayoutCompleted" DiagramEvent listener that sets position.

    +

    Setting this property does not notify about any changed event.

    +
    see

    initialDocumentSpot, initialViewportSpot

    +
    since

    1.1

    +
  • +

    Gets or sets the initial scale of this Diagram in the viewport, eventually setting the scale. +This value is relevant on initialization of a model or if delayInitialization is called. +The default is NaN.

    +

    Setting this property has the same effect as implementing +an "InitialLayoutCompleted" DiagramEvent listener that sets scale.

    +
    since

    1.1

    +
  • +

    Gets or sets whether this Diagram's state has been modified. +Setting this property does not notify about any changed event, +but it does raise the "Modified" DiagramEvent, +although perhaps not immediately.

    +

    Returns true if the Diagram has been changed, +if the undoManager has recorded any changes, or +if an undo has been performed without a corresponding redo.

    +

    Replacing the model automatically sets this property to false after the initial layout has completed. +The "Modified" DiagramEvent is also raised when an undo or a redo has finished. +A "Modified" DiagramEvent listener must not modify this Diagram or its Model.

    +
  • +

    Gets or sets whether mouse events initiated within the Diagram will be captured. +The initial value is true. +Setting this property does not notify about any changed event.

    +
  • +

    Gets or sets whether the Diagram may be modified by the user, +while still allowing the user to scroll, zoom, and select. +The initial value is false.

    +
    see

    isModelReadOnly, isEnabled

    +
  • +

    Gets or sets whether the Diagram tree structure is defined by +links going from the parent node to their children, or vice-versa. +By default this property is true: links go from the parent node to the child node.

    +
  • +

    Gets or sets the last InputEvent that occurred.

    +

    This property is useful in tools and real-time operations for determining +where the mouse pointer was most recently located.

    +

    Setting this property does not notify about any changed event.

    +
    see

    firstInput

    +
  • +

    This read-only property returns an iterator for this Diagram's Layers.

    +
    see

    addLayer, removeLayer

    +
  • +

    Gets or sets the Layout used to position all of the top-level nodes and links in this Diagram. +By default this property is an instance of a simple Layout +that assigns positions to all parts that need it. +The value cannot be null and must not be shared with other Diagrams.

    +
  • +

    Gets or sets the default selection Adornment template, used to adorn selected Links.

    +

    Each Link can have its own Part.selectionAdornmentTemplate, which if non-null will take precedence over this Diagram property.

    +

    This Adornment must not be in the visual tree of any Diagram.

    +
  • +

    Gets or sets the default Link template used as the archetype +for link data that is added to the model.

    +

    Setting this property just modifies the linkTemplateMap +by replacing the entry named with the empty string. +The value must not be null and must be a Link, not a Node or simple Part. +This Link must not be in the visual tree of any Diagram.

    +
  • +

    Gets or sets a Map mapping template names to Links. +These links are copied for each link data that is added to the model.

    +

    The new value must not be null and must contain only Links, not Nodes or simple Parts. +The Links must not be in the visual tree of any Diagram. +Replacing this Map will automatically call rebuildParts.

    +

    If you modify this Map, by replacing a Link in it or by adding or +removing a map entry, you need to explicitly call rebuildParts afterwards.

    +
  • +

    This read-only property returns an iterator of all Links in the Diagram.

    +

    This includes both data-bound and unbound links, +and both top-level links and links inside Groups.

    +
  • +

    Gets or sets the largest value that scale may take. +This property is only used to limit the range of new values of scale.

    +

    The default value is 100.0. +Values must be no less than one. +Setting this to a value that is less than the current scale +will cause the current diagram scale to be set to this new value.

    +
  • +

    Gets or sets the maximum number of selected objects. +The default value is a large positive integer. +Values must be non-negative. +Decreasing this value may cause objects to be removed from selection +in order to meet the new lower limit.

    +
  • +

    Gets or sets the smallest value greater than zero that scale may take. +This property is only used to limit the range of new values of scale.

    +

    The default value is 0.0001. +Values must be larger than zero and not greater than one. +Setting this to a value that is greater than the current scale +will cause the current diagram scale to be set to this new value.

    +
  • +

    Gets or sets the Model holding data corresponding to the +data-bound nodes and links of this Diagram.

    +

    Replacing this value causes all of the bound Nodes and Links to be deleted and re-created +from the new model data.

    +

    Models may be shared by multiple Diagrams. One common approach is to have two +Diagrams displaying the same Model but using different templates +(see nodeTemplate, nodeTemplateMap, and the associated link and group properties) and sometimes even different Layouts.

    +

    Setting this property does not notify about any changed event; the new value must not be null. +Typically a new Model will have its own UndoManager, thereby replacing the Diagram's +current UndoManager.

    +

    Replacing or re-setting the model will re-initialize the Diagram, taking in to account +initialPosition, initialScale, initialAutoScale, and initialContentAlignment. +It will also set isModified to false.

    +

    The default behavior when replacing the model is to copy a few UndoManager properties to the +new UndoManager, including UndoManager.isEnabled and UndoManager.maxHistoryLength.

    +

    It is an error to replace the Diagram.model while a transaction is in progress.

    +
  • +

    Gets or sets the function to execute when the user is dragging the selection in +the background of the Diagram during a DraggingTool drag-and-drop, +not over any GraphObjects.

    +

    If this property value is a function, it is called with an InputEvent. +It is called within the transaction performed by the DraggingTool. +By default this property is null.

    +

    Note that for a drag-and-drop that originates in a different diagram, the target diagram's +selection collection will not be the parts that are being dragged. +Instead the temporary parts being dragged can be found as the source diagram's DraggingTool.copiedParts.

    +

    This function is called with Diagram.skipsUndoManager temporarily set to true, +so that any changes to GraphObjects are not recorded in the UndoManager. +You do not need to start and commit any transaction in this function. +After calling this function the diagram will be updated immediately.

    +

    For example, if you want to prevent the user from dropping Parts into the background of the diagram, +and want to provide feedback about that during a drag:

    +
      myDiagram.mouseDragOver = function(e) {
    myDiagram.currentCursor = "no-drop";
    }
    -
    -
    see
    -

    GraphObject.contextMenu, ContextMenuTool

    -
    -
    -
    -
  • -
-
-
- -

- currentCursor - : string

-
    -
  • -
    -

    Gets or sets the current cursor for the Diagram, overriding the defaultCursor.

    -

    Valid CSS cursors are accepted, - such as "auto", "default", "none", "context-menu", "help", "pointer", "progress", "wait", etc.

    -

    It is possible to use custom cursors with the syntax "url(path_to_image), default". - A fallback (like default here) is necessary for a custom cursor to work.

    -

    To read more about cursor syntax, go to: - CSS cursors (mozilla.org).

    -

    If the specified cursor is not accepted by the platform, GoJS will append - -webkit- or -moz- prefixes.

    -

    Setting this property does not notify about any changed event. - Setting this value to the empty string ('') returns the Diagram's cursor to the defaultCursor.

    -
    -
    see
    -

    defaultCursor, GraphObject.cursor

    -
    -
    -
    -
  • -
-
-
- -

- currentTool - : Tool

-
    -
  • -
    -

    Gets or sets the current tool for this Diagram that handles all input events. - This value is frequently replaced by the toolManager as different tools run.

    -

    Each Diagram has a number of tools that define its behavior when responding to mouse events. - These include ClickSelectingTool, DraggingTool, DragSelectingTool, LinkingTool, and ResizingTool, among others.

    -

    Initially this is set to the value of defaultTool. - Setting this to a null value is treated as if it were set to the defaultTool, - because there should always be a currently running tool, except when the diagram is being initialized.

    -

    A ToolManager is the default tool used by a Diagram - it chooses to run one of the other tools - depending on the circumstances.

    -

    Setting this property to a new tool stops the previous current tool

    -

    Setting this property does not notify about any changed event.

    -
    -
    see
    -

    defaultTool, toolManager

    -
    -
    -
    -
  • -
-
-
- -

- defaultCursor - : string

-
    -
  • -
    -

    Gets or sets the cursor to be used for the Diagram - when no GraphObject specifies a different cursor.

    -

    Valid CSS cursors are accepted, - such as "auto", "default", "none", "context-menu", "help", "pointer", "progress", "wait", etc.

    -

    It is possible to use custom cursors with the syntax "url(path_to_image), default". - A fallback (like default here) is necessary for a custom cursor to work.

    -

    To read more about cursor syntax, go to: - CSS cursors (mozilla.org). - The default value is "auto".

    -
    -
    see
    -

    currentCursor, GraphObject.cursor

    -
    -
    -
    -
  • -
-
-
- -

- defaultScale - : number

- -
-
- -

- defaultTool - : Tool

-
    -
  • -
    -

    Gets or sets the default tool for this Diagram that becomes the current tool when the current tool stops. - Initially this value is the same tool as toolManager, which is an instance of ToolManager.

    -

    Setting this property also sets the currentTool if the old default tool is the currently running tool.

    -

    Setting this property does not notify about any changed event. - The value cannot be null and must not be shared with other Diagrams.

    -
    -
    see
    -

    currentTool, toolManager

    -
    -
    -
    -
  • -
-
-
- -

- div - : HTMLDivElement

-
    -
  • -
    -

    Gets or sets the Diagram's HTMLDivElement, via an HTML Element ID. - This is typically set automatically when a Div is supplied as an argument to Diagram's constructor.

    -

    Setting this property to a new value will clobber any HTML and - inner DOM elements inside of both the new and the old divs. - It will then populate the Div with the elements - (inner Divs, Canvases) needed for the Diagram to function.

    -

    If you want to disassociate the Diagram from the HTML Div element, set Diagram.div to null. - If you remove a part of the HTML DOM containing a Div with a Diagram, you will need to - set div to null in order for the page to recover the memory.

    -

    You should not attempt to manually modify the contents of this Div. - Changing this property value does not raise a Changed event.

    -
    -
  • -
-
-
- -

- Read-only - documentBounds - : Rect

-
    -
  • -
    -

    This read-only property returns the bounds of the diagram's contents, in document coordinates.

    -

    This is normally computed and set by computeBounds during Diagram updates - that can occur for any number of relevant reasons, such as a Part changing size.

    -

    The Diagram's documentBounds can have an unvarying specific value - by setting the fixedBounds property.

    -

    If the documentBounds are larger than the viewportBounds, - scrollbars will appear on desktop browsers. You can disable scrolling with the - allowHorizontalScroll and allowVerticalScroll properties, and - you can disable scrollbars themselves with the hasHorizontalScrollbar - and hasVerticalScrollbar properties.

    -
    -
  • -
-
-
- -

- doubleClick - : (e: InputEvent) => void

-
    -
  • -
    -

    Gets or sets the function to execute when the user double-primary-clicks - on the background of the Diagram. - This typically involves a mouse-down/up/down/up in rapid succession - at approximately the same position using the left (primary) mouse button. - This property is used by the ClickSelectingTool - when the user clicks on no object. - The function is called in addition to the DiagramEvent - that is raised with the name "BackgroundDoubleClicked".

    -

    If this property value is a function, it is called with an InputEvent. - By default this property is null.

    -

    If you do provide a function that makes changes to the diagram or to its model, - you should do so within a transaction -- call startTransaction and commitTransaction, - or call commit.

    -
    -
    see
    -

    click, contextClick, GraphObject.doubleClick

    -
    -
    -
    -
  • -
-
-
- -

- firstInput - : InputEvent

-
    -
  • -
    -

    Gets or sets the most recent mouse-down InputEvent that occurred.

    -

    Setting this property does not notify about any changed event.

    -
    -
    see
    -

    lastInput

    -
    -
    -
    -
  • -
-
-
- -

- fixedBounds - : Rect

-
    -
  • -
    -

    Gets or sets a fixed bounding rectangle to be returned by documentBounds - and computeBounds. - By default this has NaN values, meaning that computeBounds - will compute the union of all of the parts in the Diagram to determine the documentBounds. - If all x/y/width/height values are real numbers, this value is used as the documentBounds.

    -
    -
  • -
-
-
- -

- grid - : Panel

-
    -
  • -
    -

    Gets or sets a Panel of type Panel.Grid acting as the background grid - extending across the whole viewport of this diagram.

    -
    -
  • -
-
-
- -

- groupSelectionAdornmentTemplate - : Adornment

-
    -
  • -
    -

    Gets or sets the default selection Adornment template, used to adorn selected Groups.

    -

    Each Group can have its own Part.selectionAdornmentTemplate, which if non-null will take precedence over this Diagram property.

    -

    This Adornment must not be in the visual tree of any Diagram.

    -
    -
  • -
-
-
- -

- groupTemplate - : Group

-
    -
  • -
    -

    Gets or sets the default Group template used as the archetype - for group data that is added to the model.

    -

    Setting this property just modifies the groupTemplateMap - by replacing the entry named with the empty string. - The value must not be null and must be a Group, not a Node or simple Part. - This Part must not be in the visual tree of any Diagram.

    -
    -
  • -
-
-
- -

- groupTemplateMap - : Map<string, Group>

-
    -
  • -
    -

    Gets or sets a Map mapping template names to Groups. - These groups are copied for each group data that is added to the model.

    -

    The new value must not be null, nor may it contain a Node or Link or simple Part. - The Links must not be in the visual tree of any Diagram. - Replacing this Map will automatically call rebuildParts.

    -

    If you modify this Map, by replacing a Group in it or by adding or - removing a map entry, you need to explicitly call rebuildParts afterwards.

    -
    -
  • -
-
-
- -

- handlesDragDropForTopLevelParts - : boolean

- -
-
- -

- hasHorizontalScrollbar - : boolean

- -
-
- -

- hasVerticalScrollbar - : boolean

- -
-
- -

- Read-only - highlighteds - : Set<Part>

-
    -
  • -
    -

    This read-only property returns the read-only collection of highlighted parts.

    -

    Do not modify this collection. - If you want to highlight or remove the highlight for a particular Part in a Diagram, - set the Part.isHighlighted property. - If you want to highlight a collection of Parts, call highlightCollection. - If you want to remove all highlights and highlight a single object, call highlight. - If you want to remove all highlights, call clearHighlighteds.

    -

    Note that highlighteds collection and Part.isHighlighted property are completely independent - of the selection collection and the Part.isSelected property. - No predefined command or tool operates on this highlighteds collection.

    -
    -
  • -
-
-
- -

- initialAutoScale - : EnumValue

-
    -
  • -
    -

    Gets or sets how the scale of the diagram is automatically - set at the time of the "InitialLayoutCompleted" DiagramEvent, after the model has been replaced.

    -

    The only accepted values are listed as constant properties of Diagram, - such as Diagram.None, Diagram.Uniform, or Diagram.UniformToFill. - Setting this will change the Diagram's Diagram.scale and Diagram.position, if appropriate.

    -

    If you want to always automatically scale the Diagram, set autoScale instead. - If you want to set the scale to a specific value on initialization (each time the model is replaced), - set initialScale.

    -

    The default value is Diagram.None -- the scale and position are not automatically adjusted - according to the area covered by the document.

    -

    Setting this property to Diagram.Uniform is basically the same as calling zoomToFit - in an "InitialLayoutCompleted" DiagramEvent listener.

    -

    Note that depending on the values of maxScale and minScale, the actual value for scale - might be limited.

    -
    -
  • -
-
-
- -

- initialContentAlignment - : Spot

-
    -
  • -
    -

    Gets or sets the initial content alignment Spot of this Diagram, to be used in determining - how parts are positioned initially relative to the viewport, when the viewportBounds width or height is larger than the documentBounds.

    -

    For instance a spot of Spot.Center would ensure that the Diagram's contents are initially centered in the viewport.

    -

    To initially align the document when the documentBounds are larger than the viewport, use initialDocumentSpot and initialViewportSpot.

    -

    If you want the content to be constantly aligned with a spot, use contentAlignment instead.

    -

    The default value is Spot.Default, which causes no automatic scrolling or positioning.

    -

    Setting this property has the same effect as implementing - an "InitialLayoutCompleted" DiagramEvent listener that scrolls the viewport to align the content.

    -
    -
    see
    -

    initialDocumentSpot, initialViewportSpot

    -
    -
    -
    -
  • -
-
-
- -

- initialDocumentSpot - : Spot

- -
-
- -

- initialPosition - : Point

-
    -
  • -
    -

    Gets or sets the initial coordinates of this Diagram in the viewport, eventually setting the position. - This value is relevant on initialization of a model or if delayInitialization is called. - Value must be of type Point in document coordinates. - The default is Point(NaN, NaN).

    -

    Setting this property has the same effect as implementing - an "InitialLayoutCompleted" DiagramEvent listener that sets position.

    -

    Setting this property does not notify about any changed event.

    -
    -
    see
    -

    initialDocumentSpot, initialViewportSpot

    -
    -
    since
    -

    1.1

    -
    -
    -
    -
  • -
-
-
- -

- initialScale - : number

-
    -
  • -
    -

    Gets or sets the initial scale of this Diagram in the viewport, eventually setting the scale. - This value is relevant on initialization of a model or if delayInitialization is called. - The default is NaN.

    -

    Setting this property has the same effect as implementing - an "InitialLayoutCompleted" DiagramEvent listener that sets scale.

    -
    -
    since
    -

    1.1

    -
    -
    -
    -
  • -
-
-
- -

- initialViewportSpot - : Spot

- -
-
- -

- isEnabled - : boolean

- -
-
- -

- isModelReadOnly - : boolean

- -
-
- -

- isModified - : boolean

-
    -
  • -
    -

    Gets or sets whether this Diagram's state has been modified. - Setting this property does not notify about any changed event, - but it does raise the "Modified" DiagramEvent, - although perhaps not immediately.

    -

    Returns true if the Diagram has been changed, - if the undoManager has recorded any changes, or - if an undo has been performed without a corresponding redo.

    -

    Replacing the model automatically sets this property to false after the initial layout has completed. - The "Modified" DiagramEvent is also raised when an undo or a redo has finished. - A "Modified" DiagramEvent listener must not modify this Diagram or its Model.

    -
    -
  • -
-
-
- -

- isMouseCaptured - : boolean

-
    -
  • -
    -

    Gets or sets whether mouse events initiated within the Diagram will be captured. - The initial value is true. - Setting this property does not notify about any changed event.

    -
    -
  • -
-
-
- -

- isReadOnly - : boolean

-
    -
  • -
    -

    Gets or sets whether the Diagram may be modified by the user, - while still allowing the user to scroll, zoom, and select. - The initial value is false.

    -
    -
    see
    -

    isModelReadOnly, isEnabled

    -
    -
    -
    -
  • -
-
-
- -

- isTreePathToChildren - : boolean

-
    -
  • -
    -

    Gets or sets whether the Diagram tree structure is defined by - links going from the parent node to their children, or vice-versa. - By default this property is true: links go from the parent node to the child node.

    -
    -
  • -
-
-
- -

- lastInput - : InputEvent

-
    -
  • -
    -

    Gets or sets the last InputEvent that occurred.

    -

    This property is useful in tools and real-time operations for determining - where the mouse pointer was most recently located.

    -

    Setting this property does not notify about any changed event.

    -
    -
    see
    -

    firstInput

    -
    -
    -
    -
  • -
-
-
- -

- Read-only - layers - : Iterator<Layer>

-
    -
  • -
    -

    This read-only property returns an iterator for this Diagram's Layers.

    -
    -
    see
    -

    addLayer, removeLayer

    -
    -
    -
    -
  • -
-
-
- -

- layout - : Layout

-
    -
  • -
    -

    Gets or sets the Layout used to position all of the top-level nodes and links in this Diagram. - By default this property is an instance of a simple Layout - that assigns positions to all parts that need it. - The value cannot be null and must not be shared with other Diagrams.

    -
    -
  • -
-
-
- -

- Static - licenseKey - : string

-
    -
  • -
    -

    Gets or sets the license key.

    -
    -
    since
    -

    2.0

    -
    -
    -
    -
  • -
-
-
- -

- linkSelectionAdornmentTemplate - : Adornment

-
    -
  • -
    -

    Gets or sets the default selection Adornment template, used to adorn selected Links.

    -

    Each Link can have its own Part.selectionAdornmentTemplate, which if non-null will take precedence over this Diagram property.

    -

    This Adornment must not be in the visual tree of any Diagram.

    -
    -
  • -
-
-
- -

- linkTemplate - : Link

-
    -
  • -
    -

    Gets or sets the default Link template used as the archetype - for link data that is added to the model.

    -

    Setting this property just modifies the linkTemplateMap - by replacing the entry named with the empty string. - The value must not be null and must be a Link, not a Node or simple Part. - This Link must not be in the visual tree of any Diagram.

    -
    -
  • -
-
-
- -

- linkTemplateMap - : Map<string, Link>

-
    -
  • -
    -

    Gets or sets a Map mapping template names to Links. - These links are copied for each link data that is added to the model.

    -

    The new value must not be null and must contain only Links, not Nodes or simple Parts. - The Links must not be in the visual tree of any Diagram. - Replacing this Map will automatically call rebuildParts.

    -

    If you modify this Map, by replacing a Link in it or by adding or - removing a map entry, you need to explicitly call rebuildParts afterwards.

    -
    -
  • -
-
-
- -

- Read-only - links - : Iterator<Link>

-
    -
  • -
    -

    This read-only property returns an iterator of all Links in the Diagram.

    -

    This includes both data-bound and unbound links, - and both top-level links and links inside Groups.

    -
    -
  • -
-
-
- -

- maxScale - : number

-
    -
  • -
    -

    Gets or sets the largest value that scale may take. - This property is only used to limit the range of new values of scale.

    -

    The default value is 100.0. - Values must be no less than one. - Setting this to a value that is less than the current scale - will cause the current diagram scale to be set to this new value.

    -
    -
  • -
-
-
- -

- maxSelectionCount - : number

-
    -
  • -
    -

    Gets or sets the maximum number of selected objects. - The default value is a large positive integer. - Values must be non-negative. - Decreasing this value may cause objects to be removed from selection - in order to meet the new lower limit.

    -
    -
  • -
-
-
- -

- minScale - : number

-
    -
  • -
    -

    Gets or sets the smallest value greater than zero that scale may take. - This property is only used to limit the range of new values of scale.

    -

    The default value is 0.0001. - Values must be larger than zero and not greater than one. - Setting this to a value that is greater than the current scale - will cause the current diagram scale to be set to this new value.

    -
    -
  • -
-
-
- -

- model - : Model

-
    -
  • -
    -

    Gets or sets the Model holding data corresponding to the - data-bound nodes and links of this Diagram.

    -

    Replacing this value causes all of the bound Nodes and Links to be deleted and re-created - from the new model data.

    -

    Models may be shared by multiple Diagrams. One common approach is to have two - Diagrams displaying the same Model but using different templates - (see nodeTemplate, nodeTemplateMap, and the associated link and group properties) and sometimes even different Layouts.

    -

    Setting this property does not notify about any changed event; the new value must not be null. - Typically a new Model will have its own UndoManager, thereby replacing the Diagram's - current UndoManager.

    -

    Replacing or re-setting the model will re-initialize the Diagram, taking in to account - initialPosition, initialScale, initialAutoScale, and initialContentAlignment. - It will also set isModified to false.

    -

    The default behavior when replacing the model is to copy a few UndoManager properties to the - new UndoManager, including UndoManager.isEnabled and UndoManager.maxHistoryLength.

    -

    It is an error to replace the Diagram.model while a transaction is in progress.

    -
    -
  • -
-
-
- -

- mouseDragOver - : (e: InputEvent) => void

-
    -
  • -
    -

    Gets or sets the function to execute when the user is dragging the selection in - the background of the Diagram during a DraggingTool drag-and-drop, - not over any GraphObjects.

    -

    If this property value is a function, it is called with an InputEvent. - It is called within the transaction performed by the DraggingTool. - By default this property is null.

    -

    Note that for a drag-and-drop that originates in a different diagram, the target diagram's - selection collection will not be the parts that are being dragged. - Instead the temporary parts being dragged can be found as the source diagram's DraggingTool.copiedParts.

    -

    This function is called with Diagram.skipsUndoManager temporarily set to true, - so that any changes to GraphObjects are not recorded in the UndoManager. - You do not need to start and commit any transaction in this function. - After calling this function the diagram will be updated immediately.

    -

    For example, if you want to prevent the user from dropping Parts into the background of the diagram, - and want to provide feedback about that during a drag:

    -
      myDiagram.mouseDragOver = function(e) {
    -    myDiagram.currentCursor = "no-drop";
    -  }
    +
    see

    mouseDrop, GraphObject.mouseDragEnter, GraphObject.mouseDragLeave

    +
  • +

    Gets or sets the function to execute when the user drops the selection in +the background of the Diagram at the end of a DraggingTool drag-and-drop, +not onto any GraphObjects.

    +

    If this property value is a function, it is called with an InputEvent. +It is called within the transaction performed by the DraggingTool. +By default this property is null.

    +

    For example, if you want to prevent the user from dropping Parts into the background of the diagram:

    +
      myDiagram.mouseDrop = function(e) {
    myDiagram.currentTool.doCancel();
    }
    -
    -
    see
    -

    mouseDrop, GraphObject.mouseDragEnter, GraphObject.mouseDragLeave

    -
    -
    -
    -
  • -
-
-
- -

- mouseDrop - : (e: InputEvent) => void

-
    -
  • -
    -

    Gets or sets the function to execute when the user drops the selection in - the background of the Diagram at the end of a DraggingTool drag-and-drop, - not onto any GraphObjects.

    -

    If this property value is a function, it is called with an InputEvent. - It is called within the transaction performed by the DraggingTool. - By default this property is null.

    -

    For example, if you want to prevent the user from dropping Parts into the background of the diagram:

    -
      myDiagram.mouseDrop = function(e) {
    -    myDiagram.currentTool.doCancel();
    -  }
    +
    see

    mouseDragOver, GraphObject.mouseDrop

    +
  • +

    Gets or sets the function to execute when the mouse (pointer) enters the Diagram. +(When the browser's mouseEnter event fires on the Diagram canvas.)

    +

    If this property value is a function, it is called with an InputEvent. +By default this property is null.

    +

    If you do provide a function that makes changes to the diagram or to its model, +you should do so within a transaction -- call startTransaction and commitTransaction, +or call commit.

    +
    see

    mouseLeave, GraphObject.mouseEnter

    +
    since

    2.0

    +
  • +

    Gets or sets the function to execute when the mouse (pointer) leaves the Diagram.

    +

    If this property value is a function, it is called with an InputEvent. +By default this property is null.

    +

    If you do provide a function that makes changes to the diagram or to its model, +you should do so within a transaction -- call startTransaction and commitTransaction, +or call commit.

    +
    see

    mouseEnter, GraphObject.mouseLeave

    +
    since

    2.0

    +
  • +

    Gets or sets the function to execute when the user moves the mouse (pointer) in +the background of the Diagram without holding down any buttons, +not over any GraphObjects. +This property is used by the ToolManager.

    +

    If this property value is a function, it is called with an InputEvent. +By default this property is null.

    +

    This function is called with Diagram.skipsUndoManager temporarily set to true, +so that any changes to GraphObjects are not recorded in the UndoManager. +You do not need to start and commit any transaction in this function. +After calling this function the diagram will be updated immediately.

    +
    see

    mouseHover, GraphObject.mouseOver

    +
  • +

    Gets or sets the default selection Adornment template, used to adorn selected Parts other than Groups or Links.

    +

    Each Node or simple Part can have its own Part.selectionAdornmentTemplate, +which if non-null will take precedence over this Diagram property.

    +

    This Adornment must not be in the visual tree of any Diagram.

    +
  • +

    Gets or sets the default Node template used as the archetype +for node data that is added to the model. +Setting this property just modifies the nodeTemplateMap +by replacing the entry named with the empty string.

    +

    The value must not be null. +The template may be either a Node or a simple Part, +but not a Link or a Group.

    +

    This Part must not be in the visual tree of any Diagram.

    +
  • +

    Gets or sets a Map mapping template names to Parts. +These nodes are copied for each node data that is added to the model.

    +

    The new value must not be null and must contain Nodes or simple Parts. +These Parts must not be in the visual tree of any Diagram. +Replacing this Map will automatically call rebuildParts.

    +

    If you modify this Map, by replacing a Node or by adding or +removing a map entry, you need to explicitly call rebuildParts afterwards. +Any new map values must not be Links or Groups.

    +

    If you want to create Groups, use groupTemplateMap instead.

    +
  • +

    This read-only property returns an iterator of all Nodes and Groups in the Diagram.

    +

    This includes both data-bound and unbound nodes, +and both top-level nodes and nodes inside Groups. +All of the simple Parts are accessible via the parts property.

    +
    see

    findTopLevelGroups, findTreeRoots

    +
  • +

    Gets or sets the opacity for all parts in this diagram. +The value must be between 0.0 (fully transparent) and 1.0 (no additional transparency). +This value is multiplicative with any existing transparency, +for instance from a Brush or image transparency. +The default value is 1.

    +
    since

    2.1

    +
    see

    Layer.opacity, GraphObject.opacity

    +
  • +

    Gets or sets the Margin that describes the Diagram's padding, +which controls how much extra space in document coordinates there is around the area occupied by the document. +This keeps nodes from butting up against the side of the diagram (unless scrolled).

    +

    The default value is a margin of 5, all around the edge of the document.

    +
  • +

    This read-only property returns an iterator of all Parts in the Diagram +that are not Nodes or Links or Adornments.

    +

    This includes both data-bound and unbound parts, +and both top-level parts and parts inside Groups. +Use the nodes or links properties for getting the +collection of all Nodes or Links in the diagram.

    +
  • +

    Gets or sets the coordinates of this Diagram in the viewport. +Value must be of type Point in document coordinates. +The default is Point(NaN, NaN), but is typically set to a real value when a Diagram is initialized.

    +

    Scrolling and panning the Diagram modify the Diagram's position.

    +

    Setting this property does not notify about any changed event. +However you can listen with addDiagramListener for a DiagramEvent +with the name "ViewportBoundsChanged".

    +

    The viewportBounds x and y values are always the same as the Diagram's position values.

    +

    If you set this property any replacement of the model will result in a layout +and a computation of new documentBounds, which in turn may cause the diagram to be scrolled +and zoomed, depending on various Diagram properties named "initial...". +You may want to set initialPosition instead of setting this property around the time +that you are loading a model.

    +
  • +

    Gets or sets the function used to determine the position that this Diagram can be scrolled or moved to.

    +

    By default this function is null and the Diagram's position is bound only by the document bounds.

    +

    When this property is set the function is given a reference to the diagram and the proposed new position Point. +The function must return a new point.

    +

    An example that disallows decimal position values:

    +
      function computeIntegralPosition(diagram, pt) {
    return new go.Point(Math.floor(pt.x), Math.floor(pt.y));
    }
    -
    -
    see
    -

    mouseDragOver, GraphObject.mouseDrop

    -
    -
    -
    -
  • -
-
-
- -

- mouseEnter - : (e: InputEvent) => void

-
    -
  • -
    -

    Gets or sets the function to execute when the mouse (pointer) enters the Diagram. - (When the browser's mouseEnter event fires on the Diagram canvas.)

    -

    If this property value is a function, it is called with an InputEvent. - By default this property is null.

    -

    If you do provide a function that makes changes to the diagram or to its model, - you should do so within a transaction -- call startTransaction and commitTransaction, - or call commit.

    -
    -
    see
    -

    mouseLeave, GraphObject.mouseEnter

    -
    -
    since
    -

    2.0

    -
    -
    -
    -
  • -
-
-
- -

- mouseHold - : (e: InputEvent) => void

-
    -
  • -
    -

    Gets or sets the function to execute when the user holds the mouse (pointer) stationary in - the background of the Diagram while holding down a button, - not over any GraphObjects. - This property is used by the ToolManager.

    -

    If this property value is a function, it is called with an InputEvent. - By default this property is null.

    -

    If you do provide a function that makes changes to the diagram or to its model, - you should do so within a transaction -- call startTransaction and commitTransaction, - or call commit.

    -
    -
    see
    -

    GraphObject.mouseHold, ToolManager.doMouseHover

    -
    -
    -
    -
  • -
-
-
- -

- mouseHover - : (e: InputEvent) => void

- -
-
- -

- mouseLeave - : (e: InputEvent) => void

-
    -
  • -
    -

    Gets or sets the function to execute when the mouse (pointer) leaves the Diagram.

    -

    If this property value is a function, it is called with an InputEvent. - By default this property is null.

    -

    If you do provide a function that makes changes to the diagram or to its model, - you should do so within a transaction -- call startTransaction and commitTransaction, - or call commit.

    -
    -
    see
    -

    mouseEnter, GraphObject.mouseLeave

    -
    -
    since
    -

    2.0

    -
    -
    -
    -
  • -
-
-
- -

- mouseOver - : (e: InputEvent) => void

-
    -
  • -
    -

    Gets or sets the function to execute when the user moves the mouse (pointer) in - the background of the Diagram without holding down any buttons, - not over any GraphObjects. - This property is used by the ToolManager.

    -

    If this property value is a function, it is called with an InputEvent. - By default this property is null.

    -

    This function is called with Diagram.skipsUndoManager temporarily set to true, - so that any changes to GraphObjects are not recorded in the UndoManager. - You do not need to start and commit any transaction in this function. - After calling this function the diagram will be updated immediately.

    -
    -
    see
    -

    mouseHover, GraphObject.mouseOver

    -
    -
    -
    -
  • -
-
-
- -

- nodeSelectionAdornmentTemplate - : Adornment

-
    -
  • -
    -

    Gets or sets the default selection Adornment template, used to adorn selected Parts other than Groups or Links.

    -

    Each Node or simple Part can have its own Part.selectionAdornmentTemplate, - which if non-null will take precedence over this Diagram property.

    -

    This Adornment must not be in the visual tree of any Diagram.

    -
    -
  • -
-
-
- -

- nodeTemplate - : Part

-
    -
  • -
    -

    Gets or sets the default Node template used as the archetype - for node data that is added to the model. - Setting this property just modifies the nodeTemplateMap - by replacing the entry named with the empty string.

    -

    The value must not be null. - The template may be either a Node or a simple Part, - but not a Link or a Group.

    -

    This Part must not be in the visual tree of any Diagram.

    -
    -
  • -
-
-
- -

- nodeTemplateMap - : Map<string, Part>

-
    -
  • -
    -

    Gets or sets a Map mapping template names to Parts. - These nodes are copied for each node data that is added to the model.

    -

    The new value must not be null and must contain Nodes or simple Parts. - These Parts must not be in the visual tree of any Diagram. - Replacing this Map will automatically call rebuildParts.

    -

    If you modify this Map, by replacing a Node or by adding or - removing a map entry, you need to explicitly call rebuildParts afterwards. - Any new map values must not be Links or Groups.

    -

    If you want to create Groups, use groupTemplateMap instead.

    -
    -
  • -
-
-
- -

- Read-only - nodes - : Iterator<Node>

-
    -
  • -
    -

    This read-only property returns an iterator of all Nodes and Groups in the Diagram.

    -

    This includes both data-bound and unbound nodes, - and both top-level nodes and nodes inside Groups. - All of the simple Parts are accessible via the parts property.

    -
    -
    see
    -

    findTopLevelGroups, findTreeRoots

    -
    -
    -
    -
  • -
-
-
- -

- opacity - : number

-
    -
  • -
    -

    Gets or sets the opacity for all parts in this diagram. - The value must be between 0.0 (fully transparent) and 1.0 (no additional transparency). - This value is multiplicative with any existing transparency, - for instance from a Brush or image transparency. - The default value is 1.

    -
    -
    since
    -

    2.1

    -
    -
    see
    -

    Layer.opacity, GraphObject.opacity

    -
    -
    -
    -
  • -
-
-
- -

- padding - : MarginLike

-
    -
  • -
    -

    Gets or sets the Margin that describes the Diagram's padding, - which controls how much extra space in document coordinates there is around the area occupied by the document. - This keeps nodes from butting up against the side of the diagram (unless scrolled).

    -

    The default value is a margin of 5, all around the edge of the document.

    -
    -
  • -
-
-
- -

- Read-only - parts - : Iterator<Part>

-
    -
  • -
    -

    This read-only property returns an iterator of all Parts in the Diagram - that are not Nodes or Links or Adornments.

    -

    This includes both data-bound and unbound parts, - and both top-level parts and parts inside Groups. - Use the nodes or links properties for getting the - collection of all Nodes or Links in the diagram.

    -
    -
  • -
-
-
- -

- position - : Point

-
    -
  • -
    -

    Gets or sets the coordinates of this Diagram in the viewport. - Value must be of type Point in document coordinates. - The default is Point(NaN, NaN), but is typically set to a real value when a Diagram is initialized.

    -

    Scrolling and panning the Diagram modify the Diagram's position.

    -

    Setting this property does not notify about any changed event. - However you can listen with addDiagramListener for a DiagramEvent - with the name "ViewportBoundsChanged".

    -

    The viewportBounds x and y values are always the same as the Diagram's position values.

    -

    If you set this property any replacement of the model will result in a layout - and a computation of new documentBounds, which in turn may cause the diagram to be scrolled - and zoomed, depending on various Diagram properties named "initial...". - You may want to set initialPosition instead of setting this property around the time - that you are loading a model.

    -
    -
  • -
-
-
- -

- positionComputation - : (thisDiagram: Diagram, newPosition: Point) => Point

-
    -
  • -
    -

    Gets or sets the function used to determine the position that this Diagram can be scrolled or moved to.

    -

    By default this function is null and the Diagram's position is bound only by the document bounds.

    -

    When this property is set the function is given a reference to the diagram and the proposed new position Point. - The function must return a new point.

    -

    An example that disallows decimal position values:

    -
      function computeIntegralPosition(diagram, pt) {
    -    return new go.Point(Math.floor(pt.x), Math.floor(pt.y));
    -  }
    +

    The function, if supplied, must not have any side-effects.

    +
    since

    1.5

    +
  • +

    Gets or sets the scale transform of this Diagram. +Value must be a positive number. +The default value is 1. +Any new value will be coerced to be between minScale and maxScale.

    +

    Scale can automatically be set by the autoScale property. +There are also initialScale and initialAutoScale for +setting the scale on (re)initialization of a Diagram.

    +

    Setting this property does not notify about any changed event. +However you can listen with addDiagramListener for a DiagramEvent +with the name "ViewportBoundsChanged".

    +

    If you set this property any replacement of the model will result in a layout +and a computation of new documentBounds, which in turn may cause the diagram to be scrolled +and zoomed, depending on various Diagram properties named "initial...". +You may want to set initialScale instead of setting this property around the time +that you are loading a model.

    +
  • +

    Gets or sets the function used to determine valid scale values for this Diagram.

    +
    since

    1.5

    +
  • +

    Gets or sets the distance in screen pixels that the horizontal scrollbar will scroll +when scrolling by a line.

    +

    The default value is 16.

    +
    see

    scrollVerticalLineChange

    +
  • +

    Gets or sets a scrollable area in document coordinates that surrounds the document bounds, allowing the user to scroll into empty space.

    +

    The margin is only effective in each direction when the document bounds plus margin is greater than the viewport bounds.

    +

    The default value is a margin of 0, all around the edge of the document.

    +
    since

    1.5

    +
  • +

    Gets or sets the distance in screen pixels that the vertical scrollbar will scroll +when scrolling by a line.

    +

    The default value is 16.

    +
    see

    scrollHorizontalLineChange

    +
  • +

    Gets or sets whether the page may be scrolled when the diagram receives focus. +This happens in some browsers when the top-left corner of the diagram's HTMLDivElement +is scrolled out of view, the diagram does not have focus, and the user clicks in the diagram.

    +

    The default value is false.

    +
    since

    1.8

    +
  • +

    This read-only property returns the read-only collection of selected objects. +Most commands and many tools operate on this collection.

    +

    Do not modify this collection. +If you want to select or deselect a particular object in a Diagram, +set the Part.isSelected property. +If you want to select a collection of Parts, call selectCollection. +If you want to deselect all objects, call clearSelection. +If you want to deselect all objects and select a single object, call select.

    +

    You can limit how many objects the user can select by setting maxSelectionCount.

    +

    There are also DiagramEvents for "ChangingSelection" and "ChangedSelection", +which are raised by commands and tools before and after changes to this selection collection.

    +

    Note that selection collection and Part.isSelected property are completely independent +of the highlighteds collection and the Part.isHighlighted property.

    +
  • +

    Gets or sets whether ChangedEvents are not recorded by the UndoManager. +The initial and normal value is false. +WARNING: while this property is true do not perform any changes that cause any previous transactions +to become impossible to undo.

    +

    While this property is true, changing the Diagram or any GraphObject does not call UndoManager.handleChanged. +Even when this property is true, +transactions (such as calls to startTransaction) and +undo/redo (such as calls to CommandHandler.undo) +are still delegated to the undoManager.

    +

    You should set this to true only temporarily, and you should remember its previous value +before setting this to true. +When finishing the period for which you want the UndoManager to be disabled, +you should set this back to the remembered value it had before it was set to true.

    +

    For more permanent disabling of the UndoManager, set UndoManager.isEnabled to false.

    +

    Setting this property also sets Model.skipsUndoManager to the same value. +Setting this property does not notify about any changed event.

    +
  • +

    Gets or sets the ToolManager for this Diagram. +This tool is used for mode-less operation. +It is responsible for choosing a particular tool to run as the currentTool.

    +

    This tool is normally also the defaultTool. +If you don't want the ToolManager to run at all, +replace the defaultTool with your own tool.

    +

    Setting this property does not notify about any changed event. +The value cannot be null and must not be shared with other Diagrams. +If you set this property, you will probably also want to set defaultTool.

    +
    see

    defaultTool

    +
  • +

    This Adornment or HTMLInfo is shown when the mouse (pointer) stays motionless in the background. +The default value is null, which means no tooltip is shown.

    +

    Here is a simple example:

    +
     diagram.toolTip =
    $(go.Adornment, "Auto",
    $(go.Shape, { fill: "#CCFFCC" }),
    $(go.TextBlock, { margin: 4 },
    "This diagram lets you control the world.")
    );
    -

    The function, if supplied, must not have any side-effects.

    -
    -
    since
    -

    1.5

    -
    -
    -
    -
  • -
-
-
- -

- scale - : number

-
    -
  • -
    -

    Gets or sets the scale transform of this Diagram. - Value must be a positive number. - The default value is 1. - Any new value will be coerced to be between minScale and maxScale.

    -

    Scale can automatically be set by the autoScale property. - There are also initialScale and initialAutoScale for - setting the scale on (re)initialization of a Diagram.

    -

    Setting this property does not notify about any changed event. - However you can listen with addDiagramListener for a DiagramEvent - with the name "ViewportBoundsChanged".

    -

    If you set this property any replacement of the model will result in a layout - and a computation of new documentBounds, which in turn may cause the diagram to be scrolled - and zoomed, depending on various Diagram properties named "initial...". - You may want to set initialScale instead of setting this property around the time - that you are loading a model.

    -
    -
  • -
-
-
- -

- scaleComputation - : (thisDiagram: Diagram, newScale: number) => number

-
    -
  • -
    -

    Gets or sets the function used to determine valid scale values for this Diagram.

    -
    -
    since
    -

    1.5

    -
    -
    -
    -
  • -
-
-
- -

- scrollHorizontalLineChange - : number

-
    -
  • -
    -

    Gets or sets the distance in screen pixels that the horizontal scrollbar will scroll - when scrolling by a line.

    -

    The default value is 16.

    -
    -
    see
    -

    scrollVerticalLineChange

    -
    -
    -
    -
  • -
-
-
- -

- scrollMargin - : MarginLike

-
    -
  • -
    -

    Gets or sets a scrollable area in document coordinates that surrounds the document bounds, allowing the user to scroll into empty space.

    -

    The margin is only effective in each direction when the document bounds plus margin is greater than the viewport bounds.

    -

    The default value is a margin of 0, all around the edge of the document.

    -
    -
    since
    -

    1.5

    -
    -
    -
    -
  • -
-
-
- -

- scrollMode - : EnumValue

-
    -
  • -
    -

    Gets or sets the scrollMode of the Diagram, allowing the user to either - scroll to document bound borders with Diagram.DocumentScroll, - or scroll endlessly with Diagram.InfiniteScroll.

    -

    The default value is Diagram.DocumentScroll. - Changing this property value does not raise a Changed event.

    -
    -
    since
    -

    1.5

    -
    -
    -
    -
  • -
-
-
- -

- scrollVerticalLineChange - : number

-
    -
  • -
    -

    Gets or sets the distance in screen pixels that the vertical scrollbar will scroll - when scrolling by a line.

    -

    The default value is 16.

    -
    -
    see
    -

    scrollHorizontalLineChange

    -
    -
    -
    -
  • -
-
-
- -

- scrollsPageOnFocus - : boolean

-
    -
  • -
    -

    Gets or sets whether the page may be scrolled when the diagram receives focus. - This happens in some browsers when the top-left corner of the diagram's HTMLDivElement - is scrolled out of view, the diagram does not have focus, and the user clicks in the diagram.

    -

    The default value is false.

    -
    -
    since
    -

    1.8

    -
    -
    -
    -
  • -
-
-
- -

- Read-only - selection - : Set<Part>

-
    -
  • -
    -

    This read-only property returns the read-only collection of selected objects. - Most commands and many tools operate on this collection.

    -

    Do not modify this collection. - If you want to select or deselect a particular object in a Diagram, - set the Part.isSelected property. - If you want to select a collection of Parts, call selectCollection. - If you want to deselect all objects, call clearSelection. - If you want to deselect all objects and select a single object, call select.

    -

    You can limit how many objects the user can select by setting maxSelectionCount.

    -

    There are also DiagramEvents for "ChangingSelection" and "ChangedSelection", - which are raised by commands and tools before and after changes to this selection collection.

    -

    Note that selection collection and Part.isSelected property are completely independent - of the highlighteds collection and the Part.isHighlighted property.

    -
    -
  • -
-
-
- -

- skipsUndoManager - : boolean

-
    -
  • -
    -

    Gets or sets whether ChangedEvents are not recorded by the UndoManager. - The initial and normal value is false. - WARNING: while this property is true do not perform any changes that cause any previous transactions - to become impossible to undo.

    -

    While this property is true, changing the Diagram or any GraphObject does not call UndoManager.handleChanged. - Even when this property is true, - transactions (such as calls to startTransaction) and - undo/redo (such as calls to CommandHandler.undo) - are still delegated to the undoManager.

    -

    You should set this to true only temporarily, and you should remember its previous value - before setting this to true. - When finishing the period for which you want the UndoManager to be disabled, - you should set this back to the remembered value it had before it was set to true.

    -

    For more permanent disabling of the UndoManager, set UndoManager.isEnabled to false.

    -

    Setting this property also sets Model.skipsUndoManager to the same value. - Setting this property does not notify about any changed event.

    -
    -
  • -
-
-
- -

- toolManager - : ToolManager

-
    -
  • -
    -

    Gets or sets the ToolManager for this Diagram. - This tool is used for mode-less operation. - It is responsible for choosing a particular tool to run as the currentTool.

    -

    This tool is normally also the defaultTool. - If you don't want the ToolManager to run at all, - replace the defaultTool with your own tool.

    -

    Setting this property does not notify about any changed event. - The value cannot be null and must not be shared with other Diagrams. - If you set this property, you will probably also want to set defaultTool.

    -
    -
    see
    -

    defaultTool

    -
    -
    -
    -
  • -
-
-
- -

- toolTip - : Adornment | HTMLInfo

-
    -
  • -
    -

    This Adornment or HTMLInfo is shown when the mouse (pointer) stays motionless in the background. - The default value is null, which means no tooltip is shown.

    -

    Here is a simple example:

    -
     diagram.toolTip =
    -   $(go.Adornment, "Auto",
    -     $(go.Shape, { fill: "#CCFFCC" }),
    -     $(go.TextBlock, { margin: 4 },
    -       "This diagram lets you control the world.")
    -   );
    +
    see

    GraphObject.toolTip, ToolManager.doToolTip

    +
  • +

    This read-only property returns the UndoManager for this Diagram, which actually belongs to the model.

    +

    The default UndoManager has its UndoManager.isEnabled property set to false. +If you want users to undo and redo, you should set that property to true once you have initialized the Diagram or its Model.

    +

    Note that the UndoManager might be shared with other Diagrams that are showing the same Model. +The UndoManager might also be shared with other Models too.

    +
  • +

    Gets or sets a fixed size in document coordinates to be returned by viewportBounds. This is typically only set when the Diagram's div is null. +This property is intended to be used in DOM-less environments where there is no Diagram div expected, to simulate the size of the DIV. +Normally, the viewportBounds is sized by the DIV instead.

    +

    By default this is Size(NaN, NaN). +If this property is set, its size will always be used to compute the viewportBounds, even if +a div is also set. It is uncommon to set both this property and a Diagram DIV.

    +

    See the intro page on GoJS within Node.js for a usage example.

    +
    see

    viewportBounds

    +
    since

    2.0

    +
  • +

    This read-only property returns the bounds of the portion of the Diagram in document coordinates that is viewable from its HTML Canvas. +Typically when the viewport bounds are smaller than the documentBounds, the user can scroll or pan the view.

    +

    The x and y coordinates are equal to the position of the Diagram, +and the width and height are equal to the Diagram's canvas width and height, +divided by the scale.

    +
  • +

    Gets or sets the zoom point of this Diagram, in viewport coordinates. +This is used by Tool.standardMouseWheel and scale-setting commands to control where to zoom in or out.

    +

    Typical usage is to remember the value of this property and +to set this property to some point within the viewport (between zero and the canvas width and height). +This is commonly accomplished by using the InputEvent.viewPoint of Diagram.lastInput. +Then one changes the scale somehow, perhaps by executing one of the CommandHandler commands, +or by rotating the mouse wheel, or just by setting the Diagram.scale property. +Finally one restores the original value of this property.

    +

    The default value is Point(NaN, NaN). +Value must be of type Point, in element coordinates, not in document coordinates. +Setting this property does not notify about any changed event.

    +
    since

    1.2

    +
  • +

    Gets or sets the license key.

    +
    since

    2.0

    +
  • +

    Gets the current GoJS version.

    +
    since

    2.0

    +

Methods

  • add(part: Part): void
  • +

    Adds a Part to the Layer that matches the Part's Part.layerName, +or else the default layer, which is named with the empty string.

    +

    Normally parts added to a diagram are top-level parts. +If you want nodes to be members of a Group, in addition to calling this method +call Group.addMembers or set each Part.containingGroup.

    +
    see

    remove

    +

    Parameters

    Returns void

  • +

    Register an event handler that is called when there is a ChangedEvent because this Diagram +or one of its Parts has changed, but not because the Model or any model data has changed.

    +

    It is unusual to listen for Diagram ChangedEvents -- +it is far more common to listen for specific DiagramEvents by calling addDiagramListener, +or to listen for Model ChangedEvents (i.e. changes to the model) by calling addModelChangedListener.

    +

    Do not add or remove Changed listeners during the execution of a Changed listener.

    +
    see

    removeChangedListener

    +

    Parameters

    Returns Diagram

    this Diagram

    +
  • +

    Register an event handler that is called when there is a DiagramEvent of a given name.

    +

    See the DiagramEvent documentation for a complete listing of diagram event names and their purposes.

    +
    see

    removeDiagramListener

    +

    Parameters

    • name: DiagramEventName
      +

      the name is normally capitalized, but this method uses case-insensitive comparison.

      +
    • listener: (e: DiagramEvent) => void
      +

      a function that takes a DiagramEvent as its argument.

      +

    Returns Diagram

    this Diagram

    +
  • +

    Adds a layer to the list of layers after a specified layer. +This method can also re-order layers.

    +
    see

    addLayer, addLayerBefore, removeLayer

    +

    Parameters

    • layer: Layer
      +

      the new Layer to add or existing Layer to move in Z-order.

      +
    • existingLayer: Layer
      +

      the other Layer in this Diagram which should come just before the new or moved layer.

      +

    Returns Diagram

    this Diagram

    +
  • +

    Adds a layer to the list of layers before a specified layer. +This method can also re-order layers.

    +
    see

    addLayer, addLayerAfter, removeLayer

    +

    Parameters

    • layer: Layer
      +

      the new Layer to add or existing Layer to move in Z-order.

      +
    • existingLayer: Layer
      +

      the other Layer in this Diagram which should come just after the new or moved layer.

      +

    Returns Diagram

    this Diagram

    +
-
-
- -

- Read-only - undoManager - : UndoManager

-
    -
  • -
    -

    This read-only property returns the UndoManager for this Diagram, which actually belongs to the model.

    -

    The default UndoManager has its UndoManager.isEnabled property set to false. - If you want users to undo and redo, you should set that property to true once you have initialized the Diagram or its Model.

    -

    Note that the UndoManager might be shared with other Diagrams that are showing the same Model. - The UndoManager might also be shared with other Models too.

    -
    -
  • -
-
-
- -

- validCycle - : EnumValue

- -
-
- -

- Static - Read-only - version - : string

-
    -
  • -
    -

    Gets the current GoJS version.

    -
    -
    since
    -

    2.0

    -
    -
    -
    -
  • -
-
-
- -

- viewSize - : Size

-
    -
  • -
    -

    Gets or sets a fixed size in document coordinates to be returned by viewportBounds. This is typically only set when the Diagram's div is null. - This property is intended to be used in DOM-less environments where there is no Diagram div expected, to simulate the size of the DIV. - Normally, the viewportBounds is sized by the DIV instead.

    -

    By default this is Size(NaN, NaN). - If this property is set, its size will always be used to compute the viewportBounds, even if - a div is also set. It is uncommon to set both this property and a Diagram DIV.

    -

    See the intro page on GoJS within Node.js for a usage example.

    -
    -
    see
    -

    viewportBounds

    -
    -
    since
    -

    2.0

    -
    -
    -
    -
  • -
-
-
- -

- Read-only - viewportBounds - : Rect

-
    -
  • -
    -

    This read-only property returns the bounds of the portion of the Diagram in document coordinates that is viewable from its HTML Canvas. - Typically when the viewport bounds are smaller than the documentBounds, the user can scroll or pan the view.

    -

    The x and y coordinates are equal to the position of the Diagram, - and the width and height are equal to the Diagram's canvas width and height, - divided by the scale.

    -
    -
  • -
-
-
- -

- zoomPoint - : Point

-
    -
  • -
    -

    Gets or sets the zoom point of this Diagram, in viewport coordinates. - This is used by Tool.standardMouseWheel and scale-setting commands to control where to zoom in or out.

    -

    Typical usage is to remember the value of this property and - to set this property to some point within the viewport (between zero and the canvas width and height). - This is commonly accomplished by using the InputEvent.viewPoint of Diagram.lastInput. - Then one changes the scale somehow, perhaps by executing one of the CommandHandler commands, - or by rotating the mouse wheel, or just by setting the Diagram.scale property. - Finally one restores the original value of this property.

    -

    The default value is Point(NaN, NaN). - Value must be of type Point, in element coordinates, not in document coordinates. - Setting this property does not notify about any changed event.

    -
    -
    since
    -

    1.2

    -
    -
    -
    -
  • -
-
-
-
-

Methods

-
- -

- add -

-
    -
  • add(part: Part): void
  • -
-
    -
  • -
    -

    Adds a Part to the Layer that matches the Part's Part.layerName, - or else the default layer, which is named with the empty string.

    -

    Normally parts added to a diagram are top-level parts. - If you want nodes to be members of a Group, in addition to calling this method - call Group.addMembers or set each Part.containingGroup.

    -
    -
    see
    -

    remove

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      part: Part
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- addChangedListener -

- -
    -
  • -
    -

    Register an event handler that is called when there is a ChangedEvent because this Diagram - or one of its Parts has changed, but not because the Model or any model data has changed.

    -

    It is unusual to listen for Diagram ChangedEvents -- - it is far more common to listen for specific DiagramEvents by calling addDiagramListener, - or to listen for Model ChangedEvents (i.e. changes to the model) by calling addModelChangedListener.

    -

    Do not add or remove Changed listeners during the execution of a Changed listener.

    -
    -
    see
    -

    removeChangedListener

    -
    -
    -
    -

    Parameters

    - -

    Returns Diagram

    -

    this Diagram

    -
  • -
-
-
- -

- addDiagramListener -

- -
    -
  • -
    -

    Register an event handler that is called when there is a DiagramEvent of a given name.

    -

    See the DiagramEvent documentation for a complete listing of diagram event names and their purposes.

    -
    -
    see
    -

    removeDiagramListener

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      name: DiagramEventName
      -
      -

      the name is normally capitalized, but this method uses case-insensitive comparison.

      -
      -
    • -
    • -
      listener: (e: DiagramEvent) => void
      -
      -

      a function that takes a DiagramEvent as its argument.

      -
      -
        -
      -
    • -
    -

    Returns Diagram

    -

    this Diagram

    -
  • -
-
-
- -

- addLayer -

- - -
-
- -

- addLayerAfter -

- -
    -
  • -
    -

    Adds a layer to the list of layers after a specified layer. - This method can also re-order layers.

    -
    -
    see
    -

    addLayer, addLayerBefore, removeLayer

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      layer: Layer
      -
      -

      the new Layer to add or existing Layer to move in Z-order.

      -
      -
    • -
    • -
      existingLayer: Layer
      -
      -

      the other Layer in this Diagram which should come just before the new or moved layer.

      -
      -
    • -
    -

    Returns Diagram

    -

    this Diagram

    -
  • -
-
-
- -

- addLayerBefore -

- -
    -
  • -
    -

    Adds a layer to the list of layers before a specified layer. - This method can also re-order layers.

    -
    -
    see
    -

    addLayer, addLayerAfter, removeLayer

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      layer: Layer
      -
      -

      the new Layer to add or existing Layer to move in Z-order.

      -
      -
    • -
    • -
      existingLayer: Layer
      -
      -

      the other Layer in this Diagram which should come just after the new or moved layer.

      -
      -
    • -
    -

    Returns Diagram

    -

    this Diagram

    -
  • -
-
-
- -

- addModelChangedListener -

- -
    -
  • -
    -

    Register an event handler on this Diagram's Diagram.model that is called when there is a ChangedEvent - on the Model, not in this diagram. - Be sure to call removeModelChangedListener when you are done with the diagram.

    -

    This is convenient when the Diagram.model may be replaced. - Using this method to register a Model Changed listener is more convenient than calling Model.addChangedListener directly - because when this diagram's Model is replaced, one does not need to call Model.removeChangedListener on the old Model - and then Model.addChangedListener again on the new Model.

    -

    You can establish Model Changed listeners when you create a Diagram. - The Diagram init options are passed to GraphObject.make, which accepts "ModelChanged" as a shorthand. - For example:

    -
    new go.Diagram("myDiagramDiv",
    -   {
    -       "ModelChanged": function(e) { if (e.isTransactionFinished) saveModel(e.model); }
    -       // ... other Diagram properties
    -   })
    +

    This is equivalent to:

    +
    new go.Diagram("myDiagramDiv",
    {
    // ... Diagram properties
    })
    .addModelChangedListener(function(e) { if (e.isTransactionFinished) saveModel(e.model); })
    -

    This is equivalent to:

    -
    new go.Diagram("myDiagramDiv",
    -   {
    -       // ... Diagram properties
    -   })
    -   .addModelChangedListener(function(e) { if (e.isTransactionFinished) saveModel(e.model); })
    +

    Do not add or remove Changed listeners during the execution of a Changed listener.

    +
    see

    removeModelChangedListener

    +
    since

    1.6

    +

    Parameters

    Returns Diagram

    this Diagram

    +
  • alignDocument(documentspot: Spot, viewportspot: Spot): void
  • +

    Aligns the Diagram's position based on a desired document Spot and viewport Spot.

    +

    Parameters

    Returns void

  • +

    This method sets a collection of properties according to the property/value pairs that have been set on the given Object, +in the same manner as GraphObject.make does when constructing a Diagram with an argument that is a simple JavaScript Object.

    +

    This method does not use TypeScript compile-time type checking like Diagram.set does, +but is considerably more flexible in allowing you to set sub-properties and DiagramEvents by quoted string names.

    +

    You can set properties on an object that is the value of a property of the Diagram, +or on the Diagram.toolManager, Diagram.animationManager, or Diagram.commandHandler +by using a "subpropname.property" syntax for the property name. +At the current time only a single dot is permitted in the property "name".

    +

    The property name may also be the name of a DiagramEvent, in which case this calls addDiagramListener with that DiagramEvent name.

    +
    aDiagram.attach({
    allowDelete: false,
    "animationManager.isEnabled": false, // turn off automatic animations
    // specify a group membership validation predicate
    "commandHandler.memberValidation": function(group, part) { return ...; },
    "commandHandler.copiesTree": true, // for the copy command
    // mouse wheel zooms instead of scrolls
    "toolManager.mouseWheelBehavior": go.ToolManager.WheelZoom,
    "draggingTool.dragsTree": true, // dragging for both move and copy
    "draggingTool.isGridSnapEnabled": true,
    layout: $(go.TreeLayout),
    // add a DiagramEvent listener
    "ExternalObjectsDropped": function(e) { e.subject.each(function(part) { ... }); }
    });
    -

    Do not add or remove Changed listeners during the execution of a Changed listener.

    -
    -
    see
    -

    removeModelChangedListener

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Parameters

    - -

    Returns Diagram

    -

    this Diagram

    -
  • -
-
-
- -

- alignDocument -

-
    -
  • alignDocument(documentspot: Spot, viewportspot: Spot): void
  • -
-
    -
  • -
    -

    Aligns the Diagram's position based on a desired document Spot and viewport Spot.

    -
    -

    Parameters

    -
      -
    • -
      documentspot: Spot
      -
    • -
    • -
      viewportspot: Spot
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- attach -

- -
    -
  • -
    -

    This method sets a collection of properties according to the property/value pairs that have been set on the given Object, - in the same manner as GraphObject.make does when constructing a Diagram with an argument that is a simple JavaScript Object.

    -

    This method does not use TypeScript compile-time type checking like Diagram.set does, - but is considerably more flexible in allowing you to set sub-properties and DiagramEvents by quoted string names.

    -

    You can set properties on an object that is the value of a property of the Diagram, - or on the Diagram.toolManager, Diagram.animationManager, or Diagram.commandHandler - by using a "subpropname.property" syntax for the property name. - At the current time only a single dot is permitted in the property "name".

    -

    The property name may also be the name of a DiagramEvent, in which case this calls addDiagramListener with that DiagramEvent name.

    -
    aDiagram.attach({
    -  allowDelete: false,
    -  "animationManager.isEnabled": false,  // turn off automatic animations
    -  // specify a group membership validation predicate
    -  "commandHandler.memberValidation": function(group, part) { return ...; },
    -  "commandHandler.copiesTree": true,  // for the copy command
    -  // mouse wheel zooms instead of scrolls
    -  "toolManager.mouseWheelBehavior": go.ToolManager.WheelZoom,
    -  "draggingTool.dragsTree": true,  // dragging for both move and copy
    -  "draggingTool.isGridSnapEnabled": true,
    -  layout: $(go.TreeLayout),
    -  // add a DiagramEvent listener
    -  "ExternalObjectsDropped": function(e) { e.subject.each(function(part) { ... }); }
    -});
    +
    since

    2.2

    +
    see

    setProperties a synonym of this method, set a type-safe method to set a collection of properties

    +

    Parameters

    • props: ObjectData
      +

      a plain JavaScript object with various property values to be set on this Diagram or on a part of this Diagram.

      +

    Returns Diagram

    this Diagram

    +
  • centerRect(r: Rect): void
  • +

    Modifies the position to show a given Rect of the Diagram by centering the +viewport on that Rect.

    +

    If the rect is near the documentBounds and if the +scrollMargin is small, it might not be possible to scroll far enough to +actually put the Rect area in the center of the viewport.

    +
    see

    scrollToRect, scroll

    +

    Parameters

    Returns void

  • clear(): void
  • clearHighlighteds(): void
  • clearSelection(skipsEvents?: boolean): void
  • +

    Deselect all selected Parts. +This removes all parts from the selection collection.

    +

    This method raises the "ChangingSelection" and "ChangedSelection" DiagramEvents.

    +
    see

    select, selectCollection, clearHighlighteds

    +

    Parameters

    • Optional skipsEvents: boolean
      +

      if true, do not raise the DiagramEvents "ChangingSelection" and "ChangedSelection"; if not supplied the value is assumed to be false.

      +

    Returns void

  • commit(func: (d: Diagram) => void, tname?: string): void
  • +

    Starts a new transaction, calls the provided function, and commits the transaction. +Code is called within a try-finally statement. +If the function does not return normally, this rolls back the transaction rather than committing it. +Example usage:

    +
    myDiagram.commit(d => d.remove(somePart), "Remove Part");
     
    -
    -
    since
    -

    2.2

    -
    -
    see
    -

    setProperties a synonym of this method, set a type-safe method to set a collection of properties

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      props: ObjectData
      -
      -

      a plain JavaScript object with various property values to be set on this Diagram or on a part of this Diagram.

      -
      -
    • -
    -

    Returns Diagram

    -

    this Diagram

    -
  • -
-
-
- -

- centerRect -

-
    -
  • centerRect(r: Rect): void
  • -
-
    -
  • -
    -

    Modifies the position to show a given Rect of the Diagram by centering the - viewport on that Rect.

    -

    If the rect is near the documentBounds and if the - scrollMargin is small, it might not be possible to scroll far enough to - actually put the Rect area in the center of the viewport.

    -
    -
    see
    -

    scrollToRect, scroll

    -
    -
    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- clear -

-
    -
  • clear(): void
  • -
- -
-
- -

- Virtual - clearHighlighteds -

-
    -
  • clearHighlighteds(): void
  • -
- -
-
- -

- Virtual - clearSelection -

-
    -
  • clearSelection(skipsEvents?: boolean): void
  • -
-
    -
  • -
    -

    Deselect all selected Parts. - This removes all parts from the selection collection.

    -

    This method raises the "ChangingSelection" and "ChangedSelection" DiagramEvents.

    -
    -
    see
    -

    select, selectCollection, clearHighlighteds

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      Optional skipsEvents: boolean
      -
      -

      if true, do not raise the DiagramEvents "ChangingSelection" and "ChangedSelection"; if not supplied the value is assumed to be false.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- commit -

-
    -
  • commit(func: (d: Diagram) => void, tname?: string): void
  • -
-
    -
  • -
    -

    Starts a new transaction, calls the provided function, and commits the transaction. - Code is called within a try-finally statement. - If the function does not return normally, this rolls back the transaction rather than committing it. - Example usage:

    -
    myDiagram.commit(d => d.remove(somePart), "Remove Part");
    +

    Note: passing null as the second argument will temporarily set Diagram.skipsUndoManager to true. +It is commonplace to call this method with no second argument, which would commit a transaction with +a transaction name that is the empty string.

    +
    since

    1.8

    +

    Parameters

    • func: (d: Diagram) => void
      +

      the function to call as the transaction body

      +
    • Optional tname: string
      +

      a descriptive name for the transaction, or null to temporarily set skipsUndoManager to true; + if no string transaction name is given, an empty string is used as the transaction name

      +

    Returns void

  • commitTransaction(tname?: string): boolean
  • +

    This is called during a Diagram update to determine a new value for documentBounds. +By default this computes the union of the bounds of all the visible +GraphObjects in this Diagram, unless Diagram.fixedBounds is set. +This ignores parts for which Part.isVisible is false and +ignores those for which Part.isInDocumentBounds is false. +The returned value includes the addition of the padding margin.

    +

    To compute the bounds of a collection of Parts, call computePartsBounds.

    +

    Parameters

    • Optional rect: Rect
      +

      An optional Rect to modify and return, instead of returning a new Rect

      +

    Returns Rect

    a Rect in document coordinates. If the argument rect was specified, it returns that modified rect.

    +
  • +

    This method computes the new location for a Node or simple Part, +given a new desired location, +taking any grid-snapping into consideration, +any Part.dragComputation function, +and any Part.minLocation and Part.maxLocation.

    +

    This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    +
    since

    2.0

    +

    Parameters

    • n: Part
      +

      the Node or simple Part that is being moved

      +
    • newloc: Point
      +

      the proposed new location

      +
    • dragOptions: DraggingOptions
      +

      the dragging options

      +
    • Optional result: Point
      +

      an optional Point that is modified and returned

      +

    Returns Point

    the possibly grid-snapped computed Point that is within the minimum and maximum permitted locations

    +
  • +

    Find the union of the GraphObject.actualBounds of all of the Parts in the given collection, +excluding Links unless the second argument is true.

    +

    Unlike computeBounds, this ignores the visibility of each Part and does not add any padding to the result.

    +
    since

    1.1

    +

    Parameters

    • coll: Iterable<Part> | Part[]
      +

      an iterable collection or Array of Parts.

      +
    • Optional includeLinks: boolean
      +

      defaults to false

      +

    Returns Rect

    This returns the bounding area of the given Parts; +if there are no Parts in the collection, this returns a Rect with zero width and height and an X and Y that are NaN.

    +
  • delayInitialization(func?: (diag?: Diagram) => void): void
  • +

    Updates the diagram immediately, then resets initialization flags so that +actions taken in the argument function will be considered part of Diagram initialization, +and will participate in initial layouts, initialAutoScale, initialContentAlignment, etc.

    +

    This is useful in situations where you do not wish for the first content added to the diagram to be considered +the "initial" content, such as with a Node that represents a "Loading" bar.

    +
    since

    1.1

    +

    Parameters

    • Optional func: (diag?: Diagram) => void
      +

      an optional function of actions to perform as part of another diagram initialization.

      +

    Returns void

  • ensureBounds(): void
  • +

    Ensures that the documentBounds are up to date. +This is sometimes necessary when operations need updated document bounds immediately.

    +

    It is uncommon to call this method outside of customization. +For efficiency, do not call this method unnecessarily.

    +
    since

    2.1.30

    +
    see

    Part.ensureBounds

    +

    Returns void

  • findLayer(name: string): Layer
  • +

    Look for a Link corresponding to a GraphLinksModel's link data object.

    +

    Parameters

    • linkdata: ObjectData
      +

      a JavaScript object matched by reference identity; + use findLinksByExample if you want to find those Links whose data matches an example data object

      +

    Returns Link

    an existing Link in this Diagram that was +created because its Part.data was the link data in the Diagram's Model.

    +
  • +

    Look for a Link corresponding to a model's link data object's unique key.

    +
    since

    2.1

    +

    Parameters

    • key: Key
      +

      a string or number.

      +

    Returns Link

    null if a link data with that key cannot be found in the model, +or if a corresponding Link cannot be found in the Diagram, +or if the model is a GraphLinksModel without GraphLinksModel.linkKeyProperty set to a non-empty string.

    +
  • +

    Search for Links by matching the Link data with example data holding values, RegExps, or predicates.

    +

    See the documentation of findNodesByExample for how the example +data can match data of bound Parts.

    +
    see

    findNodesByExample

    +
    since

    1.5

    +

    Parameters

    • Rest ...examples: ObjectData[]
      +

      one or more JavaScript Objects whose properties are either predicates to be + applied or RegExps to be tested or values to be compared to the corresponding data property value

      +

    Returns Iterator<Link>

  • +

    Look for a Node or Group corresponding to a model's node data object.

    +

    Parameters

    • nodedata: ObjectData
      +

      a JavaScript object matched by reference identity; + use findNodesByExample if you want to find those Nodes whose data matches an example data object

      +

    Returns Node

    an existing Node or Group in this Diagram that was +created because its Part.data was the node data in the Diagram's Model. +This will be null if there is no such part or if it's just a Part or Link.

    +
  • +

    Look for a Node or Group corresponding to a model's node data object's unique key.

    +

    Parameters

    • key: Key
      +

      a string or number.

      +

    Returns Node

    null if a node data with that key cannot be found in the model, +or if a corresponding Node or Group cannot be found in the Diagram, +or if what is found is just a Part.

    +
  • +

    Search for Nodes or Groups by matching the Node data with example data holding values, RegExps, or predicates.

    +

    For example, calling this method with an argument object: +{ sex: "M", name: /^Alex/i, age: function(n) { return n >= 18; } } +will return an iterator of Nodes whose Node.data is a JavaScript object whose:

    +
      +
    • sex is "M" (a case-sensitive string comparison), and
    • +
    • name starts with the string "Alex" (using a case-insensitive match), and
    • +
    • age is greater than or equal to 18
    • +
    +

    Here is how an example value can match the corresponding data value:

    +
      +
    • A string, number, or boolean is compared with the === operator.

      +
    • +
    • A function is treated as a predicate and applied to the data value.

      +
    • +
    • A regular expression (RexExp) is matched against the toString() of the data value. +Common expressions include:

      +
        +
      • /abc/ matches any string that includes exactly the substring "abc"
      • +
      • /abc/i matches any string that includes the substring "abc", but uses a case-insensitive comparison
      • +
      • /^no/i matches any string that starts with "no", ignoring case
      • +
      • /ism$ matches any string that ends with "ism" exactly
      • +
      • /(green|red) apple/ matches any string that includes either "green apple" or "red apple"
      • +
      +

      For more details read Regular Expressions (mozilla.org).

      +
    • +
    • An Array requires the data value to also be an Array of equal or greater length. +Each example array item that is not undefined is matched with the corresponding data array item.

      +
    • +
    • An Object is recursively matched with the data value, which must also be an Object.

      +
    • +
    +

    All properties given by the argument example data must be present on the node data, +unless the example property value is undefined. +All other data properties are ignored when matching.

    +

    When multiple argument objects are given, if any of the objects match the node's data, +the node is included in the results.

    +
    see

    findLinksByExample

    +
    since

    1.5

    +

    Parameters

    • Rest ...examples: ObjectData[]
      +

      one or more JavaScript Objects whose properties are either predicates to be + applied or RegExps to be tested or values to be compared to the corresponding data property value

      +

    Returns Iterator<Node>

  • findObjectAt<T>(p: Point, navig?: (a: GraphObject) => T, pred?: (a: T) => boolean): T
  • +

    Find the front-most GraphObject at the given point in document coordinates.

    +

    If Layer.visible is false, this method will not find any objects in that layer. +However, Layer.opacity does not affect this method.

    +

    Example usage:

    +
    // Returns the top-most object that is a selectable Part, or null if there isn't one
    myDiagram.findObjectAt(
    myDiagram.lastInput.documentPoint,
    // Navigation function
    function(x) { return x.part; },
    // Because of the navigation function, x will always be a Part.
    function(x) { return x.canSelect(); }
    );
    -

    Note: passing null as the second argument will temporarily set Diagram.skipsUndoManager to true. - It is commonplace to call this method with no second argument, which would commit a transaction with - a transaction name that is the empty string.

    -
    -
    since
    -

    1.8

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      func: (d: Diagram) => void
      -
      -

      the function to call as the transaction body

      -
      -
        -
      -
    • -
    • -
      Optional tname: string
      -
      -

      a descriptive name for the transaction, or null to temporarily set skipsUndoManager to true; - if no string transaction name is given, an empty string is used as the transaction name

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- commitTransaction -

-
    -
  • commitTransaction(tname?: string): boolean
  • -
- -
-
- -

- Protected Virtual - computeBounds -

- -
    -
  • -
    -

    This is called during a Diagram update to determine a new value for documentBounds. - By default this computes the union of the bounds of all the visible - GraphObjects in this Diagram, unless Diagram.fixedBounds is set. - This ignores parts for which Part.isVisible is false and - ignores those for which Part.isInDocumentBounds is false. - The returned value includes the addition of the padding margin.

    -

    To compute the bounds of a collection of Parts, call computePartsBounds.

    -
    -

    Parameters

    -
      -
    • -
      Optional rect: Rect
      -
      -

      An optional Rect to modify and return, instead of returning a new Rect

      -
      -
    • -
    -

    Returns Rect

    -

    a Rect in document coordinates. If the argument rect was specified, it returns that modified rect.

    -
  • -
-
-
- -

- Virtual - computeMove -

- -
    -
  • -
    -

    This method computes the new location for a Node or simple Part, - given a new desired location, - taking any grid-snapping into consideration, - any Part.dragComputation function, - and any Part.minLocation and Part.maxLocation.

    -

    This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -
    since
    -

    2.0

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      n: Part
      -
      -

      the Node or simple Part that is being moved

      -
      -
    • -
    • -
      newloc: Point
      -
      -

      the proposed new location

      -
      -
    • -
    • -
      dragOptions: DraggingOptions
      -
      -

      the dragging options

      -
      -
    • -
    • -
      Optional result: Point
      -
      -

      an optional Point that is modified and returned

      -
      -
    • -
    -

    Returns Point

    -

    the possibly grid-snapped computed Point that is within the minimum and maximum permitted locations

    -
  • -
-
-
- -

- Virtual - computePartsBounds -

- -
    -
  • -
    -

    Find the union of the GraphObject.actualBounds of all of the Parts in the given collection, - excluding Links unless the second argument is true.

    -

    Unlike computeBounds, this ignores the visibility of each Part and does not add any padding to the result.

    -
    -
    since
    -

    1.1

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      coll: Iterable<Part> | Part[]
      -
      -

      an iterable collection or Array of Parts.

      -
      -
    • -
    • -
      Optional includeLinks: boolean
      -
      -

      defaults to false

      -
      -
    • -
    -

    Returns Rect

    -

    This returns the bounding area of the given Parts; - if there are no Parts in the collection, this returns a Rect with zero width and height and an X and Y that are NaN.

    -
  • -
-
-
- -

- copyParts -

- -
    -
  • -
    -

    Make a copy of a collection of Parts and return them in a Map mapping each original Part to its copy. - It may optionally add them to a given Diagram. - Copying a Group will also copy its member Nodes and Links. - Copying a Link will also copy any label Nodes that it owns.

    -

    This does not perform a transaction nor does it raise a DiagramEvent. - Call CommandHandler.copySelection, which calls this method, - if you want to copy all selected Parts into the clipboard. - The CommandHandler.copySelection command may also copy additional Parts as well, depending on CommandHandler.copiesTree.

    -
    -
    since
    -

    1.3

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      coll: Iterable<Part> | Part[]
      -
      -

      A List or a Set or Iterator of Parts, or an Array of Parts.

      -
      -
    • -
    • -
      diagram: Diagram
      -
      -

      The destination diagram; if null, the copied parts are not added to this diagram.

      -
      -
    • -
    • -
      Optional check: boolean
      -
      -

      Whether to check Part.canCopy on each part. The default value is false.

      -
      -
    • -
    -

    Returns Map<Part, Part>

    -
  • -
-
-
- -

- delayInitialization -

-
    -
  • delayInitialization(func?: (diag?: Diagram) => void): void
  • -
-
    -
  • -
    -

    Updates the diagram immediately, then resets initialization flags so that - actions taken in the argument function will be considered part of Diagram initialization, - and will participate in initial layouts, initialAutoScale, initialContentAlignment, etc.

    -

    This is useful in situations where you do not wish for the first content added to the diagram to be considered - the "initial" content, such as with a Node that represents a "Loading" bar.

    -
    -
    since
    -

    1.1

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      Optional func: (diag?: Diagram) => void
      -
      -

      an optional function of actions to perform as part of another diagram initialization.

      -
      -
        -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- ensureBounds -

-
    -
  • ensureBounds(): void
  • -
-
    -
  • -
    -

    Ensures that the documentBounds are up to date. - This is sometimes necessary when operations need updated document bounds immediately.

    -

    It is uncommon to call this method outside of customization. - For efficiency, do not call this method unnecessarily.

    -
    -
    since
    -

    2.1.30

    -
    -
    see
    -

    Part.ensureBounds

    -
    -
    -
    -

    Returns void

    -
  • -
-
-
- -

- findLayer -

-
    -
  • findLayer(name: string): Layer
  • -
-
    -
  • -
    -

    Finds a layer with a given name.

    -
    -
    see
    -

    addLayerBefore, addLayerAfter, removeLayer

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      name: string
      -
    • -
    -

    Returns Layer

    -

    a Layer with the given name, or null if no such layer was found.

    -
  • -
-
-
- -

- findLinkForData -

- -
    -
  • -
    -

    Look for a Link corresponding to a GraphLinksModel's link data object.

    -
    -

    Parameters

    -
      -
    • -
      linkdata: ObjectData
      -
      -

      a JavaScript object matched by reference identity; - use findLinksByExample if you want to find those Links whose data matches an example data object

      -
      -
    • -
    -

    Returns Link

    -

    an existing Link in this Diagram that was - created because its Part.data was the link data in the Diagram's Model.

    -
  • -
-
-
- -

- findLinkForKey -

-
    -
  • findLinkForKey(key: Key): Link
  • -
-
    -
  • -
    -

    Look for a Link corresponding to a model's link data object's unique key.

    -
    -
    since
    -

    2.1

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      key: Key
      -
      -

      a string or number.

      -
      -
    • -
    -

    Returns Link

    -

    null if a link data with that key cannot be found in the model, - or if a corresponding Link cannot be found in the Diagram, - or if the model is a GraphLinksModel without GraphLinksModel.linkKeyProperty set to a non-empty string.

    -
  • -
-
-
- -

- findLinksByExample -

- -
    -
  • -
    -

    Search for Links by matching the Link data with example data holding values, RegExps, or predicates.

    -

    See the documentation of findNodesByExample for how the example - data can match data of bound Parts.

    -
    -
    see
    -

    findNodesByExample

    -
    -
    since
    -

    1.5

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      Rest ...examples: ObjectData[]
      -
      -

      one or more JavaScript Objects whose properties are either predicates to be - applied or RegExps to be tested or values to be compared to the corresponding data property value

      -
      -
    • -
    -

    Returns Iterator<Link>

    -
  • -
-
-
- -

- findNodeForData -

- -
    -
  • -
    -

    Look for a Node or Group corresponding to a model's node data object.

    -
    -

    Parameters

    -
      -
    • -
      nodedata: ObjectData
      -
      -

      a JavaScript object matched by reference identity; - use findNodesByExample if you want to find those Nodes whose data matches an example data object

      -
      -
    • -
    -

    Returns Node

    -

    an existing Node or Group in this Diagram that was - created because its Part.data was the node data in the Diagram's Model. - This will be null if there is no such part or if it's just a Part or Link.

    -
  • -
-
-
- -

- findNodeForKey -

-
    -
  • findNodeForKey(key: Key): Node
  • -
-
    -
  • -
    -

    Look for a Node or Group corresponding to a model's node data object's unique key.

    -
    -

    Parameters

    -
      -
    • -
      key: Key
      -
      -

      a string or number.

      -
      -
    • -
    -

    Returns Node

    -

    null if a node data with that key cannot be found in the model, - or if a corresponding Node or Group cannot be found in the Diagram, - or if what is found is just a Part.

    -
  • -
-
-
- -

- findNodesByExample -

- -
    -
  • -
    -

    Search for Nodes or Groups by matching the Node data with example data holding values, RegExps, or predicates.

    -

    For example, calling this method with an argument object: - { sex: "M", name: /^Alex/i, age: function(n) { return n >= 18; } } - will return an iterator of Nodes whose Node.data is a JavaScript object whose:

    -
      -
    • sex is "M" (a case-sensitive string comparison), and
    • -
    • name starts with the string "Alex" (using a case-insensitive match), and
    • -
    • age is greater than or equal to 18
    • -
    -

    Here is how an example value can match the corresponding data value:

    -
      -
    • A string, number, or boolean is compared with the === operator.

      -
    • -
    • A function is treated as a predicate and applied to the data value.

      -
    • -
    • A regular expression (RexExp) is matched against the toString() of the data value. - Common expressions include:

      -
        -
      • /abc/ matches any string that includes exactly the substring "abc"
      • -
      • /abc/i matches any string that includes the substring "abc", but uses a case-insensitive comparison
      • -
      • /^no/i matches any string that starts with "no", ignoring case
      • -
      • /ism$ matches any string that ends with "ism" exactly
      • -
      • /(green|red) apple/ matches any string that includes either "green apple" or "red apple"
      • -
      -

      For more details read Regular Expressions (mozilla.org).

      -
    • -
    • An Array requires the data value to also be an Array of equal or greater length. - Each example array item that is not undefined is matched with the corresponding data array item.

      -
    • -
    • An Object is recursively matched with the data value, which must also be an Object.

      -
    • -
    -

    All properties given by the argument example data must be present on the node data, - unless the example property value is undefined. - All other data properties are ignored when matching.

    -

    When multiple argument objects are given, if any of the objects match the node's data, - the node is included in the results.

    -
    -
    see
    -

    findLinksByExample

    -
    -
    since
    -

    1.5

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      Rest ...examples: ObjectData[]
      -
      -

      one or more JavaScript Objects whose properties are either predicates to be - applied or RegExps to be tested or values to be compared to the corresponding data property value

      -
      -
    • -
    -

    Returns Iterator<Node>

    -
  • -
-
-
- -

- findObjectAt -

-
    -
  • findObjectAt<T>(p: Point, navig?: (a: GraphObject) => T, pred?: (a: T) => boolean): T
  • -
-
    -
  • -
    -

    Find the front-most GraphObject at the given point in document coordinates.

    -

    If Layer.visible is false, this method will not find any objects in that layer. - However, Layer.opacity does not affect this method.

    -

    Example usage:

    -
    // Returns the top-most object that is a selectable Part, or null if there isn't one
    -myDiagram.findObjectAt(
    -  myDiagram.lastInput.documentPoint,
    -  // Navigation function
    -  function(x) { return x.part; },
    -  // Because of the navigation function, x will always be a Part.
    -  function(x) { return x.canSelect(); }
    -);
    +
    see

    findObjectsAt, findObjectsIn, findObjectsNear, findPartAt

    +

    Type parameters

    Parameters

    • p: Point
      +

      A Point in document coordinates.

      +
    • Optional navig: (a: GraphObject) => T
      +

      A function taking a GraphObject and +returning a GraphObject, defaulting to the identity.

      +
    • Optional pred: (a: T) => boolean
      +

      A function taking the GraphObject +returned by navig and returning true if that object should be returned, +defaulting to a predicate that always returns true.

      +
        • (a: T): boolean
        • Parameters

          • a: T

          Returns boolean

    Returns T

    The first GraphObject returned by the navig function +and satisfying the pred function that is at the point p, in Z-order from front to back, +or else null if nothing is found.

    +
  • findObjectsAt<T, S>(p: Point, navig?: (a: GraphObject) => T, pred?: (a: T) => boolean, coll?: S): S
  • +

    Return a collection of the GraphObjects at the given point in document coordinates.

    +

    If Layer.visible is false, this method will not find any objects in that layer. +However, Layer.opacity does not affect this method.

    +

    Example usage:

    +
    // Returns the Nodes that are at a given point, overlapping each other
    myDiagram.findObjectsAt(somePoint,
    // Navigation function -- only return Nodes
    function(x) { var p = x.part; return (p instanceof go.Node) ? p : null; }
    );
    -
    -
    see
    -

    findObjectsAt, findObjectsIn, findObjectsNear, findPartAt

    -
    -
    -
    -

    Type parameters

    - -

    Parameters

    -
      -
    • -
      p: Point
      -
      -

      A Point in document coordinates.

      -
      -
    • -
    • -
      Optional navig: (a: GraphObject) => T
      -
      -

      A function taking a GraphObject and - returning a GraphObject, defaulting to the identity.

      -
      -
        -
      -
    • -
    • -
      Optional pred: (a: T) => boolean
      -
      -

      A function taking the GraphObject - returned by navig and returning true if that object should be returned, - defaulting to a predicate that always returns true.

      -
      -
        -
      -
    • -
    -

    Returns T

    -

    The first GraphObject returned by the navig function - and satisfying the pred function that is at the point p, in Z-order from front to back, - or else null if nothing is found.

    -
  • -
-
-
- -

- findObjectsAt -

-
    -
  • findObjectsAt<T, S>(p: Point, navig?: (a: GraphObject) => T, pred?: (a: T) => boolean, coll?: S): S
  • -
-
    -
  • -
    -

    Return a collection of the GraphObjects at the given point in document coordinates.

    -

    If Layer.visible is false, this method will not find any objects in that layer. - However, Layer.opacity does not affect this method.

    -

    Example usage:

    -
    // Returns the Nodes that are at a given point, overlapping each other
    -myDiagram.findObjectsAt(somePoint,
    -  // Navigation function -- only return Nodes
    -  function(x) { var p = x.part; return (p instanceof go.Node) ? p : null; }
    -);
    +
    see

    findObjectAt, findObjectsIn, findObjectsNear, findPartsAt

    +

    Type parameters

    Parameters

    • p: Point
      +

      A Point in document coordinates.

      +
    • Optional navig: (a: GraphObject) => T
      +

      A function taking a GraphObject and +returning a GraphObject, defaulting to the identity. +If this function returns null, the given GraphObject will not be included in the results.

      +
    • Optional pred: (a: T) => boolean
      +

      A function taking the GraphObject +returned by navig and returning true if that object should be returned, +defaulting to a predicate that always returns true.

      +
        • (a: T): boolean
        • Parameters

          • a: T

          Returns boolean

    • Optional coll: S
      +

      An optional collection (List or Set) to add the results to.

      +

    Returns S

    a collection of GraphObjects returned by the navig function +and satisfying the pred that are located at the point p, or else an empty collection. +If a List or Set was passed in, it is returned.

    +
  • findObjectsIn<T, S>(r: Rect, navig?: (a: GraphObject) => T, pred?: (a: T) => boolean, partialInclusion?: boolean, coll?: S): S
  • +

    Returns a collection of all GraphObjects that are inside or that intersect +a given Rect in document coordinates.

    +

    If Layer.visible is false, this method will not find any objects in that layer. +However, Layer.opacity does not affect this method.

    +

    Example usage:

    +
    // Returns the Links that intersect a given rectangle and have a certain data property
    myDiagram.findObjectsIn(someRect,
    // Navigation function -- only return Links
    function(x) { var p = x.part; return (p instanceof go.Link) ? p : null; },
    // Predicate that always receives a Link, due to above navigation function
    function(link) { return link.data.someProp > 17; },
    // the links may only partly overlap the given rectangle
    true
    );
    -
    -
    see
    -

    findObjectAt, findObjectsIn, findObjectsNear, findPartsAt

    -
    -
    -
    -

    Type parameters

    - -

    Parameters

    -
      -
    • -
      p: Point
      -
      -

      A Point in document coordinates.

      -
      -
    • -
    • -
      Optional navig: (a: GraphObject) => T
      -
      -

      A function taking a GraphObject and - returning a GraphObject, defaulting to the identity. - If this function returns null, the given GraphObject will not be included in the results.

      -
      -
        -
      -
    • -
    • -
      Optional pred: (a: T) => boolean
      -
      -

      A function taking the GraphObject - returned by navig and returning true if that object should be returned, - defaulting to a predicate that always returns true.

      -
      -
        -
      -
    • -
    • -
      Optional coll: S
      -
      -

      An optional collection (List or Set) to add the results to.

      -
      -
    • -
    -

    Returns S

    -

    a collection of GraphObjects returned by the navig function - and satisfying the pred that are located at the point p, or else an empty collection. - If a List or Set was passed in, it is returned.

    -
  • -
-
-
- -

- findObjectsIn -

-
    -
  • findObjectsIn<T, S>(r: Rect, navig?: (a: GraphObject) => T, pred?: (a: T) => boolean, partialInclusion?: boolean, coll?: S): S
  • -
-
    -
  • -
    -

    Returns a collection of all GraphObjects that are inside or that intersect - a given Rect in document coordinates.

    -

    If Layer.visible is false, this method will not find any objects in that layer. - However, Layer.opacity does not affect this method.

    -

    Example usage:

    -
    // Returns the Links that intersect a given rectangle and have a certain data property
    -myDiagram.findObjectsIn(someRect,
    -  // Navigation function -- only return Links
    -  function(x) { var p = x.part; return (p instanceof go.Link) ? p : null; },
    -  // Predicate that always receives a Link, due to above navigation function
    -  function(link) { return link.data.someProp > 17; },
    -  // the links may only partly overlap the given rectangle
    -  true
    -);
    +
    see

    findObjectAt, findObjectsAt, findObjectsNear, findPartsIn

    +

    Type parameters

    Parameters

    • r: Rect
      +

      A Rect in document coordinates.

      +
    • Optional navig: (a: GraphObject) => T
      +

      A function taking a GraphObject and +returning a GraphObject, defaulting to the identity. +If this function returns null, the given GraphObject will not be included in the results.

      +
    • Optional pred: (a: T) => boolean
      +

      A function taking the GraphObject +returned by navig and returning true if that object should be returned, +defaulting to a predicate that always returns true.

      +
        • (a: T): boolean
        • Parameters

          • a: T

          Returns boolean

    • Optional partialInclusion: boolean
      +

      Whether an object can match if it merely intersects the rectangular area (true) or +if it must be entirely inside the rectangular area (false). The default value is false.

      +
    • Optional coll: S
      +

      An optional collection (List or Set) to add the results to.

      +

    Returns S

    a collection of GraphObjects returned by the navig function +and satisfying the pred function that are within the rectangle r, or else an empty collection. +If a List or Set was passed in, it is returned.

    +
  • findObjectsNear<T, S>(p: Point, dist: number, navig?: (a: GraphObject) => T, pred?: (a: T) => boolean, partialInclusion?: boolean | S, coll?: S): S
  • +

    Returns a collection of all GraphObjects that are within a certain distance +of a given point in document coordinates.

    +

    If Layer.visible is false, this method will not find any objects in that layer. +However, Layer.opacity does not affect this method.

    +

    Example usage:

    +
    // Returns the Nodes that intersect a given circular area and have a certain data property
    myDiagram.findObjectsNear(somePoint,
    // The circular area is centered at somePoint and has radius 100
    100,
    // Navigation function -- only return Nodes
    function(x) { var p = x.part; return (p instanceof go.Node) ? p : null; },
    // Predicate that always receives a Node, due to above navigation function
    function(node) { return node.data.someProp > 17; },
    // the nodes may only partly overlap the given circular area
    true
    );
    -
    -
    see
    -

    findObjectAt, findObjectsAt, findObjectsNear, findPartsIn

    -
    -
    -
    -

    Type parameters

    - -

    Parameters

    -
      -
    • -
      r: Rect
      -
      -

      A Rect in document coordinates.

      -
      -
    • -
    • -
      Optional navig: (a: GraphObject) => T
      -
      -

      A function taking a GraphObject and - returning a GraphObject, defaulting to the identity. - If this function returns null, the given GraphObject will not be included in the results.

      -
      -
        -
      -
    • -
    • -
      Optional pred: (a: T) => boolean
      -
      -

      A function taking the GraphObject - returned by navig and returning true if that object should be returned, - defaulting to a predicate that always returns true.

      -
      -
        -
      -
    • -
    • -
      Optional partialInclusion: boolean
      -
      -

      Whether an object can match if it merely intersects the rectangular area (true) or - if it must be entirely inside the rectangular area (false). The default value is false.

      -
      -
    • -
    • -
      Optional coll: S
      -
      -

      An optional collection (List or Set) to add the results to.

      -
      -
    • -
    -

    Returns S

    -

    a collection of GraphObjects returned by the navig function - and satisfying the pred function that are within the rectangle r, or else an empty collection. - If a List or Set was passed in, it is returned.

    -
  • -
-
-
- -

- findObjectsNear -

-
    -
  • findObjectsNear<T, S>(p: Point, dist: number, navig?: (a: GraphObject) => T, pred?: (a: T) => boolean, partialInclusion?: boolean | S, coll?: S): S
  • -
-
    -
  • -
    -

    Returns a collection of all GraphObjects that are within a certain distance - of a given point in document coordinates.

    -

    If Layer.visible is false, this method will not find any objects in that layer. - However, Layer.opacity does not affect this method.

    -

    Example usage:

    -
    // Returns the Nodes that intersect a given circular area and have a certain data property
    -myDiagram.findObjectsNear(somePoint,
    -  // The circular area is centered at somePoint and has radius 100
    -  100,
    -  // Navigation function -- only return Nodes
    -  function(x) { var p = x.part; return (p instanceof go.Node) ? p : null; },
    -  // Predicate that always receives a Node, due to above navigation function
    -  function(node) { return node.data.someProp > 17; },
    -  // the nodes may only partly overlap the given circular area
    -  true
    -);
    +
    see

    findObjectAt, findObjectsAt, findObjectsIn, findPartsNear

    +

    Type parameters

    Parameters

    • p: Point
      +

      A Point in document coordinates.

      +
    • dist: number
      +

      The distance from the point.

      +
    • Optional navig: (a: GraphObject) => T
      +

      A function taking a GraphObject and +returning a GraphObject, defaulting to the identity. +If this function returns null, the given GraphObject will not be included in the results.

      +
    • Optional pred: (a: T) => boolean
      +

      A function taking the GraphObject +returned by navig and returning true if that object should be returned, +defaulting to a predicate that always returns true.

      +
        • (a: T): boolean
        • Parameters

          • a: T

          Returns boolean

    • Optional partialInclusion: boolean | S
      +

      Whether an object can match if it merely intersects the circular area (true) or +if it must be entirely inside the circular area (false). The default value is true. +The default is true.

      +
    • Optional coll: S
      +

      An optional collection (List or Set) to add the results to.

      +

    Returns S

    a collection of GraphObjects returned by the navig function +and satisfying the pred that are located near the point p, or else an empty collection. +If a List or Set was passed in, it is returned.

    +
  • findPartAt(p: Point, selectable?: boolean): Part
  • +

    Look for a Part or Node or Group corresponding to a model's data object's unique key. +This will find a Link if the model is a GraphLinksModel that is maintaining a key on the link data objects.

    +

    Parameters

    • key: Key
      +

      a string or number.

      +

    Returns Part

    null if a data with that key cannot be found in the model, +or if a corresponding Part cannot be found in the Diagram. +This will not return a Link unless the model is a GraphLinksModel and +GraphLinksModel.linkKeyProperty has been set. +If the same key is used for both a node data object and a link data object, this will return a Node.

    +
  • findPartsAt<T, S>(p: Point, selectable?: boolean, coll?: S): S
  • +

    This convenience function finds all Parts that are at a point in document coordinates +and that are not in temporary layers.

    +
    see

    findPartAt, findPartsIn, findPartsNear, findObjectsAt

    +
    since

    2.0

    +

    Type parameters

    Parameters

    • p: Point
      +

      A Point in document coordinates.

      +
    • Optional selectable: boolean
      +

      Whether to only consider parts that are Part.selectable. The default is true.

      +
    • Optional coll: S
      +

      An optional collection (List or Set) to add the results to.

      +

    Returns S

  • findPartsIn<T, S>(r: Rect, partialInclusion?: boolean, selectable?: boolean, coll?: S): S
  • +

    This convenience function finds Parts that are inside or that intersect +a given Rect in document coordinates.

    +

    This just calls findObjectsIn with appropriate arguments, +but ignoring Layers that are Layer.isTemporary.

    +
    see

    findPartAt, findPartsAt, findPartsNear, findObjectsIn

    +
    since

    2.0

    +

    Type parameters

    Parameters

    • r: Rect
      +

      a Rect in document coordinates.

      +
    • Optional partialInclusion: boolean
      +

      Whether a Part can match if it merely intersects the rectangular area (true) or +if it must be entirely inside the rectangular area (false). The default value is false.

      +
    • Optional selectable: boolean
      +

      Whether to only consider parts that are Part.selectable. The default is true.

      +
    • Optional coll: S
      +

      An optional collection (List or Set) to add the results to.

      +

    Returns S

  • findPartsNear<T, S>(p: Point, dist: number, partialInclusion?: boolean, selectable?: boolean, coll?: S): S
  • +

    This convenience function finds Parts that are within a certain distance +of a given point in document coordinates.

    +

    This just calls findObjectsNear with appropriate arguments, +but ignoring Layers that are Layer.isTemporary.

    +
    see

    findPartAt, findPartsAt, findPartsIn, findObjectsNear

    +
    since

    2.0

    +

    Type parameters

    Parameters

    • p: Point
      +

      A Point in document coordinates.

      +
    • dist: number
      +

      The distance from the point.

      +
    • Optional partialInclusion: boolean
      +

      Whether an object can match if it merely intersects the circular area (true) or +if it must be entirely inside the circular area (false). The default is true.

      +
    • Optional selectable: boolean
      +

      Whether to only consider parts that are Part.selectable. The default is true.

      +
    • Optional coll: S
      +

      An optional collection (List or Set) to add the results to.

      +

    Returns S

  • +

    Returns an iterator of all Groups that are at top-level, +in other words that are not themselves inside other Groups.

    +

    This is useful for when you want to traverse the diagram's graph by recursing into Groups.

    +
    since

    1.2

    +

    Returns Iterator<Group>

  • +

    Returns an iterator of all top-level Nodes that have no tree parents.

    +

    This is useful for when you want to traverse the diagram's graph by starting at the root of each tree, +assuming that the diagram consists of one tree or a forest of trees.

    +
    since

    1.2

    +

    Returns Iterator<Node>

  • focus(): void
  • +

    Explicitly bring HTML focus to the Diagram's canvas. +This is called by tools that may create other HTML elements such as TextEditingTool.

    +

    If scrollsPageOnFocus is false, this tries to keep the page at the same scroll position +that it had before calling focus. +This method is not overridable.

    +

    Returns void

  • highlight(part: Part): void
  • layoutDiagram(invalidateAll?: boolean): void
  • +

    Perform all invalid layouts. +If the optional argument is true, +this will perform all of the layouts (Diagram.layout and all Group.layouts), +not just the invalid ones.

    +

    Under normal circumstances you should not need to call this method, +because layouts will be performed automatically after they become invalid. +However you may have disabled automatic layouts by setting Layout.isInitial +and/or Layout.isOngoing to false, or by restricting a Part's Part.layoutConditions. +If that is the case you might call this method +(perhaps due to a user command) to perform the layout at a time of your choosing.

    +

    Parameters

    Returns void

  • makeImage(options?: ImageRendererOptions): HTMLImageElement
  • +

    Create an HTMLImageElement that contains a bitmap of the current Diagram. +This method is just a convenience function that creates an image, +sets its source to the returned string of makeImageData, +and returns a reference to that Image.

    +

    See makeImageData for a complete explanation of possible options.

    +

    By default this method returns a snapshot of the visible diagram, but optional arguments give more options.

    +

    Note that a returned HTMLImageElement, either returned directly or passed to the callback function, +might not yet have the complete property set to true. +So if you need to draw the image immediately, you should check that property first. +If it is false, add a "load" listener to the HTMLImageElement that does the drawing you want.

    +

    At the current time methods such as Diagram.makeImage, +Diagram.makeImageData and Diagram.makeSvg do not work on Overviews.

    +

    For the rendering to work, the diagram must have an HTML Div element as the div.

    +
    see

    makeImageData, makeSvg

    +

    Parameters

    • Optional options: ImageRendererOptions
      +

      a JavaScript object detailing optional arguments for image creation, to be passed to makeImageData.

      +

    Returns HTMLImageElement

    An HTML Image element, or null if a callback is specified, or null if there is no DOM.

    +
  • makeImageData(options?: ImageRendererOptions): string | HTMLImageElement | ImageData
  • +

    Create a bitmap of the current Diagram encoded as a base64 string, or returned as an ImageData object. +This method uses the toDataURL method of the HTMLCanvasElement to create the data URL, +or the getImageData method of the Canvas Context. +Unlike toDataURL, this method will not throw an error if cross-domain images +were drawn on the canvas, instead it will return a data URL of a bitmap with those images omitted.

    +

    A simple example:

    +
    myDiagram.makeImageData({
    scale: 1.5,
    size: new go.Size(100,100)
    });
    -
    -
    see
    -

    findObjectAt, findObjectsAt, findObjectsIn, findPartsNear

    -
    -
    -
    -

    Type parameters

    - -

    Parameters

    -
      -
    • -
      p: Point
      -
      -

      A Point in document coordinates.

      -
      -
    • -
    • -
      dist: number
      -
      -

      The distance from the point.

      -
      -
    • -
    • -
      Optional navig: (a: GraphObject) => T
      -
      -

      A function taking a GraphObject and - returning a GraphObject, defaulting to the identity. - If this function returns null, the given GraphObject will not be included in the results.

      -
      -
        -
      -
    • -
    • -
      Optional pred: (a: T) => boolean
      -
      -

      A function taking the GraphObject - returned by navig and returning true if that object should be returned, - defaulting to a predicate that always returns true.

      -
      -
        -
      -
    • -
    • -
      Optional partialInclusion: boolean | S
      -
      -

      Whether an object can match if it merely intersects the circular area (true) or - if it must be entirely inside the circular area (false). The default value is true. - The default is true.

      -
      -
    • -
    • -
      Optional coll: S
      -
      -

      An optional collection (List or Set) to add the results to.

      -
      -
    • -
    -

    Returns S

    -

    a collection of GraphObjects returned by the navig function - and satisfying the pred that are located near the point p, or else an empty collection. - If a List or Set was passed in, it is returned.

    -
  • -
-
-
- -

- findPartAt -

-
    -
  • findPartAt(p: Point, selectable?: boolean): Part
  • -
- -
-
- -

- findPartForData -

- -
    -
  • -
    -

    Look for a Part, Node, Group, or Link corresponding to a Model's data object. - We recommend that you call findNodeForData or findLinkForData if you are looking for a Node or a Link.

    -
    -

    Parameters

    -
      -
    • -
      data: ObjectData
      -
      -

      a JavaScript object matched by reference identity

      -
      -
    • -
    -

    Returns Part

    -

    an existing Part in this Diagram that was - created because its Part.data was the data in the Diagram's Model.

    -
  • -
-
-
- -

- findPartForKey -

-
    -
  • findPartForKey(key: Key): Part
  • -
-
    -
  • -
    -

    Look for a Part or Node or Group corresponding to a model's data object's unique key. - This will find a Link if the model is a GraphLinksModel that is maintaining a key on the link data objects.

    -
    -

    Parameters

    -
      -
    • -
      key: Key
      -
      -

      a string or number.

      -
      -
    • -
    -

    Returns Part

    -

    null if a data with that key cannot be found in the model, - or if a corresponding Part cannot be found in the Diagram. - This will not return a Link unless the model is a GraphLinksModel and - GraphLinksModel.linkKeyProperty has been set. - If the same key is used for both a node data object and a link data object, this will return a Node.

    -
  • -
-
-
- -

- findPartsAt -

-
    -
  • findPartsAt<T, S>(p: Point, selectable?: boolean, coll?: S): S
  • -
-
    -
  • -
    -

    This convenience function finds all Parts that are at a point in document coordinates - and that are not in temporary layers.

    -
    -
    see
    -

    findPartAt, findPartsIn, findPartsNear, findObjectsAt

    -
    -
    since
    -

    2.0

    -
    -
    -
    -

    Type parameters

    - -

    Parameters

    -
      -
    • -
      p: Point
      -
      -

      A Point in document coordinates.

      -
      -
    • -
    • -
      Optional selectable: boolean
      -
      -

      Whether to only consider parts that are Part.selectable. The default is true.

      -
      -
    • -
    • -
      Optional coll: S
      -
      -

      An optional collection (List or Set) to add the results to.

      -
      -
    • -
    -

    Returns S

    -
  • -
-
-
- -

- findPartsIn -

-
    -
  • findPartsIn<T, S>(r: Rect, partialInclusion?: boolean, selectable?: boolean, coll?: S): S
  • -
-
    -
  • -
    -

    This convenience function finds Parts that are inside or that intersect - a given Rect in document coordinates.

    -

    This just calls findObjectsIn with appropriate arguments, - but ignoring Layers that are Layer.isTemporary.

    -
    -
    see
    -

    findPartAt, findPartsAt, findPartsNear, findObjectsIn

    -
    -
    since
    -

    2.0

    -
    -
    -
    -

    Type parameters

    - -

    Parameters

    -
      -
    • -
      r: Rect
      -
      -

      a Rect in document coordinates.

      -
      -
    • -
    • -
      Optional partialInclusion: boolean
      -
      -

      Whether a Part can match if it merely intersects the rectangular area (true) or - if it must be entirely inside the rectangular area (false). The default value is false.

      -
      -
    • -
    • -
      Optional selectable: boolean
      -
      -

      Whether to only consider parts that are Part.selectable. The default is true.

      -
      -
    • -
    • -
      Optional coll: S
      -
      -

      An optional collection (List or Set) to add the results to.

      -
      -
    • -
    -

    Returns S

    -
  • -
-
-
- -

- findPartsNear -

-
    -
  • findPartsNear<T, S>(p: Point, dist: number, partialInclusion?: boolean, selectable?: boolean, coll?: S): S
  • -
-
    -
  • -
    -

    This convenience function finds Parts that are within a certain distance - of a given point in document coordinates.

    -

    This just calls findObjectsNear with appropriate arguments, - but ignoring Layers that are Layer.isTemporary.

    -
    -
    see
    -

    findPartAt, findPartsAt, findPartsIn, findObjectsNear

    -
    -
    since
    -

    2.0

    -
    -
    -
    -

    Type parameters

    - -

    Parameters

    -
      -
    • -
      p: Point
      -
      -

      A Point in document coordinates.

      -
      -
    • -
    • -
      dist: number
      -
      -

      The distance from the point.

      -
      -
    • -
    • -
      Optional partialInclusion: boolean
      -
      -

      Whether an object can match if it merely intersects the circular area (true) or - if it must be entirely inside the circular area (false). The default is true.

      -
      -
    • -
    • -
      Optional selectable: boolean
      -
      -

      Whether to only consider parts that are Part.selectable. The default is true.

      -
      -
    • -
    • -
      Optional coll: S
      -
      -

      An optional collection (List or Set) to add the results to.

      -
      -
    • -
    -

    Returns S

    -
  • -
-
-
- -

- findTopLevelGroups -

- -
    -
  • -
    -

    Returns an iterator of all Groups that are at top-level, - in other words that are not themselves inside other Groups.

    -

    This is useful for when you want to traverse the diagram's graph by recursing into Groups.

    -
    -
    since
    -

    1.2

    -
    -
    -
    -

    Returns Iterator<Group>

    -
  • -
-
-
- -

- findTreeRoots -

- -
    -
  • -
    -

    Returns an iterator of all top-level Nodes that have no tree parents.

    -

    This is useful for when you want to traverse the diagram's graph by starting at the root of each tree, - assuming that the diagram consists of one tree or a forest of trees.

    -
    -
    since
    -

    1.2

    -
    -
    -
    -

    Returns Iterator<Node>

    -
  • -
-
-
- -

- focus -

-
    -
  • focus(): void
  • -
-
    -
  • -
    -

    Explicitly bring HTML focus to the Diagram's canvas. - This is called by tools that may create other HTML elements such as TextEditingTool.

    -

    If scrollsPageOnFocus is false, this tries to keep the page at the same scroll position - that it had before calling focus. - This method is not overridable.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Static - fromDiv -

-
    -
  • fromDiv(div: string | Element): Diagram
  • -
-
    -
  • -
    -

    This static function gets the Diagram that is attached to an HTML DIV element.

    -
    -

    Parameters

    -
      -
    • -
      div: string | Element
      -
    • -
    -

    Returns Diagram

    -

    null if there is no Diagram associated with the given DIV, - or if the argument is not a DIV element nor a string naming such a DIV element in the HTML document.

    -
  • -
-
-
- -

- highlight -

-
    -
  • highlight(part: Part): void
  • -
-
    -
  • -
    -

    Make the given part the only highlighted part. - Afterwards the highlighteds collection will have only the given part in it.

    -

    Note that no predefined command or tool operates on the highlighteds collection, - and there is no predefined visual rendering when a part becomes Part.isHighlighted.

    -
    -
    see
    -

    Part.isHighlighted, highlightCollection, clearHighlighteds, select

    -
    -
    since
    -

    1.4

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      part: Part
      -
      -

      a Part that is already in a layer of this Diagram. - If the value is null, this does nothing.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- highlightCollection -

- - -
-
- -

- Static - inherit -

-
    -
  • inherit(derivedclass: Function, baseclass: Function): void
  • -
-
    -
  • -
    -

    This static function declares that a class (constructor function) derives from another class -- - but please note that most classes do not support inheritance. - Do not call this function when your class is defined using an ES2015 or TypeScript "class" declaration.

    -

    Because you must not modify the prototypes for the GoJS classes, - in order to override methods you need to define a new class that inherits from a predefined class. - You can then modify the prototype of your derived class.

    -

    Typical usage is:

    -
    function BaseClass() {
    -  this._total = 0;
    -}
    -
    -public increment(x) {
    -  this._total += x;
    -}
    +

    +See the page on Making Images for more usage examples. -function DerivedClass() { - this._anotherProperty = ""; -} -go.Diagram.inherit(DerivedClass, BaseClass); +

    Note that a returned HTMLImageElement, either returned directly or passed to the callback function, +might not yet have the complete property set to true. +So if you need to draw the image immediately, you should check that property first. +If it is false, add a "load" listener to the HTMLImageElement that does the drawing you want.

    +

    At the current time methods such as Diagram.makeImage, +Diagram.makeImageData and Diagram.makeSvg do not work on Overviews.

    +

    For the rendering to work, the diagram must have an HTML Div element as the div.

    +
    see

    makeImage

    +

    Parameters

    • Optional options: ImageRendererOptions
      +

      a JavaScript object detailing optional arguments for image creation. +Rendering options for both images and SVG:

      +
        +
      • size: +The size of the created image, as a Size, limited by the maxSize property. +If no scale or position is specified then the diagram will be scaled to fit the given size. +If you set a size, you should also set a position. If you are scaling the diagram, you may also want to scale the size.
      • +
      • scale: +The scale of the diagram. If scale is specified and size is not, the resulting image will be sized to uniformly +fit the space needed for the given scale. +Can be constrained by the maxSize property. A scale value of NaN will +automatically scale to fit within the maxSize, but may be smaller, with a maximum computed scale of 1.
      • +
      • maxSize: +The maximum size of the created image, as a Size. +The default value is (Infinity, Infinity) for SVG and (2000, 2000) for images. +This is typically used when scale is specified and helps prevent accidental excessive memory usage, +which is especially needed in limited-memory environments. +You cannot use Infinity when providing a maximum size for an image -- consider calling makeSvg instead.
      • +
      • position: +The position of the diagram, as a Point. +By default this is the position of Diagram.documentBounds with the Diagram.padding removed. +If a specific parts collection is used, by default this is the top-left diagram position of their collective bounds. +If you set a position, you should also set a size.
      • +
      • parts: +An iterator of GraphObjects, typically Parts, such as one from Diagram.selection or Layer.parts. +If GraphObjects are specified their containing Part will be drawn. By default all Parts are drawn except temporary parts (see showTemporary).
      • +
      • padding: +A Margin (or number) to pad the image with. If a size is specified, +the padding will not increase the image size, it will only offset the Diagram contents within the image. +The default value is a padding of 1.
      • +
      • background: +A valid CSS color to replace the default (transparent) canvas background. Any padding area is also colored.
      • +
      • showTemporary: +A boolean value, defaulting to false, +that determines whether or not temporary objects such as adornments are included in the image.
      • +
      • showGrid: +A boolean value, defaulting to the value of showTemporary, +that determines whether or not the Grid Layer (containing Diagram.grid) is included in the image +regardless of the value of showTemporary. +This is useful if you want to include the grid but not adornments, or vice versa.
      • +
      • document: +An HTML Document, defaulting to window.document (or the root object in other contexts) +This may be useful to set if you intend your Image or SVG to be opened in a new window.
      • +
      • callback: +The function to call when an image is finished creation. +It has one argument, which is of the type specified by the value of the returnType or SVG DOM. +If provided, call the callback when finished instead of returning immediately. This can be useful if you need to wait for image assets to load. +This also respects the callbackTimeout. +This argument is necessary if the returnType is "blob", however a callback can be used with any returnType. +See the Minimal Image Blob Download sample for an example usage, +which also demonstrates downloading an image file without involving a web server.
      • +
      • callbackTimeout: +If a callback is specified, the additional amount of time in milliseconds a call will wait before completeing. Right now, it will only wait if +image assets in the Diagram are not yet loaded. Default is 300 (milliseconds).
      • +
      +

      Additional image-specific arguments (not for SVG):

      +
        +
      • type: +The optional MIME type of the image. Valid values are typically "image/png" and "image/jpeg". +Some browsers allow "image/webp". The default value is "image/png", and unrecognized values will defer to the default.
      • +
      • returnType: +The optional return type of the image data. Valid values are "ImageData", "Image", "string", and "blob". +The "string" option returns a base64 string representation of the image. +The "ImageData" option returns an ImageData object representation of the image. +The "Image" option returns an HTMLImageElement using ImageData as the HTMLImageElement.src. +The "blob" option requires that the callback property is also defined. +The default value is "string", and unrecognized values will return a string.
      • +
      • details: +The optional details to pass to the HTMLCanvasElement's toDataURL function. +If the type is "image/jpeg" then this can be a number from 0 to 1, inclusive, describing the desired jpeg quality.
      • +
      +

    Returns string | HTMLImageElement | ImageData

    An ImageData, or a base64-encoded string describing an image, or an HTMLImageElement, or null if a callback is specified.

    +
  • makeSvg(options?: SvgRendererOptions): SVGElement
  • +

    Create an SVGElement that contains a SVG rendering of the current Diagram.

    +

    By default this method returns a snapshot of the visible diagram, but optional arguments give more options.

    +

    +See the page on Making SVG for usage examples. +See the Minimal SVG Download sample, +which also demonstrates downloading an SVG file without involving a web server. -DerivedClass.prototype.someMethod = ...; +

    See makeImageData for an explanation of possible options that are shared by both methods. +Additional SVG-specific options for this method:

    +
      +
    • elementFinished: +A function with two arguments, GraphObject and SVGElement. +As the SVG elements are created representing each graph object, this function is called on them, +allowing you to modify the SVG as it is being built, to assign stylesheets, IDs, etc. Example:
      elementFinished: function(graphObject, SVGElement) {
      // set something on every SVG element that represents a GoJS TextBlock
      if (graphObject instanceof go.TextBlock) SVGElement.setAttribute(...);
      }
      -

      Note that most classes do not support inheritance. - Currently you can only inherit from Layout, Tool, CommandHandler, and Link or their subclasses. - When you override a method, you must strongly consider calling the base method. - Please read the Introduction page on Extensions for how to override methods and how to call a base method.

      -

      The call to Diagram.inherit should be made immediately after defining the subclass constructor function - and before defining any new methods or overriding any base class methods. - You must not call this static function more than once on a derived class, or at all on a class defined using an ES2015 or TypeScript class declaration.

      -

      The need for subclassing is greatly diminished by the presence of a number of properties that have functional values. - Setting such a property to a function will cause that function to be called as if it were - an event handler for that particular object. - Example properties include: GraphObject.click, GraphObject.mouseEnter, Part.layerChanged, - Node.treeExpandedChanged, LinkingBaseTool.linkValidation, CommandHandler.memberValidation, - TextEditingTool.textValidation.

      -
    -

    Parameters

    -
      -
    • -
      derivedclass: Function
      -
    • -
    • -
      baseclass: Function
      -
      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- Static - isUsingDOM -

-
    -
  • isUsingDOM(): boolean
  • -
-
    -
  • -
    -

    This static function returns true if GoJS detects a DOM. - In browser environments this is expected to be true, in Node-like environments, false. - Specifically, this will be false if there is no root document in the JavaScript context, - or if the DOM was disabled explicitly by calling Diagram.useDOM.

    -

    Incomplete or mock implementations of a DOM may make this return true when - it is more appropriate that it returns false. If that is the case, set it to false by calling - Diagram.useDOM.

    -
    -
    since
    -

    2.2

    -
    -
    -
    -

    Returns boolean

    -
  • -
-
-
- -

- layoutDiagram -

-
    -
  • layoutDiagram(invalidateAll?: boolean): void
  • -
-
    -
  • -
    -

    Perform all invalid layouts. - If the optional argument is true, - this will perform all of the layouts (Diagram.layout and all Group.layouts), - not just the invalid ones.

    -

    Under normal circumstances you should not need to call this method, - because layouts will be performed automatically after they become invalid. - However you may have disabled automatic layouts by setting Layout.isInitial - and/or Layout.isOngoing to false, or by restricting a Part's Part.layoutConditions. - If that is the case you might call this method - (perhaps due to a user command) to perform the layout at a time of your choosing.

    -
    -

    Parameters

    -
      -
    • -
      Optional invalidateAll: boolean
      -
      -

      If true, this will explicitly set Layout.isValidLayout to false on each Layout in the diagram.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- makeImage -

-
    -
  • makeImage(options?: ImageRendererOptions): HTMLImageElement
  • -
-
    -
  • -
    -

    Create an HTMLImageElement that contains a bitmap of the current Diagram. - This method is just a convenience function that creates an image, - sets its source to the returned string of makeImageData, - and returns a reference to that Image.

    -

    See makeImageData for a complete explanation of possible options.

    -

    By default this method returns a snapshot of the visible diagram, but optional arguments give more options.

    -

    Note that a returned HTMLImageElement, either returned directly or passed to the callback function, - might not yet have the complete property set to true. - So if you need to draw the image immediately, you should check that property first. - If it is false, add a "load" listener to the HTMLImageElement that does the drawing you want.

    -

    At the current time methods such as Diagram.makeImage, - Diagram.makeImageData and Diagram.makeSvg do not work on Overviews.

    -

    For the rendering to work, the diagram must have an HTML Div element as the div.

    -
    -
    see
    -

    makeImageData, makeSvg

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      Optional options: ImageRendererOptions
      -
      -

      a JavaScript object detailing optional arguments for image creation, to be passed to makeImageData.

      -
      -
    • -
    -

    Returns HTMLImageElement

    -

    An HTML Image element, or null if a callback is specified, or null if there is no DOM.

    -
  • -
-
-
- -

- makeImageData -

-
    -
  • makeImageData(options?: ImageRendererOptions): string | HTMLImageElement | ImageData
  • -
-
    -
  • -
    -

    Create a bitmap of the current Diagram encoded as a base64 string, or returned as an ImageData object. - This method uses the toDataURL method of the HTMLCanvasElement to create the data URL, - or the getImageData method of the Canvas Context. - Unlike toDataURL, this method will not throw an error if cross-domain images - were drawn on the canvas, instead it will return a data URL of a bitmap with those images omitted.

    -

    A simple example:

    -
    myDiagram.makeImageData({
    -  scale: 1.5,
    -  size: new go.Size(100,100)
    -});
    +
  • +
+

At the current time methods such as Diagram.makeImage, +Diagram.makeImageData and Diagram.makeSvg do not work on Overviews.

+

For the rendering to work, the diagram must have an HTML Div element as the div.

+
see

makeImage

+

Parameters

  • Optional options: SvgRendererOptions
    +

    a JavaScript object detailing optional arguments for SVG creation.

    +

Returns SVGElement

  • +

    Move a collection of Parts in this Diagram by a given offset. +Moving a Group will also move its member Nodes and Links. +Moving with a zero X and a zero Y offset is potentially useful in order to snap Parts to the grid if DraggingTool.isGridSnapEnabled is true.

    +

    This does not perform a transaction nor does it raise a DiagramEvent.

    +
    since

    1.3

    +

    Parameters

    • coll: Iterable<Part> | Part[]
      +

      A List or a Set or Iterator of Parts, or an Array of Parts, +or null to move all of the Parts in this Diagram.

      +
    • offset: Point
      +

      the amount to move each Part, in document coordinates.

      +
    • Optional check: boolean
      +

      Whether to check Part.canMove on each part. The default value is false.

      +
    • Optional dragOptions: DraggingOptions
      +

      Optional dragging options. By default this uses the settings from the Diagram's DraggingTool.

      +

    Returns void

  • rebuildParts(): void
  • +

    Remove all of the Parts created from model data +and then create them again. +This must be called after modifying or replacing any of the template maps +such as nodeTemplateMap. +This re-selects all of the new Parts that were created from data of the original selected Parts.

    +

    If you modify a template Map, there is no notification that the map has changed. +You will need to call rebuildParts explicitly. +If you are replacing the nodeTemplate or the nodeTemplateMap or +the corresponding properties for Groups or Links, +the Diagram property setters will automatically call rebuildParts.

    +

    It is extremely wasteful to call this method after making some model data changes that you want to +be reflected in the diagram. Instead, it is better call Model.setDataProperty, +Model.addNodeData, Model.removeNodeData, or other model methods. +Not only do those methods update efficiently, they also preserve unbound state and support undo/redo.

    +

    Returns void

  • remove(part: Part): void
  • +

    Removes a Part from its Layer, provided the Layer is in this Diagram. +Removing a Node will also remove any Links that are connected with it. +Removing a Group will also remove all of its members. +Removing a Link will also remove all of its label Nodes, if it has any.

    +
    see

    add

    +

    Parameters

    Returns void

  • removeChangedListener(listener: (e: ChangedEvent) => void): void
  • removeDiagramListener(name: DiagramEventName, listener: (e: DiagramEvent) => void): void
  • +

    Unregister a DiagramEvent handler.

    +

    See the documentation for DiagramEvent for a complete listing of diagram event names and their purposes.

    +
    see

    addDiagramListener

    +

    Parameters

    • name: DiagramEventName
      +

      the name is normally capitalized, but this method uses case-insensitive comparison.

      +
    • listener: (e: DiagramEvent) => void
      +

      a function that takes a DiagramEvent as its argument.

      +

    Returns void

  • removeLayer(layer: Layer): void
  • +

    Removes the given layer from the list of layers.

    +

    Removing a layer does not remove the Parts in the layer. Instead, those Parts are placed into the default layer. +To remove all Parts in a layer you can call Diagram.removeParts with Layer.parts as the argument.

    +

    You cannot remove the default layer, the one named with the empty string.

    +
    see

    addLayer, addLayerBefore, addLayerAfter, findLayer

    +

    Parameters

    Returns void

  • removeModelChangedListener(listener: (e: ChangedEvent) => void): void
  • requestUpdate(alwaysQueueUpdate?: boolean): void
  • +

    Usage of this method is uncommon and may affect performance, +for efficiency do not call this method unless you have a well-defined need. +Normally, GoJS updates the diagram automatically, and completeing a transaction ensures an immediate update.

    +

    The most common reason to call this method when the HTML Div has changed size but the window has not changed size, +and the Diagram needs to be notified of this DOM change. See an example of resizing diagrams +here.

    +

    Requests that in the near-future the diagram makes sure all GraphObjects are arranged, +recomputes the document bounds, updates the scrollbars, and redraws the viewport.

    +
    since

    1.6

    +

    Parameters

    • Optional alwaysQueueUpdate: boolean
      +

      If true the Diagram will queue another update, +even if an update is already occurring. The default value is false. +Side effects in an "InitialLayoutCompleted" DiagramEvent listener might necessitate setting this parameter.

      +

    Returns void

  • rollbackTransaction(): boolean
  • scroll(unit: "pixel" | "line" | "page" | "document", dir: "up" | "down" | "left" | "right", dist?: number): void
  • +

    Scrolling function used by primarily by commandHandler's CommandHandler.doKeyDown.

    +
    see

    scrollToRect, centerRect

    +

    Parameters

    • unit: "pixel" | "line" | "page" | "document"
      +

      A string representing the unit of the scroll operation. Can only be 'pixel', 'line', 'page', or 'document'.

      +
    • dir: "up" | "down" | "left" | "right"
      +

      The direction of the scroll operation. Can only be 'up', 'down', 'left', or 'right'.

      +
    • Optional dist: number
      +

      An optional distance multiplier, for multiple pixels, lines, or pages. The default value is 1. + This argument is ignored when the unit is 'document'.

      +

    Returns void

  • scrollToRect(r: Rect): void
  • select(part: Part): void
  • +

    Make the given object the only selected object. +Afterwards the selection collection will have only the given part in it.

    +

    This method raises the "ChangingSelection" and "ChangedSelection" DiagramEvents.

    +
    see

    selectCollection, clearSelection, highlight

    +

    Parameters

    • part: Part
      +

      a Part that is already in a layer of this Diagram. +If the value is null, this does nothing.

      +

    Returns void

  • +

    This method sets a collection of properties according to the property/value pairs that have been set on the given Object, +in the same manner as GraphObject.make does when constructing a Diagram with an argument that is a simple JavaScript Object.

    +

    This method does not use TypeScript compile-time type checking like Diagram.set does, +but is considerably more flexible in allowing you to set sub-properties and DiagramEvents by quoted string names.

    +

    You can set properties on an object that is the value of a property of the Diagram, +or on the Diagram.toolManager, Diagram.animationManager, or Diagram.commandHandler +by using a "subpropname.property" syntax for the property name. +At the current time only a single dot is permitted in the property "name".

    +

    The property name may also be the name of a DiagramEvent, in which case this calls addDiagramListener with that DiagramEvent name.

    +
    aDiagram.attach({
    allowDelete: false,
    "animationManager.isEnabled": false, // turn off automatic animations
    // specify a group membership validation predicate
    "commandHandler.memberValidation": function(group, part) { return ...; },
    "commandHandler.copiesTree": true, // for the copy command
    // mouse wheel zooms instead of scrolls
    "toolManager.mouseWheelBehavior": go.ToolManager.WheelZoom,
    "draggingTool.dragsTree": true, // dragging for both move and copy
    "draggingTool.isGridSnapEnabled": true,
    layout: $(go.TreeLayout),
    // add a DiagramEvent listener
    "ExternalObjectsDropped": function(e) { e.subject.each(function(part) { ... }); }
    });
    -

    - See the page on Making Images for more usage examples. -

    Note that a returned HTMLImageElement, either returned directly or passed to the callback function, - might not yet have the complete property set to true. - So if you need to draw the image immediately, you should check that property first. - If it is false, add a "load" listener to the HTMLImageElement that does the drawing you want.

    -

    At the current time methods such as Diagram.makeImage, - Diagram.makeImageData and Diagram.makeSvg do not work on Overviews.

    -

    For the rendering to work, the diagram must have an HTML Div element as the div.

    -
    -
    see
    -

    makeImage

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      Optional options: ImageRendererOptions
      -
      -

      a JavaScript object detailing optional arguments for image creation. - Rendering options for both images and SVG:

      -
        -
      • size: - The size of the created image, as a Size, limited by the maxSize property. - If no scale or position is specified then the diagram will be scaled to fit the given size. - If you set a size, you should also set a position. If you are scaling the diagram, you may also want to scale the size.
      • -
      • scale: - The scale of the diagram. If scale is specified and size is not, the resulting image will be sized to uniformly - fit the space needed for the given scale. - Can be constrained by the maxSize property. A scale value of NaN will - automatically scale to fit within the maxSize, but may be smaller, with a maximum computed scale of 1.
      • -
      • maxSize: - The maximum size of the created image, as a Size. - The default value is (Infinity, Infinity) for SVG and (2000, 2000) for images. - This is typically used when scale is specified and helps prevent accidental excessive memory usage, - which is especially needed in limited-memory environments. - You cannot use Infinity when providing a maximum size for an image -- consider calling makeSvg instead.
      • -
      • position: - The position of the diagram, as a Point. - By default this is the position of Diagram.documentBounds with the Diagram.padding removed. - If a specific parts collection is used, by default this is the top-left diagram position of their collective bounds. - If you set a position, you should also set a size.
      • -
      • parts: - An iterator of GraphObjects, typically Parts, such as one from Diagram.selection or Layer.parts. - If GraphObjects are specified their containing Part will be drawn. By default all Parts are drawn except temporary parts (see showTemporary).
      • -
      • padding: - A Margin (or number) to pad the image with. If a size is specified, - the padding will not increase the image size, it will only offset the Diagram contents within the image. - The default value is a padding of 1.
      • -
      • background: - A valid CSS color to replace the default (transparent) canvas background. Any padding area is also colored.
      • -
      • showTemporary: - A boolean value, defaulting to false, - that determines whether or not temporary objects such as adornments are included in the image.
      • -
      • showGrid: - A boolean value, defaulting to the value of showTemporary, - that determines whether or not the Grid Layer (containing Diagram.grid) is included in the image - regardless of the value of showTemporary. - This is useful if you want to include the grid but not adornments, or vice versa.
      • -
      • document: - An HTML Document, defaulting to window.document (or the root object in other contexts) - This may be useful to set if you intend your Image or SVG to be opened in a new window.
      • -
      • callback: - The function to call when an image is finished creation. - It has one argument, which is of the type specified by the value of the returnType or SVG DOM. - If provided, call the callback when finished instead of returning immediately. This can be useful if you need to wait for image assets to load. - This also respects the callbackTimeout. - This argument is necessary if the returnType is "blob", however a callback can be used with any returnType. - See the Minimal Image Blob Download sample for an example usage, - which also demonstrates downloading an image file without involving a web server.
      • -
      • callbackTimeout: - If a callback is specified, the additional amount of time in milliseconds a call will wait before completeing. Right now, it will only wait if - image assets in the Diagram are not yet loaded. Default is 300 (milliseconds).
      • -
      -

      Additional image-specific arguments (not for SVG):

      -
        -
      • type: - The optional MIME type of the image. Valid values are typically "image/png" and "image/jpeg". - Some browsers allow "image/webp". The default value is "image/png", and unrecognized values will defer to the default.
      • -
      • returnType: - The optional return type of the image data. Valid values are "ImageData", "Image", "string", and "blob". - The "string" option returns a base64 string representation of the image. - The "ImageData" option returns an ImageData object representation of the image. - The "Image" option returns an HTMLImageElement using ImageData as the HTMLImageElement.src. - The "blob" option requires that the callback property is also defined. - The default value is "string", and unrecognized values will return a string.
      • -
      • details: - The optional details to pass to the HTMLCanvasElement's toDataURL function. - If the type is "image/jpeg" then this can be a number from 0 to 1, inclusive, describing the desired jpeg quality.
      • -
      -
      -
    • -
    -

    Returns string | HTMLImageElement | ImageData

    -

    An ImageData, or a base64-encoded string describing an image, or an HTMLImageElement, or null if a callback is specified.

    -
  • -
-
-
- -

- makeSvg -

-
    -
  • makeSvg(options?: SvgRendererOptions): SVGElement
  • -
-
    -
  • -
    -

    Create an SVGElement that contains a SVG rendering of the current Diagram.

    -

    By default this method returns a snapshot of the visible diagram, but optional arguments give more options.

    -

    - See the page on Making SVG for usage examples. - See the Minimal SVG Download sample, - which also demonstrates downloading an SVG file without involving a web server. -

    See makeImageData for an explanation of possible options that are shared by both methods. - Additional SVG-specific options for this method:

    -
      -
    • elementFinished: - A function with two arguments, GraphObject and SVGElement. - As the SVG elements are created representing each graph object, this function is called on them, - allowing you to modify the SVG as it is being built, to assign stylesheets, IDs, etc. Example:
      elementFinished: function(graphObject, SVGElement) {
      -  // set something on every SVG element that represents a GoJS TextBlock
      -  if (graphObject instanceof go.TextBlock) SVGElement.setAttribute(...);
      -}
      +
    since

    1.5

    +
    see

    attach a synonym of this method, set a type-safe method to set a collection of properties

    +

    Parameters

    • props: ObjectData
      +

      a plain JavaScript object with various property values to be set on this Diagram or on a part of this Diagram.

      +

    Returns Diagram

    this Diagram

    +
  • startTransaction(tname?: string): boolean
  • updateAllRelationshipsFromData(): void
  • updateAllTargetBindings(srcprop?: string): void
  • +

    Update all of the data-bound properties of Nodes and Links in this diagram, +without having to call Model.setDataProperty. +This copies/converts model data properties to set properties on Parts. +This method does not conduct a transaction, so you need to start and commit one yourself.

    +

    It is better to call Model.setDataProperty to modify data properties, +because that will both record changes for undo/redo and will update all bindings +that make depend on that property. +Simply modifying the data and calling an "update..." method will not be able to record +the previous value(s) of properties in the model data to support undo.

    +

    If you know which model data objects have been modified, +it will be more efficient to update only the Parts that need it +by calling Panel.updateTargetBindings.

    +

    To update relationships between nodes, call updateAllRelationshipsFromData.

    +
    see

    updateAllRelationshipsFromData

    +

    Parameters

    • Optional srcprop: string
      +

      An optional source data property name: + when provided, only evaluates those Bindings that use that particular property; + when not provided or when it is the empty string, all bindings are evaluated.

      +

    Returns void

  • zoomToFit(): void
  • zoomToRect(r: Rect, scaling?: EnumValue): void
  • +

    Modifies the scale and position of the Diagram +so that the viewport displays a given document-coordinates rectangle.

    +
    since

    1.1

    +

    Parameters

    Returns void

  • fromDiv(div: string | Element): Diagram
  • +

    This static function gets the Diagram that is attached to an HTML DIV element.

    +

    Parameters

    • div: string | Element

    Returns Diagram

    null if there is no Diagram associated with the given DIV, +or if the argument is not a DIV element nor a string naming such a DIV element in the HTML document.

    +
  • inherit(derivedclass: Function, baseclass: Function): void
  • +

    This static function declares that a class (constructor function) derives from another class -- +but please note that most classes do not support inheritance. +Do not call this function when your class is defined using an ES2015 or TypeScript "class" declaration.

    +

    Because you must not modify the prototypes for the GoJS classes, +in order to override methods you need to define a new class that inherits from a predefined class. +You can then modify the prototype of your derived class.

    +

    Typical usage is:

    +
    function BaseClass() {
    this._total = 0;
    }

    public increment(x) {
    this._total += x;
    }

    function DerivedClass() {
    this._anotherProperty = "";
    }
    go.Diagram.inherit(DerivedClass, BaseClass);

    DerivedClass.prototype.someMethod = ...;
    -
  • -
-

At the current time methods such as Diagram.makeImage, - Diagram.makeImageData and Diagram.makeSvg do not work on Overviews.

-

For the rendering to work, the diagram must have an HTML Div element as the div.

-
-
see
-

makeImage

-
-
- -

Parameters

-
    -
  • -
    Optional options: SvgRendererOptions
    -
    -

    a JavaScript object detailing optional arguments for SVG creation.

    -
    -
  • -
-

Returns SVGElement

- - -
-
- -

- moveParts -

- -
    -
  • -
    -

    Move a collection of Parts in this Diagram by a given offset. - Moving a Group will also move its member Nodes and Links. - Moving with a zero X and a zero Y offset is potentially useful in order to snap Parts to the grid if DraggingTool.isGridSnapEnabled is true.

    -

    This does not perform a transaction nor does it raise a DiagramEvent.

    -
    -
    since
    -

    1.3

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      coll: Iterable<Part> | Part[]
      -
      -

      A List or a Set or Iterator of Parts, or an Array of Parts, - or null to move all of the Parts in this Diagram.

      -
      -
    • -
    • -
      offset: Point
      -
      -

      the amount to move each Part, in document coordinates.

      -
      -
    • -
    • -
      Optional check: boolean
      -
      -

      Whether to check Part.canMove on each part. The default value is false.

      -
      -
    • -
    • -
      Optional dragOptions: DraggingOptions
      -
      -

      Optional dragging options. By default this uses the settings from the Diagram's DraggingTool.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- rebuildParts -

-
    -
  • rebuildParts(): void
  • -
-
    -
  • -
    -

    Remove all of the Parts created from model data - and then create them again. - This must be called after modifying or replacing any of the template maps - such as nodeTemplateMap. - This re-selects all of the new Parts that were created from data of the original selected Parts.

    -

    If you modify a template Map, there is no notification that the map has changed. - You will need to call rebuildParts explicitly. - If you are replacing the nodeTemplate or the nodeTemplateMap or - the corresponding properties for Groups or Links, - the Diagram property setters will automatically call rebuildParts.

    -

    It is extremely wasteful to call this method after making some model data changes that you want to - be reflected in the diagram. Instead, it is better call Model.setDataProperty, - Model.addNodeData, Model.removeNodeData, or other model methods. - Not only do those methods update efficiently, they also preserve unbound state and support undo/redo.

    -
    -

    Returns void

    -
  • -
-
-
- -

- remove -

-
    -
  • remove(part: Part): void
  • -
-
    -
  • -
    -

    Removes a Part from its Layer, provided the Layer is in this Diagram. - Removing a Node will also remove any Links that are connected with it. - Removing a Group will also remove all of its members. - Removing a Link will also remove all of its label Nodes, if it has any.

    -
    -
    see
    -

    add

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      part: Part
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- removeChangedListener -

-
    -
  • removeChangedListener(listener: (e: ChangedEvent) => void): void
  • -
- -
-
- -

- removeDiagramListener -

-
    -
  • removeDiagramListener(name: DiagramEventName, listener: (e: DiagramEvent) => void): void
  • -
-
    -
  • -
    -

    Unregister a DiagramEvent handler.

    -

    See the documentation for DiagramEvent for a complete listing of diagram event names and their purposes.

    -
    -
    see
    -

    addDiagramListener

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      name: DiagramEventName
      -
      -

      the name is normally capitalized, but this method uses case-insensitive comparison.

      -
      -
    • -
    • -
      listener: (e: DiagramEvent) => void
      -
      -

      a function that takes a DiagramEvent as its argument.

      -
      -
        -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- removeLayer -

-
    -
  • removeLayer(layer: Layer): void
  • -
-
    -
  • -
    -

    Removes the given layer from the list of layers.

    -

    Removing a layer does not remove the Parts in the layer. Instead, those Parts are placed into the default layer. - To remove all Parts in a layer you can call Diagram.removeParts with Layer.parts as the argument.

    -

    You cannot remove the default layer, the one named with the empty string.

    -
    -
    see
    -

    addLayer, addLayerBefore, addLayerAfter, findLayer

    -
    -
    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- removeModelChangedListener -

-
    -
  • removeModelChangedListener(listener: (e: ChangedEvent) => void): void
  • -
- -
-
- -

- removeParts -

- -
    -
  • -
    -

    This method removes from this Diagram all of the Parts in a collection. - Removing a Node will also remove any Links that are connected with it. - Removing a Group will also remove all of its members. - Removing a Link will also remove all of its label Nodes, if it has any.

    -

    This does not perform a transaction nor does it raise a DiagramEvent. - Call CommandHandler.deleteSelection, which calls this method, - if you want to delete all selected Parts. - The CommandHandler.deleteSelection command may delete other Parts as well, depending on CommandHandler.deletesTree.

    -

    At this time there is no "addParts" method -- just call Diagram.add on each Part.

    -
    -
    since
    -

    1.3

    -
    -
    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- requestUpdate -

-
    -
  • requestUpdate(alwaysQueueUpdate?: boolean): void
  • -
-
    -
  • -
    -

    Usage of this method is uncommon and may affect performance, - for efficiency do not call this method unless you have a well-defined need. - Normally, GoJS updates the diagram automatically, and completeing a transaction ensures an immediate update.

    -

    The most common reason to call this method when the HTML Div has changed size but the window has not changed size, - and the Diagram needs to be notified of this DOM change. See an example of resizing diagrams - here.

    -

    Requests that in the near-future the diagram makes sure all GraphObjects are arranged, - recomputes the document bounds, updates the scrollbars, and redraws the viewport.

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      Optional alwaysQueueUpdate: boolean
      -
      -

      If true the Diagram will queue another update, - even if an update is already occurring. The default value is false. - Side effects in an "InitialLayoutCompleted" DiagramEvent listener might necessitate setting this parameter.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- rollbackTransaction -

-
    -
  • rollbackTransaction(): boolean
  • -
- -
-
- -

- scroll -

-
    -
  • scroll(unit: "pixel" | "line" | "page" | "document", dir: "up" | "down" | "left" | "right", dist?: number): void
  • -
-
    -
  • -
    -

    Scrolling function used by primarily by commandHandler's CommandHandler.doKeyDown.

    -
    -
    see
    -

    scrollToRect, centerRect

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      unit: "pixel" | "line" | "page" | "document"
      -
      -

      A string representing the unit of the scroll operation. Can only be 'pixel', 'line', 'page', or 'document'.

      -
      -
    • -
    • -
      dir: "up" | "down" | "left" | "right"
      -
      -

      The direction of the scroll operation. Can only be 'up', 'down', 'left', or 'right'.

      -
      -
    • -
    • -
      Optional dist: number
      -
      -

      An optional distance multiplier, for multiple pixels, lines, or pages. The default value is 1. - This argument is ignored when the unit is 'document'.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- scrollToRect -

-
    -
  • scrollToRect(r: Rect): void
  • -
- -
-
- -

- select -

-
    -
  • select(part: Part): void
  • -
-
    -
  • -
    -

    Make the given object the only selected object. - Afterwards the selection collection will have only the given part in it.

    -

    This method raises the "ChangingSelection" and "ChangedSelection" DiagramEvents.

    -
    -
    see
    -

    selectCollection, clearSelection, highlight

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      part: Part
      -
      -

      a Part that is already in a layer of this Diagram. - If the value is null, this does nothing.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- selectCollection -

- - -
-
- -

- set -

- -
    -
  • -
    -

    Set any number of properties on this Diagram. This is common in initialization. - This method can only be used to set existing properties on this object. To attach new properties, - or to set properties of sub-objects such as the Diagram.toolManager, Diagram.animationManager, - or Diagram.commandHandler, use Diagram.attach.

    -

    This method uses TypeScript compile-time type checking, but does no runtime type checking.

    -
    -
    since
    -

    2.2

    -
    -
    see
    -

    setProperties

    -
    -
    -
    -

    Parameters

    - -

    Returns Diagram

    -

    this Diagram

    -
  • -
-
-
- -

- setProperties -

- -
    -
  • -
    -

    This method sets a collection of properties according to the property/value pairs that have been set on the given Object, - in the same manner as GraphObject.make does when constructing a Diagram with an argument that is a simple JavaScript Object.

    -

    This method does not use TypeScript compile-time type checking like Diagram.set does, - but is considerably more flexible in allowing you to set sub-properties and DiagramEvents by quoted string names.

    -

    You can set properties on an object that is the value of a property of the Diagram, - or on the Diagram.toolManager, Diagram.animationManager, or Diagram.commandHandler - by using a "subpropname.property" syntax for the property name. - At the current time only a single dot is permitted in the property "name".

    -

    The property name may also be the name of a DiagramEvent, in which case this calls addDiagramListener with that DiagramEvent name.

    -
    aDiagram.attach({
    -  allowDelete: false,
    -  "animationManager.isEnabled": false,  // turn off automatic animations
    -  // specify a group membership validation predicate
    -  "commandHandler.memberValidation": function(group, part) { return ...; },
    -  "commandHandler.copiesTree": true,  // for the copy command
    -  // mouse wheel zooms instead of scrolls
    -  "toolManager.mouseWheelBehavior": go.ToolManager.WheelZoom,
    -  "draggingTool.dragsTree": true,  // dragging for both move and copy
    -  "draggingTool.isGridSnapEnabled": true,
    -  layout: $(go.TreeLayout),
    -  // add a DiagramEvent listener
    -  "ExternalObjectsDropped": function(e) { e.subject.each(function(part) { ... }); }
    -});
    -
    -
    -
    since
    -

    1.5

    -
    -
    see
    -

    attach a synonym of this method, set a type-safe method to set a collection of properties

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      props: ObjectData
      -
      -

      a plain JavaScript object with various property values to be set on this Diagram or on a part of this Diagram.

      -
      -
    • -
    -

    Returns Diagram

    -

    this Diagram

    -
  • -
-
-
- -

- startTransaction -

-
    -
  • startTransaction(tname?: string): boolean
  • -
- -
-
- -

- transformDocToView -

- - -
-
- -

- transformViewToDoc -

- - -
-
- -

- updateAllRelationshipsFromData -

-
    -
  • updateAllRelationshipsFromData(): void
  • -
- -
-
- -

- updateAllTargetBindings -

-
    -
  • updateAllTargetBindings(srcprop?: string): void
  • -
-
    -
  • -
    -

    Update all of the data-bound properties of Nodes and Links in this diagram, - without having to call Model.setDataProperty. - This copies/converts model data properties to set properties on Parts. - This method does not conduct a transaction, so you need to start and commit one yourself.

    -

    It is better to call Model.setDataProperty to modify data properties, - because that will both record changes for undo/redo and will update all bindings - that make depend on that property. - Simply modifying the data and calling an "update..." method will not be able to record - the previous value(s) of properties in the model data to support undo.

    -

    If you know which model data objects have been modified, - it will be more efficient to update only the Parts that need it - by calling Panel.updateTargetBindings.

    -

    To update relationships between nodes, call updateAllRelationshipsFromData.

    -
    -
    see
    -

    updateAllRelationshipsFromData

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      Optional srcprop: string
      -
      -

      An optional source data property name: - when provided, only evaluates those Bindings that use that particular property; - when not provided or when it is the empty string, all bindings are evaluated.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- Static - useDOM -

-
    -
  • useDOM(value: boolean): void
  • -
-
    -
  • -
    -

    This static function sets whether or not GoJS should use a DOM, if one exists. - This can be set to false to simulate a DOM-less environment. - It is uncommon to set this, but may be required in some testing environments.

    -
    -
    since
    -

    2.2

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      value: boolean
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- zoomToFit -

-
    -
  • zoomToFit(): void
  • -
- -
-
- -

- zoomToRect -

-
    -
  • zoomToRect(r: Rect, scaling?: EnumValue): void
  • -
-
    -
  • -
    -

    Modifies the scale and position of the Diagram - so that the viewport displays a given document-coordinates rectangle.

    -
    -
    since
    -

    1.1

    -
    -
    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
-
-

Constants

-
- -

- Static - CycleAll - : EnumValue

-
-

This value for Diagram.validCycle states that - there are no restrictions on making cycles of links.

-
-
-
- -

- Static - CycleDestinationTree - : EnumValue

-
-

This value for Diagram.validCycle states that - any number of destination links may go out of a node, but at most one - source link may come into a node, and there are no directed cycles.

-

This value assumes that the graph does not already have any cycles in it, - or else the behavior may be indeterminate.

-
-
-
- -

- Static - CycleNotDirected - : EnumValue

-
-

This value for Diagram.validCycle states that - a valid link from a node will not produce a directed cycle in the graph.

-
-
-
- -

- Static - CycleNotUndirected - : EnumValue

-
-

This value for Diagram.validCycle states that - a valid link from a node will not produce an undirected cycle in the graph.

-
-
-
- -

- Static - CycleSourceTree - : EnumValue

-
-

This value for Diagram.validCycle states that - any number of source links may come into a node, but at most one - destination link may go out of a node, and there are no directed cycles.

-

This value assumes that the graph does not already have any cycles in it, - or else the behavior may be indeterminate.

-
-
-
- -

- Static - DocumentScroll - : EnumValue

-
-

This value for Diagram.scrollMode states that - the viewport constrains scrolling to the Diagram document bounds.

-
-
-
- -

- Static - InfiniteScroll - : EnumValue

-
-

This value for Diagram.scrollMode states that - the viewport does not constrain scrolling to the Diagram document bounds.

-
-
-
- -

- Static - None - : EnumValue

-
-

The default autoScale type, used as the value of Diagram.autoScale: - The Diagram does not attempt to scale so that its documentBounds would fit the view.

-
-
-
- -

- Static - Uniform - : EnumValue

-
-

Diagrams with this autoScale type, used as the value of Diagram.autoScale, - are scaled uniformly until the whole documentBounds fits in the view.

-
-
-
- -

- Static - UniformToFill - : EnumValue

-
-

Diagrams with this autoScale type, used as the value of Diagram.autoScale, - are scaled until the documentBounds fits in the view in one direction while - a scrollbar is still needed in the other direction.

-
-
-
- - - - -
- -
-
- - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/DiagramEvent.html b/api/symbols/DiagramEvent.html index d48e0cc5f..5ee5044fe 100644 --- a/api/symbols/DiagramEvent.html +++ b/api/symbols/DiagramEvent.html @@ -1,425 +1,192 @@ - - - - - - DiagramEvent | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class DiagramEvent

-
-
-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - DiagramEvent -
  • -
-
-
-
-

A DiagramEvent represents a more abstract event than an InputEvent. - They are raised on the Diagram class. - One can receive such events by registering a DiagramEvent listener on a Diagram - by calling Diagram.addDiagramListener. - The listener function, when called, will be passed an instance of a DiagramEvent. - Use the name property to decide what kind of diagram event it is. - The diagram property refers to the Diagram, and you can get additional information - from that, such as the Diagram.lastInput, which in turn provides information - such as InputEvent.documentPoint that may be relevant for that kind of DiagramEvent.

-

The subject and parameter properties optionally provide additional information - about the diagram event. The subject could be a collection of Parts or it could be - an individual object such as a Link or a GraphObject within a Node. - Everything depends on the kind of diagram event that it is.

-

Some DiagramEvents such as "ObjectSingleClicked" or "BackgroundDoubleClicked" are normally - associated with InputEvents. - Some DiagramEvents such as "SelectionMoved" or "PartRotated" are associated with the - results of Tool-handled gestures or CommandHandler actions. - Some DiagramEvents are not necessarily associated with any input events at all, - such as "ViewportBoundsChanged", which can happen due to programmatic - changes to the Diagram.position and Diagram.scale properties.

-

DiagramEvents that occur during a transaction may be called before the state of the whole diagram has settled down. - This often means that such events occur before a layout, so nodes may not have their final positions, - links may not have their final routes, and the Diagram.documentBounds and Diagram.viewportBounds - may not yet have been updated. - Such events may make additional changes to the diagram, which may in turn result in additional side-effects.

-

DiagramEvents that occur outside of a transaction require you to start and commit a transaction around any side-effects that you want to do. - However, some DiagramEvents do not allow you to make any changes to the Diagram or Model.

-

Currently defined diagram event names include:

- -
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- -
    -
  • -
    -

    The DiagramEvent class constructor produces an empty DiagramEvent. - You should never need to call this constructor. - But if you do, you must first set diagram to the Diagram before any other use.

    -
    -

    Returns DiagramEvent

    -
  • -
-
-
-
-

Properties

-
- -

- diagram - : Diagram

-
    -
  • -
    -

    Gets the diagram associated with the event.

    -
    -
  • -
-
-
- -

- name - : string

-
    -
  • -
    -

    Gets or sets the name of the kind of diagram event that this represents. - This property should always be set to one of the recognized list of names, - as listed in the documentation for DiagramEvent.

    -
    -
  • -
-
-
- -

- parameter - : any

-
    -
  • -
    -

    Gets or sets an optional object that describes the change to the subject of the diagram event. - This property defaults to null.

    -
    -
  • -
-
-
- -

- subject - : any

-
    -
  • -
    -

    Gets or sets an optional object that is the subject of the diagram event. - This property defaults to null.

    -
    -
  • -
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class DiagramEvent

Hierarchy

  • DiagramEvent
+

A DiagramEvent represents a more abstract event than an InputEvent. +They are raised on the Diagram class. +One can receive such events by registering a DiagramEvent listener on a Diagram +by calling Diagram.addDiagramListener. +The listener function, when called, will be passed an instance of a DiagramEvent. +Use the name property to decide what kind of diagram event it is. +The diagram property refers to the Diagram, and you can get additional information +from that, such as the Diagram.lastInput, which in turn provides information +such as InputEvent.documentPoint that may be relevant for that kind of DiagramEvent.

+

The subject and parameter properties optionally provide additional information +about the diagram event. The subject could be a collection of Parts or it could be +an individual object such as a Link or a GraphObject within a Node. +Everything depends on the kind of diagram event that it is.

+

Some DiagramEvents such as "ObjectSingleClicked" or "BackgroundDoubleClicked" are normally +associated with InputEvents. +Some DiagramEvents such as "SelectionMoved" or "PartRotated" are associated with the +results of Tool-handled gestures or CommandHandler actions. +Some DiagramEvents are not necessarily associated with any input events at all, +such as "ViewportBoundsChanged", which can happen due to programmatic +changes to the Diagram.position and Diagram.scale properties.

+

DiagramEvents that occur during a transaction may be called before the state of the whole diagram has settled down. +This often means that such events occur before a layout, so nodes may not have their final positions, +links may not have their final routes, and the Diagram.documentBounds and Diagram.viewportBounds +may not yet have been updated. +Such events may make additional changes to the diagram, which may in turn result in additional side-effects.

+

DiagramEvents that occur outside of a transaction require you to start and commit a transaction around any side-effects that you want to do. +However, some DiagramEvents do not allow you to make any changes to the Diagram or Model.

+

Currently defined diagram event names include:

+ +

Index

Constructors

  • +

    The DiagramEvent class constructor produces an empty DiagramEvent. +You should never need to call this constructor. +But if you do, you must first set diagram to the Diagram before any other use.

    +

    Returns DiagramEvent

Properties

  • +

    Gets the diagram associated with the event.

    +
  • +

    Gets or sets the name of the kind of diagram event that this represents. +This property should always be set to one of the recognized list of names, +as listed in the documentation for DiagramEvent.

    +
  • +

    Gets or sets an optional object that describes the change to the subject of the diagram event. +This property defaults to null.

    +
  • +

    Gets or sets an optional object that is the subject of the diagram event. +This property defaults to null.

    +

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/DiagramFile.html b/api/symbols/DiagramFile.html index cbce2e722..044ab0d39 100644 --- a/api/symbols/DiagramFile.html +++ b/api/symbols/DiagramFile.html @@ -1,238 +1,52 @@ - - - - - - DiagramFile | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Interface DiagramFile

-
-
-
-
-
-
-
-
-
-

- This is part of GoCloudStorage and not part of the main GoJS library. - Storage can be found in the GoJS kit under the projects folder. - See the Storage intro page for more information. -

-
-
-

Hierarchy

-
    -
  • - DiagramFile -
  • -
-
-
-
-

A simple interface containing basic information about a diagram saved to a storage service. - Guarantees the existence of file id, name, and path.

-

DiagramFiles are used as a minimal representation of files stored in data. GoCloudStorage.currentDiagramFile. - GoCloudStorage.save, GoCloudStorage.load, GoCloudStorage.remove, - and GoCloudStorage.create all return Promises which resolve with - DiagramFiles containing minimal data about the saved / loaded / removed / created file in storage.

-
-
-
-

Index

-
-
-
-

Properties

- -
-
-
-
-
-

Properties

-
- -

- id - : string

-
-

The storage-given ID of the diagram file. This is usually a lengthy alphanumeric string.

-

Note: In the case of files saved to / loaded from Local Storage with GoLocalStorage, - ID is the same as the name of the file.

-
-
-
- -

- name - : string

-
-

The name of the diagram file in storage. This is assigned by the user during GoCloudStorage.save.

-
-
-
- -

- path - : string

-
-

The path of the diagram file in storage. Rules for valid path syntax by subclass:

-
    -
  • GoLocalStorage: Just the filename (the key in local storage); i.e. example.diagram
  • -
  • GoDropBox: /{path-to-file}/{filename}; i.e. /Public/example.diagram
  • -
  • GoGoogleDrive: Use Google Drive-given file IDs. - Parameter is still called 'path' in GoGoogleDrive methods to preserve system nomenclature.
  • -
  • GoOneDrive: /drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram
  • -
-
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Interface DiagramFile Storage

This is part of GoCloudStorage and not part of the main GoJS library. Storage can be found in the GoJS kit under the projects folder. See the Storage intro page for more information.

Hierarchy

  • DiagramFile
+

A simple interface containing basic information about a diagram saved to a storage service. +Guarantees the existence of file id, name, and path.

+

DiagramFiles are used as a minimal representation of files stored in data. GoCloudStorage.currentDiagramFile. +GoCloudStorage.save, GoCloudStorage.load, GoCloudStorage.remove, +and GoCloudStorage.create all return Promises which resolve with +DiagramFiles containing minimal data about the saved / loaded / removed / created file in storage.

+

Index

Properties

Properties

+

The storage-given ID of the diagram file. This is usually a lengthy alphanumeric string.

+

Note: In the case of files saved to / loaded from Local Storage with GoLocalStorage, +ID is the same as the name of the file.

+
+

The name of the diagram file in storage. This is assigned by the user during GoCloudStorage.save.

+
+

The path of the diagram file in storage. Rules for valid path syntax by subclass:

+
    +
  • GoLocalStorage: Just the filename (the key in local storage); i.e. example.diagram
  • +
  • GoDropBox: /{path-to-file}/{filename}; i.e. /Public/example.diagram
  • +
  • GoGoogleDrive: Use Google Drive-given file IDs. + Parameter is still called 'path' in GoGoogleDrive methods to preserve system nomenclature.
  • +
  • GoOneDrive: /drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram
  • +
+

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/DimensioningLink.html b/api/symbols/DimensioningLink.html index 658cba2e4..00ed43a5f 100644 --- a/api/symbols/DimensioningLink.html +++ b/api/symbols/DimensioningLink.html @@ -1,387 +1,70 @@ - - - - - - DimensioningLink | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class DimensioningLink

-
-
-
-
-
-
-
-
-
-

- This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

-
-
-

Hierarchy

- -
-
-
-

A custom routed Link for showing the distances between a point on one node and a point on another node.

-

Note that because this is a Link, the points being measured must be on Nodes, not simple Parts. - The exact point on each Node is determined by the Link.fromSpot and Link.toSpot.

-

Several properties of the DimensioningLink customize the appearance of the dimensioning: - direction, for orientation of the dimension line and which side it is on, - extension, for how far the dimension line is from the measured points, - inset, for leaving room for a text label, and - gap, for distance that the extension line starts from the measured points.

-

If you want to experiment with this extension, try the Dimensioning sample.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- - -
-
-
-

Properties

-
- -

- direction - : number

-
    -
  • -
    -

    The general angle at which the measurement should be made.

    -

    The default value is 0, meaning to go measure only along the X axis, - with the dimension line and label above the two nodes (at lower Y coordinates). - New values must be one of: 0, 90, 180, 270, or NaN. - The value NaN indicates that the measurement is point-to-point and not orthogonal.

    -
    -
  • -
-
-
- -

- extension - : number

-
    -
  • -
    -

    The distance at which the dimension line should be from the points being measured.

    -

    The default value is 30. - Larger values mean further away from the nodes. - The new value must be greater than or equal to zero.

    -
    -
  • -
-
-
- -

- gap - : number

-
    -
  • -
    -

    The distance that the extension lines should come short of the measured points.

    -

    The default value is 10.

    -
    -
  • -
-
-
- -

- inset - : number

-
    -
  • -
    -

    The distance that the dimension line should be "indented" from the ends of the - extension lines that are orthogonal to the dimension line.

    -

    The default value is 10.

    -
    -
  • -
-
-
-
-

Methods

-
- -

- Override - cloneProtected -

- -
    -
  • -
    -

    Copies properties to a cloned DimensioningLink.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- Override - computePoints -

-
    -
  • computePoints(): boolean
  • -
-
    -
  • -
    -

    Constructs the link's route by modifying points.

    -
    -

    Returns boolean

    -

    true if it computed a route of points

    -
  • -
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class DimensioningLink Extension

This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

Hierarchy

+

A custom routed Link for showing the distances between a point on one node and a point on another node.

+

Note that because this is a Link, the points being measured must be on Nodes, not simple Parts. +The exact point on each Node is determined by the Link.fromSpot and Link.toSpot.

+

Several properties of the DimensioningLink customize the appearance of the dimensioning: +direction, for orientation of the dimension line and which side it is on, +extension, for how far the dimension line is from the measured points, +inset, for leaving room for a text label, and +gap, for distance that the extension line starts from the measured points.

+

If you want to experiment with this extension, try the Dimensioning sample.

+

Index

Inherited Members

Properties

Methods

Constructors

Properties

  • +

    The general angle at which the measurement should be made.

    +

    The default value is 0, meaning to go measure only along the X axis, +with the dimension line and label above the two nodes (at lower Y coordinates). +New values must be one of: 0, 90, 180, 270, or NaN. +The value NaN indicates that the measurement is point-to-point and not orthogonal.

    +
  • +

    The distance at which the dimension line should be from the points being measured.

    +

    The default value is 30. +Larger values mean further away from the nodes. +The new value must be greater than or equal to zero.

    +
  • +

    The distance that the extension lines should come short of the measured points.

    +

    The default value is 10.

    +
  • +

    The distance that the dimension line should be "indented" from the ends of the +extension lines that are orthogonal to the dimension line.

    +

    The default value is 10.

    +

Methods

  • +

    Copies properties to a cloned DimensioningLink.

    +

    Parameters

    Returns void

  • computePoints(): boolean
  • +

    Constructs the link's route by modifying points.

    +

    Returns boolean

    true if it computed a route of points

    +

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/DoubleTreeLayout.html b/api/symbols/DoubleTreeLayout.html index 98d39e00d..a1026c5d4 100644 --- a/api/symbols/DoubleTreeLayout.html +++ b/api/symbols/DoubleTreeLayout.html @@ -1,459 +1,84 @@ - - - - - - DoubleTreeLayout | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class DoubleTreeLayout

-
-
-
-
-
-
-
-
-
-

- This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

-
-
-

Hierarchy

-
    -
  • - Layout -
      -
    • - DoubleTreeLayout -
    • -
    -
  • -
-
-
-
-

Perform two TreeLayouts, one going rightwards and one going leftwards. - The choice of direction is determined by the mandatory predicate directionFunction, - which is called on each child Node of the root Node.

-

You can also set vertical to true if you want the DoubleTreeLayout to - perform TreeLayouts both downwards and upwards.

-

Normally there should be a single root node. Hoewver if there are multiple root nodes - found in the nodes and links that this layout is responsible for, this will pretend that - there is a real root node and make all of the apparent root nodes children of that pretend root.

-

If there is no root node, all nodes are involved in cycles, so the first given node is chosen.

-

If you want to experiment with this extension, try the Double Tree sample.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- -
    -
  • -
    -

    Create a minimal layout that only positions Nodes that do not have a location.

    -
    -

    Parameters

    -
      -
    • -
      Optional init: Partial<Layout>
      -
      -

      Optional initialization properties.

      -
      -
    • -
    -

    Returns DoubleTreeLayout

    -
  • -
-
-
-
-

Properties

-
- -

- bottomRightOptions - : Partial<TreeLayout>

- -
-
- -

- directionFunction - : (node: Node) => boolean

-
    -
  • -
    -

    This function is called on each child node of the root node - in order to determine whether the subtree starting from that child node - will grow towards larger coordinates or towards smaller ones. - The value must be a function and must not be null. - It must return true if isPositiveDirection should return true; otherwise it should return false.

    -
    -
  • -
-
-
- -

- topLeftOptions - : Partial<TreeLayout>

- -
-
- -

- vertical - : boolean

-
    -
  • -
    -

    When false, the layout should grow towards the left and towards the right; - when true, the layout show grow upwards and downwards. - The default value is false.

    -
    -
  • -
-
-
-
-

Methods

-
- -

- Protected - createTreeLayout -

-
    -
  • createTreeLayout(positive: boolean): TreeLayout
  • -
-
    -
  • -
    -

    This just returns an instance of TreeLayout. - The caller will set the TreeLayout.angle.

    -
    -

    Parameters

    -
      -
    • -
      positive: boolean
      -
      -

      true for growth downward or rightward

      -
      -
    • -
    -

    Returns TreeLayout

    -
  • -
-
-
- -

- Override - doLayout -

- -
    -
  • -
    -

    Perform two TreeLayouts by splitting the collection of Parts - into two separate subsets but sharing only a single root Node.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- Protected - isPositiveDirection -

-
    -
  • isPositiveDirection(child: Node): boolean
  • -
-
    -
  • -
    -

    This predicate is called on each child node of the root node, - and only on immediate children of the root. - It should return true if this child node is the root of a subtree that should grow - rightwards or downwards, or false otherwise.

    -
    -

    Parameters

    -
      -
    • -
      child: Node
      -
    • -
    -

    Returns boolean

    -

    true if grows towards right or towards bottom; false otherwise

    -
  • -
-
-
- -

- Protected - separatePartsForLayout -

- -
    -
  • -
    -

    This is called by doLayout to split the collection of Nodes and Links into two Sets, - one for the subtrees growing towards the left or upwards, and one for the subtrees - growing towards the right or downwards.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class DoubleTreeLayout Extension

This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

Hierarchy

+

Perform two TreeLayouts, one going rightwards and one going leftwards. +The choice of direction is determined by the mandatory predicate directionFunction, +which is called on each child Node of the root Node.

+

You can also set vertical to true if you want the DoubleTreeLayout to +perform TreeLayouts both downwards and upwards.

+

Normally there should be a single root node. Hoewver if there are multiple root nodes +found in the nodes and links that this layout is responsible for, this will pretend that +there is a real root node and make all of the apparent root nodes children of that pretend root.

+

If there is no root node, all nodes are involved in cycles, so the first given node is chosen.

+

If you want to experiment with this extension, try the Double Tree sample.

+

Index

Inherited Members

Constructors

  • +

    Create a minimal layout that only positions Nodes that do not have a location.

    +

    Parameters

    • Optional init: Partial<Layout>
      +

      Optional initialization properties.

      +

    Returns DoubleTreeLayout

Properties

  • +

    This function is called on each child node of the root node +in order to determine whether the subtree starting from that child node +will grow towards larger coordinates or towards smaller ones. +The value must be a function and must not be null. +It must return true if isPositiveDirection should return true; otherwise it should return false.

    +
  • +

    When false, the layout should grow towards the left and towards the right; +when true, the layout show grow upwards and downwards. +The default value is false.

    +

Methods

  • +

    Perform two TreeLayouts by splitting the collection of Parts +into two separate subsets but sharing only a single root Node.

    +

    Parameters

    Returns void

  • isPositiveDirection(child: Node): boolean
  • +

    This predicate is called on each child node of the root node, +and only on immediate children of the root. +It should return true if this child node is the root of a subtree that should grow +rightwards or downwards, or false otherwise.

    +

    Parameters

    Returns boolean

    true if grows towards right or towards bottom; false otherwise

    +
  • +

    This is called by doLayout to split the collection of Nodes and Links into two Sets, +one for the subtrees growing towards the left or upwards, and one for the subtrees +growing towards the right or downwards.

    +

    Parameters

    Returns void

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/DragCreatingTool.html b/api/symbols/DragCreatingTool.html index bf65f8401..63c0bf1e8 100644 --- a/api/symbols/DragCreatingTool.html +++ b/api/symbols/DragCreatingTool.html @@ -1,483 +1,97 @@ - - - - - - DragCreatingTool | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class DragCreatingTool

-
-
-
-
-
-
-
-
-
-

- This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

-
-
-

Hierarchy

-
    -
  • - Tool -
      -
    • - DragCreatingTool -
    • -
    -
  • -
-
-
-
-

The DragCreatingTool lets the user create a new node by dragging in the background - to indicate its size and position.

-

The default drag selection box is a magenta rectangle. - You can modify the box to customize its appearance.

-

This tool will not be able to start running unless you have set the - archetypeNodeData property to an object that can be copied and added to the diagram's model.

-

You can use this tool in a modal manner by executing:

-
  diagram.currentTool = new DragCreatingTool();
+DragCreatingTool | GoJS API
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class DragCreatingTool Extension

This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

Hierarchy

  • Tool
    • DragCreatingTool
+

The DragCreatingTool lets the user create a new node by dragging in the background +to indicate its size and position.

+

The default drag selection box is a magenta rectangle. +You can modify the box to customize its appearance.

+

This tool will not be able to start running unless you have set the +archetypeNodeData property to an object that can be copied and added to the diagram's model.

+

You can use this tool in a modal manner by executing:

+
  diagram.currentTool = new DragCreatingTool();
 
-

Use this tool in a mode-less manner by executing:

-
  myDiagram.toolManager.mouseMoveTools.insertAt(2, new DragCreatingTool());
+

Use this tool in a mode-less manner by executing:

+
  myDiagram.toolManager.mouseMoveTools.insertAt(2, new DragCreatingTool());
 
-

However when used mode-lessly as a mouse-move tool, in ToolManager.mouseMoveTools, - this cannot start running unless there has been a motionless delay - after the mouse-down event of at least delay milliseconds.

-

This tool does not utilize any Adornments or tool handles, - but it does temporarily add the box Part to the diagram. - This tool does conduct a transaction when inserting the new node.

-

If you want to experiment with this extension, try the Drag Creating sample.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- -
    -
  • -
    -

    Constructs a DragCreatingTool, sets box to a magenta rectangle, and sets name of the tool.

    -
    -

    Returns DragCreatingTool

    -
  • -
-
-
-
-

Properties

-
- -

- archetypeNodeData - : ObjectData

-
    -
  • -
    -

    Gets or sets a data object that will be copied and added to the diagram's model each time this tool executes.

    -

    The default value is null. - The value must be non-null for this tool to be able to run. - Setting this property does not raise any events.

    -
    -
  • -
-
-
- -

- box - : Part

-
    -
  • -
    -

    Gets or sets the Part used as the "rubber-band box" - that is stretched to follow the mouse, as feedback for what area will - be passed to insertPart upon a mouse-up.

    -

    Initially this is a Part containing only a simple magenta rectangular Shape. - The object to be resized should be named "SHAPE". - Setting this property does not raise any events.

    -

    Modifying this property while this tool Tool.isActive might have no effect.

    -
    -
  • -
-
-
- -

- delay - : number

-
    -
  • -
    -

    Gets or sets the time in milliseconds for which the mouse must be stationary - before this tool can be started.

    -

    The default value is 175 milliseconds. - A value of zero will allow this tool to run without any wait after the mouse down. - Setting this property does not raise any events.

    -
    -
  • -
-
-
-
-

Methods

-
- -

- Override - canStart -

-
    -
  • canStart(): boolean
  • -
-
    -
  • -
    -

    This tool can run when there has been a mouse-drag, far enough away not to be a click, - and there has been delay of at least delay milliseconds - after the mouse-down before a mouse-move.

    -
    -

    Returns boolean

    -
  • -
-
-
- -

- computeBoxBounds -

-
    -
  • computeBoxBounds(): Rect
  • -
-
    -
  • -
    -

    This just returns a Rect stretching from the mouse-down point to the current mouse point.

    -
    -

    Returns Rect

    -

    a Rect in document coordinates.

    -
  • -
-
-
- -

- Override - doActivate -

-
    -
  • doActivate(): void
  • -
-
    -
  • -
    -

    Capture the mouse and show the box.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doDeactivate -

-
    -
  • doDeactivate(): void
  • -
-
    -
  • -
    -

    Release the mouse and remove any box.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doMouseMove -

-
    -
  • doMouseMove(): void
  • -
-
    -
  • -
    -

    Update the box's position and size according to the value - of computeBoxBounds.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doMouseUp -

-
    -
  • doMouseUp(): void
  • -
- -
-
- -

- insertPart -

- -
    -
  • -
    -

    Create a node by adding a copy of the archetypeNodeData object - to the diagram's model, assign its GraphObject.position and GraphObject.desiredSize - according to the given bounds, and select the new part.

    -

    The actual part that is added to the diagram may be a Part, a Node, - or even a Group, depending on the properties of the archetypeNodeData - and the type of the template that is copied to create the part.

    -
    -

    Parameters

    -
      -
    • -
      bounds: Rect
      -
      -

      a Point in document coordinates.

      -
      -
    • -
    -

    Returns Part

    -

    the newly created Part, or null if it failed.

    -
  • -
-
-
-
- -
-
-
- -
-
- - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/DragSelectingTool.html b/api/symbols/DragSelectingTool.html index bbeba4ced..3b064a3f5 100644 --- a/api/symbols/DragSelectingTool.html +++ b/api/symbols/DragSelectingTool.html @@ -1,509 +1,123 @@ - - - - - - DragSelectingTool | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class DragSelectingTool

-
-
-
-
-
-
-
-
-
-

Hierarchy

- -
-
-
-

The DragSelectingTool lets the user select multiple parts within a rectangular area drawn by the user. - There is a temporary part, the box, - that shows the current area encompassed between the mouse-down - point and the current mouse point. - The default drag selection box is a magenta rectangle. - You can change the box to customize its appearance -- see its documentation for an example.

-

This tool is a standard mouse-move tool, the ToolManager.dragSelectingTool. - However this cannot start running unless there has been a motionless delay - after the mouse-down event of at least delay milliseconds.

-

This tool does not utilize any Adornments or tool handles, - but it does temporarily add the box part to the diagram. - This tool does not modify the model or conduct any transaction.

-

Selection occurs on a mouse-up when it calls selectInRect - with the value of computeBoxBounds. - Selectable parts are selected when their bounds fall entirely within the rectangle, - unless isPartialInclusion is set to true.

-

- For customizing the DragSelectingTool, see Introduction to the DragSelectingTool. -

If you implement your own drag-in-the-background-to-do-something tool, you may need to disable - this tool or insert your new tool in the ToolManager.mouseMoveTools list before this tool, - in order for your tool to run. There are examples of such tools defined in the extensions directory: - Realtime Drag Selecting Tool, - Drag Creating Tool, and - Drag Zooming Tool.

-

If you want to programmatically select some Parts in a rectangular area, - you can call selectInRect.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- - -
-
-
-

Properties

-
- -

- box - : Part

-
    -
  • -
    -

    Gets or sets the Part used as the "rubber-band selection box" - that is stretched to follow the mouse, as feedback for what area will - be passed to selectInRect upon a mouse-up.

    -

    Initially this is a Part containing only a simple magenta rectangular Shape. - The object to be resized during dragging should be named "SHAPE". - Setting this property does not raise any events.

    -

    Here is an example of changing the selection box to be a thicker bright green rectangle:

    -
      myDiagram.toolManager.dragSelectingTool.box =
    -    $(go.Part,
    -      { layerName: "Tool", selectable: false },
    -      $(go.Shape,
    -        { name: "SHAPE", fill: null, stroke: "chartreuse", strokeWidth: 3 }));
    +DragSelectingTool | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class DragSelectingTool

    Hierarchy

    +

    The DragSelectingTool lets the user select multiple parts within a rectangular area drawn by the user. +There is a temporary part, the box, +that shows the current area encompassed between the mouse-down +point and the current mouse point. +The default drag selection box is a magenta rectangle. +You can change the box to customize its appearance -- see its documentation for an example.

    +

    This tool is a standard mouse-move tool, the ToolManager.dragSelectingTool. +However this cannot start running unless there has been a motionless delay +after the mouse-down event of at least delay milliseconds.

    +

    This tool does not utilize any Adornments or tool handles, +but it does temporarily add the box part to the diagram. +This tool does not modify the model or conduct any transaction.

    +

    Selection occurs on a mouse-up when it calls selectInRect +with the value of computeBoxBounds. +Selectable parts are selected when their bounds fall entirely within the rectangle, +unless isPartialInclusion is set to true.

    +

    +For customizing the DragSelectingTool, see Introduction to the DragSelectingTool. + +

    If you implement your own drag-in-the-background-to-do-something tool, you may need to disable +this tool or insert your new tool in the ToolManager.mouseMoveTools list before this tool, +in order for your tool to run. There are examples of such tools defined in the extensions directory: +Realtime Drag Selecting Tool, +Drag Creating Tool, and +Drag Zooming Tool.

    +

    If you want to programmatically select some Parts in a rectangular area, +you can call selectInRect.

    +

    Index

    Inherited Members

    Constructors

    Properties

    • +

      Gets or sets the Part used as the "rubber-band selection box" +that is stretched to follow the mouse, as feedback for what area will +be passed to selectInRect upon a mouse-up.

      +

      Initially this is a Part containing only a simple magenta rectangular Shape. +The object to be resized during dragging should be named "SHAPE". +Setting this property does not raise any events.

      +

      Here is an example of changing the selection box to be a thicker bright green rectangle:

      +
        myDiagram.toolManager.dragSelectingTool.box =
      $(go.Part,
      { layerName: "Tool", selectable: false },
      $(go.Shape,
      { name: "SHAPE", fill: null, stroke: "chartreuse", strokeWidth: 3 }));
      -

      Note that the Part should be put into a Layer that Layer.isTemporary.

      -

      Modifying this property while this tool Tool.isActive might have no effect.

      -
      -
    • -
    -
    -
    - -

    - delay - : number

    -
      -
    • -
      -

      Gets or sets the time in milliseconds for which the mouse must be stationary - before this tool can be started. - The default value is 175 milliseconds. - Setting this property does not raise any events.

      -
      -
    • -
    -
    -
    - -

    - isPartialInclusion - : boolean

    -
      -
    • -
      -

      Gets or sets whether a selectable Part may be only partly - or must be completely enclosed by the rectangle given to selectInRect. - The default value is false: parts must be completely inside the rectangle. - Setting this property does not raise any events.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override Virtual - canStart -

    -
      -
    • canStart(): boolean
    • -
    -
      -
    • -
      -

      This tool can run when the diagram allows selection, - there has been delay of at least delay milliseconds - after the mouse-down before a mouse-move, - there has been a mouse-drag far enough away not to be a click, - and there is no selectable part at the mouse-down point.

      -

      The delay required to start this tool enables both this tool and - the ToolManager.panningTool to co-exist as mode-less mouse-move tools.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Virtual - computeBoxBounds -

    -
      -
    • computeBoxBounds(): Rect
    • -
    -
      -
    • -
      -

      This just returns a Rect stretching from the mouse-down point to the current mouse point.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns Rect

      -

      a Rect in document coordinates.

      -
    • -
    -
    -
    - -

    - Override - doActivate -

    -
      -
    • doActivate(): void
    • -
    -
      -
    • -
      -

      Capture the mouse and show the box.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doDeactivate -

    -
      -
    • doDeactivate(): void
    • -
    -
      -
    • -
      -

      Release the mouse and remove any box.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseMove -

    -
      -
    • doMouseMove(): void
    • -
    -
      -
    • -
      -

      Update the box's position and size according to the value - of computeBoxBounds.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseUp -

    -
      -
    • doMouseUp(): void
    • -
    -
      -
    • -
      -

      Call selectInRect with the value of a call to computeBoxBounds.

      -

      This method changes the cursor to "wait" and - raises the "ChangingSelection" DiagramEvent before calling selectInRect, - and raises the "ChangedSelection" DiagramEvent afterward.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - selectInRect -

    -
      -
    • selectInRect(r: Rect): void
    • -
    -
      -
    • -
      -

      This method is called to select some parts within the area of a given rectangle.

      -

      The normal behavior is to set the diagram's selection collection to only those parts - in the given rectangle according to the isPartialInclusion policy. - However, if the Shift key modifier is used, no parts are deselected -- - this adds to the selection the parts in the rectangle not already selected. - If the Control key (Command on Mac) modifier is used, this toggles the selectedness of the parts in the rectangle. - If the Control key (Command on Mac) and Shift key modifiers are both used, this deselects the parts in the rectangle.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      -
        -
      • -
        r: Rect
        -
        -

        a rectangular bounds in document coordinates.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/DragZoomingTool.html b/api/symbols/DragZoomingTool.html index 6f2664307..cc9e0d90d 100644 --- a/api/symbols/DragZoomingTool.html +++ b/api/symbols/DragZoomingTool.html @@ -1,479 +1,93 @@ - - - - - - DragZoomingTool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class DragZoomingTool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    -
      -
    • - Tool -
        -
      • - DragZoomingTool -
      • -
      -
    • -
    -
    -
    -
    -

    The DragZoomingTool lets the user zoom into a diagram by stretching a box - to indicate the new contents of the diagram's viewport (the area of the - model shown by the Diagram). - Hold down the Shift key in order to zoom out.

    -

    The default drag selection box is a magenta rectangle. - You can modify the box to customize its appearance.

    -

    The diagram that is zoomed by this tool is specified by the zoomedDiagram property. - If the value is null, the tool zooms its own Tool.diagram.

    -

    You can use this tool in a modal manner by executing:

    -
      diagram.currentTool = new DragZoomingTool();
    +DragZoomingTool | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class DragZoomingTool Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    The DragZoomingTool lets the user zoom into a diagram by stretching a box +to indicate the new contents of the diagram's viewport (the area of the +model shown by the Diagram). +Hold down the Shift key in order to zoom out.

    +

    The default drag selection box is a magenta rectangle. +You can modify the box to customize its appearance.

    +

    The diagram that is zoomed by this tool is specified by the zoomedDiagram property. +If the value is null, the tool zooms its own Tool.diagram.

    +

    You can use this tool in a modal manner by executing:

    +
      diagram.currentTool = new DragZoomingTool();
     
    -

    Use this tool in a mode-less manner by executing:

    -
      myDiagram.toolManager.mouseMoveTools.insertAt(2, new DragZoomingTool());
    +

    Use this tool in a mode-less manner by executing:

    +
      myDiagram.toolManager.mouseMoveTools.insertAt(2, new DragZoomingTool());
     
    -

    However when used mode-lessly as a mouse-move tool, in ToolManager.mouseMoveTools, - this cannot start running unless there has been a motionless delay - after the mouse-down event of at least delay milliseconds.

    -

    This tool does not utilize any Adornments or tool handles, - but it does temporarily add the box part to the diagram. - This tool does not modify the model or conduct any transaction.

    -

    If you want to experiment with this extension, try the Drag Zooming sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Constructs a DragZoomingTool, sets box to a magenta rectangle, and sets name of the tool.

      -
      -

      Returns DragZoomingTool

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - box - : Part

    -
      -
    • -
      -

      Gets or sets the Part used as the "rubber-band zoom box" - that is stretched to follow the mouse, as feedback for what area will - be passed to zoomToRect upon a mouse-up.

      -

      Initially this is a Part containing only a simple magenta rectangular Shape. - The object to be resized should be named "SHAPE". - Setting this property does not raise any events.

      -

      Modifying this property while this tool Tool.isActive might have no effect.

      -
      -
    • -
    -
    -
    - -

    - delay - : number

    -
      -
    • -
      -

      Gets or sets the time in milliseconds for which the mouse must be stationary - before this tool can be started.

      -

      The default value is 175 milliseconds. - Setting this property does not raise any events.

      -
      -
    • -
    -
    -
    - -

    - zoomedDiagram - : Diagram

    - -
    -
    -
    -

    Methods

    -
    - -

    - Override - canStart -

    -
      -
    • canStart(): boolean
    • -
    -
      -
    • -
      -

      This tool can run when there has been a mouse-drag, far enough away not to be a click, - and there has been delay of at least delay milliseconds - after the mouse-down before a mouse-move.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - computeBoxBounds -

    -
      -
    • computeBoxBounds(): Rect
    • -
    -
      -
    • -
      -

      This just returns a Rect stretching from the mouse-down point to the current mouse point - while maintaining the aspect ratio of the zoomedDiagram.

      -
      -

      Returns Rect

      -

      a Rect in document coordinates.

      -
    • -
    -
    -
    - -

    - Override - doActivate -

    -
      -
    • doActivate(): void
    • -
    -
      -
    • -
      -

      Capture the mouse and show the box.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doDeactivate -

    -
      -
    • doDeactivate(): void
    • -
    -
      -
    • -
      -

      Release the mouse and remove any box.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseMove -

    -
      -
    • doMouseMove(): void
    • -
    -
      -
    • -
      -

      Update the box's position and size according to the value - of computeBoxBounds.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseUp -

    -
      -
    • doMouseUp(): void
    • -
    - -
    -
    - -

    - zoomToRect -

    -
      -
    • zoomToRect(r: Rect): void
    • -
    -
      -
    • -
      -

      This method is called to change the zoomedDiagram's viewport to match the given rectangle.

      -
      -

      Parameters

      -
        -
      • -
        r: Rect
        -
        -

        a rectangular bounds in document coordinates.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/DraggingInfo.html b/api/symbols/DraggingInfo.html index 13504bf1c..4437ff37e 100644 --- a/api/symbols/DraggingInfo.html +++ b/api/symbols/DraggingInfo.html @@ -1,242 +1,43 @@ - - - - - - DraggingInfo | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class DraggingInfo

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - DraggingInfo -
    • -
    -
    -
    -
    -

    This is used in dragging methods to remember initial locations, for relative positioning and for cancellation. - You do not typically need to create these unless you are overriding tools.

    -

    CommandHandler.computeEffectiveCollection returns a Map of Parts and DraggingInfo, - which is used as an argument for methods like Diagram.computeMove.

    -

    Diagram.moveParts constructs a Map of Parts and DraggingInfo to record each Part's location offset during moves.

    -
    -
    since
    -

    2.0

    -
    -
    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Optionally takes a Point that sets point.

      -
      -

      Parameters

      -
        -
      • -
        Optional pt: Point
        -
        -
        -
      • -
      -

      Returns DraggingInfo

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - point - : Point

    -
      -
    • -
      -

      Gets or sets the initial location for a dragged object. - This is most commonly the Part.location of the dragged object, or a rounded Part.location if snapping.

      -
      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class DraggingInfo

    Hierarchy

    • DraggingInfo
    +

    This is used in dragging methods to remember initial locations, for relative positioning and for cancellation. +You do not typically need to create these unless you are overriding tools.

    +

    CommandHandler.computeEffectiveCollection returns a Map of Parts and DraggingInfo, +which is used as an argument for methods like Diagram.computeMove.

    +

    Diagram.moveParts constructs a Map of Parts and DraggingInfo to record each Part's location offset during moves.

    +
    since

    2.0

    +

    Index

    Constructors

    Properties

    Constructors

    Properties

    • +

      Gets or sets the initial location for a dragged object. +This is most commonly the Part.location of the dragged object, or a rounded Part.location if snapping.

      +

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/DraggingOptions.html b/api/symbols/DraggingOptions.html index 04d78cbb5..095309b13 100644 --- a/api/symbols/DraggingOptions.html +++ b/api/symbols/DraggingOptions.html @@ -1,338 +1,40 @@ - - - - - - DraggingOptions | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class DraggingOptions

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - DraggingOptions -
    • -
    -
    -
    -
    -

    New in 2.0, this class contains options for dragging and moving parts.

    -

    This is used by Diagram.moveParts, Diagram.computeMove, and DraggingTool.computeMove.

    -

    Both the Diagram and its DraggingTool have a DraggingOptions instance. - Typically, only the DraggingTool one is used, unless the Diagram has no DraggingTool defined.

    -

    In typical DraggingTool operation you do not need to create or modify a DraggingOptions instance. - Setting properties on the DraggingTool such as DraggingTool.isGridSnapEnabled - sets the value on the DraggingTool.dragOptions instance for you.

    -
    -
    see
    -

    DraggingTool.dragOptions

    -
    -
    since
    -

    2.0

    -
    -
    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - dragsLink - : boolean

    -
    -
    -
    -
    - -

    - dragsMembers - : boolean

    -
    -
    -
    -
    - -

    - dragsTree - : boolean

    -
    -
    -
    -
    - -

    - gridSnapCellSize - : Size

    -
    -
    -
    -
    - -

    - gridSnapCellSpot - : Spot

    -
    -
    -
    -
    - -

    - gridSnapOrigin - : Point

    -
    -
    -
    -
    - -

    - groupsAlwaysMove - : boolean

    -
    -
    -
    -
    - -

    - groupsSnapMembers - : boolean

    -
    -
    -
    -
    - -

    - isGridSnapEnabled - : boolean

    -
    -
    -
    -
    - -

    - isGridSnapRealtime - : boolean

    -
    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class DraggingOptions

    Hierarchy

    • DraggingOptions
    +

    New in 2.0, this class contains options for dragging and moving parts.

    +

    This is used by Diagram.moveParts, Diagram.computeMove, and DraggingTool.computeMove.

    +

    Both the Diagram and its DraggingTool have a DraggingOptions instance. +Typically, only the DraggingTool one is used, unless the Diagram has no DraggingTool defined.

    +

    In typical DraggingTool operation you do not need to create or modify a DraggingOptions instance. +Setting properties on the DraggingTool such as DraggingTool.isGridSnapEnabled +sets the value on the DraggingTool.dragOptions instance for you.

    +
    see

    DraggingTool.dragOptions

    +
    since

    2.0

    +

    Index

    Constructors

    Properties

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/DraggingTool.html b/api/symbols/DraggingTool.html index 618856306..5dd63610a 100644 --- a/api/symbols/DraggingTool.html +++ b/api/symbols/DraggingTool.html @@ -1,1345 +1,358 @@ - - - - - - DraggingTool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class DraggingTool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    The DraggingTool is used to move or copy selected parts with the mouse. - This sets the Part.location property; you may want to save the location to the model - by using a TwoWay Binding on the "location" property in your Parts/Nodes/Groups templates.

    -

    Dragging the selection moves parts for which Part.canMove is true. - If the user holds down the Control key (Option key on Mac), this tool will make a copy of the parts being dragged, - for those parts for which Part.canCopy is true.

    -

    When the drag starts it calls computeEffectiveCollection to find the actual collection - of Parts to be dragged. - Normally this collection includes not only the Diagram.selection, but also parts that belong - to those selected parts, such as members of groups. - If dragsTree is true, the effective collection also includes all of the nodes and links that - constitute the subtree starting from selected nodes. - The result of computeEffectiveCollection is not a Set but a Map - which remembers the original Part.location for all of the dragged parts. - This map is saved as the value of draggedParts.

    -

    During the drag if the user holds down the Control/Option key this tool makes a copy of the draggedParts - and proceeds to drag it around. - (It only copies the Diagram.selection, not the whole effective collection, - if copiesEffectiveCollection is false.) - The collection of copied parts is held by copiedParts. - It too is a Map remembering the original locations of the parts. - copiedParts will be null when this tool is moving (not copying) at the moment.

    -

    Each Part's movement is limited by the Diagram.computeMove method. - By default it limits the Part.location to be within the bounds given by Part.minLocation and Part.maxLocation. - (Those default to minus Infinity to plus Infinity.) - As a further convenience, the value of NaN in minLocation and maxLocation cause Diagram.computeMove to use the - part's current location. - So, for example, an easy way to declare that the user may only drag a node horizontally is to just set:

    -
    $(go.Node,
    -  . . .
    -  { minLocation: new go.Point(-Infinity, NaN), maxLocation: new go.Point(Infinity, NaN) },
    -  . . .
    -)
    +DraggingTool | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class DraggingTool

    Hierarchy

    +

    The DraggingTool is used to move or copy selected parts with the mouse. +This sets the Part.location property; you may want to save the location to the model +by using a TwoWay Binding on the "location" property in your Parts/Nodes/Groups templates.

    +

    Dragging the selection moves parts for which Part.canMove is true. +If the user holds down the Control key (Option key on Mac), this tool will make a copy of the parts being dragged, +for those parts for which Part.canCopy is true.

    +

    When the drag starts it calls computeEffectiveCollection to find the actual collection +of Parts to be dragged. +Normally this collection includes not only the Diagram.selection, but also parts that belong +to those selected parts, such as members of groups. +If dragsTree is true, the effective collection also includes all of the nodes and links that +constitute the subtree starting from selected nodes. +The result of computeEffectiveCollection is not a Set but a Map +which remembers the original Part.location for all of the dragged parts. +This map is saved as the value of draggedParts.

    +

    During the drag if the user holds down the Control/Option key this tool makes a copy of the draggedParts +and proceeds to drag it around. +(It only copies the Diagram.selection, not the whole effective collection, +if copiesEffectiveCollection is false.) +The collection of copied parts is held by copiedParts. +It too is a Map remembering the original locations of the parts. +copiedParts will be null when this tool is moving (not copying) at the moment.

    +

    Each Part's movement is limited by the Diagram.computeMove method. +By default it limits the Part.location to be within the bounds given by Part.minLocation and Part.maxLocation. +(Those default to minus Infinity to plus Infinity.) +As a further convenience, the value of NaN in minLocation and maxLocation cause Diagram.computeMove to use the +part's current location. +So, for example, an easy way to declare that the user may only drag a node horizontally is to just set:

    +
    $(go.Node,
    . . .
    { minLocation: new go.Point(-Infinity, NaN), maxLocation: new go.Point(Infinity, NaN) },
    . . .
    )
    -

    If you set isGridSnapEnabled to true, dragged or copied parts will be snapped to points on a grid. - The snapping occurs continuously during a drag unless you set isGridSnapRealtime to false. - Normally the grid points come from the Diagram.grid, even if that grid is not GraphObject.visible. - However you can override those grid's properties for the snapping grid cell size and offset - by setting the properties here: gridSnapCellSize and gridSnapOrigin. - This computes the point to snap to for each dragged part. - The resulting point is used as the new Part.location.

    -

    For the most general control over where a part may be dragged, either set the Part.dragComputation property - or override Diagram.computeMove. - For the common case of wanting to keep member nodes within the Group that they are members of, - you can do something like:

    -
     // this is a Part.dragComputation function for limiting where a Node may be dragged
    -  function stayInGroup(part, pt, gridpt) {
    -    // don't constrain top-level nodes
    -    var grp = part.containingGroup;
    -    if (grp === null) return pt;
    -    // try to stay within the background Shape of the Group
    -    var back = grp.resizeObject;
    -    if (back === null) return pt;
    -    // allow dragging a Node out of a Group if the Shift key is down
    -    if (part.diagram.lastInput.shift) return pt;
    -    var p1 = back.getDocumentPoint(go.Spot.TopLeft);
    -    var p2 = back.getDocumentPoint(go.Spot.BottomRight);
    -    var b = part.actualBounds;
    -    var loc = part.location;
    -    // find the padding inside the group's placeholder that is around the member parts
    -    var m = grp.placeholder.padding;
    -    // now limit the location appropriately, assuming no grid-snapping
    -    var x = Math.max(p1.x + m.left, Math.min(pt.x, p2.x - m.right - b.width - 1)) + (loc.x-b.x);
    -    var y = Math.max(p1.y + m.top, Math.min(pt.y, p2.y - m.bottom - b.height - 1)) + (loc.y-b.y);
    -    return new go.Point(x, y);
    -  }
    +

    If you set isGridSnapEnabled to true, dragged or copied parts will be snapped to points on a grid. +The snapping occurs continuously during a drag unless you set isGridSnapRealtime to false. +Normally the grid points come from the Diagram.grid, even if that grid is not GraphObject.visible. +However you can override those grid's properties for the snapping grid cell size and offset +by setting the properties here: gridSnapCellSize and gridSnapOrigin. +This computes the point to snap to for each dragged part. +The resulting point is used as the new Part.location.

    +

    For the most general control over where a part may be dragged, either set the Part.dragComputation property +or override Diagram.computeMove. +For the common case of wanting to keep member nodes within the Group that they are members of, +you can do something like:

    +
     // this is a Part.dragComputation function for limiting where a Node may be dragged
    function stayInGroup(part, pt, gridpt) {
    // don't constrain top-level nodes
    var grp = part.containingGroup;
    if (grp === null) return pt;
    // try to stay within the background Shape of the Group
    var back = grp.resizeObject;
    if (back === null) return pt;
    // allow dragging a Node out of a Group if the Shift key is down
    if (part.diagram.lastInput.shift) return pt;
    var p1 = back.getDocumentPoint(go.Spot.TopLeft);
    var p2 = back.getDocumentPoint(go.Spot.BottomRight);
    var b = part.actualBounds;
    var loc = part.location;
    // find the padding inside the group's placeholder that is around the member parts
    var m = grp.placeholder.padding;
    // now limit the location appropriately, assuming no grid-snapping
    var x = Math.max(p1.x + m.left, Math.min(pt.x, p2.x - m.right - b.width - 1)) + (loc.x-b.x);
    var y = Math.max(p1.y + m.top, Math.min(pt.y, p2.y - m.bottom - b.height - 1)) + (loc.y-b.y);
    return new go.Point(x, y);
    }
    -

    Note that this expects there to be a "SHAPE" object within the Group's visual tree that delimits - where the part may be dragged within the group. - This also expects that Group.computesBoundsIncludingLinks is false. - Then in your node template(s), just set:

    -
    $(go.Node,
    -  . . .,
    -  { dragComputation: stayInGroup },
    -  . . .
    -)
    +

    Note that this expects there to be a "SHAPE" object within the Group's visual tree that delimits +where the part may be dragged within the group. +This also expects that Group.computesBoundsIncludingLinks is false. +Then in your node template(s), just set:

    +
    $(go.Node,
    . . .,
    { dragComputation: stayInGroup },
    . . .
    )
    -

    This tool does not utilize any Adornments or tool handles. - If the drag is successful, it raises the "SelectionMoved" or "SelectionCopied" DiagramEvent - and produces a "Move" or a "Copy" transaction.

    -

    If you want to programmatically start a new user's dragging of a particular existing node, - you can make sure that node is selected, set the currentPart property, and then start and activate the tool.

    -
      var node = ...;
    -  myDiagram.select(node);        // in this case the only selected node
    -  var tool = myDiagram.toolManager.draggingTool;
    -  tool.currentPart = node;       // the DraggingTool will not call standardMouseSelect
    -  myDiagram.currentTool = tool;  // starts the DraggingTool
    -  tool.doActivate();             // activates the DraggingTool
    +

    This tool does not utilize any Adornments or tool handles. +If the drag is successful, it raises the "SelectionMoved" or "SelectionCopied" DiagramEvent +and produces a "Move" or a "Copy" transaction.

    +

    If you want to programmatically start a new user's dragging of a particular existing node, +you can make sure that node is selected, set the currentPart property, and then start and activate the tool.

    +
      var node = ...;
    myDiagram.select(node); // in this case the only selected node
    var tool = myDiagram.toolManager.draggingTool;
    tool.currentPart = node; // the DraggingTool will not call standardMouseSelect
    myDiagram.currentTool = tool; // starts the DraggingTool
    tool.doActivate(); // activates the DraggingTool
    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - copiedParts - : Map<Part, DraggingInfo>

    -
      -
    • -
      -

      Gets the collection of Parts that this tool has copied. - The value is a Map mapping Parts to DraggingInfo Objects - that have a "point" property remembering the original location of that Part. - The value is null when moving instead of copying.

      -

      draggedParts provides the map of Parts that are being moved and from which this collection was copied.

      -
      -
    • -
    -
    -
    - -

    - copiesEffectiveCollection - : boolean

    -
      -
    • -
      -

      Gets or sets whether for a copying operation the extended selection - is copied or only the selected parts. - The default value is true. - Setting this property does not raise any events.

      -

      The CommandHandler.copiesConnectedLinks property serves a similar role for the CommandHandler.copySelection command, - when the user types control-C to copy the currently selected parts.

      -
      -
    • -
    -
    -
    - -

    - copyCursor - : string

    -
      -
    • -
      -

      The cursor to show when a drop is allowed and will result in a copy. - This defaults to 'copy'.

      -
      -
      since
      -

      2.2

      -
      -
      -
      -
    • -
    -
    -
    - -

    - currentPart - : Part

    - -
    -
    - -

    - delay - : number

    -
      -
    • -
      -

      On touch gestures only, this property gets or sets the time in milliseconds - for which the mouse must be stationary before this tool can be started. - The default value is 100 milliseconds. - Setting this property does not raise any events.

      -
      -
    • -
    -
    -
    - -

    - dragOptions - : DraggingOptions

    - -
    -
    - -

    - draggedParts - : Map<Part, DraggingInfo>

    -
      -
    • -
      -

      Gets the collection of Parts being moved. - The value is a Map mapping Parts to DraggingInfo Objects - that have a "point" property remembering the original location of that Part.

      -

      copiedParts provides the map of Parts that have been copied during a copying operation, if any.

      -
      -
    • -
    -
    -
    - -

    - dragsLink - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user can drag a single Link, - disconnecting it from its connected nodes and possibly connecting it - to valid ports when the link is dropped. - The default value is false. - Setting this property does not raise any events.

      -

      In order to avoid too many cases of having both ends of a dragged Link connect to the same node (if allowed), - it is commonplace to decrease the LinkingBaseTool.portGravity to a smaller value such as 10 or 20.

      -

      This property is a convenience getter/setter, and sets a value on dragOptions.

      -
      -
      since
      -

      1.3

      -
      -
      -
      -
    • -
    -
    -
    - -

    - dragsTree - : boolean

    -
      -
    • -
      -

      Gets or sets whether moving or copying a node also includes all of the - node's tree children and their descendants, along with the links to those additional nodes. - The default value is false. - Setting this property does not raise any events.

      -

      The CommandHandler.copiesTree property serves a similar role for the CommandHandler.copySelection command, - when the user types control-C to copy the currently selected parts.

      -

      This property is a convenience getter/setter, and sets a value on dragOptions.

      -
      -
    • -
    -
    -
    - -

    - gridSnapCellSize - : Size

    -
      -
    • -
      -

      Gets or sets the size of the grid cell used when snapping during a drag - if the value of isGridSnapEnabled is true. - By default this property is the Size(NaN, NaN), which causes this tool to use the Panel.gridCellSize value of the Diagram.grid. - Setting this property does not raise any events.

      -

      This property is a convenience getter/setter, and sets a value on dragOptions.

      -
      -
    • -
    -
    -
    - -

    - gridSnapCellSpot - : Spot

    -
      -
    • -
      -

      Gets or sets the Spot that specifies what point in the grid cell dragged parts snap to, - if the value of isGridSnapEnabled is true. - By default this property is Spot.TopLeft: - node locations will snap exactly to the grid point. - Setting this property does not raise any events.

      -

      This property is a convenience getter/setter, and sets a value on dragOptions.

      -
      -
    • -
    -
    -
    - -

    - gridSnapOrigin - : Point

    -
      -
    • -
      -

      Gets or sets the snapping grid's origin point, in document coordinates, - if the value of isGridSnapEnabled is true. - By default this property is the Point(NaN, NaN), - which causes this tool to use the Panel.gridOrigin value from the Diagram.grid. - Setting this property does not raise any events.

      -

      This property is a convenience getter/setter, and sets a value on dragOptions.

      -
      -
    • -
    -
    -
    - -

    - isComplexRoutingRealtime - : boolean

    -
      -
    • -
      -

      Gets or sets whether link routing takes some short-cuts during dragging. - When false Links whose routing is AvoidsNodes are not routed to avoid Nodes, in order to improve dragging performance. - The default value is true.

      -
      -
      since
      -

      1.4

      -
      -
      -
      -
    • -
    -
    -
    - -

    - isCopyEnabled - : boolean

    -
      -
    • -
      -

      Gets or sets whether for any internal copying operation is permitted by control-drag-and-drop. - This property affects the behavior of mayCopy, - but does not affect whether copied objects may be dropped into this diagram from a different diagram.

      -

      The default value is true. - Setting this property does not raise any events.

      -
      -
      since
      -

      1.4

      -
      -
      -
      -
    • -
    -
    -
    - -

    - isGridSnapEnabled - : boolean

    -
      -
    • -
      -

      Gets or sets whether the DraggingTool snaps objects to grid points. - Whether the snapping movement of the dragged parts occurs during the drag or only upon a drop - is determined by the value of isGridSnapRealtime.

      -

      This property does not affect dragging disconnected links, - but those links to respect the Part.dragComputation, which can be used to snap them.

      -

      By default this property is false. - Setting this property does not raise any events.

      -

      This property is a convenience getter/setter, and sets a value on dragOptions.

      -
      -
    • -
    -
    -
    - -

    - isGridSnapRealtime - : boolean

    -
      -
    • -
      -

      Gets or sets whether the DraggingTool snaps objects to grid points during the drag. - This property is ignored unless isGridSnapEnabled is true. - By default this property is true; when false parts are only snapped to grid locations upon the drop (i.e. mouse-up). - Setting this property does not raise any events.

      -

      This property is a convenience getter/setter, and sets a value on dragOptions.

      -
      -
      since
      -

      1.1

      -
      -
      -
      -
    • -
    -
    -
    - -

    - moveCursor - : string

    -
      -
    • -
      -

      The cursor to show when a drop is allowed and will result in a move. - This defaults to the empty string, which refers to the Diagram.defaultCursor.

      -
      -
      since
      -

      2.2

      -
      -
      -
      -
    • -
    -
    -
    - -

    - nodropCursor - : string

    -
      -
    • -
      -

      The cursor to show when a drop is not allowed. - This defaults to 'no-drop'.

      -
      -
      since
      -

      2.2

      -
      -
      -
      -
    • -
    -
    -
    - -

    - startPoint - : Point

    -
      -
    • -
      -

      Gets or sets the mouse point from which parts start to move. - The value is a Point in document coordinates. - This property is normally set to the diagram's mouse-down point in doActivate, - but may be set to a different point if parts are being copied from a different control. - Setting this property does not raise any events.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override Virtual - canStart -

    -
      -
    • canStart(): boolean
    • -
    -
      -
    • -
      -

      This tool can run if the diagram allows selection and moves/copies/dragging-out, - if the mouse has moved far enough away to be a drag and not a click, - and if findDraggablePart has found a selectable part at the mouse-down point.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Virtual - computeEffectiveCollection -

    - -
      -
    • -
      -

      This just calls CommandHandler.computeEffectiveCollection. The implementation of this method was moved to CommandHandler for 2.0.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      - -

      Returns Map<Part, DraggingInfo>

      -

      a Map mapping Parts to DraggingInfo Objects - that have a "point" property remembering the original location of that Part.

      -
    • -
    -
    -
    - -

    - Virtual - computeMove -

    - -
      -
    • -
      -

      This method computes the new location for a Node or simple Part, - given a new desired location and an optional Map of dragged parts, - taking any grid-snapping into consideration, - any Part.dragComputation function, - and any Part.minLocation and Part.maxLocation.

      -

      As of 2.0, this just calls Diagram.computeMove and remains for compatibility.

      -

      This method may be overridden, but should usually be overridden on Diagram. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -
      since
      -

      1.1

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        n: Part
        -
        -

        the Node or simple Part that is being moved

        -
        -
      • -
      • -
        newloc: Point
        -
        -

        the proposed new location

        -
        -
      • -
      • -
        Optional draggedparts: Map<Part, DraggingInfo>
        -
        -

        an optional Map mapping Parts to DraggingInfo Objects - that have a "point" property remembering the original location of that Part.

        -
        -
      • -
      • -
        Optional result: Point
        -
        -

        an optional Point that is modified and returned

        -
        -
      • -
      -

      Returns Point

      -

      the possibly grid-snapped computed Point that is within the minimum and maximum permitted locations

      -
    • -
    -
    -
    - -

    - Override - doActivate -

    -
      -
    • doActivate(): void
    • -
    -
      -
    • -
      -

      Start the dragging operation. - This calls computeEffectiveCollection and saves the result as draggedParts.

      -

      This starts a "Drag" transaction. - Depending on what happens, the transaction may be finished as a "Move" or a "Copy" - transaction, or it may be rolled-back if the tool is cancelled.

      -

      Normally when this method is called the value of currentPart will be null, - in which case this will call Tool.standardMouseSelect which will set currentPart. - But if when this method is called the value of currentPart has already been set - because the programmer wants the user to start dragging that Part, - then this method will not need to call Tool.standardMouseSelect because - the Part(s) to be selected and dragged have already been determined by the caller.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doCancel -

    -
      -
    • doCancel(): void
    • -
    -
      -
    • -
      -

      Abort any dragging operation.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doDeactivate -

    -
      -
    • doDeactivate(): void
    • -
    -
      -
    • -
      -

      Stop the dragging operation by stopping the transaction and cleaning up any temporary state.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - doDragOver -

    - -
      -
    • -
      -

      Perform any additional side-effects during a drag, whether an internal move or copy or an external drag, - that may affect the existing non-moved object(s).

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -
      since
      -

      1.1

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        pt: Point
        -
        -

        a Point in document coordinates.

        -
        -
      • -
      • -
        obj: GraphObject
        -
        -

        the GraphObject at the point, - excluding what is being dragged or temporary objects; - the argument may be null if the drag is occurring in the background of the diagram. - Use GraphObject.part to get the Node or Part at the root of - the visual tree of the stationary object.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - doDropOnto -

    - -
      -
    • -
      -

      Perform any additional side-effects after a drop, whether an internal move or copy or an external drop, - that may affect the existing non-moved object(s).

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -
      since
      -

      1.1

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        pt: Point
        -
        -

        a Point in document coordinates.

        -
        -
      • -
      • -
        obj: GraphObject
        -
        -

        the GraphObject where the drop occurred, - excluding what was dropped or temporary objects; - the argument may be null if the drop occurred in the background of the diagram. - Use GraphObject.part to get the Node or Part at the root of - the visual tree of the stationary object.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doKeyDown -

    -
      -
    • doKeyDown(): void
    • -
    -
      -
    • -
      -

      Handle switching between copying and moving modes as the Control/Option key is pressed or released.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doKeyUp -

    -
      -
    • doKeyUp(): void
    • -
    -
      -
    • -
      -

      Handle switching between copying and moving modes as the Control/Option key is pressed or released.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseMove -

    -
      -
    • doMouseMove(): void
    • -
    -
      -
    • -
      -

      Move the draggedParts (or if copying, the copiedParts) to follow the current mouse point.

      -

      If this creates any temporary parts, by default it adds them to the Tool layer.

      -

      This calls doDragOver for any side-effects on stationary parts.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseUp -

    -
      -
    • doMouseUp(): void
    • -
    -
      -
    • -
      -

      On a mouse-up finish moving or copying the effective selection.

      -

      This calls doDropOnto for any side-effects on stationary parts.

      -

      This also updates the diagram's bounds, - raises a "SelectionCopied" or "SelectionMoved" DiagramEvent, and stops this tool.

      -

      This method also raises the "ChangingSelection" and "ChangedSelection" diagram events. - Changes are performed in a "Drag" transaction, but the "ChangedSelection" event is raised outside the transaction.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - findDraggablePart -

    -
      -
    • findDraggablePart(): Part
    • -
    -
      -
    • -
      -

      Return the selectable and movable/copyable Part at the mouse-down point. - This is called by canStart to decide if this tool is ready to run.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns Part

      -
    • -
    -
    -
    - -

    - Virtual - mayCopy -

    -
      -
    • mayCopy(): boolean
    • -
    -
      -
    • -
      -

      This predicate is true when the diagram allows objects to be copied and inserted, - and some object in the selection is copyable, - and the user is holding down the Control key (Option key on Mac).

      -

      This method may be overridden, although in most cases it is easiest to set Part.copyable. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Virtual - mayMove -

    -
      -
    • mayMove(): boolean
    • -
    -
      -
    • -
      -

      This predicate is true when the diagram allows objects to be moved, - and some object in the selection is movable.

      -

      This method may be overridden, although in most cases it is easiest to set Part.movable. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Virtual - moveParts -

    - -
      -
    • -
      -

      Move a collection Map of Parts by a given offset.

      -

      If check is true this respects the Part.canMove predicate for Nodes or simple Parts - when this is the Diagram.currentTool. - It also respects isGridSnapEnabled in order to try to automatically snap part locations to a grid. - And it also uses the Part.dragComputation function, if any, to determine the new location for each part.

      -

      The first argument is a Map as produced by computeEffectiveCollection, - not a List or Set or Iterator of Parts. - Call Diagram.moveParts if you want to move a simple collection of Parts without having to create the argument Map.

      -
      -
      since
      -

      1.1

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        parts: Map<Part, DraggingInfo>
        -
        -

        a Map mapping Parts to DraggingInfo Objects - that have a "point" property remembering the original location of that Part.

        -
        -
      • -
      • -
        offset: Point
        -
        -

        The offset, before snapping, to move parts. - This offset reflects the total amount moved during tool operation, - based on original Part locations remembered when the DraggingTool activated.

        -
        -
      • -
      • -
        Optional check: boolean
        -
        -

        Whether to check Part.canMove on each part. The default value is false.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override Virtual - standardMouseSelect -

    -
      -
    • standardMouseSelect(): void
    • -
    -
      -
    • -
      -

      This override prevents the Control modifier unselecting an already selected part. - This also remembers the selectable currentPart at the current mouse point.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override Virtual - stopTransaction -

    -
      -
    • stopTransaction(): boolean
    • -
    -
      -
    • -
      -

      This calls the super Tool.stopTransaction method, and if the result is true, - attempts to optimize the transaction by removing all changes except the first and last - by calling Transaction.optimize.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns boolean

      -

      the result of the call to rollback or commit the transaction.

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/DrawCommandHandler.html b/api/symbols/DrawCommandHandler.html index 2ff794d74..845ac7240 100644 --- a/api/symbols/DrawCommandHandler.html +++ b/api/symbols/DrawCommandHandler.html @@ -1,667 +1,103 @@ - - - - - - DrawCommandHandler | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class DrawCommandHandler

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    This CommandHandler class allows the user to position selected Parts in a diagram - relative to the first part selected, in addition to overriding the doKeyDown method - of the CommandHandler for handling the arrow keys in additional manners.

    -

    Typical usage:

    -
      $(go.Diagram, "myDiagramDiv",
    -    {
    -      commandHandler: $(DrawCommandHandler),
    -      . . .
    -    }
    -  )
    +DrawCommandHandler | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class DrawCommandHandler Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    This CommandHandler class allows the user to position selected Parts in a diagram +relative to the first part selected, in addition to overriding the doKeyDown method +of the CommandHandler for handling the arrow keys in additional manners.

    +

    Typical usage:

    +
      $(go.Diagram, "myDiagramDiv",
    {
    commandHandler: $(DrawCommandHandler),
    . . .
    }
    )
    -

    or:

    -
       myDiagram.commandHandler = new DrawCommandHandler();
    +

    or:

    +
       myDiagram.commandHandler = new DrawCommandHandler();
     
    -

    If you want to experiment with this extension, try the Drawing Commands sample.

    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      The constructor produces a CommandHandler with the default key bindings.

      -
      -

      Returns DrawCommandHandler

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - arrowKeyBehavior - : string

    -
      -
    • -
      -

      Gets or sets the arrow key behavior. Possible values are "move", "select", and "scroll".

      -

      The default value is "move".

      -
      -
    • -
    -
    -
    - -

    - pasteOffset - : Point

    -
      -
    • -
      -

      Gets or sets the offset at which each repeated pasteSelection puts the new copied parts from the clipboard.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - alignBottom -

    -
      -
    • alignBottom(): void
    • -
    -
      -
    • -
      -

      Aligns selected parts at the bottom-most edge of the bottom-most part.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - alignCenterX -

    -
      -
    • alignCenterX(): void
    • -
    -
      -
    • -
      -

      Aligns selected parts at the x-value of the center point of the first selected part.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - alignCenterY -

    -
      -
    • alignCenterY(): void
    • -
    -
      -
    • -
      -

      Aligns selected parts at the y-value of the center point of the first selected part.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - alignColumn -

    -
      -
    • alignColumn(distance: number): void
    • -
    -
      -
    • -
      -

      Aligns selected parts top-to-bottom in order of the order selected. - Distance between parts can be specified. Default distance is 0.

      -
      -

      Parameters

      -
        -
      • -
        distance: number
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - alignLeft -

    -
      -
    • alignLeft(): void
    • -
    -
      -
    • -
      -

      Aligns selected parts along the left-most edge of the left-most part.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - alignRight -

    -
      -
    • alignRight(): void
    • -
    -
      -
    • -
      -

      Aligns selected parts at the right-most edge of the right-most part.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - alignRow -

    -
      -
    • alignRow(distance: number): void
    • -
    -
      -
    • -
      -

      Aligns selected parts left-to-right in order of the order selected. - Distance between parts can be specified. Default distance is 0.

      -
      -

      Parameters

      -
        -
      • -
        distance: number
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - alignTop -

    -
      -
    • alignTop(): void
    • -
    -
      -
    • -
      -

      Aligns selected parts at the top-most edge of the top-most part.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - canAlignSelection -

    -
      -
    • canAlignSelection(): boolean
    • -
    - -
    -
    - -

    - canRotate -

    -
      -
    • canRotate(): boolean
    • -
    -
      -
    • -
      -

      This controls whether or not the user can invoke the rotate command.

      -
      -

      Returns boolean

      -

      This returns true: - if the diagram is not Diagram.isReadOnly, - if the model is not Model.isReadOnly, and - if there is at least one selected Part.

      -
    • -
    -
    -
    - -

    - Override - copyToClipboard -

    - -
      -
    • -
      -

      Reset the last offset for pasting.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doKeyDown -

    -
      -
    • doKeyDown(): void
    • -
    -
      -
    • -
      -

      This implements custom behaviors for arrow key keyboard events. - Set arrowKeyBehavior to "select", "move" (the default), "scroll" (the standard behavior), or "none" - to affect the behavior when the user types an arrow key.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - pasteFromClipboard -

    -
      -
    • pasteFromClipboard(): Set<Part>
    • -
    -
      -
    • -
      -

      Paste from the clipboard with an offset incremented on each paste, and reset when copied.

      -
      -

      Returns Set<Part>

      -

      a collection of newly pasted Parts

      -
    • -
    -
    -
    - -

    - pullToFront -

    -
      -
    • pullToFront(): void
    • -
    -
      -
    • -
      -

      Change the z-ordering of selected parts to pull them forward, in front of all other parts - in their respective layers. - All unselected parts in each layer with a selected Part with a non-numeric Part.zOrder will get a zOrder of zero.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - pushToBack -

    -
      -
    • pushToBack(): void
    • -
    -
      -
    • -
      -

      Change the z-ordering of selected parts to push them backward, behind of all other parts - in their respective layers. - All unselected parts in each layer with a selected Part with a non-numeric Part.zOrder will get a zOrder of zero.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - rotate -

    -
      -
    • rotate(angle: number): void
    • -
    -
      -
    • -
      -

      Change the angle of the parts connected with the given part. This is in the command handler - so it can be easily accessed for the purpose of creating commands that change the rotation of a part.

      -
      -

      Parameters

      -
        -
      • -
        angle: number
        -
        -

        the positive (clockwise) or negative (counter-clockwise) change in the rotation angle of each Part, in degrees.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/FishboneLayout.html b/api/symbols/FishboneLayout.html index c0b1b56ba..e1b3958ec 100644 --- a/api/symbols/FishboneLayout.html +++ b/api/symbols/FishboneLayout.html @@ -1,405 +1,60 @@ - - - - - - FishboneLayout | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class FishboneLayout

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    FishboneLayout is a custom Layout derived from TreeLayout for creating "fishbone" diagrams. - A fishbone diagram also requires a Link class that implements custom routing, FishboneLink.

    -

    This only works for angle === 0 or angle === 180.

    -

    This layout assumes Links are automatically routed in the way needed by fishbone diagrams, - by using the FishboneLink class instead of go.Link.

    -

    If you want to experiment with this extension, try the Fishbone Layout sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Methods

    -
    - -

    - Override - assignTreeVertexValues -

    - - -
    -
    - -

    - Override - commitLinks -

    -
      -
    • commitLinks(): void
    • -
    -
      -
    • -
      -

      This override stops links from being committed since the work is done by the FishboneLink class.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - commitNodes -

    -
      -
    • commitNodes(): void
    • -
    -
      -
    • -
      -

      Assigns Link.fromSpots and Link.toSpots based on branching and angle - and moves vertexes based on dummy locations.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - makeNetwork -

    - -
      -
    • -
      -

      Create and initialize a LayoutNetwork with the given nodes and links. - This override creates dummy vertexes, when necessary, to allow for proper positioning within the fishbone.

      -
      -

      Parameters

      - -

      Returns LayoutNetwork

      -
    • -
    -
    -
    - -

    - shift -

    - -
      -
    • -
      -

      Shifts subtrees within the fishbone based on angle and node spacing.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - shiftAll -

    - -
      -
    • -
      -

      Shifts a subtree.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class FishboneLayout Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    FishboneLayout is a custom Layout derived from TreeLayout for creating "fishbone" diagrams. +A fishbone diagram also requires a Link class that implements custom routing, FishboneLink.

    +

    This only works for angle === 0 or angle === 180.

    +

    This layout assumes Links are automatically routed in the way needed by fishbone diagrams, +by using the FishboneLink class instead of go.Link.

    +

    If you want to experiment with this extension, try the Fishbone Layout sample.

    +

    Index

    Inherited Members

    Properties

    Methods

    Constructors

    Methods

    • commitLinks(): void
    • +

      This override stops links from being committed since the work is done by the FishboneLink class.

      +

      Returns void

    • commitNodes(): void
    • +

      Assigns Link.fromSpots and Link.toSpots based on branching and angle +and moves vertexes based on dummy locations.

      +

      Returns void

    • +

      Shifts subtrees within the fishbone based on angle and node spacing.

      +

      Parameters

      Returns void

    • +

      Shifts a subtree.

      +

      Parameters

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/FishboneLink.html b/api/symbols/FishboneLink.html index c2b3cf83c..a47b7ff8a 100644 --- a/api/symbols/FishboneLink.html +++ b/api/symbols/FishboneLink.html @@ -1,299 +1,48 @@ - - - - - - FishboneLink | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class FishboneLink

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    Custom Link class for FishboneLayout.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Constructs an empty link that does not connect any nodes. - If you want the link to be seen, you must provide a Shape as an element - to be used as the visual path for the link.

      -

      Usage example:

      -
      // Constructs a Link, sets properties on it,
      -// adds a data binding to it,
      -// and adds two Shapes to the Link:
      -const l = new go.Link({
      -  routing: go.Link.Orthogonal
      -})
      -.add(new go.Shape({ strokeWidth: 2 }))
      -.add(new go.Shape({ toArrow: "Standard" }))
      +FishboneLink | GoJS API
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class FishboneLink Extension

      This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

      Hierarchy

      +

      Custom Link class for FishboneLayout.

      +

      Index

      Inherited Members

      Properties

      Methods

      Constructors

      • +

        Constructs an empty link that does not connect any nodes. +If you want the link to be seen, you must provide a Shape as an element +to be used as the visual path for the link.

        +

        Usage example:

        +
        // Constructs a Link, sets properties on it,
        // adds a data binding to it,
        // and adds two Shapes to the Link:
        const l = new go.Link({
        routing: go.Link.Orthogonal
        })
        .add(new go.Shape({ strokeWidth: 2 }))
        .add(new go.Shape({ toArrow: "Standard" }))
        -
        -

        Parameters

        -
          -
        • -
          Optional init: Partial<Link>
          -
          -

          Optional initialization properties.

          -
          -
        • -
        -

        Returns FishboneLink

        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - Override - computeAdjusting -

      -
        -
      • computeAdjusting(): EnumValue
      • -
      -
        -
      • -

        Returns EnumValue

        -
      • -
      -
      -
      - -

      - Override - computePoints -

      -
        -
      • computePoints(): boolean
      • -
      -
        -
      • -
        -

        Determines the points for this link based on spots and maintains horizontal lines.

        -
        -

        Returns boolean

        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/ForceDirectedEdge.html b/api/symbols/ForceDirectedEdge.html index da53204fe..573794485 100644 --- a/api/symbols/ForceDirectedEdge.html +++ b/api/symbols/ForceDirectedEdge.html @@ -1,252 +1,41 @@ - - - - - - ForceDirectedEdge | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class ForceDirectedEdge

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      Hierarchy

      - -
      -
      -
      -

      This holds ForceDirectedLayout-specific information about Links.

      -

      This class inherits from LayoutEdge.

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -

      Properties

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - - -
      -
      -
      -

      Properties

      -
      - -

      - length - : number

      -
        -
      • -
        -

        Gets or sets the length of this edge. - The default value is NaN.

        -
        -
      • -
      -
      -
      - -

      - stiffness - : number

      -
        -
      • -
        -

        Gets or sets this edge's stiffness or resistance to compression or stretching. - The default value is NaN.

        -
        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class ForceDirectedEdge

      Hierarchy

      +

      This holds ForceDirectedLayout-specific information about Links.

      +

      This class inherits from LayoutEdge.

      +

      Index

      Constructors

      Properties

      Inherited Members

      Constructors

      Properties

      • +

        Gets or sets the length of this edge. +The default value is NaN.

        +
      • +

        Gets or sets this edge's stiffness or resistance to compression or stretching. +The default value is NaN.

        +

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/ForceDirectedLayout.html b/api/symbols/ForceDirectedLayout.html index e9c649770..db58f424b 100644 --- a/api/symbols/ForceDirectedLayout.html +++ b/api/symbols/ForceDirectedLayout.html @@ -1,1118 +1,267 @@ - - - - - - ForceDirectedLayout | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class ForceDirectedLayout

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      Hierarchy

      -
        -
      • - Layout -
          -
        • - ForceDirectedLayout -
        • -
        -
      • -
      -
      -
      -
      -

      Force-directed layout treats the graph as if it were a system of physical bodies - with repulsive electrical, attractional gravitational, and spring forces acting on them and between them.

      -

      Electrical forces come both from the field at the vertex's location as well as from neighboring vertexes and are quadratic by distance. - Gravitational forces come from the field at the vertex's location and are constant. - Spring forces are only exerted between two different vertexes that are connected by an edge and are linear by distance.

      -

      The electrical forces on a vertex are the sum of the electrical charge times the electrical field at that location - (electricalCharge, electricalFieldX, electricalFieldY) - and the electrical forces of all nearby vertexes divided by the square of the distance between them. - You can easily assign the electrical charge for all vertexes by assigning defaultElectricalCharge. - By default there is no electrical field, so all forces are due to nearby charged vertexes. - For efficiency, infinityDistance determines a cut-off distance between vertexes for which to consider any influence.

      -

      The gravitational forces on a vertex are the sum of the gravitational mass times the gravitational field at that location - (gravitationalMass, gravitationalFieldX, gravitationalFieldY). - You can easily assign the gravitational mass for all vertexes by assigning defaultGravitationalMass. - By default there is no gravitational field.

      -

      The spring forces on a vertex are only exerted by the edges connecting it with other vertexes. - The force along an edge is the stiffness of the spring times the difference of the distance between the vertexes and the nominal length of the spring - (springStiffness, springLength) divided by the distance between the vertexes. - When the distance is less than the nominal length, the force pushes the vertexes apart; when the distance is greater, the force pulls them together. - You can easily assign the spring length and stiffness for all edges by assigning defaultSpringLength and defaultSpringStiffness.

      -

      When the distance between two vertexes is less than one unit, this uses a random number generator to decide which direction the forces should go. - For layouts that start with all of the vertexes at the same location, this results in potentially dramatically different results. - Set randomNumberGenerator to null in order to produce reproducible results given the same initial vertex locations.

      -

      The algorithm seeks a configuration of the bodies with locally minimal energy, - i.e. vertex positions such that the sum of the forces on each vertex is zero. - This is achieved by repeatedly computing the forces on each vertex, moving them, and repeating. - Computations stop when no vertex moves more than epsilonDistance or when maxIterations have happened.

      -

      The layout cannot guarantee that it provides optimal positioning of nodes. - Nodes will normally not overlap each other, but when there is a dense interconnectivity overlaps might not be avoidable.

      -

      - If you want to experiment interactively with most of the properties, try the Force Directed Layout sample. - See samples that make use of ForceDirectedLayout in the samples index. -

      This layout makes use of a LayoutNetwork of - ForceDirectedVertexes and ForceDirectedEdges that normally - correspond to the Nodes and Links of the Diagram.

      -
      -
      -
      -

      Index

      -
      - -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - - -
      -
      -
      -

      Properties

      -
      - -

      - arrangementSpacing - : Size

      -
        -
      • -
        -

        Gets or sets the space between which the layout - will position the connected graphs that together compose the network. - This defaults to Size(100, 100). - These distances are used during a clustered layout; - afterwards the normal force-directed layout - will likely cause the size of any space between connected graphs to change, - perhaps considerably.

        -
        -
      • -
      -
      -
      - -

      - arrangesToOrigin - : boolean

      - -
      -
      - -

      - comments - : boolean

      -
        -
      • -
        -

        Gets or sets whether this layout should find all Nodes - whose category is "Comment" and - whose anchors are nodes represented in the network, - and add ForceDirectedVertexes representing those balloon comments - as nodes in the network. - The default value is false.

        -
        -
      • -
      -
      -
      - -

      - Read-only - currentIteration - : number

      -
        -
      • -
        -

        This read-only property returns the current iteration count, valid during a call to doLayout.

        -
        -
      • -
      -
      -
      - -

      - defaultCommentElectricalCharge - : number

      -
        -
      • -
        -

        Gets or sets the default value computed by electricalCharge. - The initial value is 5.

        -
        -
      • -
      -
      -
      - -

      - defaultCommentSpringLength - : number

      -
        -
      • -
        -

        Gets or sets the default value computed by springLength. - The initial value is 10.

        -
        -
      • -
      -
      -
      - -

      - defaultElectricalCharge - : number

      -
        -
      • -
        -

        Gets or sets the default value computed by electricalCharge. - The initial value is 150.

        -
        -
      • -
      -
      -
      - -

      - defaultGravitationalMass - : number

      -
        -
      • -
        -

        Gets or sets the default value computed by gravitationalMass. - The initial value is zero.

        -
        -
      • -
      -
      -
      - -

      - defaultSpringLength - : number

      -
        -
      • -
        -

        Gets or sets the default value computed by springLength. - The initial value is 50.

        -
        -
      • -
      -
      -
      - -

      - defaultSpringStiffness - : number

      -
        -
      • -
        -

        Gets or sets the default value computed by springStiffness. - The initial value is 0.05.

        -
        -
      • -
      -
      -
      - -

      - epsilonDistance - : number

      -
        -
      • -
        -

        Gets or sets approximately how far a node must move in order for the iterations to continue. - The default value is 1. - The value must be larger than zero.

        -
        -
      • -
      -
      -
      - -

      - infinityDistance - : number

      -
        -
      • -
        -

        Gets or sets a threshold for the distance beyond which the electrical charge forces may be ignored. - The default value is 1000. - The value must be larger than 1.

        -
        -
      • -
      -
      -
      - -

      - maxIterations - : number

      -
        -
      • -
        -

        Gets or sets the maximum number of iterations to perform when doing the - force-directed auto layout. - The value must be non-negative. - The default value is 100.

        -
        -
      • -
      -
      -
      - -

      - moveLimit - : number

      -
        -
      • -
        -

        Gets or sets how far a vertex may be moved in an iteration. - The default value is 10. - The value must be larger than 1.

        -
        -
        since
        -

        1.8

        -
        -
        -
        -
      • -
      -
      -
      - -

      - randomNumberGenerator - : { random: () => number }

      -
        -
      • -
        -

        Gets or sets a random number generator. - The default value is Math, which results in calling Math.random(). - Change this to null in order to use an instance of an internal repeatable pseudo-random number generator, - which will become the new value of this property.

        -

        The new value must be either null or an Object with a method named "random" taking zero arguments - and returning a random number between zero (inclusive) and one (exclusive).

        -
        -
        since
        -

        1.5

        -
        -
        -
        -
      • -
      -
      -
      - -

      - setsPortSpots - : boolean

      -
        -
      • -
        -

        Gets or sets whether the fromSpot and the toSpot of every Link - should be set to Spot.Default. - The default value is true.

        -
        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - Virtual - addComments -

      - - -
      -
      - -

      - Protected Override - commitLayout -

      -
        -
      • commitLayout(): void
      • -
      -
        -
      • -
        -

        Set the fromSpot and toSpot on each Link, position each Node according - to the vertex position, and then position/route the Links.

        -

        This calls the commitNodes and commitLinks methods, the latter only if isRouting is true. - You should not call this method -- it is a "protected virtual" method. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Protected Virtual - commitLinks -

      -
        -
      • commitLinks(): void
      • -
      -
        -
      • -
        -

        Routes the links.

        -

        This is called by commitLayout. - This is only called if Layout.isRouting is true. - See also commitNodes. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Protected Virtual - commitNodes -

      -
        -
      • commitNodes(): void
      • -
      -
        -
      • -
        -

        Commit the position of all nodes.

        -

        This is called by commitLayout. - See also commitLinks. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - createNetwork -

      - - -
      -
      - -

      - Override - doLayout -

      - - -
      -
      - -

      - Virtual - electricalCharge -

      - -
        -
      • -
        -

        Returns the charge of the vertex, - the value of ForceDirectedVertex.charge if it's a number, - or else the value of defaultElectricalCharge.

        -

        The electrical forces between two vertexes decrease by the square of the distance between them. - Vertexes that are more than infinityDistance apart are assumed to have no electrical charge effect on each other.

        -

        Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Parameters

        - -

        Returns number

        -
      • -
      -
      -
      - -

      - Virtual - electricalFieldX -

      -
        -
      • electricalFieldX(x: number, y: number): number
      • -
      -
        -
      • -
        -

        Returns the electrical field in the X direction acting on a vertex at the given point. - By default there is no electrical field at any location.

        -

        Used to define an external electrical field at a point independent of the vertex charges. - A vertex L is acted upon by a force in the X direction of proportional to - electricalFieldX(L.center.x, L.center.y) * electricalCharge(L). - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Parameters

        -
          -
        • -
          x: number
          -
        • -
        • -
          y: number
          -
        • -
        -

        Returns number

        -

        the default implementation returns zero.

        -
      • -
      -
      -
      - -

      - Virtual - electricalFieldY -

      -
        -
      • electricalFieldY(x: number, y: number): number
      • -
      -
        -
      • -
        -

        Returns the electrical field in the Y direction acting on a vertex at the given point. - By default there is no electrical field at any location.

        -

        Used to define an external electrical field at a point independent of the vertex charges. - A vertex L is acted upon by a force in the Y direction of proportional to - electricalFieldY(L.center.x, L.center.y) * electricalCharge(L). - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Parameters

        -
          -
        • -
          x: number
          -
        • -
        • -
          y: number
          -
        • -
        -

        Returns number

        -

        the default implementation returns zero.

        -
      • -
      -
      -
      - -

      - Virtual - gravitationalFieldX -

      -
        -
      • gravitationalFieldX(x: number, y: number): number
      • -
      -
        -
      • -
        -

        This returns the gravitational field in the X direction acting on a vertex at the given point. - By default there is no gravitational field at any location.

        -

        Used to define an external gravitational field at a point independent of the vertex masses. - A vertex L is acted upon by a force in the X direction of proportional to - gravitationalFieldX(L.center.x, L.center.y) * gravitationalMass(L). - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Parameters

        -
          -
        • -
          x: number
          -
        • -
        • -
          y: number
          -
        • -
        -

        Returns number

        -

        the default implementation returns zero.

        -
      • -
      -
      -
      - -

      - Virtual - gravitationalFieldY -

      -
        -
      • gravitationalFieldY(x: number, y: number): number
      • -
      -
        -
      • -
        -

        This returns the gravitational field in the Y direction acting on a vertex at the given point. - By default there is no gravitational field at any location.

        -

        Used to define an external gravitational field at a point independent of the vertex masses. - A vertex L is acted upon by a force in the Y direction of proportional to - gravitationalFieldY(L.center.x, L.center.y) * gravitationalMass(L). - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Parameters

        -
          -
        • -
          x: number
          -
        • -
        • -
          y: number
          -
        • -
        -

        Returns number

        -

        the default implementation returns zero.

        -
      • -
      -
      -
      - -

      - Virtual - gravitationalMass -

      - - -
      -
      - -

      - Virtual - isFixed -

      - -
        -
      • -
        -

        This predicate returns true if the vertex should not be moved - by the layout algorithm but still have an effect on nearby and connected vertexes. - The default implementation returns ForceDirectedVertex.isFixed. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Parameters

        - -

        Returns boolean

        -

        returns true if the node should not be moved by the layout algorithm.

        -
      • -
      -
      -
      - -

      - Virtual - moveFixedVertex -

      - -
        -
      • -
        -

        Maybe move a vertex that isFixed. - This is called each iteration on each such vertex. - By default this does nothing.

        -
        -

        Parameters

        - -

        Returns void

        -
      • -
      -
      -
      - -

      - Virtual - springLength -

      - -
        -
      • -
        -

        Returns the length of the spring representing an edge. - The two vertexes connected by the edge E are acted upon by a force of proportional to - springStiffness(E) * (getNodeDistance(E.fromVertex, E.toVertex) - springLength(E)) divided by the distance between the vertexes. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Parameters

        - -

        Returns number

        -

        Returns the length of the edge representing a link, - the value of ForceDirectedEdge.length if it's a number, - or else the value of defaultSpringLength.

        -
      • -
      -
      -
      - -

      - Virtual - springStiffness -

      - -
        -
      • -
        -

        Returns the stiffness of the spring representing an edge.

        -

        The spring force between two vertexes connected by an edge is linearly proportional by distance - to the difference between the springLength and the distance. - When the distance is greater than the length, the force pulls the vertexes closer to each other. - When the distance is less than the length, the force pushes them apart.

        -

        The two vertexes connected by the edge E are acted upon by a force of proportional to - springStiffness(E) * (getNodeDistance(E.fromVertex, E.toVertex) - springLength(E)) divided by the distance between the vertexes. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Parameters

        - -

        Returns number

        -

        Returns the stiffness of the edge representing a link, - the value of ForceDirectedEdge.stiffness if it's a number, - or else the value of defaultSpringStiffness.

        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class ForceDirectedLayout

      Hierarchy

      +

      Force-directed layout treats the graph as if it were a system of physical bodies +with repulsive electrical, attractional gravitational, and spring forces acting on them and between them.

      +

      Electrical forces come both from the field at the vertex's location as well as from neighboring vertexes and are quadratic by distance. +Gravitational forces come from the field at the vertex's location and are constant. +Spring forces are only exerted between two different vertexes that are connected by an edge and are linear by distance.

      +

      The electrical forces on a vertex are the sum of the electrical charge times the electrical field at that location +(electricalCharge, electricalFieldX, electricalFieldY) +and the electrical forces of all nearby vertexes divided by the square of the distance between them. +You can easily assign the electrical charge for all vertexes by assigning defaultElectricalCharge. +By default there is no electrical field, so all forces are due to nearby charged vertexes. +For efficiency, infinityDistance determines a cut-off distance between vertexes for which to consider any influence.

      +

      The gravitational forces on a vertex are the sum of the gravitational mass times the gravitational field at that location +(gravitationalMass, gravitationalFieldX, gravitationalFieldY). +You can easily assign the gravitational mass for all vertexes by assigning defaultGravitationalMass. +By default there is no gravitational field.

      +

      The spring forces on a vertex are only exerted by the edges connecting it with other vertexes. +The force along an edge is the stiffness of the spring times the difference of the distance between the vertexes and the nominal length of the spring +(springStiffness, springLength) divided by the distance between the vertexes. +When the distance is less than the nominal length, the force pushes the vertexes apart; when the distance is greater, the force pulls them together. +You can easily assign the spring length and stiffness for all edges by assigning defaultSpringLength and defaultSpringStiffness.

      +

      When the distance between two vertexes is less than one unit, this uses a random number generator to decide which direction the forces should go. +For layouts that start with all of the vertexes at the same location, this results in potentially dramatically different results. +Set randomNumberGenerator to null in order to produce reproducible results given the same initial vertex locations.

      +

      The algorithm seeks a configuration of the bodies with locally minimal energy, +i.e. vertex positions such that the sum of the forces on each vertex is zero. +This is achieved by repeatedly computing the forces on each vertex, moving them, and repeating. +Computations stop when no vertex moves more than epsilonDistance or when maxIterations have happened.

      +

      The layout cannot guarantee that it provides optimal positioning of nodes. +Nodes will normally not overlap each other, but when there is a dense interconnectivity overlaps might not be avoidable.

      +

      +If you want to experiment interactively with most of the properties, try the Force Directed Layout sample. +See samples that make use of ForceDirectedLayout in the samples index. - // topnav - var topButton = document.getElementById("topnavButton"); - var topnavList = document.getElementById("topnavList"); - topButton.addEventListener("click", function() { - this.classList.toggle("active"); - topnavList.classList.toggle("hidden"); - document.getElementById("topnavOpen").classList.toggle("hidden"); - document.getElementById("topnavClosed").classList.toggle("hidden"); - }); - - - \ No newline at end of file +

      This layout makes use of a LayoutNetwork of +ForceDirectedVertexes and ForceDirectedEdges that normally +correspond to the Nodes and Links of the Diagram.

      +

      Index

      Inherited Members

      Constructors

      Properties

      • +

        Gets or sets the space between which the layout +will position the connected graphs that together compose the network. +This defaults to Size(100, 100). +These distances are used during a clustered layout; +afterwards the normal force-directed layout +will likely cause the size of any space between connected graphs to change, +perhaps considerably.

        +
      • +

        Gets or sets whether this layout should find all Nodes +whose category is "Comment" and +whose anchors are nodes represented in the network, +and add ForceDirectedVertexes representing those balloon comments +as nodes in the network. +The default value is false.

        +
      • +

        This read-only property returns the current iteration count, valid during a call to doLayout.

        +
      • +

        Gets or sets the default value computed by electricalCharge. +The initial value is 5.

        +
      • +

        Gets or sets the default value computed by springLength. +The initial value is 10.

        +
      • +

        Gets or sets the default value computed by electricalCharge. +The initial value is 150.

        +
      • +

        Gets or sets the default value computed by gravitationalMass. +The initial value is zero.

        +
      • +

        Gets or sets the default value computed by springLength. +The initial value is 50.

        +
      • +

        Gets or sets the default value computed by springStiffness. +The initial value is 0.05.

        +
      • +

        Gets or sets approximately how far a node must move in order for the iterations to continue. +The default value is 1. +The value must be larger than zero.

        +
      • +

        Gets or sets a threshold for the distance beyond which the electrical charge forces may be ignored. +The default value is 1000. +The value must be larger than 1.

        +
      • +

        Gets or sets the maximum number of iterations to perform when doing the +force-directed auto layout. +The value must be non-negative. +The default value is 100.

        +
      • +

        Gets or sets how far a vertex may be moved in an iteration. +The default value is 10. +The value must be larger than 1.

        +
        since

        1.8

        +
      • +

        Gets or sets a random number generator. +The default value is Math, which results in calling Math.random(). +Change this to null in order to use an instance of an internal repeatable pseudo-random number generator, +which will become the new value of this property.

        +

        The new value must be either null or an Object with a method named "random" taking zero arguments +and returning a random number between zero (inclusive) and one (exclusive).

        +
        since

        1.5

        +
      • +

        Gets or sets whether the fromSpot and the toSpot of every Link +should be set to Spot.Default. +The default value is true.

        +

      Methods

      • commitLayout(): void
      • +

        Set the fromSpot and toSpot on each Link, position each Node according +to the vertex position, and then position/route the Links.

        +

        This calls the commitNodes and commitLinks methods, the latter only if isRouting is true. +You should not call this method -- it is a "protected virtual" method. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Returns void

      • commitLinks(): void
      • +

        Routes the links.

        +

        This is called by commitLayout. +This is only called if Layout.isRouting is true. +See also commitNodes. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Returns void

      • commitNodes(): void
      • +

        Commit the position of all nodes.

        +

        This is called by commitLayout. +See also commitLinks. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Returns void

      • +

        Returns the charge of the vertex, +the value of ForceDirectedVertex.charge if it's a number, +or else the value of defaultElectricalCharge.

        +

        The electrical forces between two vertexes decrease by the square of the distance between them. +Vertexes that are more than infinityDistance apart are assumed to have no electrical charge effect on each other.

        +

        Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Parameters

        Returns number

      • electricalFieldX(x: number, y: number): number
      • +

        Returns the electrical field in the X direction acting on a vertex at the given point. +By default there is no electrical field at any location.

        +

        Used to define an external electrical field at a point independent of the vertex charges. +A vertex L is acted upon by a force in the X direction of proportional to +electricalFieldX(L.center.x, L.center.y) * electricalCharge(L). +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Parameters

        • x: number
        • y: number

        Returns number

        the default implementation returns zero.

        +
      • electricalFieldY(x: number, y: number): number
      • +

        Returns the electrical field in the Y direction acting on a vertex at the given point. +By default there is no electrical field at any location.

        +

        Used to define an external electrical field at a point independent of the vertex charges. +A vertex L is acted upon by a force in the Y direction of proportional to +electricalFieldY(L.center.x, L.center.y) * electricalCharge(L). +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Parameters

        • x: number
        • y: number

        Returns number

        the default implementation returns zero.

        +
      • gravitationalFieldX(x: number, y: number): number
      • +

        This returns the gravitational field in the X direction acting on a vertex at the given point. +By default there is no gravitational field at any location.

        +

        Used to define an external gravitational field at a point independent of the vertex masses. +A vertex L is acted upon by a force in the X direction of proportional to +gravitationalFieldX(L.center.x, L.center.y) * gravitationalMass(L). +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Parameters

        • x: number
        • y: number

        Returns number

        the default implementation returns zero.

        +
      • gravitationalFieldY(x: number, y: number): number
      • +

        This returns the gravitational field in the Y direction acting on a vertex at the given point. +By default there is no gravitational field at any location.

        +

        Used to define an external gravitational field at a point independent of the vertex masses. +A vertex L is acted upon by a force in the Y direction of proportional to +gravitationalFieldY(L.center.x, L.center.y) * gravitationalMass(L). +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Parameters

        • x: number
        • y: number

        Returns number

        the default implementation returns zero.

        +
      • +

        This predicate returns true if the vertex should not be moved +by the layout algorithm but still have an effect on nearby and connected vertexes. +The default implementation returns ForceDirectedVertex.isFixed. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Parameters

        Returns boolean

        returns true if the node should not be moved by the layout algorithm.

        +
      • +

        Maybe move a vertex that isFixed. +This is called each iteration on each such vertex. +By default this does nothing.

        +

        Parameters

        Returns void

      • +

        Returns the length of the spring representing an edge. +The two vertexes connected by the edge E are acted upon by a force of proportional to +springStiffness(E) * (getNodeDistance(E.fromVertex, E.toVertex) - springLength(E)) divided by the distance between the vertexes. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Parameters

        Returns number

        Returns the length of the edge representing a link, +the value of ForceDirectedEdge.length if it's a number, +or else the value of defaultSpringLength.

        +
      • +

        Returns the stiffness of the spring representing an edge.

        +

        The spring force between two vertexes connected by an edge is linearly proportional by distance +to the difference between the springLength and the distance. +When the distance is greater than the length, the force pulls the vertexes closer to each other. +When the distance is less than the length, the force pushes them apart.

        +

        The two vertexes connected by the edge E are acted upon by a force of proportional to +springStiffness(E) * (getNodeDistance(E.fromVertex, E.toVertex) - springLength(E)) divided by the distance between the vertexes. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +

        Parameters

        Returns number

        Returns the stiffness of the edge representing a link, +the value of ForceDirectedEdge.stiffness if it's a number, +or else the value of defaultSpringStiffness.

        +

      Settings

      Theme

      + \ No newline at end of file diff --git a/api/symbols/ForceDirectedNetwork.html b/api/symbols/ForceDirectedNetwork.html index 89be640e3..047312a41 100644 --- a/api/symbols/ForceDirectedNetwork.html +++ b/api/symbols/ForceDirectedNetwork.html @@ -1,211 +1,40 @@ - - - - - - ForceDirectedNetwork | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class ForceDirectedNetwork

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      Hierarchy

      - -
      -
      -
      -

      This class represents an abstract graph of ForceDirectedVertexes and ForceDirectedEdges - that can be constructed based on the Nodes and Links of a Diagram - so that the ForceDirectedLayout can operate independently of the diagram until it - is time to commit any node positioning or link routing.

      -

      This class inherits from LayoutNetwork.

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - - -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class ForceDirectedNetwork

      Hierarchy

      +

      This class represents an abstract graph of ForceDirectedVertexes and ForceDirectedEdges +that can be constructed based on the Nodes and Links of a Diagram +so that the ForceDirectedLayout can operate independently of the diagram until it +is time to commit any node positioning or link routing.

      +

      This class inherits from LayoutNetwork.

      +

      Index

      Constructors

      Inherited Members

      Constructors

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/ForceDirectedVertex.html b/api/symbols/ForceDirectedVertex.html index 97b648cfa..62d7ad3db 100644 --- a/api/symbols/ForceDirectedVertex.html +++ b/api/symbols/ForceDirectedVertex.html @@ -1,306 +1,50 @@ - - - - - - ForceDirectedVertex | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class ForceDirectedVertex

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      Hierarchy

      - -
      -
      -
      -

      This holds ForceDirectedLayout-specific information about Nodes.

      -

      This class inherits from LayoutVertex.

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -

      Properties

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - - -
      -
      -
      -

      Properties

      -
      - -

      - charge - : number

      -
        -
      • -
        -

        Gets or sets the electrical charge for this vertex. - The default value is NaN.

        -
        -
      • -
      -
      -
      - -

      - forceX - : number

      -
        -
      • -
        -

        Gets or sets the cumulative force on the vertex in the X direction. - The default value is zero.

        -
        -
      • -
      -
      -
      - -

      - forceY - : number

      -
        -
      • -
        -

        Gets or sets the cumulative force on the vertex in the Y direction. - The default value is zero.

        -
        -
      • -
      -
      -
      - -

      - isFixed - : boolean

      -
        -
      • -
        -

        Gets or sets whether the vertex may be moved by any forces. - The default value is false.

        -
        -
      • -
      -
      -
      - -

      - mass - : number

      -
        -
      • -
        -

        Gets or sets the gravitational mass for this vertex. - The default value is NaN.

        -
        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class ForceDirectedVertex

      Hierarchy

      +

      This holds ForceDirectedLayout-specific information about Nodes.

      +

      This class inherits from LayoutVertex.

      +

      Index

      Inherited Members

      Constructors

      Properties

      • +

        Gets or sets the electrical charge for this vertex. +The default value is NaN.

        +
      • +

        Gets or sets the cumulative force on the vertex in the X direction. +The default value is zero.

        +
      • +

        Gets or sets the cumulative force on the vertex in the Y direction. +The default value is zero.

        +
      • +

        Gets or sets whether the vertex may be moved by any forces. +The default value is false.

        +
      • +

        Gets or sets the gravitational mass for this vertex. +The default value is NaN.

        +

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/FreehandDrawingTool.html b/api/symbols/FreehandDrawingTool.html index f56707ba7..4c42ab1d6 100644 --- a/api/symbols/FreehandDrawingTool.html +++ b/api/symbols/FreehandDrawingTool.html @@ -1,456 +1,73 @@ - - - - - - FreehandDrawingTool | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class FreehandDrawingTool

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

      -
      -
      -

      Hierarchy

      -
        -
      • - Tool -
          -
        • - FreehandDrawingTool -
        • -
        -
      • -
      -
      -
      -
      -

      The FreehandDrawingTool allows the user to draw a shape using the mouse. - It collects all of the points from a mouse-down, all mouse-moves, until a mouse-up, - and puts all of those points in a Geometry used by a Shape. - It then adds a node data object to the diagram's model.

      -

      This tool may be installed as the first mouse down tool:

      -
        myDiagram.toolManager.mouseDownTools.insertAt(0, new FreehandDrawingTool());
      +FreehandDrawingTool | GoJS API
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class FreehandDrawingTool Extension

      This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

      Hierarchy

      • Tool
        • FreehandDrawingTool
      +

      The FreehandDrawingTool allows the user to draw a shape using the mouse. +It collects all of the points from a mouse-down, all mouse-moves, until a mouse-up, +and puts all of those points in a Geometry used by a Shape. +It then adds a node data object to the diagram's model.

      +

      This tool may be installed as the first mouse down tool:

      +
        myDiagram.toolManager.mouseDownTools.insertAt(0, new FreehandDrawingTool());
       
      -

      The Shape used during the drawing operation can be customized by setting temporaryShape. - The node data added to the model can be customized by setting archetypePartData.

      -

      If you want to experiment with this extension, try the Freehand Drawing sample.

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -

      Properties

      - -
      -
      -

      Methods

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - - -
      -
      -
      -

      Properties

      -
      - -

      - archetypePartData - : ObjectData

      -
        -
      • -
        -

        Gets or sets the node data object that is copied and added to the model - when the freehand drawing operation completes.

        -
        -
      • -
      -
      -
      - -

      - isBackgroundOnly - : boolean

      -
        -
      • -
        -

        Gets or sets whether this tool can only run if the user starts in the diagram's background - rather than on top of an existing Part.

        -

        The default value is true.

        -
        -
      • -
      -
      -
      - -

      - temporaryShape - : Shape

      -
        -
      • -
        -

        Gets or sets the Shape that is used to hold the line as it is being drawn.

        -

        The default value is a simple Shape drawing an unfilled open thin black line.

        -
        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - addPoint -

      -
        -
      • addPoint(p: Point): void
      • -
      -
        -
      • -
        -

        This adds a Point to the temporaryShape's geometry.

        -

        If the Shape is not yet in the Diagram, its geometry is initialized and - its parent Part is added to the Diagram.

        -

        If the point is less than half a pixel away from the previous point, it is ignored.

        -
        -

        Parameters

        - -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - canStart -

      -
        -
      • canStart(): boolean
      • -
      -
        -
      • -
        -

        Only start if the diagram is modifiable and allows insertions. - OPTIONAL: if the user is starting in the diagram's background, not over an existing Part.

        -
        -

        Returns boolean

        -
      • -
      -
      -
      - -

      - Override - doActivate -

      -
        -
      • doActivate(): void
      • -
      -
        -
      • -
        -

        Capture the mouse and use a "crosshair" cursor.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doDeactivate -

      -
        -
      • doDeactivate(): void
      • -
      -
        -
      • -
        -

        Release the mouse and reset the cursor.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doMouseDown -

      -
        -
      • doMouseDown(): void
      • -
      -
        -
      • -
        -

        Start drawing the line by starting to accumulate points in the temporaryShape's geometry.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doMouseMove -

      -
        -
      • doMouseMove(): void
      • -
      -
        -
      • -
        -

        Keep accumulating points in the temporaryShape's geometry.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doMouseUp -

      -
        -
      • doMouseUp(): void
      • -
      -
        -
      • -
        -

        Finish drawing the line by adding a node data object holding the - geometry string and the node position that the node template can bind to. - This copies the archetypePartData and adds it to the model.

        -
        -

        Returns void

        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Geometry.html b/api/symbols/Geometry.html index 1dc42e349..b45ccf336 100644 --- a/api/symbols/Geometry.html +++ b/api/symbols/Geometry.html @@ -1,1042 +1,220 @@ - - - - - - Geometry | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class Geometry

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      Hierarchy

      -
        -
      • - Geometry -
      • -
      -
      -
      -
      -

      The Geometry class is used to define the "shape" of a Shape. - A Geometry can be simple straight lines, rectangles, or ellipses. - A Geometry can also be an arbitrarily complex path, consisting of a list of PathFigures.

      -

      A Geometry must not be modified once it has been used by a Shape. - However, a Geometry may be shared by multiple Shapes.

      -

      It is commonplace to create Geometries using geometry path string syntax: - Geometry Path Strings. - However it is much more efficient to create Geometries programmatically. - One way to do that is illustrated by several of the samples that evaluate JavaScript such as:

      -
      new go.Geometry()
      -    .add(new go.PathFigure(p.x, p.y)
      -         .add(new go.PathSegment(go.PathSegment.Arc, -sweep/2, sweep, 0, 0, radius+layerThickness, radius+layerThickness))
      -         .add(new go.PathSegment(go.PathSegment.Line, q.x, q.y))
      -         .add(new go.PathSegment(go.PathSegment.Arc, sweep/2, -sweep, 0, 0, radius, radius).close()));
      +Geometry | GoJS API
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class Geometry

      Hierarchy

      • Geometry
      +

      The Geometry class is used to define the "shape" of a Shape. +A Geometry can be simple straight lines, rectangles, or ellipses. +A Geometry can also be an arbitrarily complex path, consisting of a list of PathFigures.

      +

      A Geometry must not be modified once it has been used by a Shape. +However, a Geometry may be shared by multiple Shapes.

      +

      It is commonplace to create Geometries using geometry path string syntax: +Geometry Path Strings. +However it is much more efficient to create Geometries programmatically. +One way to do that is illustrated by several of the samples that evaluate JavaScript such as:

      +
      new go.Geometry()
      .add(new go.PathFigure(p.x, p.y)
      .add(new go.PathSegment(go.PathSegment.Arc, -sweep/2, sweep, 0, 0, radius+layerThickness, radius+layerThickness))
      .add(new go.PathSegment(go.PathSegment.Line, q.x, q.y))
      .add(new go.PathSegment(go.PathSegment.Arc, sweep/2, -sweep, 0, 0, radius, radius).close()));
      -

      See samples that make use of Geometries in the samples index.

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -

      Properties

      - -
      -
      -

      Methods

      - -
      -
      -

      Constants

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      -
        -
      • new Geometry(type?: EnumValue): Geometry
      • -
      - -
      -
      -
      -

      Properties

      -
      - -

      - Read-only - bounds - : Rect

      -
        -
      • -
        -

        This read-only property returns a rectangle that contains all points within the Geometry. - The result will always contain the origin (0, 0).

        -
        -
      • -
      -
      -
      - -

      - defaultStretch - : EnumValue

      - -
      -
      - -

      - endX - : number

      -
        -
      • -
        -

        Gets or sets the ending X coordinate of the Geometry if it is of type - Line, Rectangle, or Ellipse. - The initial value is zero.

        -
        -
      • -
      -
      -
      - -

      - endY - : number

      -
        -
      • -
        -

        Gets or sets the ending Y coordinate of the Geometry if it is of type - Line, Rectangle, or Ellipse. - The initial value is zero.

        -
        -
      • -
      -
      -
      - -

      - figures - : List<PathFigure>

      -
        -
      • -
        -

        Gets or sets the List of PathFigures - that describes the content of the - path for Geometries of type Path.

        -
        -
      • -
      -
      -
      - -

      - spot1 - : Spot

      -
        -
      • -
        -

        Gets or sets the spot an "Auto" Panel will use for the top-left corner of any panel content - when the Shape.spot1 value is Spot.Default. - The default value is Spot.TopLeft, at the top-left point of the bounds of the Shape.

        -
        -
      • -
      -
      -
      - -

      - spot2 - : Spot

      -
        -
      • -
        -

        Gets or sets the spot an "Auto" Panel will use for the bottom-right corner of any panel content - when the Shape.spot2 value is Spot.Default. - The default value is Spot.BottomRight, at the bottom-right point of the bounds of the Shape.

        -
        -
      • -
      -
      -
      - -

      - startX - : number

      -
        -
      • -
        -

        Gets or sets the starting X coordinate of the Geometry if it is of type - Line, Rectangle, or Ellipse. - The initial value is zero.

        -
        -
      • -
      -
      -
      - -

      - startY - : number

      -
        -
      • -
        -

        Gets or sets the starting Y coordinate of the Geometry if it is of type - Line, Rectangle, or Ellipse. - The initial value is zero.

        -
        -
      • -
      -
      -
      - -

      - type - : EnumValue

      - -
      -
      -
      -

      Methods

      -
      - -

      - add -

      - -
        -
      • -
        -

        Add a PathFigure to the figures list.

        -
        -
        since
        -

        1.5

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          figure: PathFigure
          -
          -

          a newly allocated unshared PathFigure that will become owned by this Geometry

          -
          -
        • -
        -

        Returns Geometry

        -

        this

        -
      • -
      -
      -
      - -

      - computeBoundsWithoutOrigin -

      -
        -
      • computeBoundsWithoutOrigin(): Rect
      • -
      -
        -
      • -
        -

        Computes the Geometry's bounds without adding an origin point, and returns those bounds as a rect. - This method does not modify the Geometry or its bounds.

        -
        -
        since
        -

        1.1

        -
        -
        -
        -

        Returns Rect

        -
      • -
      -
      -
      - -

      - containsPoint -

      -
        -
      • containsPoint(p: Point, sw?: number): boolean
      • -
      -
        -
      • -
        -

        Returns true if the Geometry contains the point.

        -
        -
        since
        -

        2.2

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          p: Point
          -
          -

          in local geometry coordinates

          -
          -
        • -
        • -
          Optional sw: number
          -
          -

          half the stroke width that a Shape has or that you want to pretend it has

          -
          -
        • -
        -

        Returns boolean

        -
      • -
      -
      -
      - -

      - Virtual - copy -

      - -
        -
      • -
        -

        Create a copy of this Geometry, with the same values and figures.

        -
        -

        Returns Geometry

        -
      • -
      -
      -
      - -

      - Static - fillPath -

      -
        -
      • fillPath(str: string): string
      • -
      -
        -
      • -
        -

        Given a SVG or GoJS path string, returns a congruent path string with each pathfigure filled. - For instance, "M0 0 L22 22 L33 0" would become "F M0 0 L22 22 L33 0".

        -
        -
        since
        -

        1.1

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          str: string
          -
        • -
        -

        Returns string

        -
      • -
      -
      -
      - -

      - getAngleAlongPath -

      -
        -
      • getAngleAlongPath(fraction: number): number
      • -
      -
        -
      • -
        -

        Returns the slope expressed as an angle at the fractional distance (0-1) along this Geometry's path, in local coordinates.

        -
        -
        since
        -

        2.1

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          fraction: number
          -
          -

          A fractional amount between 0 and 1, inclusive.

          -
          -
        • -
        -

        Returns number

        -
      • -
      -
      -
      - -

      - getFractionForPoint -

      -
        -
      • getFractionForPoint(pt: Point): number
      • -
      -
        -
      • -
        -

        Returns the fractional distance (0-1) along this Geometry's path for a nearby point.

        -
        -
        since
        -

        2.1

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          pt: Point
          -
          -

          A Point, in local coordinates, near this Geometry.

          -
          -
        • -
        -

        Returns number

        -

        A fractional amount between 0 and 1, inclusive.

        -
      • -
      -
      -
      - -

      - getPointAlongPath -

      -
        -
      • getPointAlongPath(fraction: number, result?: Point): Point
      • -
      -
        -
      • -
        -

        Returns the point at the fractional distance (0-1) along this Geometry's path.

        -
        -
        since
        -

        2.1

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          fraction: number
          -
          -

          A fractional amount between 0 and 1, inclusive.

          -
          -
        • -
        • -
          Optional result: Point
          -
          -

          an optional Point that is modified and returned; otherwise it allocates and returns a new Point.

          -
          -
        • -
        -

        Returns Point

        -

        the Point, in local coordinates, of the fractional distance along the path.

        -
      • -
      -
      -
      - -

      - normalize -

      - -
        -
      • -
        -

        Normalizes the Geometry points in place by ensuring the top-left bounds of the geometry lines up with (0, 0), - returning the Point (x, y) amount it was shifted. - After this method is called there will be no negative X or Y value for the Geometry's bounds, - and no empty space at the top-left of the Geometry.

        -
        -
        since
        -

        1.1

        -
        -
        -
        -

        Returns Point

        -
      • -
      -
      -
      - -

      - offset -

      -
        -
      • offset(x: number, y: number): Geometry
      • -
      -
        -
      • -
        -

        Offsets the Geometry in place by a given (x, y) amount

        -
        -
        since
        -

        1.1

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          x: number
          -
          -

          The x-axis offset factor.

          -
          -
        • -
        • -
          y: number
          -
          -

          The y-axis offset factor.

          -
          -
        • -
        -

        Returns Geometry

        -

        this

        -
      • -
      -
      -
      - -

      - Static - parse -

      -
        -
      • parse(str: string, filled?: boolean): Geometry
      • -
      -
        -
      • -
        -

        Produce a Geometry from a string that uses an SVG-like compact path geometry syntax. - The syntax accepts all SVG Path Syntax (SVG Path Syntax (w3.org)), - as well as three GoJS-specific tokens. - Specifically, the following tokens are allowed:

        -
          -
        • M (x,y)+ - Move commands
        • -
        • L (x,y)+, H (x)+, V (y)+ Lines commands, including horizontal and vertical lines
        • -
        • C (x1 y1 x2 y2 x y)+, S (x2 y2 x y)+ Cubic bezier curves
        • -
        • Q (x1 y1 x y)+, T (x y)+ Quadratic bezier curves
        • -
        • A (rx ry x-axis-rotation large-arc-flag clockwise-flag x y)+ Arcs (following SVG arc conventions)
        • -
        • Z Denotes that the previous subpath is closed
        • -
        -

        Additionally there are some tokens specific to GoJS:

        -
          -
        • B (startAngle, sweepAngle, centerX, centerY, radius)+ Arcs following GoJS canvas arc conventions
        • -
        • X Used before M-commands to denote separate PathFigures instead of a subpath
        • -
        • F Denotes whether the current PathFigure is filled (true if F is present)
        • -
        • U Denotes that the PathFigure is not shadowed
        • -
        -

        See the Introduction page on Geometry Parsing for more details.

        -
        -

        Parameters

        -
          -
        • -
          str: string
          -
        • -
        • -
          Optional filled: boolean
          -
          -

          whether figures should be filled. - If true, all PathFigures in the string will be filled regardless of the presence - of an "F" command or not. - If false, all PathFigures will determine their own filled state by the presence of an "F" command or not. - Default is false.

          -
          -
        • -
        -

        Returns Geometry

        -
      • -
      -
      -
      - -

      - rotate -

      -
        -
      • rotate(angle: number, x?: number, y?: number): Geometry
      • -
      -
        -
      • -
        -

        Rotates the Geometry in place by a given angle, with optional x and y values to rotate the geometry about. - If no x and y value are given, (0, 0) is used as the rotation point.

        -
        -
        since
        -

        1.1

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          angle: number
          -
          -

          The angle to rotate by.

          -
          -
        • -
        • -
          Optional x: number
          -
          -

          The optional X point to rotate the geometry about. If no point is given, this value is 0.

          -
          -
        • -
        • -
          Optional y: number
          -
          -

          The optional Y point to rotate the geometry about. If no point is given, this value is 0.

          -
          -
        • -
        -

        Returns Geometry

        -

        this

        -
      • -
      -
      -
      - -

      - scale -

      -
        -
      • scale(x: number, y: number): Geometry
      • -
      -
        -
      • -
        -

        Scales the Geometry in place by a given (x, y) scale factor.

        -

        If you want to flip a Geometry horizontally, call geo.scale(-1, 1). - If you want to flip a Geometry vertically, call geo.scale(1, -1).

        -
        -
        since
        -

        1.1

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          x: number
          -
          -

          The x-axis scale factor.

          -
          -
        • -
        • -
          y: number
          -
          -

          The y-axis scale factor.

          -
          -
        • -
        -

        Returns Geometry

        -

        this

        -
      • -
      -
      -
      - -

      - Static - stringify -

      - -
        -
      • -
        -

        This static function can be used to write out a Geometry as a string - that can be read by Geometry.parse.

        -

        The string produced by this method is a superset of the SVG path - string rules that contains some additional GoJS-specific tokens. - See the Introduction page on Geometry Parsing for more details.

        -
        -
        since
        -

        1.1

        -
        -
        -
        -

        Parameters

        - -

        Returns string

        -
      • -
      -
      -
      -
      -

      Constants

      -
      - -

      - Static - Ellipse - : EnumValue

      -
      -

      For drawing an ellipse fitting within a rectangle; - a value for Geometry.type. - The ellipse fits within the rectangle that goes from the point - (startX, startY) to the point (endX, endY).

      -
      -
      -
      - -

      - Static - Line - : EnumValue

      -
      -

      For drawing a simple straight line; - a value for Geometry.type. - The line goes from the point - (startX, startY) to the point (endX, endY).

      -
      -
      -
      - -

      - Static - Path - : EnumValue

      -
      -

      For drawing a complex path made of a list of PathFigures; - a value for Geometry.type.

      -
      -
      -
      - -

      - Static - Rectangle - : EnumValue

      -
      -

      For drawing a rectangle; - a value for Geometry.type. - The rectangle goes from the point - (startX, startY) to the point (endX, endY).

      -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/GeometryReshapingTool.html b/api/symbols/GeometryReshapingTool.html index 03c9d392b..3bccfcde3 100644 --- a/api/symbols/GeometryReshapingTool.html +++ b/api/symbols/GeometryReshapingTool.html @@ -1,621 +1,105 @@ - - - - - - GeometryReshapingTool | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class GeometryReshapingTool

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

      -
      -
      -

      Hierarchy

      -
        -
      • - Tool -
          -
        • - GeometryReshapingTool -
        • -
        -
      • -
      -
      -
      -
      -

      The GeometryReshapingTool class allows for a Shape's Geometry to be modified by the user - via the dragging of tool handles. - This does not handle Links, whose routes should be reshaped by the LinkReshapingTool. - The reshapeObjectName needs to identify the named Shape within the - selected Part. - If the shape cannot be found or if its Shape.geometry is not of type Geometry.Path, - this will not show any GeometryReshaping Adornment. - At the current time this tool does not support adding or removing PathSegments to the Geometry.

      -

      If you want to experiment with this extension, try the Geometry Reshaping sample.

      -
      -
      -
      -

      Index

      -
      - -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - -
        -
      • -
        -

        Constructs a GeometryReshapingTool and sets the handle and name of the tool.

        -
        -

        Returns GeometryReshapingTool

        -
      • -
      -
      -
      -
      -

      Properties

      -
      - -

      - Read-only - adornedShape - : Shape

      -
        -
      • -
        -

        Gets the Shape that is being reshaped. - This must be contained within the selected Part.

        -
        -
      • -
      -
      -
      - -

      - handle - : GraphObject

      - -
      -
      - -

      - handleArchetype - : GraphObject

      -
        -
      • -
        -

        A small GraphObject used as a reshape handle for each segment. - The default GraphObject is a small blue diamond.

        -
        -
      • -
      -
      -
      - -

      - isResegmenting - : boolean

      -
        -
      • -
        -

        Gets or sets whether this tool supports the user's addition or removal of segments in the geometry. - The default value is false. - When the value is true, copies of the midHandleArchetype will appear in the middle of each segment. - At the current time, resegmenting is limited to straight segments, not curved ones.

        -
        -
      • -
      -
      -
      - -

      - midHandleArchetype - : GraphObject

      -
        -
      • -
        -

        A small GraphObject used as a reshape handle at the middle of each segment for inserting a new segment. - The default GraphObject is a small blue circle.

        -
        -
      • -
      -
      -
      - -

      - Read-only - originalGeometry - : Geometry

      -
        -
      • -
        -

        This read-only property remembers the original value for Shape.geometry, - so that it can be restored if this tool is cancelled.

        -
        -
      • -
      -
      -
      - -

      - resegmentingDistance - : number

      -
        -
      • -
        -

        The maximum distance at which a resegmenting handle being positioned on a straight line - between the adjacent points will cause one of the segments to be removed from the geometry. - The default value is 3.

        -
        -
      • -
      -
      -
      - -

      - reshapeObjectName - : string

      -
        -
      • -
        -

        The name of the GraphObject to be reshaped. - The default name is "SHAPE".

        -
        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - Override - canStart -

      -
        -
      • canStart(): boolean
      • -
      -
        -
      • -
        -

        This tool may run when there is a mouse-down event on a reshape handle.

        -
        -

        Returns boolean

        -
      • -
      -
      -
      - -

      - computeReshape -

      - -
        -
      • -
        -

        This is called by doMouseMove and doMouseUp to limit the input point - before calling reshape. - By default, this doesn't limit the input point.

        -
        -

        Parameters

        -
          -
        • -
          p: Point
          -
          -

          the point where the handle is being dragged.

          -
          -
        • -
        -

        Returns Point

        -
      • -
      -
      -
      - -

      - Override - doActivate -

      -
        -
      • doActivate(): void
      • -
      -
        -
      • -
        -

        Start reshaping, if findToolHandleAt finds a reshape handle at the mouse down point.

        -

        If successful this sets handle to be the reshape handle that it finds - and adornedShape to be the Shape being reshaped. - It also remembers the original geometry in case this tool is cancelled. - And it starts a transaction.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doCancel -

      -
        -
      • doCancel(): void
      • -
      -
        -
      • -
        -

        Restore the shape to be the original geometry and stop this tool.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doDeactivate -

      -
        -
      • doDeactivate(): void
      • -
      -
        -
      • -
        -

        This stops the current reshaping operation with the Shape as it is.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doMouseMove -

      -
        -
      • doMouseMove(): void
      • -
      -
        -
      • -
        -

        Call reshape with a new point determined by the mouse - to change the geometry of the adornedShape.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doMouseUp -

      -
        -
      • doMouseUp(): void
      • -
      -
        -
      • -
        -

        Reshape the Shape's geometry with a point based on the most recent mouse point by calling reshape, - and then stop this tool.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - reshape -

      -
        -
      • reshape(newPoint: Point): void
      • -
      - -
      -
      - -

      - Override - updateAdornments -

      -
        -
      • updateAdornments(part: Part): void
      • -
      - -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class GeometryReshapingTool Extension

      This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

      Hierarchy

      • Tool
        • GeometryReshapingTool
      +

      The GeometryReshapingTool class allows for a Shape's Geometry to be modified by the user +via the dragging of tool handles. +This does not handle Links, whose routes should be reshaped by the LinkReshapingTool. +The reshapeObjectName needs to identify the named Shape within the +selected Part. +If the shape cannot be found or if its Shape.geometry is not of type Geometry.Path, +this will not show any GeometryReshaping Adornment. +At the current time this tool does not support adding or removing PathSegments to the Geometry.

      +

      If you want to experiment with this extension, try the Geometry Reshaping sample.

      +

      Index

      Inherited Members

      Constructors

      • +

        Constructs a GeometryReshapingTool and sets the handle and name of the tool.

        +

        Returns GeometryReshapingTool

      Properties

      • +

        Gets the Shape that is being reshaped. +This must be contained within the selected Part.

        +
      • +

        A small GraphObject used as a reshape handle for each segment. +The default GraphObject is a small blue diamond.

        +
      • +

        Gets or sets whether this tool supports the user's addition or removal of segments in the geometry. +The default value is false. +When the value is true, copies of the midHandleArchetype will appear in the middle of each segment. +At the current time, resegmenting is limited to straight segments, not curved ones.

        +
      • +

        A small GraphObject used as a reshape handle at the middle of each segment for inserting a new segment. +The default GraphObject is a small blue circle.

        +
      • +

        This read-only property remembers the original value for Shape.geometry, +so that it can be restored if this tool is cancelled.

        +
      • +

        The maximum distance at which a resegmenting handle being positioned on a straight line +between the adjacent points will cause one of the segments to be removed from the geometry. +The default value is 3.

        +
      • +

        The name of the GraphObject to be reshaped. +The default name is "SHAPE".

        +

      Methods

      • canStart(): boolean
      • +

        This tool may run when there is a mouse-down event on a reshape handle.

        +

        Returns boolean

      • +

        This is called by doMouseMove and doMouseUp to limit the input point +before calling reshape. +By default, this doesn't limit the input point.

        +

        Parameters

        • p: Point
          +

          the point where the handle is being dragged.

          +

        Returns Point

      • doActivate(): void
      • +

        Start reshaping, if findToolHandleAt finds a reshape handle at the mouse down point.

        +

        If successful this sets handle to be the reshape handle that it finds +and adornedShape to be the Shape being reshaped. +It also remembers the original geometry in case this tool is cancelled. +And it starts a transaction.

        +

        Returns void

      • doCancel(): void
      • +

        Restore the shape to be the original geometry and stop this tool.

        +

        Returns void

      • doDeactivate(): void
      • +

        This stops the current reshaping operation with the Shape as it is.

        +

        Returns void

      • doMouseMove(): void
      • +

        Call reshape with a new point determined by the mouse +to change the geometry of the adornedShape.

        +

        Returns void

      • doMouseUp(): void
      • +

        Reshape the Shape's geometry with a point based on the most recent mouse point by calling reshape, +and then stop this tool.

        +

        Returns void

      • reshape(newPoint: Point): void
      • updateAdornments(part: Part): void

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/GoCloudStorage.html b/api/symbols/GoCloudStorage.html index 32f4bb411..ab365fb07 100644 --- a/api/symbols/GoCloudStorage.html +++ b/api/symbols/GoCloudStorage.html @@ -1,874 +1,202 @@ - - - - - - GoCloudStorage | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class GoCloudStorage

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      - This is part of GoCloudStorage and not part of the main GoJS library. - Storage can be found in the GoJS kit under the projects folder. - See the Storage intro page for more information. -

      -
      -
      -

      Hierarchy

      - -
      -
      -
      -

      An abstract class for storing GoJS Models in various cloud storage services.

      -

      GoCloudStorage is never used on its own. Its subclasses can be used to manage diagram model storage programatically, - or any subset of GoCloudStorage subclasses can be bundled and used graphically with the GoCloudStorageManager.

      -

      Note: With the exception of GoLocalStorage, all GoCloudStorage subclasses must be used in pages served - on a web server.

      -
      -
      -
      -

      Index

      -
      - -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      -
        -
      • new GoCloudStorage(managedDiagrams: Diagram | Diagram[], defaultModel?: string, clientId?: string, iconsRelativeDirectory?: string): GoCloudStorage
      • -
      -
        -
      • -

        Parameters

        -
          -
        • -
          managedDiagrams: Diagram | Diagram[]
          -
          -

          An array of GoJS Diagrams whose model(s) will be saved to - / loaded from a cloud storage service. Can also be a single Diagram.

          -
          -
        • -
        • -
          Optional defaultModel: string
          -
          -

          String representation of the default model data for new diagrams. If this is null, default new diagrams will be empty. - Usually a value given by calling Model.toJson on a GoJS Diagram's Model.

          -
          -
        • -
        • -
          Optional clientId: string
          -
          -

          The client ID of the cloud storage application to use (given by the cloud storage service to developer). - Not needed for all subclasses.

          -
          -
        • -
        • -
          Optional iconsRelativeDirectory: string
          -
          -

          The directory path relative to the page in which this instance of GoCloudStorage exists, in which - the storage service brand icons can be found. The default value is "../goCloudStorageIcons/".

          -
          -
        • -
        -

        Returns GoCloudStorage

        -
      • -
      -
      -
      -
      -

      Properties

      -
      - -

      - Read-only - className - : string

      -
        -
      • -
        -

        Get the name of the class; i.e. "GoDropbox"

        -
        -
      • -
      -
      -
      - -

      - Read-only - clientId - : string

      -
        -
      • -
        -

        Get the clientId for the app using the cloud storage service. This is usually given by the cloud storage provider's dev console or similar. - Set with a parameter during construction.

        -
        -
      • -
      -
      -
      - -

      - currentDiagramFile - : DiagramFile

      -
        -
      • -
        -

        Get or set the currently open DiagramFile. By default, currentDiagramFile is set when a file is - loaded from storage, saved to storage (if saved to a different path from the currentDiagramFile.path), or - deleted from storage (if the deleted file is the currently open one). - The default value is a DiagramFile with null id, name, and path values.

        -
        -
      • -
      -
      -
      - -

      - defaultModel - : string

      -
        -
      • -
        -

        Get / set the defaultModel data for the app used by an instance of GoCloudStorage. - defaultModel is used when creating new diagrams. See create.

        -
        -
      • -
      -
      -
      - -

      - iconsRelativeDirectory - : string

      -
        -
      • -
        -

        Get / set iconsRelativeDirectory, the directory path relative to the page in which this instance of GoCloudStorage exists, - in which the storage service brand icons can be found. The default value is "../goCloudStorageIcons/".

        -
        -
      • -
      -
      -
      - -

      - isAutoSaving - : boolean

      -
        -
      • -
        -

        Get or set isAutoSaving property. If true, the managedDiagrams will be saved to storage after every - Transaction (only if currentDiagramFile holds a non-null path value). - Additionally, if isAutoSaving is true, users will be prompted to save newly created - diagrams when created with create. - The default value for isAutoSaving is true.

        -
        -
      • -
      -
      -
      - -

      - managedDiagrams - : Diagram[]

      -
        -
      • -
        -

        Get / set the GoJS Diagrams associated with this instance of GoCloudStorage. - Set with a parameter during construction.

        -
        -
      • -
      -
      -
      - -

      - Read-only - serviceName - : string

      -
        -
      • -
        -

        Get the name of the cloud storage service being used; i.e. "Dropbox"

        -
        -
      • -
      -
      -
      - -

      - Read-only - ui - : HTMLElement

      -
        -
      • -
        -

        Get the UI element associated with this instance of GoCloudStorage. This is a custom filepicker window for GoDropBox and - GoLocalStorage. It is a save prompt for GoOneDrive and GoGoogleDrive (both these classes use third party - UI for storage navigation, provided by Microsoft and Google, respectively). The UI element is created during construction.

        -
        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - authorize -

      -
        -
      • authorize(refreshToken?: boolean): Promise<any>
      • -
      -
        -
      • -
        -

        Explicitly authorize a currently-signed in user of the storage service to use the application associated with this - instance of GoCloudStorage (via clientId. If no currently signed-in user exists, prompt user to sign into their account, then authorize that account.

        -

        Note: Authorization does not occur (and is not possible or necessary) with GoLocalStorage. Instead, - GoLocalStorage.authorize ensures localStorage exists in the browser.

        -
        -

        Parameters

        - -

        Returns Promise<any>

        -

        Returns a Promise that resolves with a boolean stating whether authorization was succesful (true) or failed (false).

        -
      • -
      -
      -
      - -

      - checkFileExists -

      -
        -
      • checkFileExists(path: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Check whether a file exists at a given path.

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid filepath. What is meant by this varies from subclass to subclass. Rules for valid filepaths by subclass:

          -
            -
          • GoLocalStorage: Just the filename (the key in local storage); i.e. example.diagram
          • -
          • GoDropBox: /{path-to-file}/{filename}; i.e. /Public/example.diagram
          • -
          • GoGoogleDrive: Use Google Drive-given file IDs. Parameter is still called 'path' in GoGoogleDrive methods to preserve system nomenclature.
          • -
          • GoOneDrive: /drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram
          • -
          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a boolean stating whether a file exists at a given path.

        -
      • -
      -
      -
      - -

      - create -

      -
        -
      • create(path?: string, saveBefore?: boolean): Promise<unknown>
      • -
      -
        -
      • -
        -

        Set each of managedDiagrams' .model to defaultModel (if defaultModel is null, - each model will be set to a new GraphLinksModel by default). - If isAutoSaving is true and no path parameter is supplied, users will be immediately prompted to save their new diagrams to cloud storage.

        -
        -

        Parameters

        -
          -
        • -
          Optional path: string
          -
          -

          Optional. If a valid filepath is supplied, save each of managedDiagrams' model data to this path. No UI of any sort appears. - What is meant by "valid filepath" varies from subclass to subclass. Rules for valid filepaths by subclass:

          -
            -
          • GoLocalStorage: Just the filename (the key in local storage); i.e. example.diagram
          • -
          • GoDropBox: /{path-to-file}/{filename}; i.e. /Public/example.diagram
          • -
          • GoGoogleDrive: Use Google Drive-given file IDs. Parameter is still called 'path' in GoGoogleDrive methods to preserve system nomenclature.
          • -
          • GoOneDrive: /drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram
          • -
          -
          -
        • -
        • -
          saveBefore: boolean = false
          -
          -

          Optional. If true, the user will be prompted to save their current diagram(s) before GoCloudStorage makes a new one. - The default value is false.

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the newly created file.

        -
      • -
      -
      -
      - -

      - getFile -

      -
        -
      • getFile(path: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Get the file at a given path in storage. The exact file data given varies from storage service - to storage service, though all include name, path, id data. The exact syntax of these data fields may vary. - See subclass-specific documentation for more details.

        - -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid filepath. What is meant by this varies from subclass to subclass. Rules for valid filepaths by subclass:

          -
            -
          • GoLocalStorage: Just the filename (the key in local storage); i.e. example.diagram
          • -
          • GoDropBox: /{path-to-file}/{filename}; i.e. /Public/example.diagram
          • -
          • GoGoogleDrive: Use Google Drive-given file IDs. Parameter is still called 'path' in GoGoogleDrive methods to preserve system nomenclature.
          • -
          • GoOneDrive: /drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram
          • -
          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Return a Promise that resolves with the file at a given path in storage(or null).

        -
      • -
      -
      -
      - -

      - getUserInfo -

      -
        -
      • getUserInfo(): Promise<unknown>
      • -
      - -
      -
      - -

      - hideUI -

      -
        -
      • hideUI(isActionCanceled?: boolean): void
      • -
      -
        -
      • -
        -

        Hide the ui element associated with this instance of GoCloudStorage. Used in some UI element onclicks.

        -
        -

        Parameters

        -
          -
        • -
          isActionCanceled: boolean = false
          -
          -

          If action (save, delete, load) is canceled, resolve Promise (returned previously in - showUI) with a 'Canceled' notification. Default value is false.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - load -

      -
        -
      • load(path: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Load diagram model data from a given cloud storage-specific file path into managedDiagrams.

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid filepath. What is meant by this varies from subclass to subclass. Rules for valid filepaths by subclass:

          -
            -
          • GoLocalStorage: Just the filename (the key in local storage); i.e. example.diagram
          • -
          • GoDropBox: /{path-to-file}/{filename}; i.e. /Public/example.diagram
          • -
          • GoGoogleDrive: Use Google Drive-given file IDs. Parameter is still called 'path' in GoGoogleDrive methods to preserve system nomenclature.
          • -
          • GoOneDrive: /drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram
          • -
          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile

        -
      • -
      -
      -
      - -

      - loadWithUI -

      -
        -
      • loadWithUI(): Promise<unknown>
      • -
      -
        -
      • -
        -

        Load diagram model data from cloud storage into managedDiagrams using the ui for this class.

        -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the loaded file

        -
      • -
      -
      -
      - -

      - remove -

      -
        -
      • remove(path: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Remove a file containing diagram model data at a given cloud storage-specific file path.

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid filepath. What is meant by this varies from subclass to subclass. Rules for valid filepaths by subclass:

          -
            -
          • GoLocalStorage: Just the filename (the key in local storage); i.e. example.diagram
          • -
          • GoDropBox: /{path-to-file}/{filename}; i.e. /Public/example.diagram
          • -
          • GoGoogleDrive: Use Google Drive-given file IDs. Parameter is still called 'path' in GoGoogleDrive methods to preserve system nomenclature.
          • -
          • GoOneDrive: /drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram
          • -
          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the deleted file.

        -
      • -
      -
      -
      - -

      - removeWithUI -

      -
        -
      • removeWithUI(): Promise<unknown>
      • -
      -
        -
      • -
        -

        Remove a given diagram from cloud storage using the ui for this class.

        -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the deleted file

        -
      • -
      -
      -
      - -

      - save -

      -
        -
      • save(path?: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Save managedDiagrams' model data to storage. If path is supplied save to that path. If no path is supplied but currentDiagramFile has non-null, - valid properties, update saved diagram file content at the path in storage corresponding to currentDiagramFile.path with current managedDiagrams' model data.

        -

        Rules for valid filepaths by subclass:

        -
          -
        • GoLocalStorage: Just the filename (the key in local storage); i.e. example.diagram
        • -
        • GoDropBox: /{path-to-file}/{filename}; i.e. /Public/example.diagram
        • -
        • GoGoogleDrive: Use Google Drive-given file IDs. Parameter is still called 'path' in GoGoogleDrive methods to preserve system nomenclature.
        • -
        • GoOneDrive: /drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram
        • -
        -
        -

        Parameters

        -
          -
        • -
          Optional path: string
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the saved file

        -
      • -
      -
      -
      - -

      - saveWithUI -

      -
        -
      • saveWithUI(): Promise<unknown>
      • -
      -
        -
      • -
        -

        Save the current diagram's model data to cloud storage with the ui for this class.

        -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the saved file.

        -
      • -
      -
      -
      - -

      - showUI -

      -
        -
      • showUI(action: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Show the ui element associated with this instance of GoCloudStorage.

        -
        -

        Parameters

        -
          -
        • -
          action: string
          -
          -

          Clarify what action is being done after file selection. Acceptable values: Save, Delete, Load

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves (in save, load, or remove with an DiagramFile - representing the saved/loaded/deleted file

        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class GoCloudStorage Storage

      This is part of GoCloudStorage and not part of the main GoJS library. Storage can be found in the GoJS kit under the projects folder. See the Storage intro page for more information.

      Hierarchy

      +

      An abstract class for storing GoJS Models in various cloud storage services.

      +

      GoCloudStorage is never used on its own. Its subclasses can be used to manage diagram model storage programatically, +or any subset of GoCloudStorage subclasses can be bundled and used graphically with the GoCloudStorageManager.

      +

      Note: With the exception of GoLocalStorage, all GoCloudStorage subclasses must be used in pages served +on a web server.

      +

      Index

      Constructors

      • new GoCloudStorage(managedDiagrams: Diagram | Diagram[], defaultModel?: string, clientId?: string, iconsRelativeDirectory?: string): GoCloudStorage
      • Parameters

        • managedDiagrams: Diagram | Diagram[]
          +

          An array of GoJS Diagrams whose model(s) will be saved to +/ loaded from a cloud storage service. Can also be a single Diagram.

          +
        • Optional defaultModel: string
          +

          String representation of the default model data for new diagrams. If this is null, default new diagrams will be empty. +Usually a value given by calling Model.toJson on a GoJS Diagram's Model.

          +
        • Optional clientId: string
          +

          The client ID of the cloud storage application to use (given by the cloud storage service to developer). +Not needed for all subclasses.

          +
        • Optional iconsRelativeDirectory: string
          +

          The directory path relative to the page in which this instance of GoCloudStorage exists, in which +the storage service brand icons can be found. The default value is "../goCloudStorageIcons/".

          +

        Returns GoCloudStorage

      Properties

      • +

        Get the name of the class; i.e. "GoDropbox"

        +
      • +

        Get the clientId for the app using the cloud storage service. This is usually given by the cloud storage provider's dev console or similar. +Set with a parameter during construction.

        +
      • +

        Get or set the currently open DiagramFile. By default, currentDiagramFile is set when a file is +loaded from storage, saved to storage (if saved to a different path from the currentDiagramFile.path), or +deleted from storage (if the deleted file is the currently open one). +The default value is a DiagramFile with null id, name, and path values.

        +
      • +

        Get / set the defaultModel data for the app used by an instance of GoCloudStorage. +defaultModel is used when creating new diagrams. See create.

        +
      • +

        Get / set iconsRelativeDirectory, the directory path relative to the page in which this instance of GoCloudStorage exists, +in which the storage service brand icons can be found. The default value is "../goCloudStorageIcons/".

        +
      • +

        Get or set isAutoSaving property. If true, the managedDiagrams will be saved to storage after every +Transaction (only if currentDiagramFile holds a non-null path value). +Additionally, if isAutoSaving is true, users will be prompted to save newly created +diagrams when created with create. +The default value for isAutoSaving is true.

        +
      • +

        Get / set the GoJS Diagrams associated with this instance of GoCloudStorage. +Set with a parameter during construction.

        +
      • +

        Get the name of the cloud storage service being used; i.e. "Dropbox"

        +
      • +

        Get the UI element associated with this instance of GoCloudStorage. This is a custom filepicker window for GoDropBox and +GoLocalStorage. It is a save prompt for GoOneDrive and GoGoogleDrive (both these classes use third party +UI for storage navigation, provided by Microsoft and Google, respectively). The UI element is created during construction.

        +

      Methods

      • authorize(refreshToken?: boolean): Promise<any>
      • +

        Explicitly authorize a currently-signed in user of the storage service to use the application associated with this +instance of GoCloudStorage (via clientId. If no currently signed-in user exists, prompt user to sign into their account, then authorize that account.

        +

        Note: Authorization does not occur (and is not possible or necessary) with GoLocalStorage. Instead, +GoLocalStorage.authorize ensures localStorage exists in the browser.

        +

        Parameters

        Returns Promise<any>

        Returns a Promise that resolves with a boolean stating whether authorization was succesful (true) or failed (false).

        +
      • checkFileExists(path: string): Promise<unknown>
      • +

        Check whether a file exists at a given path.

        +

        Parameters

        • path: string
          +

          A valid filepath. What is meant by this varies from subclass to subclass. Rules for valid filepaths by subclass:

          +
            +
          • GoLocalStorage: Just the filename (the key in local storage); i.e. example.diagram
          • +
          • GoDropBox: /{path-to-file}/{filename}; i.e. /Public/example.diagram
          • +
          • GoGoogleDrive: Use Google Drive-given file IDs. Parameter is still called 'path' in GoGoogleDrive methods to preserve system nomenclature.
          • +
          • GoOneDrive: /drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram
          • +
          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a boolean stating whether a file exists at a given path.

        +
      • create(path?: string, saveBefore?: boolean): Promise<unknown>
      • +

        Set each of managedDiagrams' .model to defaultModel (if defaultModel is null, +each model will be set to a new GraphLinksModel by default). +If isAutoSaving is true and no path parameter is supplied, users will be immediately prompted to save their new diagrams to cloud storage.

        +

        Parameters

        • Optional path: string
          +

          Optional. If a valid filepath is supplied, save each of managedDiagrams' model data to this path. No UI of any sort appears. +What is meant by "valid filepath" varies from subclass to subclass. Rules for valid filepaths by subclass:

          +
            +
          • GoLocalStorage: Just the filename (the key in local storage); i.e. example.diagram
          • +
          • GoDropBox: /{path-to-file}/{filename}; i.e. /Public/example.diagram
          • +
          • GoGoogleDrive: Use Google Drive-given file IDs. Parameter is still called 'path' in GoGoogleDrive methods to preserve system nomenclature.
          • +
          • GoOneDrive: /drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram
          • +
          +
        • saveBefore: boolean = false
          +

          Optional. If true, the user will be prompted to save their current diagram(s) before GoCloudStorage makes a new one. +The default value is false.

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the newly created file.

        +
      • getFile(path: string): Promise<unknown>
      • +

        Get the file at a given path in storage. The exact file data given varies from storage service +to storage service, though all include name, path, id data. The exact syntax of these data fields may vary. +See subclass-specific documentation for more details.

        + +

        Parameters

        • path: string
          +

          A valid filepath. What is meant by this varies from subclass to subclass. Rules for valid filepaths by subclass:

          +
            +
          • GoLocalStorage: Just the filename (the key in local storage); i.e. example.diagram
          • +
          • GoDropBox: /{path-to-file}/{filename}; i.e. /Public/example.diagram
          • +
          • GoGoogleDrive: Use Google Drive-given file IDs. Parameter is still called 'path' in GoGoogleDrive methods to preserve system nomenclature.
          • +
          • GoOneDrive: /drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram
          • +
          +

        Returns Promise<unknown>

        Return a Promise that resolves with the file at a given path in storage(or null).

        +
      • getUserInfo(): Promise<unknown>
      • hideUI(isActionCanceled?: boolean): void
      • +

        Hide the ui element associated with this instance of GoCloudStorage. Used in some UI element onclicks.

        +

        Parameters

        • isActionCanceled: boolean = false
          +

          If action (save, delete, load) is canceled, resolve Promise (returned previously in +showUI) with a 'Canceled' notification. Default value is false.

          +

        Returns void

      • load(path: string): Promise<unknown>
      • +

        Load diagram model data from a given cloud storage-specific file path into managedDiagrams.

        +

        Parameters

        • path: string
          +

          A valid filepath. What is meant by this varies from subclass to subclass. Rules for valid filepaths by subclass:

          +
            +
          • GoLocalStorage: Just the filename (the key in local storage); i.e. example.diagram
          • +
          • GoDropBox: /{path-to-file}/{filename}; i.e. /Public/example.diagram
          • +
          • GoGoogleDrive: Use Google Drive-given file IDs. Parameter is still called 'path' in GoGoogleDrive methods to preserve system nomenclature.
          • +
          • GoOneDrive: /drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram
          • +
          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile

        +
      • loadWithUI(): Promise<unknown>
      • +

        Load diagram model data from cloud storage into managedDiagrams using the ui for this class.

        +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the loaded file

        +
      • remove(path: string): Promise<unknown>
      • +

        Remove a file containing diagram model data at a given cloud storage-specific file path.

        +

        Parameters

        • path: string
          +

          A valid filepath. What is meant by this varies from subclass to subclass. Rules for valid filepaths by subclass:

          +
            +
          • GoLocalStorage: Just the filename (the key in local storage); i.e. example.diagram
          • +
          • GoDropBox: /{path-to-file}/{filename}; i.e. /Public/example.diagram
          • +
          • GoGoogleDrive: Use Google Drive-given file IDs. Parameter is still called 'path' in GoGoogleDrive methods to preserve system nomenclature.
          • +
          • GoOneDrive: /drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram
          • +
          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the deleted file.

        +
      • removeWithUI(): Promise<unknown>
      • +

        Remove a given diagram from cloud storage using the ui for this class.

        +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the deleted file

        +
      • save(path?: string): Promise<unknown>
      • +

        Save managedDiagrams' model data to storage. If path is supplied save to that path. If no path is supplied but currentDiagramFile has non-null, +valid properties, update saved diagram file content at the path in storage corresponding to currentDiagramFile.path with current managedDiagrams' model data.

        +

        Rules for valid filepaths by subclass:

        +
          +
        • GoLocalStorage: Just the filename (the key in local storage); i.e. example.diagram
        • +
        • GoDropBox: /{path-to-file}/{filename}; i.e. /Public/example.diagram
        • +
        • GoGoogleDrive: Use Google Drive-given file IDs. Parameter is still called 'path' in GoGoogleDrive methods to preserve system nomenclature.
        • +
        • GoOneDrive: /drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram
        • +
        +

        Parameters

        • Optional path: string

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the saved file

        +
      • saveWithUI(): Promise<unknown>
      • +

        Save the current diagram's model data to cloud storage with the ui for this class.

        +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the saved file.

        +
      • showUI(action: string): Promise<unknown>
      • +

        Show the ui element associated with this instance of GoCloudStorage.

        +

        Parameters

        • action: string
          +

          Clarify what action is being done after file selection. Acceptable values: Save, Delete, Load

          +

        Returns Promise<unknown>

        Returns a Promise that resolves (in save, load, or remove with an DiagramFile +representing the saved/loaded/deleted file

        +

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/GoCloudStorageManager.html b/api/symbols/GoCloudStorageManager.html index fefce6ca0..e61dc5854 100644 --- a/api/symbols/GoCloudStorageManager.html +++ b/api/symbols/GoCloudStorageManager.html @@ -1,576 +1,103 @@ - - - - - - GoCloudStorageManager | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class GoCloudStorageManager

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      - This is part of GoCloudStorage and not part of the main GoJS library. - Storage can be found in the GoJS kit under the projects folder. - See the Storage intro page for more information. -

      -
      -
      -

      Hierarchy

      -
        -
      • - GoCloudStorageManager -
      • -
      -
      -
      -
      -

      Class for easily saving / loading GoJS Models to / from a user-defined set of Cloud Storage Services with a pre-defined UI.

      -

      GoCloudStorageManager holds a set of GoCloudStorage subclass instances (storages) to manage. When one is selected from the - storage selection menu, it becomes the currentStorage property, which is used to save / load / delete / create files.

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -

      Properties

      - -
      -
      -

      Methods

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - -
        -
      • -

        Parameters

        -
          -
        • -
          storages: Set<GoCloudStorage> | GoCloudStorage[]
          -
          -

          Contains valid instances of GoCloudStorage subclasses. Use at most one instance of each subclass.

          -
          -
        • -
        • -
          Optional iconsRelativeDirectory: string
          -
          -

          The directory path relative to the page in which this instance of GoCloudStorageManager exists, in which - the storage service brand icons can be found. The default value is "../goCloudStorageIcons/". - Note: If this parameter is supplied, it is used as for the "iconsRelativeDirectory" constructor parameter for each instance - this instance of GoCloudStorageManager manages in storages.

          -
          -
        • -
        -

        Returns GoCloudStorageManager

        -
      • -
      -
      -
      -
      -

      Properties

      -
      - -

      - currentStorage - : GoCloudStorage

      -
        -
      • -
        -

        Get / set the GoCloudStorage subclass this instance of GoCloudStorageManager is actively managing.

        -
        -
      • -
      -
      -
      - -

      - iconsRelativeDirectory - : string

      -
        -
      • -
        -

        Get / set iconsRelativeDirectory, the directory path relative to the page in which this instance of GoCloudStorageManager exists, in which - the storage service brand icons can be found. The default value is "../goCloudStorageIcons/".

        -
        -
      • -
      -
      -
      - -

      - Read-only - menu - : HTMLElement

      -
        -
      • -
        -

        Get GoCloudStorageManager menu, from which a user chooses which storage service for this instance of GoCloudStorageManager to actively manage (see currentStorage). - This is created (as a blank div) during construction. Its contents are populated during selectStorageService.

        -
        -
      • -
      -
      -
      - -

      - Read-only - storages - : Set<GoCloudStorage>

      -
        -
      • -
        -

        Get storages (GoCloudStorage subclass instances) managed by an instance of GoCloudStorageManager. At most, there should be only one instance of each subclass. - This is set with a parameter during construction.

        -
        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - create -

      -
        -
      • create(saveBeforeCreate?: boolean): Promise<unknown>
      • -
      -
        -
      • -
        -

        Creates a new diagram with currentStorage's default model data (see GoCloudStorage.defaultModel. - If currentStorage.isAutoSaving is true, prompt to save it to to currentStorage's storage service. - if currentStorage's GoCloudStorage.isAutoSaving is true).

        -
        -

        Parameters

        -
          -
        • -
          saveBeforeCreate: boolean = false
          -
          -

          Whether or not to prompt the user to save their current work before creating a new diagram. - See more at GoCloudStorage.create. Default value is false.

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves a DiagramFile representing the newly created file (if file was saved).

        -
      • -
      -
      -
      - -

      - getStorageIconPath -

      -
        -
      • getStorageIconPath(className: string): string
      • -
      -
        -
      • -
        -

        Get the path to the icon for a given GoCloudStorage.className

        -
        -

        Parameters

        -
          -
        • -
          className: string
          -
          -
          -
        • -
        -

        Returns string

        -
      • -
      -
      -
      - -

      - handleAction -

      -
        -
      • handleAction(action: string, saveBeforeCreate?: boolean): Promise<unknown>
      • -
      -
        -
      • -
        -

        Handle an action with the current currentStorage. Possible values for action can be:

        -
          -
        • Load
        • -
        • Save
        • -
        • Save As
        • -
        • Create
        • -
        • Remove
        • -
        -
        -

        Parameters

        -
          -
        • -
          action: string
          -
        • -
        • -
          saveBeforeCreate: boolean = false
          -
          -

          Whether or not to prompt the user to save their current work before creating a new file. - Default value is false. See more at GoCloudStorage.create

          -
          -
        • -
        -

        Returns Promise<unknown>

        -
      • -
      -
      -
      - -

      - hideMenu -

      -
        -
      • hideMenu(): void
      • -
      -
        -
      • -
        -

        Hide the storage selection menu

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - load -

      -
        -
      • load(): Promise<unknown>
      • -
      -
        -
      • -
        -

        Launches the load interface for currentStorage.

        -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the loaded file.

        -
      • -
      -
      -
      - -

      - remove -

      -
        -
      • remove(): Promise<unknown>
      • -
      -
        -
      • -
        -

        Launches the remove interface for currentStorage.

        -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the deleted file.

        -
      • -
      -
      -
      - -

      - save -

      -
        -
      • save(isSaveAs?: boolean): Promise<unknown>
      • -
      -
        -
      • -
        -

        Either launches the save interface for currentStorage or just saves the GoCloudStorage.managedDiagrams' model data to - storage at the path supplied in currentStorage's GoCloudStorage.currentDiagramFile.path value, depending on a parameter.

        -
        -

        Parameters

        -
          -
        • -
          isSaveAs: boolean = true
          -
          -

          If true, show the save interface for currentStorage. If false, save currentStorage's managedDiagrams' model data to storage. - Default value is true.

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the saved file.

        -
      • -
      -
      -
      - -

      - selectStorageService -

      -
        -
      • selectStorageService(): Promise<unknown>
      • -
      -
        -
      • -
        -

        Display options (storages) supported by this instance of GoCloudStorageManager. - Sets currentStorage to user's choice.

        -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with the new currentStorage instance

        -
      • -
      -
      -
      - -

      - showMessage -

      -
        -
      • showMessage(msg: string, seconds?: number): void
      • -
      -
        -
      • -
        -

        Display a message on the screen for a given number of seconds. Can be used for a variety of purposes, but a common one is to - notify users when a file has been loaded / saved / deleted / created by handling the DiagramFile argument in the - "then" function of returned Promises (from functions load, create, save, - remove) by displaying it as a message.

        -
        -

        Parameters

        -
          -
        • -
          msg: string
          -
          -

          Message to display

          -
          -
        • -
        • -
          Optional seconds: number
          -
          -

          Number of seconds to display the message for. If no value is provided, the message will display for two seconds.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class GoCloudStorageManager Storage

      This is part of GoCloudStorage and not part of the main GoJS library. Storage can be found in the GoJS kit under the projects folder. See the Storage intro page for more information.

      Hierarchy

      • GoCloudStorageManager
      +

      Class for easily saving / loading GoJS Models to / from a user-defined set of Cloud Storage Services with a pre-defined UI.

      +

      GoCloudStorageManager holds a set of GoCloudStorage subclass instances (storages) to manage. When one is selected from the +storage selection menu, it becomes the currentStorage property, which is used to save / load / delete / create files.

      +

      Index

      Constructors

      • Parameters

        • storages: Set<GoCloudStorage> | GoCloudStorage[]
          +

          Contains valid instances of GoCloudStorage subclasses. Use at most one instance of each subclass.

          +
        • Optional iconsRelativeDirectory: string
          +

          The directory path relative to the page in which this instance of GoCloudStorageManager exists, in which +the storage service brand icons can be found. The default value is "../goCloudStorageIcons/". +Note: If this parameter is supplied, it is used as for the "iconsRelativeDirectory" constructor parameter for each instance +this instance of GoCloudStorageManager manages in storages.

          +

        Returns GoCloudStorageManager

      Properties

      • +

        Get / set the GoCloudStorage subclass this instance of GoCloudStorageManager is actively managing.

        +
      • +

        Get / set iconsRelativeDirectory, the directory path relative to the page in which this instance of GoCloudStorageManager exists, in which +the storage service brand icons can be found. The default value is "../goCloudStorageIcons/".

        +
      • +

        Get GoCloudStorageManager menu, from which a user chooses which storage service for this instance of GoCloudStorageManager to actively manage (see currentStorage). +This is created (as a blank div) during construction. Its contents are populated during selectStorageService.

        +
      • +

        Get storages (GoCloudStorage subclass instances) managed by an instance of GoCloudStorageManager. At most, there should be only one instance of each subclass. +This is set with a parameter during construction.

        +

      Methods

      • create(saveBeforeCreate?: boolean): Promise<unknown>
      • +

        Creates a new diagram with currentStorage's default model data (see GoCloudStorage.defaultModel. +If currentStorage.isAutoSaving is true, prompt to save it to to currentStorage's storage service. +if currentStorage's GoCloudStorage.isAutoSaving is true).

        +

        Parameters

        • saveBeforeCreate: boolean = false
          +

          Whether or not to prompt the user to save their current work before creating a new diagram. +See more at GoCloudStorage.create. Default value is false.

          +

        Returns Promise<unknown>

        Returns a Promise that resolves a DiagramFile representing the newly created file (if file was saved).

        +
      • getStorageIconPath(className: string): string
      • handleAction(action: string, saveBeforeCreate?: boolean): Promise<unknown>
      • +

        Handle an action with the current currentStorage. Possible values for action can be:

        +
          +
        • Load
        • +
        • Save
        • +
        • Save As
        • +
        • Create
        • +
        • Remove
        • +
        +

        Parameters

        • action: string
        • saveBeforeCreate: boolean = false
          +

          Whether or not to prompt the user to save their current work before creating a new file. +Default value is false. See more at GoCloudStorage.create

          +

        Returns Promise<unknown>

      • hideMenu(): void
      • +

        Hide the storage selection menu

        +

        Returns void

      • load(): Promise<unknown>
      • +

        Launches the load interface for currentStorage.

        +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the loaded file.

        +
      • remove(): Promise<unknown>
      • +

        Launches the remove interface for currentStorage.

        +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the deleted file.

        +
      • save(isSaveAs?: boolean): Promise<unknown>
      • +

        Either launches the save interface for currentStorage or just saves the GoCloudStorage.managedDiagrams' model data to +storage at the path supplied in currentStorage's GoCloudStorage.currentDiagramFile.path value, depending on a parameter.

        +

        Parameters

        • isSaveAs: boolean = true
          +

          If true, show the save interface for currentStorage. If false, save currentStorage's managedDiagrams' model data to storage. +Default value is true.

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the saved file.

        +
      • selectStorageService(): Promise<unknown>
      • +

        Display options (storages) supported by this instance of GoCloudStorageManager. +Sets currentStorage to user's choice.

        +

        Returns Promise<unknown>

        Returns a Promise that resolves with the new currentStorage instance

        +
      • showMessage(msg: string, seconds?: number): void
      • +

        Display a message on the screen for a given number of seconds. Can be used for a variety of purposes, but a common one is to +notify users when a file has been loaded / saved / deleted / created by handling the DiagramFile argument in the +"then" function of returned Promises (from functions load, create, save, +remove) by displaying it as a message.

        +

        Parameters

        • msg: string
          +

          Message to display

          +
        • Optional seconds: number
          +

          Number of seconds to display the message for. If no value is provided, the message will display for two seconds.

          +

        Returns void

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/GoDropBox.html b/api/symbols/GoDropBox.html index 70bfc37f4..d9f409552 100644 --- a/api/symbols/GoDropBox.html +++ b/api/symbols/GoDropBox.html @@ -1,690 +1,138 @@ - - - - - - GoDropBox | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class GoDropBox

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      - This is part of GoCloudStorage and not part of the main GoJS library. - Storage can be found in the GoJS kit under the projects folder. - See the Storage intro page for more information. -

      -
      -
      -

      Hierarchy

      - -
      -
      -
      -

      Class for saving / loading GoJS Models to / from Dropbox. - As with all GoCloudStorage subclasses (with the exception of GoLocalStorage, any page using GoDropBox must be served on a web server.

      -

      Note: Any page using GoDropBox must include a script tag with a reference to the Dropbox JS SDK.

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -

      Properties

      - -
      -
      -

      Methods

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      -
        -
      • new GoDropBox(managedDiagrams: Diagram | Diagram[], clientId: string, defaultModel?: string, iconsRelativeDirectory?: string): GoDropBox
      • -
      -
        -
      • -

        Parameters

        -
          -
        • -
          managedDiagrams: Diagram | Diagram[]
          -
          -

          An array of GoJS Diagrams whose model(s) will be saved to / loaded from Dropbox. - Can also be a single Diagram.

          -
          -
        • -
        • -
          clientId: string
          -
          -

          The client ID of the application in use (given in Dropbox Developer's Console)

          -
          -
        • -
        • -
          Optional defaultModel: string
          -
          -

          String representation of the default model data for new diagrams. If this is null, - default new diagrams will be empty. Usually a value given by calling Model.toJson on a GoJS Diagram's Model.

          -
          -
        • -
        • -
          Optional iconsRelativeDirectory: string
          -
          -

          The directory path relative to the page in which this instance of GoDropBox exists, in which - the storage service brand icons can be found. The default value is "../goCloudStorageIcons/".

          -
          -
        • -
        -

        Returns GoDropBox

        -
      • -
      -
      -
      -
      -

      Properties

      -
      - -

      - Read-only - dropbox - : any

      - -
      -
      - -

      - menuPath - : string

      -
        -
      • -
        -

        Get / set currently open Dropnpx path in custom filepicker ui. Default value is the empty string, which corresponds to the - currently signed in user's Drobox account's root path. Set when a user clicks on a folder in the custom ui menu by invoking anchor onclick values. - These onclick values are set when the Dropbox directory at the current menuPath is displayed with showUI.

        -
        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - Override - authorize -

      -
        -
      • authorize(refreshToken?: boolean): Promise<unknown>
      • -
      -
        -
      • -
        -

        Check if there is a signed in Dropbox user who has authorized the application linked to this instance of GoDropBox (via clientId). - If not, prompt user to sign in / authenticate their Dropbox account.

        -
        -

        Parameters

        -
          -
        • -
          refreshToken: boolean = false
          -
          -

          Whether to get a new acess token (triggers a page redirect) (true) or try to find / use the - one in the browser window URI (no redirect) (false)

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a boolean stating whether authorization was succesful (true) or failed (false)

        -
      • -
      -
      -
      - -

      - Override - checkFileExists -

      -
        -
      • checkFileExists(path: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Check whether a file exists in user's Dropbox at a given path.

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid Dropbox filepath. Path syntax is /{path-to-file}/{filename}; i.e. /Public/example.diagram. - Alternatively, this may be a valid Dropbox file ID.

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a boolean stating whether a file exists in user's Dropbox at a given path

        -
      • -
      -
      -
      - -

      - Override - getFile -

      -
        -
      • getFile(path: string): any
      • -
      -
        -
      • -
        -

        Get the Dropbox file reference object at a given path. Properties of particular note include:

        -
          -
        • name: The name of the file in DropBox
        • -
        • id: The DropBox-given file ID
        • -
        • path_diplay: A lower-case version of the path this file is stored at in DropBox
        • -
        • .tag: A tag denoting the type of this file. Common values are "file" and "folder".
        • -
        -

        Note: The first three elements in the above list are requisite for creating valid DiagramFiles.

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid Dropbox filepath. Path syntax is /{path-to-file}/{filename}; i.e. /Public/example.diagram. - Alternatively, this may be a valid Dropbox file ID.

          -
          -
        • -
        -

        Returns any

        -

        Returns a Promise that resolves with a Dropbox file reference object at a given path

        -
      • -
      -
      -
      - -

      - Override - getUserInfo -

      -
        -
      • getUserInfo(): Promise<unknown>
      • -
      -
        -
      • -
        -

        Get information about the currently logged in Dropbox user. Some properties of particular note include:

        -
          -
        • country
        • -
        • email
        • -
        • account_id
        • -
        • name
            -
          • abbreviated_name
          • -
          • display_name
          • -
          • given_name
          • -
          • surname
          • -
          -
        • -
        -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with information about the currently logged in Dropbox user

        -
      • -
      -
      -
      - -

      - Override - hideUI -

      -
        -
      • hideUI(isActionCanceled?: boolean): void
      • -
      -
        -
      • -
        -

        Hide the custom GoDropBox filepicker ui; nullify menuPath.

        -
        -

        Parameters

        -
          -
        • -
          Optional isActionCanceled: boolean
          -
          -

          If action (Save, Delete, Load) is cancelled, resolve the Promise returned in showUI with a 'Canceled' notification.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - load -

      -
        -
      • load(path: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Load the contents of a saved diagram from Dropbox.

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid Dropbox filepath to load diagram model data from. Path syntax is /{path-to-file}/{filename}; - i.e. /Public/example.diagram. - Alternatively, this may be a valid Dropbox file ID.

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the loaded file

        -
      • -
      -
      -
      - -

      - Override - loadWithUI -

      -
        -
      • loadWithUI(): any
      • -
      -
        -
      • -
        -

        Load the contents of a saved diagram from Dropbox using the custom filepicker ui.

        -
        -

        Returns any

        -

        Returns a Promise that resolves with a DiagramFile representing the loaded file.

        -
      • -
      -
      -
      - -

      - Override - remove -

      -
        -
      • remove(path: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Delete a given diagram file from Dropbox.

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid Dropbox filepath to delete diagram model data from. Path syntax is - /{path-to-file}/{filename}; i.e. /Public/example.diagram. - Alternatively, this may be a valid Dropbox file ID.

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the deleted file.

        -
      • -
      -
      -
      - -

      - Override - removeWithUI -

      -
        -
      • removeWithUI(): any
      • -
      -
        -
      • -
        -

        Delete a chosen diagram file from Dropbox using the custom filepicker ui.

        -
        -

        Returns any

        -

        Returns a Promise that resolves with a DiagramFile representing the deleted file.

        -
      • -
      -
      -
      - -

      - Override - save -

      -
        -
      • save(path?: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Save managedDiagrams' model data to Dropbox. If path is supplied save to that path. If no path is supplied but currentDiagramFile has non-null, - valid properties, update saved diagram file content at the path in Dropbox corresponding to currentDiagramFile.path with current managedDiagrams' model data. - If no path is supplied and currentDiagramFile is null or has null properties, this calls saveWithUI.

        -
        -

        Parameters

        -
          -
        • -
          Optional path: string
          -
          -

          A valid Dropbox filepath to save current diagram model to. Path syntax is /{path-to-file}/{filename}; - i.e. /Public/example.diagram. - Alternatively, this may be a valid Dropbox file ID.

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the saved file.

        -
      • -
      -
      -
      - -

      - Override - saveWithUI -

      -
        -
      • saveWithUI(filename?: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Save the current managedDiagrams model data to Dropbox with the filepicker ui. Returns a Promise that resolves with a - DiagramFile representing the saved file.

        -
        -

        Parameters

        -
          -
        • -
          Optional filename: string
          -
          -

          Optional: The name to save data to Dropbox under. If this is not provided, you will be prompted for a filename

          -
          -
        • -
        -

        Returns Promise<unknown>

        -
      • -
      -
      -
      - -

      - Override - showUI -

      -
        -
      • showUI(): any
      • -
      -
        -
      • -

        Returns any

        -
      • -
      -
      -
      - -

      - signOut -

      -
        -
      • signOut(): void
      • -
      -
        -
      • -
        -

        Sign out the currently signed in Dropbox user - Note: Since this redirects the app page, unsaved diagram model data will be lost after calling this

        -
        -

        Returns void

        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class GoDropBox Storage

      This is part of GoCloudStorage and not part of the main GoJS library. Storage can be found in the GoJS kit under the projects folder. See the Storage intro page for more information.

      Hierarchy

      +

      Class for saving / loading GoJS Models to / from Dropbox. +As with all GoCloudStorage subclasses (with the exception of GoLocalStorage, any page using GoDropBox must be served on a web server.

      +

      Note: Any page using GoDropBox must include a script tag with a reference to the Dropbox JS SDK.

      +

      Index

      Inherited Members

      Constructors

      • new GoDropBox(managedDiagrams: Diagram | Diagram[], clientId: string, defaultModel?: string, iconsRelativeDirectory?: string): GoDropBox
      • Parameters

        • managedDiagrams: Diagram | Diagram[]
          +

          An array of GoJS Diagrams whose model(s) will be saved to / loaded from Dropbox. +Can also be a single Diagram.

          +
        • clientId: string
          +

          The client ID of the application in use (given in Dropbox Developer's Console)

          +
        • Optional defaultModel: string
          +

          String representation of the default model data for new diagrams. If this is null, +default new diagrams will be empty. Usually a value given by calling Model.toJson on a GoJS Diagram's Model.

          +
        • Optional iconsRelativeDirectory: string
          +

          The directory path relative to the page in which this instance of GoDropBox exists, in which +the storage service brand icons can be found. The default value is "../goCloudStorageIcons/".

          +

        Returns GoDropBox

      Properties

      • +

        Get / set currently open Dropnpx path in custom filepicker ui. Default value is the empty string, which corresponds to the +currently signed in user's Drobox account's root path. Set when a user clicks on a folder in the custom ui menu by invoking anchor onclick values. +These onclick values are set when the Dropbox directory at the current menuPath is displayed with showUI.

        +

      Methods

      • authorize(refreshToken?: boolean): Promise<unknown>
      • +

        Check if there is a signed in Dropbox user who has authorized the application linked to this instance of GoDropBox (via clientId). +If not, prompt user to sign in / authenticate their Dropbox account.

        +

        Parameters

        • refreshToken: boolean = false
          +

          Whether to get a new acess token (triggers a page redirect) (true) or try to find / use the +one in the browser window URI (no redirect) (false)

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a boolean stating whether authorization was succesful (true) or failed (false)

        +
      • checkFileExists(path: string): Promise<unknown>
      • +

        Check whether a file exists in user's Dropbox at a given path.

        +

        Parameters

        • path: string
          +

          A valid Dropbox filepath. Path syntax is /{path-to-file}/{filename}; i.e. /Public/example.diagram. +Alternatively, this may be a valid Dropbox file ID.

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a boolean stating whether a file exists in user's Dropbox at a given path

        +
      • getFile(path: string): any
      • +

        Get the Dropbox file reference object at a given path. Properties of particular note include:

        +
          +
        • name: The name of the file in DropBox
        • +
        • id: The DropBox-given file ID
        • +
        • path_diplay: A lower-case version of the path this file is stored at in DropBox
        • +
        • .tag: A tag denoting the type of this file. Common values are "file" and "folder".
        • +
        +

        Note: The first three elements in the above list are requisite for creating valid DiagramFiles.

        +

        Parameters

        • path: string
          +

          A valid Dropbox filepath. Path syntax is /{path-to-file}/{filename}; i.e. /Public/example.diagram. +Alternatively, this may be a valid Dropbox file ID.

          +

        Returns any

        Returns a Promise that resolves with a Dropbox file reference object at a given path

        +
      • getUserInfo(): Promise<unknown>
      • +

        Get information about the currently logged in Dropbox user. Some properties of particular note include:

        +
          +
        • country
        • +
        • email
        • +
        • account_id
        • +
        • name
            +
          • abbreviated_name
          • +
          • display_name
          • +
          • given_name
          • +
          • surname
          • +
          +
        • +
        +

        Returns Promise<unknown>

        Returns a Promise that resolves with information about the currently logged in Dropbox user

        +
      • hideUI(isActionCanceled?: boolean): void
      • +

        Hide the custom GoDropBox filepicker ui; nullify menuPath.

        +

        Parameters

        • Optional isActionCanceled: boolean
          +

          If action (Save, Delete, Load) is cancelled, resolve the Promise returned in showUI with a 'Canceled' notification.

          +

        Returns void

      • load(path: string): Promise<unknown>
      • +

        Load the contents of a saved diagram from Dropbox.

        +

        Parameters

        • path: string
          +

          A valid Dropbox filepath to load diagram model data from. Path syntax is /{path-to-file}/{filename}; +i.e. /Public/example.diagram. +Alternatively, this may be a valid Dropbox file ID.

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the loaded file

        +
      • loadWithUI(): any
      • +

        Load the contents of a saved diagram from Dropbox using the custom filepicker ui.

        +

        Returns any

        Returns a Promise that resolves with a DiagramFile representing the loaded file.

        +
      • remove(path: string): Promise<unknown>
      • +

        Delete a given diagram file from Dropbox.

        +

        Parameters

        • path: string
          +

          A valid Dropbox filepath to delete diagram model data from. Path syntax is +/{path-to-file}/{filename}; i.e. /Public/example.diagram. +Alternatively, this may be a valid Dropbox file ID.

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the deleted file.

        +
      • removeWithUI(): any
      • +

        Delete a chosen diagram file from Dropbox using the custom filepicker ui.

        +

        Returns any

        Returns a Promise that resolves with a DiagramFile representing the deleted file.

        +
      • save(path?: string): Promise<unknown>
      • +

        Save managedDiagrams' model data to Dropbox. If path is supplied save to that path. If no path is supplied but currentDiagramFile has non-null, +valid properties, update saved diagram file content at the path in Dropbox corresponding to currentDiagramFile.path with current managedDiagrams' model data. +If no path is supplied and currentDiagramFile is null or has null properties, this calls saveWithUI.

        +

        Parameters

        • Optional path: string
          +

          A valid Dropbox filepath to save current diagram model to. Path syntax is /{path-to-file}/{filename}; +i.e. /Public/example.diagram. +Alternatively, this may be a valid Dropbox file ID.

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the saved file.

        +
      • saveWithUI(filename?: string): Promise<unknown>
      • +

        Save the current managedDiagrams model data to Dropbox with the filepicker ui. Returns a Promise that resolves with a +DiagramFile representing the saved file.

        +

        Parameters

        • Optional filename: string
          +

          Optional: The name to save data to Dropbox under. If this is not provided, you will be prompted for a filename

          +

        Returns Promise<unknown>

      • showUI(): any
      • +

        Show the ui element associated with this instance of GoCloudStorage.

        +

        Returns any

        Returns a Promise that resolves (in save, load, or remove with an DiagramFile +representing the saved/loaded/deleted file

        +
      • signOut(): void
      • +

        Sign out the currently signed in Dropbox user +Note: Since this redirects the app page, unsaved diagram model data will be lost after calling this

        +

        Returns void

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/GoGoogleDrive.html b/api/symbols/GoGoogleDrive.html index 52e90b6a2..e7d4a3602 100644 --- a/api/symbols/GoGoogleDrive.html +++ b/api/symbols/GoGoogleDrive.html @@ -1,708 +1,141 @@ - - - - - - GoGoogleDrive | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class GoGoogleDrive

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      - This is part of GoCloudStorage and not part of the main GoJS library. - Storage can be found in the GoJS kit under the projects folder. - See the Storage intro page for more information. -

      -
      -
      -

      Hierarchy

      - -
      -
      -
      -

      Class for saving / loading GoJS Models to / from Google Drive. - Uses the Google Drive V3 API by use of a - Google Client API object. - As with all GoCloudStorage subclasses (with the exception of GoLocalStorage, any page using GoDropBox must be served on a web server.

      -

      Note: Any page using GoGoogleDrive must include a script tag with src set to https://apis.google.com/js/api.js.

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -

      Properties

      - -
      -
      -

      Methods

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      -
        -
      • new GoGoogleDrive(managedDiagrams: Diagram | Diagram[], clientId: string, pickerApiKey: string, defaultModel?: string, iconsRelativeDirectory?: string): GoGoogleDrive
      • -
      -
        -
      • -

        Parameters

        -
          -
        • -
          managedDiagrams: Diagram | Diagram[]
          -
          -

          An array of GoJS Diagrams whose model(s) will be saved to / loaded from Google Drive. - Can also be a single Diagram.

          -
          -
        • -
        • -
          clientId: string
          -
          -

          The client ID of the Google application linked with this instance of GoGoogleDrive (given in - Google Developers Console after registering a Google app)

          -
          -
        • -
        • -
          pickerApiKey: string
          -
          -

          The Google Picker API key. Once - obtained, it can be found in the Google Developers Console

          -
          -
        • -
        • -
          Optional defaultModel: string
          -
          -

          String representation of the default model data for new diagrams. If this is null, default new diagrams will be empty. - Usually a value given by calling Model.toJson on a GoJS Diagram's Model.

          -
          -
        • -
        • -
          Optional iconsRelativeDirectory: string
          -
          -

          The directory path relative to the page in which this instance of GoGoogleDrive exists, in which - the storage service brand icons can be found. The default value is "../goCloudStorageIcons/".

          -
          -
        • -
        -

        Returns GoGoogleDrive

        -
      • -
      -
      -
      -
      -

      Properties

      -
      - -

      - Read-only - gapiClient - : any

      -
        -
      • -
        -

        Get Google API Client. The Google API Client is used in GoGoogleDrive to make many different requests to Google Drive, however, it - can be used with other Google Libraries to achieve many purposes. To read more about what can be done with a Google API Client object, - click here. gapiClient is set after a succesful - authorization in authorize.

        -

        gapiClient is really of type Object, not type any. However, the Google libraries are all written in JavaScript and do not provide - d.ts files. As such, to avoid TypeScript compilation errors, both gapiClient and gapiPicker properties are declared as type any.

        -
        -
      • -
      -
      -
      - -

      - Read-only - gapiPicker - : any

      -
        -
      • -
        -

        Get Google Picker API Object. Used to show the Google filepicker when loading - / deleting files, in the createPicker function. gapiPicker is set after a succesful authorization in authorize.

        -

        gapiPicker is really of type Object, not type any. However, the Google libraries are all written in JavaScript and do not - provide d.ts files. As such, to avoid TypeScript compilation errors, both gapiClient and gapiPicker properties are declared as type any.

        -
        -
      • -
      -
      -
      - -

      - Read-only - pickerApiKey - : string

      -
        -
      • -
        -

        Get the Google Picker API key associated with this instance of GoGoogleDrive. This is set with a parameter during construction. - A Google Picker API key can be obtained by following the process detailed here, - and it can be found in your Google Developers Console. The pickerApiKey is used only in createPicker.

        -
        -
      • -
      -
      -
      - -

      - Read-only - scope - : string

      -
        -
      • -
        -

        Get the scope for the application linked to this instance of GoGoogleDrive (via clientId). Scope tells the - gapiClient what permissions it has in making requests. Read more on scope here. - The default value is 'https://www.googleapis.com/auth/drive', set during construction. This can only be modified by changing the source code for - GoGoogleDrive. As changing scope impacts gapiClient's permissions (and could break the usability of some or all functions of GoGoogleDrive), this is not recommended.

        -
        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - Override - authorize -

      -
        -
      • authorize(refreshToken?: boolean): Promise<unknown>
      • -
      -
        -
      • -
        -

        Check if there is a signed in user who has authorized the application connected to this instance of GoGoogleDrive (via clientId. - If not, prompt user to sign into their Google Account and authorize the application. On successful authorization, set gapiClient and gapiPicker.

        -
        -

        Parameters

        -
          -
        • -
          refreshToken: boolean = false
          -
          -

          Whether to get a new token (change current Google User)(true) or attempt to fetch a token for the currently signed in Google User (false).

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a boolean stating whether authorization was succesful (true) or failed (false)

        -
      • -
      -
      -
      - -

      - Override - checkFileExists -

      -
        -
      • checkFileExists(path: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Check whether a file exists at a given path

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid GoogleDrive file ID -- not a path. Named 'path' only to preserve system nomenclature

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a boolean stating whether a file exists at a given path

        -
      • -
      -
      -
      - -

      - createPicker -

      -
        -
      • createPicker(cb: Function): void
      • -
      -
        -
      • -
        -

        Launch Google Picker, a filepicker UI used to graphically select files in - Google Drive to load or delete. This is accomplished with gapiPicker, which is set after succesful authorization, so this - function may only be called after a successful call to authorize.

        -
        -

        Parameters

        -
          -
        • -
          cb: Function
          -
          -

          Callback function that takes the chosen file from the picker as a parameter

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - getFile -

      -
        -
      • getFile(path: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Get the Google Drive file reference object at a given path. Fields include:

        -
          -
        • id: The Google Drive-given ID of the file at the provided path
        • -
        • name: The name of the file saved to Google Drive at the provided path
        • -
        • mimeType: For diagram files, this will always be text/plain
        • -
        • kind: This will usually be drive#file.
        • -
        -

        Note: Name, ID, and path values are requisite for creating valid DiagramFiles. When creating a DiagramFile for a - diagram saved to Google Drive, provide the same value for name and path properties.

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid GoogleDrive file ID -- not a path. Named 'path' only to preserve system nomenclature

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a Google Drive file reference object at a given path

        -
      • -
      -
      -
      - -

      - Override - getUserInfo -

      -
        -
      • getUserInfo(): Promise<unknown>
      • -
      -
        -
      • -
        -

        Get information about the - currently logged in Google user. Some fields of particular note include:

        -
          -
        • displayName
        • -
        • emailAdrdress
        • -
        • kind
        • -
        -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with information about the currently logged in Google user

        -
      • -
      -
      -
      - -

      - Override - load -

      -
        -
      • load(path: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Get the contents of a saved diagram from Google Drive using a given Google Drive file ID. No UI of any sort appears.

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid GoogleDrive file ID -- not a path. Named 'path' only to preserve GoCloudStorage system nomenclature

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the loaded file

        -
      • -
      -
      -
      - -

      - Override - loadWithUI -

      -
        -
      • loadWithUI(): Promise<unknown>
      • -
      -
        -
      • -
        -

        Load the contents of a saved diagram from Google Drive using the Google Picker (see gapiPicker and createPicker).

        -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the loaded file

        -
      • -
      -
      -
      - -

      - Override - remove -

      -
        -
      • remove(path: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Delete a the diagram from a user's Google Drive with the given Google Drive file ID. No UI of any sort appears.

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid GoogleDrive file ID -- not a path. Named 'path' only to preserve system nomenclature

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the deleted file

        -
      • -
      -
      -
      - -

      - Override - removeWithUI -

      -
        -
      • removeWithUI(): Promise<unknown>
      • -
      -
        -
      • -
        -

        Delete a selected diagram from a user's Google Drive using the Google Picker (see gapiPicker and createPicker).

        -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the deleted file

        -
      • -
      -
      -
      - -

      - Override - save -

      -
        -
      • save(path?: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Save managedDiagrams' model data to GoGoogleDrive. If path is supplied save to that path. If no path is supplied but currentDiagramFile has non-null, - valid properties, update saved diagram file content at the path in GoGoogleDrive corresponding to currentDiagramFile.path with current managedDiagrams' model data. - If no path is supplied and currentDiagramFile is null or has null properties, this calls saveWithUI.

        -
        -

        Parameters

        -
          -
        • -
          Optional path: string
          -
          -

          A name (not a path, not an id) to save this diagram file in Google Drive under. Named 'path' only to preserve system nomenclature

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the saved file

        -
      • -
      -
      -
      - -

      - Override - saveWithUI -

      -
        -
      • saveWithUI(): Promise<unknown>
      • -
      -
        -
      • -
        -

        Save the current managedDiagrams's model data to the current Google user's Google Drive using the custom ui save prompt.

        -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the saved file

        -
      • -
      -
      -
      - -

      - Override - showUI -

      -
        -
      • showUI(): any
      • -
      -
        -
      • -
        -

        Show the custom GoGoogleDrive save prompt; a div with an HTML input element that accepts a file name to save the current managedDiagrams - data to in Google Drive.

        -
        -

        Returns any

        -

        Returns a Promise that resolves (in save, load, or remove) with a DiagramFile representing the saved/loaded/deleted file

        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class GoGoogleDrive Storage

      This is part of GoCloudStorage and not part of the main GoJS library. Storage can be found in the GoJS kit under the projects folder. See the Storage intro page for more information.

      Hierarchy

      +

      Class for saving / loading GoJS Models to / from Google Drive. +Uses the Google Drive V3 API by use of a +Google Client API object. +As with all GoCloudStorage subclasses (with the exception of GoLocalStorage, any page using GoDropBox must be served on a web server.

      +

      Note: Any page using GoGoogleDrive must include a script tag with src set to https://apis.google.com/js/api.js.

      +

      Index

      Inherited Members

      Constructors

      • new GoGoogleDrive(managedDiagrams: Diagram | Diagram[], clientId: string, pickerApiKey: string, defaultModel?: string, iconsRelativeDirectory?: string): GoGoogleDrive
      • Parameters

        • managedDiagrams: Diagram | Diagram[]
          +

          An array of GoJS Diagrams whose model(s) will be saved to / loaded from Google Drive. +Can also be a single Diagram.

          +
        • clientId: string
          +

          The client ID of the Google application linked with this instance of GoGoogleDrive (given in +Google Developers Console after registering a Google app)

          +
        • pickerApiKey: string
          +

          The Google Picker API key. Once +obtained, it can be found in the Google Developers Console

          +
        • Optional defaultModel: string
          +

          String representation of the default model data for new diagrams. If this is null, default new diagrams will be empty. +Usually a value given by calling Model.toJson on a GoJS Diagram's Model.

          +
        • Optional iconsRelativeDirectory: string
          +

          The directory path relative to the page in which this instance of GoGoogleDrive exists, in which +the storage service brand icons can be found. The default value is "../goCloudStorageIcons/".

          +

        Returns GoGoogleDrive

      Properties

      • +

        Get Google API Client. The Google API Client is used in GoGoogleDrive to make many different requests to Google Drive, however, it +can be used with other Google Libraries to achieve many purposes. To read more about what can be done with a Google API Client object, +click here. gapiClient is set after a succesful +authorization in authorize.

        +

        gapiClient is really of type Object, not type any. However, the Google libraries are all written in JavaScript and do not provide +d.ts files. As such, to avoid TypeScript compilation errors, both gapiClient and gapiPicker properties are declared as type any.

        +
      • +

        Get Google Picker API Object. Used to show the Google filepicker when loading +/ deleting files, in the createPicker function. gapiPicker is set after a succesful authorization in authorize.

        +

        gapiPicker is really of type Object, not type any. However, the Google libraries are all written in JavaScript and do not +provide d.ts files. As such, to avoid TypeScript compilation errors, both gapiClient and gapiPicker properties are declared as type any.

        +
      • +

        Get the Google Picker API key associated with this instance of GoGoogleDrive. This is set with a parameter during construction. +A Google Picker API key can be obtained by following the process detailed here, +and it can be found in your Google Developers Console. The pickerApiKey is used only in createPicker.

        +
      • +

        Get the scope for the application linked to this instance of GoGoogleDrive (via clientId). Scope tells the +gapiClient what permissions it has in making requests. Read more on scope here. +The default value is 'https://www.googleapis.com/auth/drive', set during construction. This can only be modified by changing the source code for +GoGoogleDrive. As changing scope impacts gapiClient's permissions (and could break the usability of some or all functions of GoGoogleDrive), this is not recommended.

        +

      Methods

      • authorize(refreshToken?: boolean): Promise<unknown>
      • +

        Check if there is a signed in user who has authorized the application connected to this instance of GoGoogleDrive (via clientId. +If not, prompt user to sign into their Google Account and authorize the application. On successful authorization, set gapiClient and gapiPicker.

        +

        Parameters

        • refreshToken: boolean = false
          +

          Whether to get a new token (change current Google User)(true) or attempt to fetch a token for the currently signed in Google User (false).

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a boolean stating whether authorization was succesful (true) or failed (false)

        +
      • checkFileExists(path: string): Promise<unknown>
      • +

        Check whether a file exists at a given path

        +

        Parameters

        • path: string
          +

          A valid GoogleDrive file ID -- not a path. Named 'path' only to preserve system nomenclature

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a boolean stating whether a file exists at a given path

        +
      • createPicker(cb: Function): void
      • +

        Launch Google Picker, a filepicker UI used to graphically select files in +Google Drive to load or delete. This is accomplished with gapiPicker, which is set after succesful authorization, so this +function may only be called after a successful call to authorize.

        +

        Parameters

        • cb: Function
          +

          Callback function that takes the chosen file from the picker as a parameter

          +

        Returns void

      • getFile(path: string): Promise<unknown>
      • +

        Get the Google Drive file reference object at a given path. Fields include:

        +
          +
        • id: The Google Drive-given ID of the file at the provided path
        • +
        • name: The name of the file saved to Google Drive at the provided path
        • +
        • mimeType: For diagram files, this will always be text/plain
        • +
        • kind: This will usually be drive#file.
        • +
        +

        Note: Name, ID, and path values are requisite for creating valid DiagramFiles. When creating a DiagramFile for a +diagram saved to Google Drive, provide the same value for name and path properties.

        +

        Parameters

        • path: string
          +

          A valid GoogleDrive file ID -- not a path. Named 'path' only to preserve system nomenclature

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a Google Drive file reference object at a given path

        +
      • getUserInfo(): Promise<unknown>
      • +

        Get information about the +currently logged in Google user. Some fields of particular note include:

        +
          +
        • displayName
        • +
        • emailAdrdress
        • +
        • kind
        • +
        +

        Returns Promise<unknown>

        Returns a Promise that resolves with information about the currently logged in Google user

        +
      • load(path: string): Promise<unknown>
      • +

        Get the contents of a saved diagram from Google Drive using a given Google Drive file ID. No UI of any sort appears.

        +

        Parameters

        • path: string
          +

          A valid GoogleDrive file ID -- not a path. Named 'path' only to preserve GoCloudStorage system nomenclature

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the loaded file

        +
      • loadWithUI(): Promise<unknown>
      • +

        Load the contents of a saved diagram from Google Drive using the Google Picker (see gapiPicker and createPicker).

        +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the loaded file

        +
      • remove(path: string): Promise<unknown>
      • +

        Delete a the diagram from a user's Google Drive with the given Google Drive file ID. No UI of any sort appears.

        +

        Parameters

        • path: string
          +

          A valid GoogleDrive file ID -- not a path. Named 'path' only to preserve system nomenclature

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the deleted file

        +
      • removeWithUI(): Promise<unknown>
      • +

        Delete a selected diagram from a user's Google Drive using the Google Picker (see gapiPicker and createPicker).

        +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the deleted file

        +
      • save(path?: string): Promise<unknown>
      • +

        Save managedDiagrams' model data to GoGoogleDrive. If path is supplied save to that path. If no path is supplied but currentDiagramFile has non-null, +valid properties, update saved diagram file content at the path in GoGoogleDrive corresponding to currentDiagramFile.path with current managedDiagrams' model data. +If no path is supplied and currentDiagramFile is null or has null properties, this calls saveWithUI.

        +

        Parameters

        • Optional path: string
          +

          A name (not a path, not an id) to save this diagram file in Google Drive under. Named 'path' only to preserve system nomenclature

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the saved file

        +
      • saveWithUI(): Promise<unknown>
      • +

        Save the current managedDiagrams's model data to the current Google user's Google Drive using the custom ui save prompt.

        +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the saved file

        +
      • showUI(): any
      • +

        Show the custom GoGoogleDrive save prompt; a div with an HTML input element that accepts a file name to save the current managedDiagrams +data to in Google Drive.

        +

        Returns any

        Returns a Promise that resolves (in save, load, or remove) with a DiagramFile representing the saved/loaded/deleted file

        +

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/GoLocalStorage.html b/api/symbols/GoLocalStorage.html index 31d63c87a..d5ed53af7 100644 --- a/api/symbols/GoLocalStorage.html +++ b/api/symbols/GoLocalStorage.html @@ -1,586 +1,110 @@ - - - - - - GoLocalStorage | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class GoLocalStorage

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      - This is part of GoCloudStorage and not part of the main GoJS library. - Storage can be found in the GoJS kit under the projects folder. - See the Storage intro page for more information. -

      -
      -
      -

      Hierarchy

      - -
      -
      -
      -

      Class for saving / loading GoJS Models to / from Local Storage. - GoLocalStorage is the only GoCloudStorage subclass than can be used in a local page; - that is, one not served by a web server.

      -

      Note: This class will not work with browsers that do not have Local Storage support - (like some old versions of Internet Explorer).

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -

      Properties

      - -
      -
      -

      Methods

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - -
        -
      • -

        Parameters

        -
          -
        • -
          managedDiagrams: Diagram | Diagram[]
          -
          -

          An array of GoJS Diagrams whose model(s) will be saved to / loaded from Local Storage. - Can also be a single Diagram.

          -
          -
        • -
        • -
          Optional defaultModel: string
          -
          -

          String representation of the default model data for new diagrams. If this is null, default new - diagrams will be empty. Usually a value given by calling Model.toJson on a GoJS Diagram's Model.

          -
          -
        • -
        • -
          Optional iconsRelativeDirectory: string
          -
          -

          The directory path relative to the page in which this instance of GoLocalStorage exists, in which - the storage service brand icons can be found. The default value is "../goCloudStorageIcons/".

          -
          -
        • -
        -

        Returns GoLocalStorage

        -
      • -
      -
      -
      -
      -

      Properties

      -
      - -

      - Read-only - localStorage - : Storage

      - -
      -
      -
      -

      Methods

      -
      - -

      - Override - authorize -

      -
        -
      • authorize(refreshToken?: boolean): Promise<any>
      • -
      -
        -
      • -
        -

        Check if Local Storage is supported by the current browser.

        -
        -

        Parameters

        -
          -
        • -
          refreshToken: boolean = false
          -
          -

          This parameter can be ignored. It exists only to maintain GoCloudStorage system structure

          -
          -
        • -
        -

        Returns Promise<any>

        -

        Returns a Promise that resolves with a boolean (true if local storage is supported, false if not)

        -
      • -
      -
      -
      - -

      - Override - checkFileExists -

      -
        -
      • checkFileExists(path: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Check whether a file exists in Local Storage at a given path.

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid key corresponding to a saved diagram file in Local Storage

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a boolean stating whether a file exists in LocalStorage at a given path

        -
      • -
      -
      -
      - -

      - Override - getFile -

      -
        -
      • getFile(path: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Get information about a diagram file saved to Local Storage. This data includes:

        -
          -
        • content: The content of the saved file (a string respresentation of a GoJS Diagram Model)
        • -
        • id: The key of the file in local storage
        • -
        • name: Same as id value
        • -
        • path: Same as id value
        • -
        -

        Note: Id, name, and path are all provided (despite being the same). They are required for creating valid DiagramFiles.

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid key corresponding to a saved diagram file in Local Storage

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with information about a diagram file saved to local storage

        -
      • -
      -
      -
      - -

      - Override - load -

      -
        -
      • load(path: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Get the contents of a given file; load to managedDiagrams model.

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid localstorage key to load diagram model data from

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the loaded file

        -
      • -
      -
      -
      - -

      - Override - loadWithUI -

      -
        -
      • loadWithUI(): Promise<unknown>
      • -
      -
        -
      • -
        -

        Get the contents of a given file; load to managedDiagrams model. Use the custom filepicker ui.

        -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the loaded file

        -
      • -
      -
      -
      - -

      - Override - remove -

      -
        -
      • remove(path: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Delete a given diagram from Local Storage.

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid localstorage key to delete diagram model data from

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the deleted file

        -
      • -
      -
      -
      - -

      - Override - removeWithUI -

      -
        -
      • removeWithUI(): Promise<unknown>
      • -
      -
        -
      • -
        -

        Delete a diagram from Local Storage using the custom filepicker menu ui.

        -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the deleted file

        -
      • -
      -
      -
      - -

      - Override - save -

      -
        -
      • save(path?: string): Promise<unknown>
      • -
      -
        -
      • -
        -

        Save managedDiagrams' model data to Local Storage. If path is supplied save to that path. If no path is supplied but currentDiagramFile has non-null, - valid properties, update saved diagram file content at the key in Local Storage corresponding to currentDiagramFile.path with current managedDiagrams' model data. - If no path is supplied and currentDiagramFile is null or has null properties, this calls saveWithUI.

        -
        -

        Parameters

        -
          -
        • -
          Optional path: string
          -
          -

          A string to save diagram model data to (becomes the key for the file in Local Storage)

          -
          -
        • -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the saved file

        -
      • -
      -
      -
      - -

      - Override - saveWithUI -

      -
        -
      • saveWithUI(): Promise<unknown>
      • -
      -
        -
      • -
        -

        Save the current managedDiagrams's model data to Local Storage using the custom filepicker ui.

        -
        -

        Returns Promise<unknown>

        -

        Returns a Promise that resolves with a DiagramFile representing the saved file

        -
      • -
      -
      -
      - -

      - Override - showUI -

      -
        -
      • showUI(action: string, numAdditionalFiles?: number): any
      • -
      -
        -
      • -
        -

        Show the custom Go Local Storage filepicker ui.

        -
        -

        Parameters

        -
          -
        • -
          action: string
          -
          -

          Clarify what action is being done after file selection. Must be one of the following:

          -
            -
          • New
          • -
          • Open
          • -
          • Save
          • -
          • Delete
          • -
          -
          -
        • -
        • -
          Optional numAdditionalFiles: number
          -
          -

          Optional: Number of files to show in UI, in addition to a static numerical property (that can only be - modified by changing source code). This prevents long wait times while the UI loads if there are a large number of diagram files stored in Local Storage.

          -
          -
        • -
        -

        Returns any

        -

        Returns a Promise that resolves (in save, load, or remove with an DiagramFile - representing the saved/loaded/deleted file

        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class GoLocalStorage Storage

      This is part of GoCloudStorage and not part of the main GoJS library. Storage can be found in the GoJS kit under the projects folder. See the Storage intro page for more information.

      Hierarchy

      +

      Class for saving / loading GoJS Models to / from Local Storage. +GoLocalStorage is the only GoCloudStorage subclass than can be used in a local page; +that is, one not served by a web server.

      +

      Note: This class will not work with browsers that do not have Local Storage support +(like some old versions of Internet Explorer).

      +

      Index

      Inherited Members

      Constructors

      • Parameters

        • managedDiagrams: Diagram | Diagram[]
          +

          An array of GoJS Diagrams whose model(s) will be saved to / loaded from Local Storage. +Can also be a single Diagram.

          +
        • Optional defaultModel: string
          +

          String representation of the default model data for new diagrams. If this is null, default new +diagrams will be empty. Usually a value given by calling Model.toJson on a GoJS Diagram's Model.

          +
        • Optional iconsRelativeDirectory: string
          +

          The directory path relative to the page in which this instance of GoLocalStorage exists, in which +the storage service brand icons can be found. The default value is "../goCloudStorageIcons/".

          +

        Returns GoLocalStorage

      Properties

      Methods

      • authorize(refreshToken?: boolean): Promise<any>
      • +

        Check if Local Storage is supported by the current browser.

        +

        Parameters

        • refreshToken: boolean = false
          +

          This parameter can be ignored. It exists only to maintain GoCloudStorage system structure

          +

        Returns Promise<any>

        Returns a Promise that resolves with a boolean (true if local storage is supported, false if not)

        +
      • checkFileExists(path: string): Promise<unknown>
      • +

        Check whether a file exists in Local Storage at a given path.

        +

        Parameters

        • path: string
          +

          A valid key corresponding to a saved diagram file in Local Storage

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a boolean stating whether a file exists in LocalStorage at a given path

        +
      • getFile(path: string): Promise<unknown>
      • +

        Get information about a diagram file saved to Local Storage. This data includes:

        +
          +
        • content: The content of the saved file (a string respresentation of a GoJS Diagram Model)
        • +
        • id: The key of the file in local storage
        • +
        • name: Same as id value
        • +
        • path: Same as id value
        • +
        +

        Note: Id, name, and path are all provided (despite being the same). They are required for creating valid DiagramFiles.

        +

        Parameters

        • path: string
          +

          A valid key corresponding to a saved diagram file in Local Storage

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with information about a diagram file saved to local storage

        +
      • load(path: string): Promise<unknown>
      • +

        Get the contents of a given file; load to managedDiagrams model.

        +

        Parameters

        • path: string
          +

          A valid localstorage key to load diagram model data from

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the loaded file

        +
      • loadWithUI(): Promise<unknown>
      • +

        Get the contents of a given file; load to managedDiagrams model. Use the custom filepicker ui.

        +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the loaded file

        +
      • remove(path: string): Promise<unknown>
      • +

        Delete a given diagram from Local Storage.

        +

        Parameters

        • path: string
          +

          A valid localstorage key to delete diagram model data from

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the deleted file

        +
      • removeWithUI(): Promise<unknown>
      • +

        Delete a diagram from Local Storage using the custom filepicker menu ui.

        +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the deleted file

        +
      • save(path?: string): Promise<unknown>
      • +

        Save managedDiagrams' model data to Local Storage. If path is supplied save to that path. If no path is supplied but currentDiagramFile has non-null, +valid properties, update saved diagram file content at the key in Local Storage corresponding to currentDiagramFile.path with current managedDiagrams' model data. +If no path is supplied and currentDiagramFile is null or has null properties, this calls saveWithUI.

        +

        Parameters

        • Optional path: string
          +

          A string to save diagram model data to (becomes the key for the file in Local Storage)

          +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the saved file

        +
      • saveWithUI(): Promise<unknown>
      • +

        Save the current managedDiagrams's model data to Local Storage using the custom filepicker ui.

        +

        Returns Promise<unknown>

        Returns a Promise that resolves with a DiagramFile representing the saved file

        +
      • showUI(action: string, numAdditionalFiles?: number): any
      • +

        Show the custom Go Local Storage filepicker ui.

        +

        Parameters

        • action: string
          +

          Clarify what action is being done after file selection. Must be one of the following:

          +
            +
          • New
          • +
          • Open
          • +
          • Save
          • +
          • Delete
          • +
          +
        • Optional numAdditionalFiles: number
          +

          Optional: Number of files to show in UI, in addition to a static numerical property (that can only be +modified by changing source code). This prevents long wait times while the UI loads if there are a large number of diagram files stored in Local Storage.

          +

        Returns any

        Returns a Promise that resolves (in save, load, or remove with an DiagramFile +representing the saved/loaded/deleted file

        +

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/GoOneDrive.html b/api/symbols/GoOneDrive.html index d4d65959f..d22dc4ef3 100644 --- a/api/symbols/GoOneDrive.html +++ b/api/symbols/GoOneDrive.html @@ -1,693 +1,143 @@ - - - - - - GoOneDrive | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class GoOneDrive

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      - This is part of GoCloudStorage and not part of the main GoJS library. - Storage can be found in the GoJS kit under the projects folder. - See the Storage intro page for more information. -

      -
      -
      -

      Hierarchy

      - -
      -
      -
      -

      Class for saving / loading GoJS Diagram.models to / from Microsoft One Drive. - As with all GoCloudStorage subclasses (with the exception of GoLocalStorage, any page using GoDropBox must be served on a web server.

      -

      Note: Makes use of OneDrive FilePicker for JavaScript v7.2. Any page - using GoOneDrive must include a script tag with src set to https://js.live.net/v7.2/OneDrive.js.

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -

      Properties

      - -
      -
      -

      Methods

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      -
        -
      • new GoOneDrive(managedDiagrams: Diagram | Diagram[], clientId: string, defaultModel?: string, iconsRelativeDirectory?: string): GoOneDrive
      • -
      -
        -
      • -

        Parameters

        -
          -
        • -
          managedDiagrams: Diagram | Diagram[]
          -
          -

          An array of GoJS Diagrams whose model(s) will be saved to - / loaded from OneDrive. Can also be a single Diagram.

          -
          -
        • -
        • -
          clientId: string
          -
          -

          The client ID of the application in use (given by Microsoft in Microsoft Dev Center)

          -
          -
        • -
        • -
          Optional defaultModel: string
          -
          -

          String representation of the default model data for new diagrams. If this is null, default new diagrams - will be empty. Usually a value given by calling Model.toJson on a GoJS Diagram's Model.

          -
          -
        • -
        • -
          Optional iconsRelativeDirectory: string
          -
          -

          The directory path relative to the page in which this instance of GoOneDrive exists, in which - the storage service brand icons can be found. The default value is "../goCloudStorageIcons/".

          -
          -
        • -
        -

        Returns GoOneDrive

        -
      • -
      -
      -
      -
      -

      Properties

      -
      - -

      - oauthToken - : string

      -
        -
      • -
        -

        Get / set the global oauthToken. Only used to authorize requests in load, save, and remove - when the oneDriveFilepicker property is not used. Not needed when the oneDriveFilePicker is used, as action-specific tokens (issued by the Microsoft-provided - OneDrive Filepicker) are issued then. oauthToken is null after construction, - but can be set or refreshed with calls to authorize.

        -
        -
      • -
      -
      -
      - -

      - Read-only - oneDriveFilepicker - : any

      -
        -
      • -
        -

        Get OneDrive Filepicker object. Used to display a Microsoft user's OneDrive files.

        -
        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - Override - authorize -

      -
        -
      • authorize(refreshToken?: boolean): Promise<boolean>
      • -
      -
        -
      • -
        -

        Get OAuth 2.0 token for Microsoft OneDrive API requests with a specific Microsoft account. Sets oauthToken.

        -
        -

        Parameters

        -
          -
        • -
          Optional refreshToken: boolean
          -
          -

          Whether to get a new access token (triggers a page redirect) (true) or try to find / use the one in the browser - window URI (no redirect) (false)

          -
          -
        • -
        -

        Returns Promise<boolean>

        -

        Returns a Promise that resolves with a boolean stating whether authorization was succesful (true) or failed (false).

        -
      • -
      -
      -
      - -

      - Override - checkFileExists -

      -
        -
      • checkFileExists(path: string): Promise<any>
      • -
      -
        -
      • -
        -

        Check whether a file exists at a given path.

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid MS OneDrive filepath to save current diagram model to - Path must be of the form: /drive/root:/{item-path}

          -
          -
        • -
        -

        Returns Promise<any>

        -

        Returns a Promise that resolves with a boolean stating whether a file exists at a given path

        -
      • -
      -
      -
      - -

      - generateGraphUrl -

      -
        -
      • generateGraphUrl(driveItem: Object, targetParentFolder: boolean, itemRelativeApiPath: boolean): string
      • -
      -
        -
      • -
        -

        Generate and return a Microsoft Graph URL for a target item

        -
        -

        Parameters

        -
          -
        • -
          driveItem: Object
          -
          -

          The item to generate the URL for

          -
          -
        • -
        • -
          targetParentFolder: boolean
          -
          -

          Indicates whether to target the parent folder + filename instead of the item itself

          -
          -
        • -
        • -
          itemRelativeApiPath: boolean
          -
          -

          Indicates whether to append /content to the item URL

          -
          -
        • -
        -

        Returns string

        -

        Returns a Microsoft Graph URL for a target item

        -
      • -
      -
      -
      - -

      - Override - getFile -

      -
        -
      • getFile(path: string, token?: string): Promise<any>
      • -
      -
        -
      • -
        -

        Get the OneDrive file reference object at a given path. Properties of particular note include:

        -
          -
        • name: The name of the file in OneDrive
        • -
        • id: The OneDrive-given file ID
        • -
        • parentReference
            -
          • path: The path of the parent folder of the file at the provided path
          • -
          -
        • -
        -

        Note: Name, ID, and path are requisite for creating valid DiagramFiles. A path can be constructed by concatenating the - parentReference.path with name. DiagramFiles optionally also contain parentReference and token values (both used exclusively by GoOneDrive and its methods).

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid MS OneDrive filepath to save current diagram model to - Path must be of the form: /drive/root:/{item-path}

          -
          -
        • -
        • -
          Optional token: string
          -
          -

          Optional: A token received by OneDrive filepicker (loadDiagramWithUI) to allow for its file to be loaded. - If no token is given, use global oauthToken

          -
          -
        • -
        -

        Returns Promise<any>

        -

        Returns a Promise that resolves with a OneDrive file reference object at a given path

        -
      • -
      -
      -
      - -

      - Override - getUserInfo -

      -
        -
      • getUserInfo(): Promise<any>
      • -
      -
        -
      • -
        -

        Get information about the currently logged in Microsoft user. Some fields of particular note include:

        -
          -
        • displayName
        • -
        • givenName
        • -
        • id
        • -
        • jobTitle
        • -
        • userPrincipalName (email)
        • -
        -

        Note: If oauthToken is not valid or has expired, a page redirect to the Microsoft Account sign in will occur.

        -
        -

        Returns Promise<any>

        -

        Returns a Promise that resolves with information about the currently logged in Microsoft user

        -
      • -
      -
      -
      - -

      - Override - load -

      -
        -
      • load(path: string, token?: string): Promise<any>
      • -
      -
        -
      • -
        -

        Load the contents of a saved diagram from MS OneDrive to diagram model.

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid Microsoft OneDrive filepath to load diagram model data from. Path syntax is - /drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram

          -
          -
        • -
        • -
          Optional token: string
          -
          -

          A token received by OneDrive Filepicker - (passed from loadWithUI) to allow for its file to be loaded. If no token is given, use global oauthToken

          -
          -
        • -
        -

        Returns Promise<any>

        -

        Returns a Promise that resolves with a DiagramFile representing the loaded file

        -
      • -
      -
      -
      - -

      - Override - loadWithUI -

      -
        -
      • loadWithUI(): Promise<any>
      • -
      -
        -
      • -
        -

        Load diagram model data from a given OneDrive-specific file path into managedDiagrams using the MS OneDrive filepicker.

        -
        -

        Returns Promise<any>

        -

        Returns a Promise that resolves with a DiagramFile representing the loaded file

        -
      • -
      -
      -
      - -

      - Override - remove -

      -
        -
      • remove(path: string, token?: string): Promise<any>
      • -
      -
        -
      • -
        -

        Delete a diagram from a user's OneDrive at a given path.

        -
        -

        Parameters

        -
          -
        • -
          path: string
          -
          -

          A valid Microsoft OneDrive filepath to delete. Path syntax is - /drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram

          -
          -
        • -
        • -
          Optional token: string
          -
          -

          A token received by OneDrive filepicker (passed from removeWithUI) to allow for - its file to be deleted. If no token is given, use global oauthToken

          -
          -
        • -
        -

        Returns Promise<any>

        -

        Returns a Promise that resolves with a DiagramFile representing the deleted file

        -
      • -
      -
      -
      - -

      - Override - removeWithUI -

      -
        -
      • removeWithUI(): Promise<any>
      • -
      -
        -
      • -
        -

        Delete a diagram from a user's OneDrive using the OneDrive Filepicker.

        -
        -

        Returns Promise<any>

        -

        Returns a Promise that resolves with a DiagramFile representing the deleted file

        -
      • -
      -
      -
      - -

      - Override - save -

      -
        -
      • save(path?: string): Promise<any>
      • -
      -
        -
      • -
        -

        Save managedDiagrams' model data to Microsoft OneDrive. If path is supplied save to that path. If no path is supplied but currentDiagramFile has non-null, - valid properties, update saved diagram file content at the path in OneDrive corresponding to currentDiagramFile.path with current managedDiagrams' model data.

        -
        -

        Parameters

        -
          -
        • -
          Optional path: string
          -
          -

          A valid MS OneDrive filepath to save current diagram model to. Path syntax is - /drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram

          -
          -
        • -
        -

        Returns Promise<any>

        -

        Returns a Promise that resolves with a DiagramFile representing the saved file.

        -
      • -
      -
      -
      - -

      - Override - saveWithUI -

      -
        -
      • saveWithUI(): Promise<any>
      • -
      - -
      -
      - -

      - Override - showUI -

      -
        -
      • showUI(): Promise<any>
      • -
      -
        -
      • -
        -

        Show the custom GoOneDrive save prompt ui.

        -
        -

        Returns Promise<any>

        -

        Returns a Promise that resolves (in save, load, or remove) with a DiagramFile - representing the saved/loaded/deleted file

        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class GoOneDrive Storage

      This is part of GoCloudStorage and not part of the main GoJS library. Storage can be found in the GoJS kit under the projects folder. See the Storage intro page for more information.

      Hierarchy

      +

      Class for saving / loading GoJS Diagram.models to / from Microsoft One Drive. +As with all GoCloudStorage subclasses (with the exception of GoLocalStorage, any page using GoDropBox must be served on a web server.

      +

      Note: Makes use of OneDrive FilePicker for JavaScript v7.2. Any page +using GoOneDrive must include a script tag with src set to https://js.live.net/v7.2/OneDrive.js.

      +

      Index

      Inherited Members

      Constructors

      • new GoOneDrive(managedDiagrams: Diagram | Diagram[], clientId: string, defaultModel?: string, iconsRelativeDirectory?: string): GoOneDrive
      • Parameters

        • managedDiagrams: Diagram | Diagram[]
          +

          An array of GoJS Diagrams whose model(s) will be saved to +/ loaded from OneDrive. Can also be a single Diagram.

          +
        • clientId: string
          +

          The client ID of the application in use (given by Microsoft in Microsoft Dev Center)

          +
        • Optional defaultModel: string
          +

          String representation of the default model data for new diagrams. If this is null, default new diagrams +will be empty. Usually a value given by calling Model.toJson on a GoJS Diagram's Model.

          +
        • Optional iconsRelativeDirectory: string
          +

          The directory path relative to the page in which this instance of GoOneDrive exists, in which +the storage service brand icons can be found. The default value is "../goCloudStorageIcons/".

          +

        Returns GoOneDrive

      Properties

      • +

        Get / set the global oauthToken. Only used to authorize requests in load, save, and remove +when the oneDriveFilepicker property is not used. Not needed when the oneDriveFilePicker is used, as action-specific tokens (issued by the Microsoft-provided +OneDrive Filepicker) are issued then. oauthToken is null after construction, +but can be set or refreshed with calls to authorize.

        +

      Methods

      • authorize(refreshToken?: boolean): Promise<boolean>
      • +

        Get OAuth 2.0 token for Microsoft OneDrive API requests with a specific Microsoft account. Sets oauthToken.

        +

        Parameters

        • Optional refreshToken: boolean
          +

          Whether to get a new access token (triggers a page redirect) (true) or try to find / use the one in the browser +window URI (no redirect) (false)

          +

        Returns Promise<boolean>

        Returns a Promise that resolves with a boolean stating whether authorization was succesful (true) or failed (false).

        +
      • checkFileExists(path: string): Promise<any>
      • +

        Check whether a file exists at a given path.

        +

        Parameters

        • path: string
          +

          A valid MS OneDrive filepath to save current diagram model to + Path must be of the form: /drive/root:/{item-path}

          +

        Returns Promise<any>

        Returns a Promise that resolves with a boolean stating whether a file exists at a given path

        +
      • generateGraphUrl(driveItem: Object, targetParentFolder: boolean, itemRelativeApiPath: boolean): string
      • +

        Generate and return a Microsoft Graph URL for a target item

        +

        Parameters

        • driveItem: Object
          +

          The item to generate the URL for

          +
        • targetParentFolder: boolean
          +

          Indicates whether to target the parent folder + filename instead of the item itself

          +
        • itemRelativeApiPath: boolean
          +

          Indicates whether to append /content to the item URL

          +

        Returns string

        Returns a Microsoft Graph URL for a target item

        +
      • getFile(path: string, token?: string): Promise<any>
      • +

        Get the OneDrive file reference object at a given path. Properties of particular note include:

        +
          +
        • name: The name of the file in OneDrive
        • +
        • id: The OneDrive-given file ID
        • +
        • parentReference
            +
          • path: The path of the parent folder of the file at the provided path
          • +
          +
        • +
        +

        Note: Name, ID, and path are requisite for creating valid DiagramFiles. A path can be constructed by concatenating the +parentReference.path with name. DiagramFiles optionally also contain parentReference and token values (both used exclusively by GoOneDrive and its methods).

        +

        Parameters

        • path: string
          +

          A valid MS OneDrive filepath to save current diagram model to + Path must be of the form: /drive/root:/{item-path}

          +
        • Optional token: string
          +

          Optional: A token received by OneDrive filepicker (loadDiagramWithUI) to allow for its file to be loaded. +If no token is given, use global oauthToken

          +

        Returns Promise<any>

        Returns a Promise that resolves with a OneDrive file reference object at a given path

        +
      • getUserInfo(): Promise<any>
      • +

        Get information about the currently logged in Microsoft user. Some fields of particular note include:

        +
          +
        • displayName
        • +
        • givenName
        • +
        • id
        • +
        • jobTitle
        • +
        • userPrincipalName (email)
        • +
        +

        Note: If oauthToken is not valid or has expired, a page redirect to the Microsoft Account sign in will occur.

        +

        Returns Promise<any>

        Returns a Promise that resolves with information about the currently logged in Microsoft user

        +
      • load(path: string, token?: string): Promise<any>
      • +

        Load the contents of a saved diagram from MS OneDrive to diagram model.

        +

        Parameters

        • path: string
          +

          A valid Microsoft OneDrive filepath to load diagram model data from. Path syntax is +/drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram

          +
        • Optional token: string
          +

          A token received by OneDrive Filepicker +(passed from loadWithUI) to allow for its file to be loaded. If no token is given, use global oauthToken

          +

        Returns Promise<any>

        Returns a Promise that resolves with a DiagramFile representing the loaded file

        +
      • loadWithUI(): Promise<any>
      • +

        Load diagram model data from a given OneDrive-specific file path into managedDiagrams using the MS OneDrive filepicker.

        +

        Returns Promise<any>

        Returns a Promise that resolves with a DiagramFile representing the loaded file

        +
      • remove(path: string, token?: string): Promise<any>
      • +

        Delete a diagram from a user's OneDrive at a given path.

        +

        Parameters

        • path: string
          +

          A valid Microsoft OneDrive filepath to delete. Path syntax is +/drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram

          +
        • Optional token: string
          +

          A token received by OneDrive filepicker (passed from removeWithUI) to allow for +its file to be deleted. If no token is given, use global oauthToken

          +

        Returns Promise<any>

        Returns a Promise that resolves with a DiagramFile representing the deleted file

        +
      • removeWithUI(): Promise<any>
      • +

        Delete a diagram from a user's OneDrive using the OneDrive Filepicker.

        +

        Returns Promise<any>

        Returns a Promise that resolves with a DiagramFile representing the deleted file

        +
      • save(path?: string): Promise<any>
      • +

        Save managedDiagrams' model data to Microsoft OneDrive. If path is supplied save to that path. If no path is supplied but currentDiagramFile has non-null, +valid properties, update saved diagram file content at the path in OneDrive corresponding to currentDiagramFile.path with current managedDiagrams' model data.

        +

        Parameters

        • Optional path: string
          +

          A valid MS OneDrive filepath to save current diagram model to. Path syntax is +/drive/root:/{path-to-file}/{filename}; i.e. /drive/root:/Documents/example.diagram

          +

        Returns Promise<any>

        Returns a Promise that resolves with a DiagramFile representing the saved file.

        +
      • saveWithUI(): Promise<any>
      • showUI(): Promise<any>
      • +

        Show the custom GoOneDrive save prompt ui.

        +

        Returns Promise<any>

        Returns a Promise that resolves (in save, load, or remove) with a DiagramFile +representing the saved/loaded/deleted file

        +

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/GraphLinksModel.html b/api/symbols/GraphLinksModel.html index 6a79c69ba..b235466c4 100644 --- a/api/symbols/GraphLinksModel.html +++ b/api/symbols/GraphLinksModel.html @@ -1,1989 +1,558 @@ - - - - - - GraphLinksModel | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class GraphLinksModel

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      Hierarchy

      -
        -
      • - Model -
          -
        • - GraphLinksModel -
        • -
        -
      • -
      -
      -
      -
      -

      GraphLinksModels support links between nodes and grouping nodes and links into subgraphs. - GraphLinksModels hold node data and link data in separate arrays. - Node data is normally represented in a Diagram by instances of Node, - but they could be represented by simple Parts or by Groups. - Link data should be represented by instances of Link.

      -

      Each link data object is assumed to have two values, one referring to the node that the - link is coming from and one that the link is going to. - The linkFromKeyProperty property names the property on the link data whose value - is the key of the "from" node. - The linkToKeyProperty property names the property on the link data whose value - is the key of the "to" node. - The default values for these properties are "from" and "to" respectively.

      -

      For example, one can define a graph consisting of two nodes with one link connecting them:

      -
       model.nodeDataArray = [
      -   { key: "Alpha" },
      -   { key: "Beta" }
      - ];
      - model.linkDataArray = [
      -   { from: "Alpha", to: "Beta" }
      - ];
      +GraphLinksModel | GoJS API
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class GraphLinksModel

      Hierarchy

      +

      GraphLinksModels support links between nodes and grouping nodes and links into subgraphs. +GraphLinksModels hold node data and link data in separate arrays. +Node data is normally represented in a Diagram by instances of Node, +but they could be represented by simple Parts or by Groups. +Link data should be represented by instances of Link.

      +

      Each link data object is assumed to have two values, one referring to the node that the +link is coming from and one that the link is going to. +The linkFromKeyProperty property names the property on the link data whose value +is the key of the "from" node. +The linkToKeyProperty property names the property on the link data whose value +is the key of the "to" node. +The default values for these properties are "from" and "to" respectively.

      +

      For example, one can define a graph consisting of two nodes with one link connecting them:

      +
       model.nodeDataArray = [
      { key: "Alpha" },
      { key: "Beta" }
      ];
      model.linkDataArray = [
      { from: "Alpha", to: "Beta" }
      ];
      -

      If you want to have subgraphs in your diagram, where a group node contains some number of nodes and links, - you need to declare that some node data actually represent groups, - and you need to provide a reference from a member node data to its containing group node data. - The nodeIsGroupProperty property names the property on a node data that is true - if that node data represents a group. - The nodeGroupKeyProperty property names the property on a node data whose value - is the key of the containing group's node data. - The default values for these properties are "isGroup" and "group" respectively.

      -

      For example, one can define a graph consisting of one group containing a subgraph of - two nodes connected by a link, with a second link from that group to a third node - that is not a member of that group:

      -
       model.nodeDataArray = [
      -   { key: "Group1", isGroup: true},
      -   { key: "Alpha", group: "Group1" },
      -   { key: "Beta", group: "Group1" },
      -   { key: "Gamma" }
      - ];
      - model.linkDataArray = [
      -   { from: "Alpha", to: "Beta" },
      -   { from: "Group1", to: "Gamma" }
      - ];
      +

      If you want to have subgraphs in your diagram, where a group node contains some number of nodes and links, +you need to declare that some node data actually represent groups, +and you need to provide a reference from a member node data to its containing group node data. +The nodeIsGroupProperty property names the property on a node data that is true +if that node data represents a group. +The nodeGroupKeyProperty property names the property on a node data whose value +is the key of the containing group's node data. +The default values for these properties are "isGroup" and "group" respectively.

      +

      For example, one can define a graph consisting of one group containing a subgraph of +two nodes connected by a link, with a second link from that group to a third node +that is not a member of that group:

      +
       model.nodeDataArray = [
      { key: "Group1", isGroup: true},
      { key: "Alpha", group: "Group1" },
      { key: "Beta", group: "Group1" },
      { key: "Gamma" }
      ];
      model.linkDataArray = [
      { from: "Alpha", to: "Beta" },
      { from: "Group1", to: "Gamma" }
      ];
      -

      GraphLinksModels also support distinguishing the "port" element of a node to which - a link can connect, at either end of the link. - This identification is a string that names the "port" element in the node. - However, you need to set the linkFromPortIdProperty and/or - linkToPortIdProperty properties before the model is able to - get the "port id" information from the link data.

      -

      For example, one can define a graph consisting of a "subtraction" node and two inputs and one output. - The "subtraction" node has two distinct inputs called "subtrahend" and "minuend"; - the output is called "difference".

      -
       model.linkFromPortIdProperty = "fromPort";  // necessary to remember portIds
      - model.linkToPortIdProperty = "toPort";
      - model.nodeDataArray = [
      -   { key: 1, constant: 5 },  // a constant input node
      -   { key: 2, constant: 2 },  // another constant node
      -   { key: 3, operation: "subtract" },
      -   { key: 4, value: 3 }  // the output node
      - ];
      - model.linkDataArray = [
      -   { from: 1, to: 3, toPort: "subtrahend" },
      -   { from: 2, to: 3, toPort: "minuend" },
      -   { from: 3, to: 4, fromPort: "difference" }
      - ];
      +

      GraphLinksModels also support distinguishing the "port" element of a node to which +a link can connect, at either end of the link. +This identification is a string that names the "port" element in the node. +However, you need to set the linkFromPortIdProperty and/or +linkToPortIdProperty properties before the model is able to +get the "port id" information from the link data.

      +

      For example, one can define a graph consisting of a "subtraction" node and two inputs and one output. +The "subtraction" node has two distinct inputs called "subtrahend" and "minuend"; +the output is called "difference".

      +
       model.linkFromPortIdProperty = "fromPort";  // necessary to remember portIds
      model.linkToPortIdProperty = "toPort";
      model.nodeDataArray = [
      { key: 1, constant: 5 }, // a constant input node
      { key: 2, constant: 2 }, // another constant node
      { key: 3, operation: "subtract" },
      { key: 4, value: 3 } // the output node
      ];
      model.linkDataArray = [
      { from: 1, to: 3, toPort: "subtrahend" },
      { from: 2, to: 3, toPort: "minuend" },
      { from: 3, to: 4, fromPort: "difference" }
      ];
      -

      In this case links connected to node 3 (which is the subtraction operation) - are distinguished by port id. - The connections to the other nodes do not have any port identification, - presumably because there is only one port on those nodes, representing the node value.

      -

      Note that there is no requirement that the link data objects have any kind of unique identifier, unlike for node data. - There is no expectation that there be references to link data in the model, so there is no need for such an identifier. - When there are multiple links connecting two ports, the only way to distinguish the links in the model - is by reference to the particular link data object. - This is why there are two methods on the Diagram class for Nodes, Diagram.findNodeForKey and Diagram.findNodeForData, - but there is only the one method for Links, Diagram.findLinkForData.

      -

      However you may wish to have the model maintain string or number identifiers on the link data just as all models do for node data. - To get that behavior, so that you can call findLinkDataForKey, you need to set linkKeyProperty to be a non-empty string. - Just as with the assignment of node keys, you can customize the assignment of link keys by setting - makeUniqueLinkKeyFunction to a function that returns a unique identifier.

      -

      This model does not support the modification of whether a node data object is a group.

      -

      This model cannot detect the modification of the linkDataArray array - or the modification of any link data object. - If you want to add or remove link data from the linkDataArray, - call the addLinkData or removeLinkData methods. - If you want to modify the node a link connects to, call the - setFromKeyForLinkData and/or setToKeyForLinkData methods. - If you want to change the membership of a node data in a group, - call the setGroupKeyForNodeData method.

      -
      -
      -
      -

      Index

      -
      - -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - -
        -
      • -
        -

        This constructs an empty GraphLinksModel unless one provides arguments as the initial data array values - for the Model.nodeDataArray and GraphLinksModel.linkDataArray properties.

        -
        -

        Parameters

        -
          -
        • -
          Optional nodedataarray: ObjectData[]
          -
          -

          an optional Array containing JavaScript objects to be represented by Nodes.

          -
          -
        • -
        • -
          Optional linkdataarray: ObjectData[]
          -
          -

          an optional Array containing JavaScript objects to be represented by Links.

          -
          -
        • -
        • -
          Optional init: Partial<GraphLinksModel>
          -
          -

          optional initialization properties.

          -
          -
        • -
        -

        Returns GraphLinksModel

        -
      • -
      • -
        -

        This constructs an empty GraphLinksModel unless one provides arguments as the initial data array values - for the Model.nodeDataArray and GraphLinksModel.linkDataArray properties.

        -
        -

        Parameters

        -
          -
        • -
          Optional init: Partial<GraphLinksModel>
          -
          -

          optional initialization properties.

          -
          -
        • -
        -

        Returns GraphLinksModel

        -
      • -
      -
      -
      -
      -

      Properties

      -
      - -

      - archetypeNodeData - : ObjectData

      -
        -
      • -
        -

        Gets or sets a data object that will be copied and added to the model as a new node data each time there - is a link reference (either the "to" or the "from" of a link data) to a node key that does not yet exist in the model.

        -

        The default value is null -- node data is not automatically copied and added to the model - when there is an unresolved reference in a link data. - When adding or modifying a link data if there is a "from" or "to" key value for which Model.findNodeDataForKey returns null, - it will call Model.copyNodeData on this property value and Model.addNodeData on the result.

        -
        -
        since
        -

        1.1

        -
        -
        -
        -
      • -
      -
      -
      - -

      - copyLinkDataFunction - : (a: ObjectData, b: GraphLinksModel) => ObjectData

      -
        -
      • -
        -

        Gets or sets a function that makes a copy of a link data object.

        -

        You may need to set this property in order to ensure that a copied Link is bound - to data that does not share certain data structures between the original link data and the copied link data. - This property value may be null in order to cause copyLinkData to make a shallow copy of a JavaScript Object. - The default value is null.

        -
        -
      • -
      -
      -
      - -

      - linkCategoryProperty - : string | ((a: ObjectData, b?: string) => string)

      -
        -
      • -
        -

        Gets or sets the name of the data property that returns a string naming that data's category, - The value may also be a function taking two arguments, where the first argument will be a link data object. - If the second argument is not supplied, the function should return the category name; - if the second argument is supplied, the function should modify the link data object so that it has that new category name. - The default value is the name 'category', meaning that it expects the data to have a property named 'category' if it cares to name the category for the Link. - This is used by the diagram to distinguish between different kinds of links. - The name must not be null. - If the value is an empty string, - getCategoryForLinkData will return an empty string for all link data objects.

        -

        If you want to set this property you must do so before using the model, and especially before you assign Diagram.model. - Note that functions cannot be serialized into JSON-formatted text, so if you are using toJson and Model.fromJson, - and if you want this property to be a function, you will need to assign this property to your desired function - immediately after creating the model, including when it is created by Model.fromJson.

        -
        -
        see
        -

        getCategoryForLinkData, setCategoryForLinkData

        -
        -
        -
        -
      • -
      -
      -
      - -

      - linkDataArray - : ObjectData[]

      -
        -
      • -
        -

        Gets or sets the array of link data objects that correspond to Links in the Diagram. - The initial value is an empty Array.

        -
        -
      • -
      -
      -
      - -

      - linkFromKeyProperty - : string | ((a: ObjectData, b?: Key) => Key)

      -
        -
      • -
        -

        Gets or sets the name of the data property that returns - the key of the node data that the link data is coming from. - The value may also be a function taking two arguments, where the first argument will be a link data object. - If the second argument is not supplied, the function should return the key of the link's source node; - if the second argument is supplied, the function should modify the link data object so that it has that new key - (which may be undefined to refer to no node) as the identifier to the "from" node. - The default value is the name 'from', meaning that it expects the data to have a property named 'from' to refer to the link's source node. - The name must not be null. - If the value is an empty string, - getFromKeyForLinkData will return undefined for all link data objects.

        -

        If you want to set this property you must do so before using the model, and especially before you assign Diagram.model. - Note that functions cannot be serialized into JSON-formatted text, so if you are using toJson and Model.fromJson, - and if you want this property to be a function, you will need to assign this property to your desired function - immediately after creating the model, including when it is created by Model.fromJson.

        -
        -
        see
        -

        getFromKeyForLinkData, setFromKeyForLinkData

        -
        -
        -
        -
      • -
      -
      -
      - -

      - linkFromPortIdProperty - : string | ((a: ObjectData, b?: string) => string)

      -
        -
      • -
        -

        Gets or sets the name of the data property that returns - the optional parameter naming a "port" element on the node that the link data is connected from. - The value may also be a function taking two arguments, where the first argument will be a link data object. - If the second argument is not supplied, the function should return the string identifier of the link's source port; - if the second argument is supplied, the function should modify the link data object so that it has that string as the identifier to the "from" port. - The default value is the empty string indicating that one cannot distinguish - different logical connection points for any links. - The name must not be null nor the value of linkFromKeyProperty or linkToKeyProperty. - If the value is an empty string, - getFromPortIdForLinkData will return an empty string for all link data objects.

        -

        If you want to set this property you must do so before using the model, and especially before you assign Diagram.model. - Note that functions cannot be serialized into JSON-formatted text, so if you are using toJson and Model.fromJson, - and if you want this property to be a function, you will need to assign this property to your desired function - immediately after creating the model, including when it is created by Model.fromJson.

        -
        -
        see
        -

        getFromPortIdForLinkData, setFromPortIdForLinkData

        -
        -
        -
        -
      • -
      -
      -
      - -

      - linkKeyProperty - : string | ((a: ObjectData, b?: Key) => Key)

      -
        -
      • -
        -

        Gets or sets the name of the data property that returns a unique id number or string for each link data object. - The value may also be a function taking two arguments, where the first argument will be a link data object. - If the second argument is not supplied, the function should return the unique string or number key for that link data object; - if the second argument is supplied, the function should modify the link data object so that it has that string or number as the unique key for that link. - The default value is the empty string, which means the model will not maintain a key property value on link data objects. - The name must not be null.

        -

        When this property has a value of an empty string (the default value), - getKeyForLinkData will return undefined, and findLinkDataForKey will always return null.

        -

        If you want to set this property you must do so before using the model, and especially before you assign Diagram.model. - Note that functions cannot be serialized into JSON-formatted text, so if you are using toJson and Model.fromJson, - and if you want this property to be a function, you will need to assign this property to your desired function - immediately after creating the model, including when it is created by Model.fromJson.

        -
        -
        see
        -

        getKeyForLinkData

        -
        -
        since
        -

        1.6

        -
        -
        -
        -
      • -
      -
      -
      - -

      - linkLabelKeysProperty - : string | ((a: ObjectData, b?: Key[]) => Key[])

      -
        -
      • -
        -

        Gets or sets the name of the data property that returns - an array of keys of node data that are labels on that link data. - The value may also be a function taking two arguments, where the first argument will be a link data object. - If the second argument is not supplied, the function should return the array of label node keys for the link; - if the second argument is supplied, the function should modify the link data object so that it holds that Array of node keys as references to label nodes. - The default value is the empty string: '', meaning that the model does not support links owning label nodes.

        -

        The name must not be null. - If the value is an empty string, - getLabelKeysForLinkData will return an empty array for all link data objects. - You will need to set this property in order to support nodes as link labels.

        -

        If you want to set this property you must do so before using the model, and especially before you assign Diagram.model. - Note that functions cannot be serialized into JSON-formatted text, so if you are using toJson and Model.fromJson, - and if you want this property to be a function, you will need to assign this property to your desired function - immediately after creating the model, including when it is created by Model.fromJson.

        -
        -
        see
        -

        getLabelKeysForLinkData, setLabelKeysForLinkData

        -
        -
        -
        -
      • -
      -
      -
      - -

      - linkToKeyProperty - : string | ((a: ObjectData, b?: Key) => Key)

      -
        -
      • -
        -

        Gets or sets the name of the data property that returns - the key of the node data that the link data is going to, - The value may also be a function taking two arguments, where the first argument will be a link data object. - If the second argument is not supplied, the function should return the key of the link's destination node; - if the second argument is supplied, the function should modify the link data object so that it has that new key - (which may be undefined to refer to no node) as the identifier to the "to" node. - The default value is the name 'to', meaning that it expects the data to have a property named 'to' to refer to the link's destination node. - The name must not be null. - If the value is an empty string, - getToKeyForLinkData will return undefined for all link data objects.

        -

        If you want to set this property you must do so before using the model, and especially before you assign Diagram.model. - Note that functions cannot be serialized into JSON-formatted text, so if you are using toJson and Model.fromJson, - and if you want this property to be a function, you will need to assign this property to your desired function - immediately after creating the model, including when it is created by Model.fromJson.

        -
        -
        see
        -

        getToKeyForLinkData, setToKeyForLinkData

        -
        -
        -
        -
      • -
      -
      -
      - -

      - linkToPortIdProperty - : string | ((a: ObjectData, b?: string) => string)

      -
        -
      • -
        -

        Gets or sets the name of the data property that returns - the optional parameter naming a "port" element on the node that the link data is connected to. - The value may also be a function taking two arguments, where the first argument will be a link data object. - If the second argument is not supplied, the function should return the string identifier of the link's destination port; - if the second argument is supplied, the function should modify the link data object so that it has that string as the identifier to the "to" port. - The default value is the empty string indicating that one cannot distinguish - different logical connection points for any links. - The name must not be null nor the value of linkFromKeyProperty or linkToKeyProperty. - If the value is an empty string, - getToPortIdForLinkData will return an empty string for all link data objects.

        -

        If you want to set this property you must do so before using the model, and especially before you assign Diagram.model. - Note that functions cannot be serialized into JSON-formatted text, so if you are using toJson and Model.fromJson, - and if you want this property to be a function, you will need to assign this property to your desired function - immediately after creating the model, including when it is created by Model.fromJson.

        -
        -
        see
        -

        getToPortIdForLinkData, setToPortIdForLinkData

        -
        -
        -
        -
      • -
      -
      -
      - -

      - makeUniqueLinkKeyFunction - : (a: GraphLinksModel, b: ObjectData) => Key

      -
        -
      • -
        -

        Gets or sets a function that returns a unique id number or string for a link data object. - This function is called by makeLinkDataKeyUnique - when a link data object is added to the model, either as part of a new - linkDataArray or by a call to addLinkData, to make sure the value of - getKeyForLinkData is unique within the model. - However it will not be called when linkKeyProperty is the default value, an empty string.

        -

        The value may be null in order to cause makeLinkDataKeyUnique behave in the standard manner. - (The default value is null.) - You may want to supply a function here in order to make sure all of the automatically generated keys - are in a particular format. - Setting this property after setting linkDataArray has no real effect until there is a call - to addLinkData.

        -

        If a link data object is already in the model and you want to change its key value, - call setKeyForLinkData with a new and unique key.

        -
        -
        since
        -

        1.6

        -
        -
        -
        -
      • -
      -
      -
      - -

      - nodeGroupKeyProperty - : string | ((a: ObjectData, b?: Key) => Key)

      -
        -
      • -
        -

        Gets or sets the name of the property on node data that specifies - the string or number key of the group data that "owns" that node data. - The value may also be a function taking two arguments, where the first argument will be a node data object. - If the second argument is not supplied, the function should return the string or number key for the group data object of which the given data object is a member; - if the second argument is supplied, the function should modify the node data object so that it has that new key - (which may be undefined to refer to no node) as the containing group key for that node. - The default value is the name 'group', meaning that it expects the data to have a property named 'group' to refer to any containing group.

        -

        The value must not be null. - If the value is an empty string, - getGroupKeyForNodeData will return undefined for all node data objects.

        -

        If you want to set this property you must do so before using the model, and especially before you assign Diagram.model. - Note that functions cannot be serialized into JSON-formatted text, so if you are using toJson and Model.fromJson, - and if you want this property to be a function, you will need to assign this property to your desired function - immediately after creating the model, including when it is created by Model.fromJson.

        -
        -
        see
        -

        getGroupKeyForNodeData, setGroupKeyForNodeData

        -
        -
        -
        -
      • -
      -
      -
      - -

      - nodeIsGroupProperty - : string | ((a: ObjectData, b?: boolean) => boolean)

      -
        -
      • -
        -

        Gets or sets the name of the boolean property on node data that indicates - whether the data should be represented as a group of nodes and links or as a simple node. - The value may also be a function taking two arguments, where the first argument will be a node data object. - If the second argument is not supplied, the function should return true if the node data object should be represented by a Group and false otherwise. - At the current time the function will not be called to change whether the node is a group or not. - The default value is the name 'isGroup', meaning that it expects the data to have a property named 'isGroup' on those node data objects that should be represented by Groups.

        -

        The value must not be null. - If the value is an empty string, - isGroupForNodeData will return false for all node data objects.

        -

        If you want to set this property you must do so before using the model, and especially before you assign Diagram.model. - Note that functions cannot be serialized into JSON-formatted text, so if you are using toJson and Model.fromJson, - and if you want this property to be a function, you will need to assign this property to your desired function - immediately after creating the model, including when it is created by Model.fromJson.

        -
        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - addLabelKeyForLinkData -

      -
        -
      • addLabelKeyForLinkData(linkdata: ObjectData, key: Key): void
      • -
      -
        -
      • -
        -

        Adds a node key value that identifies a node data acting as a new label node on the given link data.

        -

        This method only works if linkLabelKeysProperty has been set to something other than an empty string.

        -
        -
        see
        -

        removeLabelKeyForLinkData, setLabelKeysForLinkData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link.

          -
          -
        • -
        • -
          key: Key
          -
          -

          a number or string that is the key of the new label node.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - addLinkData -

      - -
        -
      • -
        -

        When you want to add a link to the diagram, call this method with a new data object. - This will add that data to the linkDataArray and - notify all listeners that a new link data object has been inserted into the collection.

        -

        Presumably the link data object will already have its "from" and "to" node key references set, - but it is also possible to set them after the link data is in the model - by calling setFromKeyForLinkData and setToKeyForLinkData.

        -

        This operation does nothing if the link data is already part of this model's linkDataArray.

        -
        -
        see
        -

        removeLinkData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - addLinkDataCollection -

      - -
        -
      • -
        -

        Add to this model all of the link data held in an Array or in an Iterable of link data objects.

        -
        -
        since
        -

        1.3

        -
        -
        -
        -

        Parameters

        - -

        Returns void

        -
      • -
      -
      -
      - -

      - containsLinkData -

      -
        -
      • containsLinkData(linkdata: ObjectData): boolean
      • -
      -
        -
      • -
        -

        Decide if a given link data object is in this model, using reference equality.

        -

        If you do not have a reference to the particular data object that is in the linkDataArray, - you may need to search for it by iterating through that Array, or (more likely), - by finding the desired Link in a Diagram and getting that link's Panel.data.

        -

        Note that because link data are not assumed to be have a unique key property - they cannot be found using an index that this model would maintain. - However you may choose to provide such a property on the link data objects - and maintain your own index.

        -
        -
        see
        -

        addLinkData, removeLinkData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link.

          -
          -
        • -
        -

        Returns boolean

        -
      • -
      -
      -
      - -

      - copyLinkData -

      - -
        -
      • -
        -

        Make a copy of a link data object. - This uses the value of copyLinkDataFunction to actually perform the copy, - unless it is null, in which case this method just makes a shallow copy of the JavaScript Object.

        -

        This does not modify the model -- the returned data object is not added to this model. - This assumes that the data's constructor can be called with no arguments. - This also makes sure there is no reference to either the "from" or the "to" node of the original data.

        -
        -
        see
        -

        addLinkData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link.

          -
          -
        • -
        -

        Returns ObjectData

        -
      • -
      -
      -
      - -

      - Override Virtual - copyNodeData -

      - -
        -
      • -
        -

        This override also makes sure any copied node data does not have a reference to the containing group.

        -
        -
        see
        -

        Model.copyNodeData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          nodedata: ObjectData
          -
          -

          a JavaScript object represented by a node, group, or non-link.

          -
          -
        • -
        -

        Returns ObjectData

        -
      • -
      -
      -
      - -

      - findLinkDataForKey -

      - -
        -
      • -
        -

        Given a number or string, find the link data object in this model - that uses the given value as its unique key.

        -

        Unless linkKeyProperty is set to a non-empty string, this model - will not automatically assign unique key values for link data objects, - and thus this method will always return null.

        -
        -
        see
        -

        containsLinkData, getKeyForLinkData

        -
        -
        since
        -

        1.6

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          key: Key
          -
          -

          a string or a number.

          -
          -
        • -
        -

        Returns ObjectData

        -

        null if the key is not present in the model, - or if the key is null or undefined or not a string or number.

        -
      • -
      -
      -
      - -

      - getCategoryForLinkData -

      -
        -
      • getCategoryForLinkData(linkdata: ObjectData): string
      • -
      -
        -
      • -
        -

        Find the category of a given link data, a string naming the link template - that the Diagram should use to represent the link data.

        -
        -
        see
        -

        linkCategoryProperty, setCategoryForLinkData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link.

          -
          -
        • -
        -

        Returns string

        -
      • -
      -
      -
      - -

      - getFromKeyForLinkData -

      - -
        -
      • -
        -

        From a link data retrieve a value uniquely identifying the node data - from which this link is connected.

        -
        -
        see
        -

        linkFromKeyProperty, setFromKeyForLinkData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link.

          -
          -
        • -
        -

        Returns Key

        -

        This may return undefined if - the link is not coming from any node.

        -
      • -
      -
      -
      - -

      - getFromPortIdForLinkData -

      -
        -
      • getFromPortIdForLinkData(linkdata: ObjectData): string
      • -
      -
        -
      • -
        -

        From a link data retrieve a value identifying the port object of the node - from which this link is connected.

        -
        -
        see
        -

        linkFromPortIdProperty, setFromPortIdForLinkData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link.

          -
          -
        • -
        -

        Returns string

        -

        This may return the empty string if - there is no particular port parameter information.

        -
      • -
      -
      -
      - -

      - getGroupKeyForNodeData -

      - -
        -
      • -
        -

        If there is a container group for the given node data, return the group's key.

        -
        -
        see
        -

        nodeGroupKeyProperty, setGroupKeyForNodeData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          nodedata: ObjectData
          -
          -

          a JavaScript object represented by a node, group, or non-link.

          -
          -
        • -
        -

        Returns Key

        -

        This returns undefined if there is no containing group data.

        -
      • -
      -
      -
      - -

      - getKeyForLinkData -

      - -
        -
      • -
        -

        Given a link data object return its unique key: a number or a string. - This returns undefined if there is no key value. - Unless linkKeyProperty is set to a non-empty string, this model - will not automatically assign unique key values for link data objects.

        -

        It is possible to change the key for a link data object by calling setKeyForLinkData.

        -
        -
        see
        -

        linkKeyProperty, setKeyForLinkData, findLinkDataForKey

        -
        -
        since
        -

        1.6

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link

          -
          -
        • -
        -

        Returns Key

        -
      • -
      -
      -
      - -

      - getLabelKeysForLinkData -

      - - -
      -
      - -

      - getToKeyForLinkData -

      - -
        -
      • -
        -

        From a link data retrieve a value uniquely identifying the node data - to which this link is connected.

        -
        -
        see
        -

        linkToKeyProperty, setToKeyForLinkData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link.

          -
          -
        • -
        -

        Returns Key

        -

        This may return undefined if - the link is not going to any node.

        -
      • -
      -
      -
      - -

      - getToPortIdForLinkData -

      -
        -
      • getToPortIdForLinkData(linkdata: ObjectData): string
      • -
      -
        -
      • -
        -

        From a link data retrieve a value identifying the port object of the node - to which this link is connected.

        -
        -
        see
        -

        linkToPortIdProperty, setToPortIdForLinkData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link.

          -
          -
        • -
        -

        Returns string

        -

        This may return the empty string if - there is no particular port parameter information.

        -
      • -
      -
      -
      - -

      - isGroupForNodeData -

      -
        -
      • isGroupForNodeData(nodedata: ObjectData): boolean
      • -
      -
        -
      • -
        -

        See if the given node data should be represented as a group or as a simple node.

        -

        This value must not change as long as the node data is part of the model. - At the current time there is no setIsGroupForNodeData method.

        -
        -
        see
        -

        nodeIsGroupProperty

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          nodedata: ObjectData
          -
          -

          a JavaScript object represented by a node, group, or non-link.

          -
          -
        • -
        -

        Returns boolean

        -
      • -
      -
      -
      - -

      - makeLinkDataKeyUnique -

      -
        -
      • makeLinkDataKeyUnique(linkdata: ObjectData): void
      • -
      -
        -
      • -
        -

        This method is called when a link data object is added to the model to make sure that - getKeyForLinkData returns a unique key value.

        -

        The key value should be unique within the set of data managed by this model: - linkDataArray. - If the key is already in use, this will assign an unused number to the - linkKeyProperty property on the data.

        -

        If you want to customize the way in which link data gets a unique key, - you can set the makeUniqueKeyFunction functional property.

        -

        If the link data object is already in the model and you want to change its key value, - call setKeyForLinkData and give it a new unique key value.

        -
        -
        since
        -

        1.6

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - mergeLinkDataArray -

      - -
        -
      • -
        -

        Take an Array of link data objects and update linkDataArray without replacing - the Array and without replacing any existing link data objects that are identified by key. - This depends on linkKeyProperty being a non-empty string.

        -

        For link data objects that have the same key value, this makes calls to setDataProperty - to update the existing link data object. - For new keys, this calls cloneDeep to copy the data and then addLinkData to add a new link to the model. - For existing links that have keys that are not present in the given Array, - this calls removeLinkData to remove the existing link from the model.

        -

        This method is typically used when GoJS is being used within an application that is maintaining state - related to the diagram model. When state is updated, this method can be called to keep the GoJS model synchronized. - Any updates to the data should use new references since this method will use reference equality to check - if a link data object needs to be updated.

        -

        This method does not conduct a transaction.

        -
        -
        since
        -

        2.1

        -
        -
        -
        -

        Parameters

        - -

        Returns void

        -
      • -
      -
      -
      - -

      - removeLabelKeyForLinkData -

      -
        -
      • removeLabelKeyForLinkData(linkdata: ObjectData, key: Key): void
      • -
      -
        -
      • -
        -

        Removes a node key value that identifies a node data acting as a former label node on the given link data.

        -

        Removing a reference to a node data from the collection of link label keys - does not automatically remove any node data from the model.

        -

        This method only works if linkLabelKeysProperty has been set to something other than an empty string.

        -
        -
        see
        -

        addLabelKeyForLinkData, setLabelKeysForLinkData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link.

          -
          -
        • -
        • -
          key: Key
          -
          -

          a number or string that is the key of the label node being removed from the link.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - removeLinkData -

      - -
        -
      • -
        -

        When you want to remove a link from the diagram, call this method with an existing link data object. - This will remove that data object from the linkDataArray and - notify all listeners that a link data object has been removed from the collection.

        -

        If you do not have a reference to the particular data object that is in the linkDataArray, - you may need to search for it by iterating through that Array, or (more likely), - by finding the desired Link in a Diagram and getting that link's Panel.data.

        -

        Removing a link data from a model does not automatically remove - any associated label node data from the model.

        -

        This operation does nothing if the link data is not present in the linkDataArray.

        -
        -
        see
        -

        addLinkData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - removeLinkDataCollection -

      - -
        -
      • -
        -

        Remove from this model all of the link data held in an Array or in an Iterable of link data objects.

        -
        -
        since
        -

        1.3

        -
        -
        -
        -

        Parameters

        - -

        Returns void

        -
      • -
      -
      -
      - -

      - setCategoryForLinkData -

      -
        -
      • setCategoryForLinkData(linkdata: ObjectData, cat: string): void
      • -
      -
        -
      • -
        -

        Change the category of a given link data, a string naming the link template - that the Diagram should use to represent the link data.

        -

        Changing the link template for a link data will cause the existing Link - to be removed from the Diagram and be replaced with a new Link - created by copying the new link template and applying any data-bindings. - Note that the new template must be an instance of the same class as the original link. - Thus one cannot change the category of a link from an instance of Link - to an instance of a subclass of Link, nor vice-versa.

        -
        -
        see
        -

        linkCategoryProperty, getCategoryForLinkData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link.

          -
          -
        • -
        • -
          cat: string
          -
          -

          Must not be null.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override Virtual - setDataProperty -

      -
        -
      • setDataProperty(data: ObjectData, propname: string, val: any): void
      • -
      -
        -
      • -
        -

        This override changes the value of some property of a node data, a link data, or an item data, given a string naming the property - and the new value, in a manner that can be undone/redone and that automatically updates any bindings. - This override handles link data as well as node data.

        -

        This gets the old value of the property; if the value is the same as the new value, no side-effects occur.

        -
        -
        see
        -

        Model.setDataProperty

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          data: ObjectData
          -
          -

          a JavaScript object typically the value of a Panel.data and represented by a Node, Link, Group, simple Part, - or item in a Panel.itemArray; or this model's modelData.

          -
          -
        • -
        • -
          propname: string
          -
          -

          a string that is not null or the empty string.

          -
          -
        • -
        • -
          val: any
          -
          -

          the new value for the property.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - setFromKeyForLinkData -

      -
        -
      • setFromKeyForLinkData(linkdata: ObjectData, key: Key): void
      • -
      -
        -
      • -
        -

        Change the node key that the given link data references as the - source of the link.

        -
        -
        see
        -

        linkFromKeyProperty, getFromKeyForLinkData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link.

          -
          -
        • -
        • -
          key: Key
          -
          -

          This may be undefined if - the link should no longer come from any node.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - setFromPortIdForLinkData -

      -
        -
      • setFromPortIdForLinkData(linkdata: ObjectData, portname: string): void
      • -
      -
        -
      • -
        -

        Change the information that the given link data uses to identify the - particular "port" that the link is coming from.

        -
        -
        see
        -

        linkFromPortIdProperty, getFromPortIdForLinkData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link.

          -
          -
        • -
        • -
          portname: string
          -
          -

          This may be the empty string if - the link should no longer be associated with any particular "port".

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - setGroupKeyForNodeData -

      -
        -
      • setGroupKeyForNodeData(nodedata: ObjectData, key: Key): void
      • -
      -
        -
      • -
        -

        Change the container group for the given node data, given a key for the new group.

        -
        -
        see
        -

        nodeGroupKeyProperty, getGroupKeyForNodeData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          nodedata: ObjectData
          -
          -

          a JavaScript object represented by a node, group, or non-link.

          -
          -
        • -
        • -
          key: Key
          -
          -

          This may be undefined if there should be no containing group data.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - setKeyForLinkData -

      - -
        -
      • -
        -

        Change the unique key of a given link data that is already in this model. - The new key value must be unique -- i.e. not in use by another link data object. - You can call findLinkDataForKey to check if a proposed new key is already in use.

        -

        If this is called when linkKeyProperty is the empty string (i.e. its default value), - this method has no effect. - If this is called on a link data object that is not (yet) in this model, - this unconditionally modifies the property to the new key value.

        -
        -
        see
        -

        linkKeyProperty, getKeyForLinkData

        -
        -
        since
        -

        1.6

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link

          -
          -
        • -
        • -
          key: Key
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - setLabelKeysForLinkData -

      -
        -
      • setLabelKeysForLinkData(linkdata: ObjectData, arr: Key[]): void
      • -
      - -
      -
      - -

      - setToKeyForLinkData -

      - -
        -
      • -
        -

        Change the node key that the given link data references as the - destination of the link.

        -
        -
        see
        -

        linkToKeyProperty, getToKeyForLinkData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link.

          -
          -
        • -
        • -
          key: Key
          -
          -

          This may be undefined if - the link should no longer go to any node.

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - setToPortIdForLinkData -

      -
        -
      • setToPortIdForLinkData(linkdata: ObjectData, portname: string): void
      • -
      -
        -
      • -
        -

        Change the information that the given link data uses to identify the - particular "port" that the link is going to.

        -
        -
        see
        -

        linkToPortIdProperty, getToPortIdForLinkData

        -
        -
        -
        -

        Parameters

        -
          -
        • -
          linkdata: ObjectData
          -
          -

          a JavaScript object represented by a link.

          -
          -
        • -
        • -
          portname: string
          -
          -

          This may be the empty string if - the link should no longer be associated with any particular "port".

          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/GraphObject.html b/api/symbols/GraphObject.html index 3a1dceb81..51667e9a3 100644 --- a/api/symbols/GraphObject.html +++ b/api/symbols/GraphObject.html @@ -1,3950 +1,1432 @@ - - - - - - GraphObject | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class GraphObject

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      Hierarchy

      - -
      -
      -
      -

      This is the abstract base class for all graphical objects. - Classes inheriting from GraphObject include: - Shape, TextBlock, Picture, and Panel. - From the Panel class the Part class is derived, from which the - Node and Link classes derive.

      -

      It is very common to make use of the static function GraphObject.make in order to build up - a visual tree of GraphObjects. You can see many examples of this throughout the - Introduction, starting at Building Objects, - and the Samples, starting with Minimal Sample.

      -

      Since GraphObject is an abstract class, programmers do not create GraphObjects themselves, - but this class defines many properties used by all kinds of GraphObjects.

      -

      The only visual properties on GraphObject is background. - However one can control whether the GraphObject is drawn at all by setting visible, - or by setting opacity to zero if you still want the GraphObject to occupy space. - Also, if you want to control whether any mouse or touch events "see" the GraphObject, - you can set pickable to false.

      -

      For more information about specifying how things get drawn, see the properties on the - Shape, TextBlock, and Picture classes.

      -

      GraphObject Sizing

      -

      GraphObject defines most of the properties that cause objects to size themselves differently. - The most prominent ones include:

      -
        -
      • The desiredSize, minSize, and maxSize properties are used to - explicitly set or limit the size of visual elements. width and height are - convenience properties that set the desiredSize width and height, respectively.
      • -
      • The angle and scale properties are used to transform visual elements.
      • -
      • The stretch property determines how a GraphObject will fill its visual space, - contextually granted to it by its containing Panel. Top-level (Part) - GraphObjects are not affected by this property because they are always granted infinite space.
      • -
      -

      All GraphObjects in a Diagram are measured and then arranged by their containing Panels in a tree-like fashion. - After measuring and arranging, a GraphObject will have valid values for the read-only - properties naturalBounds, measuredBounds, and actualBounds.

      - -

      - See the Introduction page on sizing - for usage information and examples. -

      GraphObject Size and Position within Panel

      - Several GraphObject properties guide the containing Panel for how to size and position the object within the panel. -
        -
      • The alignment specifies where the object should be relative to some area of the panel. - For example, an alignment value of Spot.BottomRight means that the GraphObject should be at the bottom-right corner of the panel.
      • -
      • The alignmentFocus specifies precisely which point of the GraphObject should be aligned at the alignment spot.
      • -
      • The column and row properties are only used by Panel.Table panels, to indicate where the GraphObject should be.
      • -
      • The columnSpan and rowSpan properties tell the Panel.Table panel how large the GraphObject should be.
      • -
      • The isPanelMain property indicates to some kinds of Panels that the GraphObject is the "primary" object - that other panel children should be measured with or positioned in.
      • -
      • The margin property tells the containing Panel how much extra space to put around this GraphObject.
      • -
      • The position property is used to determine the relative position of GraphObjects when they are elements of a Panel.Position panel.
      • -
      -

      - See the Introduction page on Panels - and Table Panels for an overview of the capabilities. -

      Top-level GraphObjects are Parts

      -

      A Part is a derived class of GraphObject representing a top-level object. - All top-level GraphObjects must be Parts, and Node, Link, Group, and Adornment derive from Part. - The position of a Part determines the point of the Part's top-left corner in document coordinates. - See also Part.location, which supports an way to specify the position based on a different - spot of a different element within the Part.

      -

      There are several read-only properties that help navigate up the visual tree.

      -
        -
      • panel returns the Panel that directly contains this GraphObject
      • -
      • part returns the Part that this GraphObject is in, perhaps via intervening Panels; - this is frequently used in order to get to the model data, Panel.data
      • -
      • layer returns the Layer that this GraphObject's Part is in
      • -
      • diagram returns the Diagram that this GraphObject's Part's Layer is in
      • -
      -

      - See the Visual Tree sample - for a diagram displaying the visual tree of a simple diagram. -

      User Interaction

      -

      GraphObjects have several properties enabling dynamic customizable interaction. - There are several definable functions that execute on input events: mouseDragEnter, - mouseDragLeave, mouseDrop, mouseEnter, mouseHold, - mouseHover, mouseLeave, and mouseOver. - For example, you could define mouse enter-and-leave event handlers to modify the appearance of a link - as the mouse passes over it:

      -
      myDiagram.linkTemplate =
      -  $(go.Link,
      -    $(go.Shape,
      -      { strokeWidth: 2, stroke: "gray" },  // default color is "gray"
      -      { // here E is the InputEvent and OBJ is this Shape
      -        mouseEnter: function(e, obj) { obj.strokeWidth = 4; obj.stroke = "dodgerblue"; },
      -        mouseLeave: function(e, obj) { obj.strokeWidth = 2; obj.stroke = "gray"; }
      -      }));
      +GraphObject | GoJS API
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class GraphObject Abstract

      Hierarchy

      +

      This is the abstract base class for all graphical objects. +Classes inheriting from GraphObject include: +Shape, TextBlock, Picture, and Panel. +From the Panel class the Part class is derived, from which the +Node and Link classes derive.

      +

      It is very common to make use of the static function GraphObject.make in order to build up +a visual tree of GraphObjects. You can see many examples of this throughout the +Introduction, starting at Building Objects, +and the Samples, starting with Minimal Sample.

      +

      Since GraphObject is an abstract class, programmers do not create GraphObjects themselves, +but this class defines many properties used by all kinds of GraphObjects.

      +

      The only visual properties on GraphObject is background. +However one can control whether the GraphObject is drawn at all by setting visible, +or by setting opacity to zero if you still want the GraphObject to occupy space. +Also, if you want to control whether any mouse or touch events "see" the GraphObject, +you can set pickable to false.

      +

      For more information about specifying how things get drawn, see the properties on the +Shape, TextBlock, and Picture classes.

      +

      GraphObject Sizing

      + +

      GraphObject defines most of the properties that cause objects to size themselves differently. +The most prominent ones include:

      +
        +
      • The desiredSize, minSize, and maxSize properties are used to +explicitly set or limit the size of visual elements. width and height are +convenience properties that set the desiredSize width and height, respectively.
      • +
      • The angle and scale properties are used to transform visual elements.
      • +
      • The stretch property determines how a GraphObject will fill its visual space, +contextually granted to it by its containing Panel. Top-level (Part) +GraphObjects are not affected by this property because they are always granted infinite space.
      • +
      +

      All GraphObjects in a Diagram are measured and then arranged by their containing Panels in a tree-like fashion. +After measuring and arranging, a GraphObject will have valid values for the read-only +properties naturalBounds, measuredBounds, and actualBounds.

      + +

      +See the Introduction page on sizing +for usage information and examples. +

      GraphObject Size and Position within Panel

      +Several GraphObject properties guide the containing Panel for how to size and position the object within the panel. + +
        +
      • The alignment specifies where the object should be relative to some area of the panel. +For example, an alignment value of Spot.BottomRight means that the GraphObject should be at the bottom-right corner of the panel.
      • +
      • The alignmentFocus specifies precisely which point of the GraphObject should be aligned at the alignment spot.
      • +
      • The column and row properties are only used by Panel.Table panels, to indicate where the GraphObject should be.
      • +
      • The columnSpan and rowSpan properties tell the Panel.Table panel how large the GraphObject should be.
      • +
      • The isPanelMain property indicates to some kinds of Panels that the GraphObject is the "primary" object +that other panel children should be measured with or positioned in.
      • +
      • The margin property tells the containing Panel how much extra space to put around this GraphObject.
      • +
      • The position property is used to determine the relative position of GraphObjects when they are elements of a Panel.Position panel.
      • +
      +

      +See the Introduction page on Panels +and Table Panels for an overview of the capabilities. +

      Top-level GraphObjects are Parts

      + +

      A Part is a derived class of GraphObject representing a top-level object. +All top-level GraphObjects must be Parts, and Node, Link, Group, and Adornment derive from Part. +The position of a Part determines the point of the Part's top-left corner in document coordinates. +See also Part.location, which supports an way to specify the position based on a different +spot of a different element within the Part.

      +

      There are several read-only properties that help navigate up the visual tree.

      +
        +
      • panel returns the Panel that directly contains this GraphObject
      • +
      • part returns the Part that this GraphObject is in, perhaps via intervening Panels; +this is frequently used in order to get to the model data, Panel.data
      • +
      • layer returns the Layer that this GraphObject's Part is in
      • +
      • diagram returns the Diagram that this GraphObject's Part's Layer is in
      • +
      +

      +See the Visual Tree sample +for a diagram displaying the visual tree of a simple diagram. +

      User Interaction

      + +

      GraphObjects have several properties enabling dynamic customizable interaction. +There are several definable functions that execute on input events: mouseDragEnter, +mouseDragLeave, mouseDrop, mouseEnter, mouseHold, +mouseHover, mouseLeave, and mouseOver. +For example, you could define mouse enter-and-leave event handlers to modify the appearance of a link +as the mouse passes over it:

      +
      myDiagram.linkTemplate =
      $(go.Link,
      $(go.Shape,
      { strokeWidth: 2, stroke: "gray" }, // default color is "gray"
      { // here E is the InputEvent and OBJ is this Shape
      mouseEnter: function(e, obj) { obj.strokeWidth = 4; obj.stroke = "dodgerblue"; },
      mouseLeave: function(e, obj) { obj.strokeWidth = 2; obj.stroke = "gray"; }
      }));
      -

      There are click, doubleClick, and contextClick functions - that execute when a user appropriately clicks the GraphObject. - These click functions are called with the InputEvent as the first argument - and this GraphObject as the second argument. - For example, you could define a click event handler on a Node that goes to another page:

      -
      myDiagram.nodeTemplate =
      -  $(go.Node, "Auto",
      -    $(go.Shape, "RoundedRectangle",
      -      new go.Binding("fill", "color")),
      -    $(go.TextBlock,
      -      { name: "TB", margin: 3 },
      -      new go.Binding("text", "key")),
      -    { // second arg will be this GraphObject, which in this case is the Node itself:
      -      click: function(e, node) {
      -        window.open("https://en.wikipedia.org/Wiki/" + node.data.key);
      -      }
      -    });
      +

      There are click, doubleClick, and contextClick functions +that execute when a user appropriately clicks the GraphObject. +These click functions are called with the InputEvent as the first argument +and this GraphObject as the second argument. +For example, you could define a click event handler on a Node that goes to another page:

      +
      myDiagram.nodeTemplate =
      $(go.Node, "Auto",
      $(go.Shape, "RoundedRectangle",
      new go.Binding("fill", "color")),
      $(go.TextBlock,
      { name: "TB", margin: 3 },
      new go.Binding("text", "key")),
      { // second arg will be this GraphObject, which in this case is the Node itself:
      click: function(e, node) {
      window.open("https://en.wikipedia.org/Wiki/" + node.data.key);
      }
      });
      -

      Note: you may prefer defining DiagramEvent listeners on the Diagram - rather than on individual GraphObjects. DiagramEvents also include more general events that - do not necessarily correspond to input events.

      -

      The properties actionCancel, actionDown, actionMove, - and actionUp define functions to execute when the GraphObject's isActionable property - is set to true (default false). See the ActionTool for more detail.

      -

      - See the Introduction page on Events for a more general discussion. -

      GraphObjects as Ports

      -

      In GoJS, Links can only connect to elements within a Node - that are specified as "ports", and by default the only port is the Node itself. - Setting the portId of a GraphObject inside a Node allows that object to act as a port. - Note: the only kind of model that can save which port a link is connected with, i.e. portIds that are not an empty string, - is a GraphLinksModel whose GraphLinksModel.linkFromPortIdProperty and - GraphLinksModel.linkToPortIdProperty have been set to name properties on the link data objects.

      -

      GraphObjects have several properties that are only relevant when they are acting as ports. - These port-related properties are:

      - -

      - See the Introduction page on ports - and link routing - and link connection points - for port usage information and examples. -

      GraphObjects as labels on a Link

      -

      GraphObjects can also be used as "labels" on a Link. - In addition to the alignmentFocus property, these properties direct a Link Panel - to position a "label" at a particular point along the route of the link, in a particular manner:

      -
        -
      • segmentIndex, which segment the label should be on
      • -
      • segmentFraction, how far along the segment the label should be
      • -
      • segmentOffset, where the label should be positioned relative to the segment
      • -
      • segmentOrientation, how the label should be rotated relative to the angle of the segment
      • -
      -

      - See the Introduction page on link labels - for examples of how to make use of labels on Links. -

      Interactive Behavior

      -

      There are several properties that specify fairly high-level interactive behavior:

      - -

      - For more information, please read the Introduction page about Context Menus - and the page about ToolTips. -

      - Also see the Basic sample - for examples of how to show context menus and tooltips. -

      -
      -
      -

      Index

      -
      - -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - -
        -
      • -
        -

        This is an abstract class, so you should not use this constructor.

        -
        -

        Returns GraphObject

        -
      • -
      -
      -
      -
      -

      Properties

      -
      - -

      - actionCancel - : (e: InputEvent, thisObj: GraphObject) => void

      -
        -
      • -
        -

        Gets or sets the function to execute when the ActionTool is cancelled and this GraphObject's isActionable - is set to true. - This property is infrequently set. - By default this property is null.

        -

        This functional property is only set on objects such as buttons, knobs, or sliders that want to handle all events, - in conjunction with ActionTool, pre-empting the normal tool mechanisms.

        -

        The ActionTool does not conduct any transaction, so if this property has a value, - the function will not be called within a transaction.

        -
        -
        see
        -

        actionDown, actionMove, actionUp

        -
        -
        -
        -
      • -
      -
      -
      - -

      - actionDown - : (e: InputEvent, thisObj: GraphObject) => void

      -
        -
      • -
        -

        Gets or sets the function to execute on a mouse-down event when this GraphObject's isActionable - is set to true. - This property is infrequently set. - By default this property is null.

        -

        This functional property is only set on objects such as buttons, knobs, or sliders that want to handle all events, - in conjunction with ActionTool, pre-empting the normal tool mechanisms.

        -

        The ActionTool does not conduct any transaction, so if this property has a value, - the function will not be called within a transaction.

        -
        -
        see
        -

        actionMove, actionUp, actionCancel

        -
        -
        -
        -
      • -
      -
      -
      - -

      - actionMove - : (e: InputEvent, thisObj: GraphObject) => void

      -
        -
      • -
        -

        Gets or sets the function to execute on a mouse-move event when this GraphObject's isActionable - is set to true. - This property is infrequently set. - By default this property is null.

        -

        This functional property is only set on objects such as buttons, knobs, or sliders that want to handle all events, - in conjunction with ActionTool, pre-empting the normal tool mechanisms.

        -

        The ActionTool does not conduct any transaction, so if this property has a value, - the function will not be called within a transaction.

        -
        -
        see
        -

        actionDown, actionUp, actionCancel

        -
        -
        -
        -
      • -
      -
      -
      - -

      - actionUp - : (e: InputEvent, thisObj: GraphObject) => void

      -
        -
      • -
        -

        Gets or sets the function to execute on a mouse-up event when this GraphObject's isActionable - is set to true. - This property is infrequently set. - By default this property is null.

        -

        This functional property is only set on objects such as buttons, knobs, or sliders that want to handle all events, - in conjunction with ActionTool, pre-empting the normal tool mechanisms.

        -

        The ActionTool does not conduct any transaction, so if this property has a value, - the function will not be called within a transaction. - If you do provide a function that makes changes to the diagram or to its model, - you should do so within a transaction -- call Diagram.startTransaction and - Diagram.commitTransaction.

        -
        -
        see
        -

        actionDown, actionMove, actionCancel

        -
        -
        -
        -
      • -
      -
      -
      - -

      - Read-only - actualBounds - : Rect

      -
        -
      • -
        -

        This read-only property returns the bounds of this GraphObject in container coordinates. This means that - the actualBounds are in the coordinate space of the GraphObject's Panel, - unless this is a Part, in which case they are in - the Diagram's coordinate system.

        -

        You must not modify any of the properties of the Rect that is the value of this property.

        -

        If this GraphObject is a Part, - then the x and y values of the actualBounds are identical to that Part's position, - and the width and height values of the actualBounds represent the rectangular space occupied - by the Part in Diagram.documentBounds coordinates.

        -

        If this GraphObject is not a top-level object (not a Part), then the actualBounds - x and y values represent that GraphObject's position within its Panel. In a Panel of type Panel.Position - this is identical to the GraphObject's position, but in other cases it is dependent on - the unique workings of each Panel type. The actualBounds width and height - of a GraphObject are the final size after the scale and angle are applied.

        -

        It is possible for a GraphObject (be it an GraphObject or a Panel containing several more GraphObjects) - to have no containing Part, in which case these GraphObjects cannot possibly be in a Diagram. - These GraphObjects are unlikely to have real-number values for their actualBounds, as they may - never have had the chance to be measured and arranged.

        -

        As with all read-only properties, using this property as a binding source is unlikely to be useful.

        -
        -
        see
        -

        measuredBounds, desiredSize

        -
        -
        -
        -
      • -
      -
      -
      - -

      - alignment - : Spot

      -
        -
      • -
        -

        Gets or sets the alignment Spot of this GraphObject used in Panel layouts, - to determine where in the area allocated by the panel this object should be placed.

        -

        The default value is Spot.Default, which lets the Panel determine the Spot using - Panel.defaultAlignment. If that property is also Spot.Default, - then the alignment spot will be different depending on the Panel type.

        -

        The alignmentFocus is often used along with this property to specify - where this object should be positioned in a Panel.

        -

        A Spot.Default is equivalent to Spot.Center in Spot, Auto, Horizontal, and Vertical panels. - For examples of alignments in different panels, see the Introduction page on Panels.

        -
        -
        see
        -

        alignmentFocus, Panel.defaultAlignment

        -
        -
        -
        -
      • -
      -
      -
      - -

      - alignmentFocus - : Spot

      -
        -
      • -
        -

        Gets or sets the spot on this GraphObject to be used as the alignment point - in Spot and Fixed Panels. - Value must be of the Spot.

        -

        The default value is Spot.Default, which means that the Panel type can decide the effective alignment spot.

        -

        The alignment is often used along with this property to specify - where this object should be positioned in a Panel.

        -

        For Panel.Graduated, the alignmentFocus spot determines the spot on a child element to be aligned with some - point along the main element.

        -

        When you want a link label Node to be positioned by its location spot rather than by this alignmentFocus spot, - you can set this property to Spot.None, only on Nodes.

        -

        For examples of alignments in different panels, see the Introduction page on Panels.

        -

        WARNING: Since 2.0, for Spot Panels, the offsetX/offsetY of alignmentFocus has been reversed. - The offsetX/Y now describes offset distance from the alignmentFocus point to the alignment point, rather than the opposite. - This is what it has always described when using alignmentFocus with Link Labels.

        -
        -
        see
        -

        Panel.alignmentFocusName

        -
        -
        -
        -
      • -
      -
      -
      - -

      - angle - : number

      -
        -
      • -
        -

        Gets or sets the angle transform, in degrees, of this GraphObject. - Value must be a number. If the value is not between (0 <= value < 360), - it will be normalized to be in that range. - Zero is along the positive X-axis (rightwards); 90 is along the positive Y-axis (downwards). - Default is 0.

        -

        When set on a Graduated Panel's TextBlock label, this value will be be ignored if segmentOrientation is not - Link.None, Link.OrientAlong, or Link.OrientUpright. OrientAlong and OrientUpright will use this angle - relative to the slope of the main path.

        -

        When set on a Link label, this value will be be ignored if segmentOrientation is not Link.None.

        -
        -
        see
        -

        scale, stretch

        -
        -
        -
        -
      • -
      -
      -
      - -

      - background - : BrushLike

      -
        -
      • -
        -

        Gets or sets the background Brush of this GraphObject, - filling the rectangle of this object's local coordinate space. - If the object is rotated, the background will rotate with it.

        -

        The value may be either a Brush object or a string that is a CSS color. - The default value is null -- no background is drawn. - More information about the syntax of CSS color strings is available at: - CSS colors (mozilla.org).

        -
        -
        see
        -

        Shape.fill

        -
        -
        -
        -
      • -
      -
      -
      - -

      - click - : (e: InputEvent, thisObj: GraphObject) => void

      -
        -
      • -
        -

        Gets or sets the function to execute when the user single-primary-clicks on this object. - This typically involves a mouse-down followed by a prompt mouse-up - at approximately the same position using the left (primary) mouse button. - This property is used by the ClickSelectingTool - when the user clicks on a GraphObject. - The function is called in addition to the DiagramEvent - that is raised with the name "ObjectSingleClicked".

        -

        If this property value is a function, it is called with an InputEvent - and this GraphObject. - The InputEvent.targetObject provides the GraphObject that was found - at the mouse point before looking up the visual tree of GraphObject.panels - to get to this object.

        -

        From the second argument, obj, you can get to the Node or Link via the part property. - From there you can access the bound data via the Panel.data property. - So from an event handler you can get the bound data by obj.part.data.

        -

        By default this property is null.

        -

        Objects in Layers that are Layer.isTemporary do not receive click events. - If you do want such objects to respond to clicks, set isActionable to true.

        -

        If you do provide a function that makes changes to the diagram or to its model, - you should do so within a transaction -- call Diagram.startTransaction and - Diagram.commitTransaction.

        -

        - An example of a click event handler is shown in the - Arrowheads sample. -

        -
        see
        -

        doubleClick, contextClick, Diagram.click

        -
        -
        -
        -
      • -
      -
      -
      - -

      - column - : number

      -
        -
      • -
        -

        Gets or sets the column of this GraphObject if it is in a Table Panel. - The value must be a small non-negative integer. The default is 0.

        -
        -
      • -
      -
      -
      - -

      - columnSpan - : number

      -
        -
      • -
        -

        Gets or sets the number of columns spanned by this GraphObject if it is in a Table Panel. - The value must be a small positive integer. The default is 1.

        -
        -
      • -
      -
      -
      - -

      - contextClick - : (e: InputEvent, thisObj: GraphObject) => void

      -
        -
      • -
        -

        Gets or sets the function to execute when the user single-secondary-clicks on this object. - This typically involves a mouse-down followed by a prompt mouse-up - at approximately the same position using the right (secondary) mouse button. - This property is used by the ClickSelectingTool - when the user clicks on a GraphObject. - The function is called in addition to the DiagramEvent - that is raised with the name "ObjectContextClicked".

        -

        If this property value is a function, it is called with an InputEvent - and this GraphObject. - The InputEvent.targetObject provides the GraphObject that was found - at the mouse point before looking up the visual tree of GraphObject.panels - to get to this object.

        -

        From the second argument, obj, you can get to the Node or Link via the part property. - From there you can access the bound data via the Panel.data property. - So from an event handler you can get the bound data by obj.part.data.

        -

        By default this property is null.

        -

        Objects in Layers that are Layer.isTemporary do not receive click events. - If you do want such objects to respond to clicks, set isActionable to true.

        -

        If you do provide a function that makes changes to the diagram or to its model, - you should do so within a transaction -- call Diagram.startTransaction and - Diagram.commitTransaction.

        -
        -
        see
        -

        click, doubleClick, Diagram.contextClick

        -
        -
        -
        -
      • -
      -
      -
      - -

      - contextMenu - : Adornment | HTMLInfo

      -
        -
      • -
        -

        This Adornment or HTMLInfo is shown upon a context click on this object. - The default value is null, which means no context menu is shown.

        -

        Changing this value will not modify or remove any existing menu that is being shown for this object.

        -

        Context menus may also depend on having the same data binding as the adorned Part - (i.e. the same value for Panel.data).

        -

        Context menus are not copied by copy, so that context menus may be shared by all instances of a template.

        -

        A typical context menu is implemented as an Adornment with several buttons in it. - For example, this context menu is defined in the - Dynamic Port sample:

        -
        var nodeMenu =  // context menu for each Node
        - $("ContextMenu",
        -    $("ContextMenuButton",
        -      $(go.TextBlock, "Add top port"),
        -      { click: function(e, obj) { addPort("top"); } }),
        -    $("ContextMenuButton",
        -      $(go.TextBlock, "Add left port"),
        -      { click: function(e, obj) { addPort("left"); } }),
        -    $("ContextMenuButton",
        -      $(go.TextBlock, "Add right port"),
        -      { click: function(e, obj) { addPort("right"); } }),
        -    $("ContextMenuButton",
        -      $(go.TextBlock, "Add bottom port"),
        -      { click: function(e, obj) { addPort("bottom"); } }));
        +

        Note: you may prefer defining DiagramEvent listeners on the Diagram +rather than on individual GraphObjects. DiagramEvents also include more general events that +do not necessarily correspond to input events.

        +

        The properties actionCancel, actionDown, actionMove, +and actionUp define functions to execute when the GraphObject's isActionable property +is set to true (default false). See the ActionTool for more detail.

        +

        +See the Introduction page on Events for a more general discussion. +

        GraphObjects as Ports

        + +

        In GoJS, Links can only connect to elements within a Node +that are specified as "ports", and by default the only port is the Node itself. +Setting the portId of a GraphObject inside a Node allows that object to act as a port. +Note: the only kind of model that can save which port a link is connected with, i.e. portIds that are not an empty string, +is a GraphLinksModel whose GraphLinksModel.linkFromPortIdProperty and +GraphLinksModel.linkToPortIdProperty have been set to name properties on the link data objects.

        +

        GraphObjects have several properties that are only relevant when they are acting as ports. +These port-related properties are:

        + +

        +See the Introduction page on ports +and link routing +and link connection points +for port usage information and examples. +

        GraphObjects as labels on a Link

        + +

        GraphObjects can also be used as "labels" on a Link. +In addition to the alignmentFocus property, these properties direct a Link Panel +to position a "label" at a particular point along the route of the link, in a particular manner:

        + +

        +See the Introduction page on link labels +for examples of how to make use of labels on Links. +

        Interactive Behavior

        + +

        There are several properties that specify fairly high-level interactive behavior:

        + +

        +For more information, please read the Introduction page about Context Menus +and the page about ToolTips. +

        +Also see the Basic sample +for examples of how to show context menus and tooltips.

      Index

      Constructors

      • +

        This is an abstract class, so you should not use this constructor.

        +

        Returns GraphObject

      Properties

      • +

        Gets or sets the function to execute when the ActionTool is cancelled and this GraphObject's isActionable +is set to true. +This property is infrequently set. +By default this property is null.

        +

        This functional property is only set on objects such as buttons, knobs, or sliders that want to handle all events, +in conjunction with ActionTool, pre-empting the normal tool mechanisms.

        +

        The ActionTool does not conduct any transaction, so if this property has a value, +the function will not be called within a transaction.

        +
        see

        actionDown, actionMove, actionUp

        +
      • +

        Gets or sets the function to execute on a mouse-down event when this GraphObject's isActionable +is set to true. +This property is infrequently set. +By default this property is null.

        +

        This functional property is only set on objects such as buttons, knobs, or sliders that want to handle all events, +in conjunction with ActionTool, pre-empting the normal tool mechanisms.

        +

        The ActionTool does not conduct any transaction, so if this property has a value, +the function will not be called within a transaction.

        +
        see

        actionMove, actionUp, actionCancel

        +
      • +

        Gets or sets the function to execute on a mouse-move event when this GraphObject's isActionable +is set to true. +This property is infrequently set. +By default this property is null.

        +

        This functional property is only set on objects such as buttons, knobs, or sliders that want to handle all events, +in conjunction with ActionTool, pre-empting the normal tool mechanisms.

        +

        The ActionTool does not conduct any transaction, so if this property has a value, +the function will not be called within a transaction.

        +
        see

        actionDown, actionUp, actionCancel

        +
      • +

        Gets or sets the function to execute on a mouse-up event when this GraphObject's isActionable +is set to true. +This property is infrequently set. +By default this property is null.

        +

        This functional property is only set on objects such as buttons, knobs, or sliders that want to handle all events, +in conjunction with ActionTool, pre-empting the normal tool mechanisms.

        +

        The ActionTool does not conduct any transaction, so if this property has a value, +the function will not be called within a transaction. +If you do provide a function that makes changes to the diagram or to its model, +you should do so within a transaction -- call Diagram.startTransaction and +Diagram.commitTransaction.

        +
        see

        actionDown, actionMove, actionCancel

        +
      • +

        This read-only property returns the bounds of this GraphObject in container coordinates. This means that +the actualBounds are in the coordinate space of the GraphObject's Panel, +unless this is a Part, in which case they are in +the Diagram's coordinate system.

        +

        You must not modify any of the properties of the Rect that is the value of this property.

        +

        If this GraphObject is a Part, +then the x and y values of the actualBounds are identical to that Part's position, +and the width and height values of the actualBounds represent the rectangular space occupied +by the Part in Diagram.documentBounds coordinates.

        +

        If this GraphObject is not a top-level object (not a Part), then the actualBounds +x and y values represent that GraphObject's position within its Panel. In a Panel of type Panel.Position +this is identical to the GraphObject's position, but in other cases it is dependent on +the unique workings of each Panel type. The actualBounds width and height +of a GraphObject are the final size after the scale and angle are applied.

        +

        It is possible for a GraphObject (be it an GraphObject or a Panel containing several more GraphObjects) +to have no containing Part, in which case these GraphObjects cannot possibly be in a Diagram. +These GraphObjects are unlikely to have real-number values for their actualBounds, as they may +never have had the chance to be measured and arranged.

        +

        As with all read-only properties, using this property as a binding source is unlikely to be useful.

        +
        see

        measuredBounds, desiredSize

        +
      • +

        Gets or sets the alignment Spot of this GraphObject used in Panel layouts, +to determine where in the area allocated by the panel this object should be placed.

        +

        The default value is Spot.Default, which lets the Panel determine the Spot using +Panel.defaultAlignment. If that property is also Spot.Default, +then the alignment spot will be different depending on the Panel type.

        +

        The alignmentFocus is often used along with this property to specify +where this object should be positioned in a Panel.

        +

        A Spot.Default is equivalent to Spot.Center in Spot, Auto, Horizontal, and Vertical panels. +For examples of alignments in different panels, see the Introduction page on Panels.

        +
        see

        alignmentFocus, Panel.defaultAlignment

        +
      • +

        Gets or sets the spot on this GraphObject to be used as the alignment point +in Spot and Fixed Panels. +Value must be of the Spot.

        +

        The default value is Spot.Default, which means that the Panel type can decide the effective alignment spot.

        +

        The alignment is often used along with this property to specify +where this object should be positioned in a Panel.

        +

        For Panel.Graduated, the alignmentFocus spot determines the spot on a child element to be aligned with some +point along the main element.

        +

        When you want a link label Node to be positioned by its location spot rather than by this alignmentFocus spot, +you can set this property to Spot.None, only on Nodes.

        +

        For examples of alignments in different panels, see the Introduction page on Panels.

        +

        WARNING: Since 2.0, for Spot Panels, the offsetX/offsetY of alignmentFocus has been reversed. +The offsetX/Y now describes offset distance from the alignmentFocus point to the alignment point, rather than the opposite. +This is what it has always described when using alignmentFocus with Link Labels.

        +
        see

        Panel.alignmentFocusName

        +
      • +

        Gets or sets the angle transform, in degrees, of this GraphObject. +Value must be a number. If the value is not between (0 <= value < 360), +it will be normalized to be in that range. +Zero is along the positive X-axis (rightwards); 90 is along the positive Y-axis (downwards). +Default is 0.

        +

        When set on a Graduated Panel's TextBlock label, this value will be be ignored if segmentOrientation is not +Link.None, Link.OrientAlong, or Link.OrientUpright. OrientAlong and OrientUpright will use this angle +relative to the slope of the main path.

        +

        When set on a Link label, this value will be be ignored if segmentOrientation is not Link.None.

        +
        see

        scale, stretch

        +
      • +

        Gets or sets the background Brush of this GraphObject, +filling the rectangle of this object's local coordinate space. +If the object is rotated, the background will rotate with it.

        +

        The value may be either a Brush object or a string that is a CSS color. +The default value is null -- no background is drawn. +More information about the syntax of CSS color strings is available at: +CSS colors (mozilla.org).

        +
        see

        Shape.fill

        +
      • +

        Gets or sets the function to execute when the user single-primary-clicks on this object. +This typically involves a mouse-down followed by a prompt mouse-up +at approximately the same position using the left (primary) mouse button. +This property is used by the ClickSelectingTool +when the user clicks on a GraphObject. +The function is called in addition to the DiagramEvent +that is raised with the name "ObjectSingleClicked".

        +

        If this property value is a function, it is called with an InputEvent +and this GraphObject. +The InputEvent.targetObject provides the GraphObject that was found +at the mouse point before looking up the visual tree of GraphObject.panels +to get to this object.

        +

        From the second argument, obj, you can get to the Node or Link via the part property. +From there you can access the bound data via the Panel.data property. +So from an event handler you can get the bound data by obj.part.data.

        +

        By default this property is null.

        +

        Objects in Layers that are Layer.isTemporary do not receive click events. +If you do want such objects to respond to clicks, set isActionable to true.

        +

        If you do provide a function that makes changes to the diagram or to its model, +you should do so within a transaction -- call Diagram.startTransaction and +Diagram.commitTransaction.

        +

        +An example of a click event handler is shown in the +Arrowheads sample.

        see

        doubleClick, contextClick, Diagram.click

        +
      • +

        Gets or sets the column of this GraphObject if it is in a Table Panel. +The value must be a small non-negative integer. The default is 0.

        +
      • +

        Gets or sets the number of columns spanned by this GraphObject if it is in a Table Panel. +The value must be a small positive integer. The default is 1.

        +
      • +

        Gets or sets the function to execute when the user single-secondary-clicks on this object. +This typically involves a mouse-down followed by a prompt mouse-up +at approximately the same position using the right (secondary) mouse button. +This property is used by the ClickSelectingTool +when the user clicks on a GraphObject. +The function is called in addition to the DiagramEvent +that is raised with the name "ObjectContextClicked".

        +

        If this property value is a function, it is called with an InputEvent +and this GraphObject. +The InputEvent.targetObject provides the GraphObject that was found +at the mouse point before looking up the visual tree of GraphObject.panels +to get to this object.

        +

        From the second argument, obj, you can get to the Node or Link via the part property. +From there you can access the bound data via the Panel.data property. +So from an event handler you can get the bound data by obj.part.data.

        +

        By default this property is null.

        +

        Objects in Layers that are Layer.isTemporary do not receive click events. +If you do want such objects to respond to clicks, set isActionable to true.

        +

        If you do provide a function that makes changes to the diagram or to its model, +you should do so within a transaction -- call Diagram.startTransaction and +Diagram.commitTransaction.

        +
        see

        click, doubleClick, Diagram.contextClick

        +
      • +

        This Adornment or HTMLInfo is shown upon a context click on this object. +The default value is null, which means no context menu is shown.

        +

        Changing this value will not modify or remove any existing menu that is being shown for this object.

        +

        Context menus may also depend on having the same data binding as the adorned Part +(i.e. the same value for Panel.data).

        +

        Context menus are not copied by copy, so that context menus may be shared by all instances of a template.

        +

        A typical context menu is implemented as an Adornment with several buttons in it. +For example, this context menu is defined in the +Dynamic Port sample:

        +
        var nodeMenu =  // context menu for each Node
        $("ContextMenu",
        $("ContextMenuButton",
        $(go.TextBlock, "Add top port"),
        { click: function(e, obj) { addPort("top"); } }),
        $("ContextMenuButton",
        $(go.TextBlock, "Add left port"),
        { click: function(e, obj) { addPort("left"); } }),
        $("ContextMenuButton",
        $(go.TextBlock, "Add right port"),
        { click: function(e, obj) { addPort("right"); } }),
        $("ContextMenuButton",
        $(go.TextBlock, "Add bottom port"),
        { click: function(e, obj) { addPort("bottom"); } }));
        -

        and is used in the node template:

        -
        myDiagram.nodeTemplate =
        -  $(go.Node, "Table",
        -    { . . .
        -      contextMenu: nodeMenu
        -    },
        -    . . .);
        +

        and is used in the node template:

        +
        myDiagram.nodeTemplate =
        $(go.Node, "Table",
        { . . .
        contextMenu: nodeMenu
        },
        . . .);
        -

        Context menus are normally positioned by ContextMenuTool.positionContextMenu. - However, if there is a Placeholder in the context menu, the context menu (i.e. an Adornment) - will be positioned so that the Placeholder is at the same position as this adorned GraphObject.

        -

        The Basic sample also shows how - to make context menu items invisible when the command is disabled.

        -

        Replacing this value will not modify or remove any existing context menu that is being shown for this object.

        -

        Read more about context menus at Context Menus.

        -
        -
      • -
      -
      -
      - -

      - cursor - : string

      -
        -
      • -
        -

        Gets or sets the mouse cursor to use when the mouse is over this object with no mouse buttons pressed. - The value is null when no particular cursor is specified for this object; - the actual cursor is determined by any containing Panel.

        -

        The default value is the empty string, which means the - current mouse cursor is determined by the Diagram. - Other strings should be valid CSS strings that specify a cursor. - This provides some more information about cursor syntax: - CSS cursors (mozilla.org).

        -
        -
        see
        -

        Diagram.defaultCursor, Diagram.currentCursor

        -
        -
        -
        -
      • -
      -
      -
      - -

      - desiredSize - : Size

      -
        -
      • -
        -

        Gets or sets the desired size of this GraphObject in local coordinates. - Value must be of type Size. - Default is Size(NaN, NaN). - You cannot modify the width or height of the value of this property -- - if you want to change the desiredSize you must set this property to a different Size.

        -

        Getting or setting width or height is equivalent to getting or setting the - width or height of this property.

        -

        The size does not include any transformation due to scale or angle, - nor any pen thickness due to Shape.strokeWidth if this is a Shape. - If there is a containing Panel the Panel will determine the actual size. - If the desiredSize is greater than the allowed size that the GraphObject's Panel determines, - then the GraphObject may be visually clipped. If the desiredSize does not meet the constraints - of minSize and maxSize, the GraphObject will be resized to meet them.

        -
        -
        see
        -

        minSize, maxSize, naturalBounds, measuredBounds, actualBounds

        -
        -
        -
        -
      • -
      -
      -
      - -

      - Read-only - diagram - : Diagram

      -
        -
      • -
        -

        This read-only property returns the Diagram that this GraphObject is in, if it is.

        -

        This property is not settable. - Although you cannot add any plain GraphObject to a Diagram, you can call Diagram.add - to add a Part to a Diagram.

        -
        -
      • -
      -
      -
      - -

      - doubleClick - : (e: InputEvent, thisObj: GraphObject) => void

      -
        -
      • -
        -

        Gets or sets the function to execute when the user double-primary-clicks on this object. - This typically involves a mouse-down/up/down/up in rapid succession - at approximately the same position using the left (primary) mouse button. - This property is used by the ClickSelectingTool - when the user clicks on a GraphObject. - The function is called in addition to the DiagramEvent - that is raised with the name "ObjectDoubleClicked".

        -

        If this property value is a function, it is called with an InputEvent - and this GraphObject. - The InputEvent.targetObject provides the GraphObject that was found - at the mouse point before looking up the visual tree of GraphObject.panels - to get to this object.

        -

        From the second argument, obj, you can get to the Node or Link via the part property. - From there you can access the bound data via the Panel.data property. - So from an event handler you can get the bound data by obj.part.data.

        -

        By default this property is null.

        -

        Objects in Layers that are Layer.isTemporary do not receive click events. - If you do want such objects to respond to clicks, set isActionable to true.

        -

        If you do provide a function that makes changes to the diagram or to its model, - you should do so within a transaction -- call Diagram.startTransaction and - Diagram.commitTransaction.

        -

        The Class Hierarchy sample - demonstrates the definition of a double-click event handler that opens up - a web page with the documentation for that class:

        -
        diagram.nodeTemplate =
        -  $(go.Node, . . .,
        -    {
        -      doubleClick:  // here the second argument is this object, which is this Node
        -        function(e, node) { window.open("../api/symbols/" + node.data.key + ".html"); }
        -    },
        -    . . .
        -    );
        +

        Context menus are normally positioned by ContextMenuTool.positionContextMenu. +However, if there is a Placeholder in the context menu, the context menu (i.e. an Adornment) +will be positioned so that the Placeholder is at the same position as this adorned GraphObject.

        +

        The Basic sample also shows how +to make context menu items invisible when the command is disabled.

        +

        Replacing this value will not modify or remove any existing context menu that is being shown for this object.

        +

        Read more about context menus at Context Menus.

        +
    • +

      Gets or sets the mouse cursor to use when the mouse is over this object with no mouse buttons pressed. +The value is null when no particular cursor is specified for this object; +the actual cursor is determined by any containing Panel.

      +

      The default value is the empty string, which means the +current mouse cursor is determined by the Diagram. +Other strings should be valid CSS strings that specify a cursor. +This provides some more information about cursor syntax: +CSS cursors (mozilla.org).

      +
      see

      Diagram.defaultCursor, Diagram.currentCursor

      +
    • +

      Gets or sets the desired size of this GraphObject in local coordinates. +Value must be of type Size. +Default is Size(NaN, NaN). +You cannot modify the width or height of the value of this property -- +if you want to change the desiredSize you must set this property to a different Size.

      +

      Getting or setting width or height is equivalent to getting or setting the +width or height of this property.

      +

      The size does not include any transformation due to scale or angle, +nor any pen thickness due to Shape.strokeWidth if this is a Shape. +If there is a containing Panel the Panel will determine the actual size. +If the desiredSize is greater than the allowed size that the GraphObject's Panel determines, +then the GraphObject may be visually clipped. If the desiredSize does not meet the constraints +of minSize and maxSize, the GraphObject will be resized to meet them.

      +
      see

      minSize, maxSize, naturalBounds, measuredBounds, actualBounds

      +
    • +

      This read-only property returns the Diagram that this GraphObject is in, if it is.

      +

      This property is not settable. +Although you cannot add any plain GraphObject to a Diagram, you can call Diagram.add +to add a Part to a Diagram.

      +
    • +

      Gets or sets the function to execute when the user double-primary-clicks on this object. +This typically involves a mouse-down/up/down/up in rapid succession +at approximately the same position using the left (primary) mouse button. +This property is used by the ClickSelectingTool +when the user clicks on a GraphObject. +The function is called in addition to the DiagramEvent +that is raised with the name "ObjectDoubleClicked".

      +

      If this property value is a function, it is called with an InputEvent +and this GraphObject. +The InputEvent.targetObject provides the GraphObject that was found +at the mouse point before looking up the visual tree of GraphObject.panels +to get to this object.

      +

      From the second argument, obj, you can get to the Node or Link via the part property. +From there you can access the bound data via the Panel.data property. +So from an event handler you can get the bound data by obj.part.data.

      +

      By default this property is null.

      +

      Objects in Layers that are Layer.isTemporary do not receive click events. +If you do want such objects to respond to clicks, set isActionable to true.

      +

      If you do provide a function that makes changes to the diagram or to its model, +you should do so within a transaction -- call Diagram.startTransaction and +Diagram.commitTransaction.

      +

      The Class Hierarchy sample +demonstrates the definition of a double-click event handler that opens up +a web page with the documentation for that class:

      +
      diagram.nodeTemplate =
      $(go.Node, . . .,
      {
      doubleClick: // here the second argument is this object, which is this Node
      function(e, node) { window.open("../api/symbols/" + node.data.key + ".html"); }
      },
      . . .
      );
      -
      -
      see
      -

      click, contextClick, Diagram.doubleClick

      -
      -
      -
      -
    • -
    -
    -
    - -

    - enabledChanged - : (thisObj: GraphObject, enabled: boolean) => void

    -
      -
    • -
      -

      Gets or sets the function to execute when some containing Panel changes the value of Panel.isEnabled. - It is typically used to modify the appearance of the object. - This function must not change the value of any panel Panel.isEnabled.

      -

      If this property value is a function, it is called with two arguments, - this GraphObject and the new value. - By default this property is null -- no function is called.

      -
      -
      see
      -

      isEnabledObject, Panel.isEnabled

      -
      -
      since
      -

      1.7

      -
      -
      -
      -
    • -
    -
    -
    - -

    - fromEndSegmentLength - : number

    - -
    -
    - -

    - fromLinkable - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may draw Links from this port. - This property is used by LinkingBaseTool.isValidFrom.

      -

      The default value is null, which indicates that the real value is inherited from - the parent Panel, or false if there is no containing panel.

      -

      You must set this property on a GraphObject whose portId is non-null, - unless the whole Node is acting as a single port, - in which case this property should be set on the Node, - or unless you are disabling the "linkability" of a particular GraphObject - inside a Panel whose fromLinkable has been set or bound to true.

      -
      -
      see
      -

      toLinkable, fromMaxLinks, portId, cursor

      -
      -
      -
      -
    • -
    -
    -
    - -

    - fromLinkableDuplicates - : boolean

    - -
    -
    - -

    - fromLinkableSelfNode - : boolean

    - -
    -
    - -

    - fromMaxLinks - : number

    -
      -
    • -
      -

      Gets or sets the maximum number of links that may come out of this port. - This property is used by LinkingBaseTool.isValidFrom.

      -

      The value must be non-negative. - The default value is Infinity.

      -

      You must set this property on a GraphObject whose portId is non-null, - unless the whole Node is acting as a single port, - in which case this property should be set on the Node.

      -
      -
      see
      -

      fromLinkable, toMaxLinks, portId

      -
      -
      -
      -
    • -
    -
    -
    - -

    - fromShortLength - : number

    -
      -
    • -
      -

      Gets or sets how far the end segment of a link coming from this port stops short of the actual port. - Positive values are limited by the fromEndSegmentLength or Link.fromEndSegmentLength. - Negative values cause the link to extend into the port. - The default value is zero.

      -

      This property is useful when you have a thick link and a pointy arrowhead. - Normally the link Shape extends all the way to the end of the arrowhead. - If the link Shape is wide, its edges will be seen behind the arrowhead. - By setting this property to a small positive value, the link Shape can end within the - body of the arrowhead, leaving only the point of the arrowhead visible at the end of the link.

      -

      A negative value for this property can also be useful when you want the link Shape to continue - into the port, perhaps because a portion of the port is transparent and you want the link to - appear to connect visually with a different point on the node.

      -

      The value of Link.fromShortLength, if not NaN, takes precedence over the value at this port - when determining the route of the link.

      -

      For examples of how to use this property, see Link Connection Points.

      -

      You must set this property on a GraphObject whose portId is non-null, - unless the whole Node is acting as a single port, - in which case this property should be set on the Node.

      -
      -
      see
      -

      toShortLength, Link.fromShortLength, portId

      -
      -
      -
      -
    • -
    -
    -
    - -

    - fromSpot - : Spot

    - -
    -
    - -

    - height - : number

    -
      -
    • -
      -

      Gets or sets the desired height of this GraphObject in local coordinates. - This just gets or sets the height component of the desiredSize. - Default is NaN.

      -

      Size can also be constrained by setting minSize and maxSize.

      -

      The height does not include any transformation due to scale or angle, - nor any pen thickness due to Shape.strokeWidth if this is a Shape. - If there is a containing Panel the Panel will determine the actual size.

      -
      -
    • -
    -
    -
    - -

    - isActionable - : boolean

    - -
    -
    - -

    - isPanelMain - : boolean

    -
      -
    • -
      -

      Gets or sets whether a GraphObject is the "main" object for some types of Panel. - Panels that use a "main" object include Panel.Auto, Panel.Spot, and Panel.Link.

      -

      Panels that use a "main" object will use the first object that has this property set to true, - or else just the first object, if none have the property set.

      -

      Do not modify this property once this object is an element of a panel.

      -
      -
    • -
    -
    -
    - -

    - Read-only - layer - : Layer

    -
      -
    • -
      -

      This read-only property returns the GraphObject's containing Layer, if there is any. - A plain GraphObject cannot belong directly to a Layer -- only a Part can belong directly to a Layer.

      -

      This property is not settable. - Normally one changes which Layer that a GraphObject is in by setting Part.layerName. - Adding a Part to a Diagram will automatically add that Part to a Layer in that Diagram based on the layerName.

      -
      -
    • -
    -
    -
    - -

    - margin - : MarginLike

    -
      -
    • -
      -

      Gets or sets the size of empty area around this GraphObject, as a Margin, - in the containing Panel coordinates.

      -

      Negative values are permitted but may cause overlaps with adjacent - objects in a Panel. - You cannot modify the top or left or right or bottom of the value of this property -- - if you want to change the margin you must set this property to a different Margin. - Default margin is Margin(0,0,0,0).

      -

      The property setter accepts a number instead of a Margin object: providing a - number N will result in using a Margin(N, N, N, N). - The property getter will always return a Margin.

      -
      -
      see
      -

      desiredSize, measuredBounds, actualBounds, Panel.padding

      -
      -
      -
      -
    • -
    -
    -
    - -

    - maxSize - : Size

    -
      -
    • -
      -

      Gets or sets the maximum size of this GraphObject in container coordinates - (either a Panel or the document). - Any new value must be of type Size; NaN values are treated as Infinity. If you want no maximum width or height, use NaN or Infinity.

      -

      You cannot modify the width or height of the value of this property -- - if you want to change the maxSize you must set this property to a different Size. - The default value is Infinity by Infinity. - A containing Panel will determine the actual size of this object.

      -
      -
      see
      -

      minSize, desiredSize

      -
      -
      -
      -
    • -
    -
    -
    - -

    - Read-only - measuredBounds - : Rect

    -
      -
    • -
      -

      This read-only property returns the measuredBounds of the GraphObject in container coordinates - (either a Panel or the document). - This describes the transformed bounds with margins excluded.

      -

      You must not modify any of the properties of the Rect that is the value of this property.

      -

      As with all read-only properties, using this property as a binding source is unlikely to be useful.

      -
      -
      see
      -

      naturalBounds, desiredSize, actualBounds

      -
      -
      -
      -
    • -
    -
    -
    - -

    - minSize - : Size

    -
      -
    • -
      -

      Gets or sets the minimum size of this GraphObject in container coordinates - (either a Panel or the document). - Any new value must be of type Size; NaN values are treated as 0.

      -

      You cannot modify the width or height of the value of this property -- - if you want to change the minSize you must set this property to a different Size. - The default value is zero by zero. - A containing Panel will determine the actual size of this object.

      -
      -
      see
      -

      maxSize, desiredSize

      -
      -
      -
      -
    • -
    -
    -
    - -

    - mouseDragEnter - : (e: InputEvent, thisObj: GraphObject, prevObj: GraphObject) => void

    -
      -
    • -
      -

      Gets or sets the function to execute when the user moves the mouse - into this stationary object during a DraggingTool drag; - this allows you to provide feedback during a drag based on where it might drop.

      -

      If this property value is a function, it is called with an InputEvent, - this GraphObject, and any previous GraphObject. - The InputEvent.targetObject provides the GraphObject that was found - at the mouse point before looking up the visual tree of GraphObject.panels - to get to this object. - By default this property is null.

      -

      Note that for a drag-and-drop that originates in a different diagram, the target diagram's - selection collection will not be the parts that are being dragged. - Instead the temporary parts being dragged can be found as the source diagram's DraggingTool.copiedParts.

      -

      This function is called with Diagram.skipsUndoManager temporarily set to true, - so that any changes to GraphObjects are not recorded in the UndoManager. - You do not need to start and commit any transaction in this function, - because the DraggingTool will be conducting one already. - After calling this function the diagram will be updated immediately.

      -

      For an example of a mouseDragEnter event handler, see the node template in the - Org Chart Editor sample.

      -
      -
      see
      -

      mouseDragLeave, mouseHold, mouseDrop, mouseEnter, Group.handlesDragDropForMembers

      -
      -
      -
      -
    • -
    -
    -
    - -

    - mouseDragLeave - : (e: InputEvent, thisObj: GraphObject, nextObj: GraphObject) => void

    -
      -
    • -
      -

      Gets or sets the function to execute when the user moves the mouse - out of this stationary object during a DraggingTool drag; - this allows you to provide feedback during a drag based on where it might drop.

      -

      If this property value is a function, it is called with an InputEvent, - this GraphObject, and any new GraphObject that the mouse is in. - The InputEvent.targetObject provides the GraphObject that was found - at the mouse point before looking up the visual tree of GraphObject.panels - to get to this object. - By default this property is null.

      -

      Note that for a drag-and-drop that originates in a different diagram, the target diagram's - selection collection will not be the parts that are being dragged. - Instead the temporary parts being dragged can be found as the source diagram's DraggingTool.copiedParts.

      -

      This function is called with Diagram.skipsUndoManager temporarily set to true, - so that any changes to GraphObjects are not recorded in the UndoManager. - You do not need to start and commit any transaction in this function, - because the DraggingTool will be conducting one already. - After calling this function the diagram will be updated immediately.

      -

      For an example of a mouseDragLeave event handler, see the node template in the - Org Chart Editor sample.

      -
      -
      see
      -

      mouseDragEnter, mouseHold, mouseDrop, mouseLeave, Group.handlesDragDropForMembers

      -
      -
      -
      -
    • -
    -
    -
    - -

    - mouseDrop - : (e: InputEvent, thisObj: GraphObject) => void

    - -
    -
    - -

    - mouseEnter - : (e: InputEvent, thisObj: GraphObject, prevObj: GraphObject) => void

    -
      -
    • -
      -

      Gets or sets the function to execute when the user moves the mouse - into this object without holding down any buttons. - This property is used by the ToolManager.

      -

      If this property value is a function, it is called with an InputEvent, - this GraphObject that the mouse is now in, - and any previous GraphObject that the mouse was in. - The InputEvent.targetObject provides the GraphObject that was found - at the mouse point before looking up the visual tree of GraphObject.panels - to get to this object. - By default this property is null.

      -

      This function is called with Diagram.skipsUndoManager temporarily set to true, - so that any changes to GraphObjects are not recorded in the UndoManager. - You do not need to start and commit any transaction in this function. - After calling this function the diagram will be updated immediately.

      -

      For example, consider the situation where one wants to display buttons that the user can click - whenever the user passes the mouse over a node, and the buttons automatically disappear when the - mouse leaves the node. This can be implemented by showing an Adornment holding the buttons.

      -
      var nodeContextMenu =
      -  $(go.Adornment, "Spot",
      -    { background: "transparent" },  // to help detect when the mouse leaves the area
      -    $(go.Placeholder),
      -    $(go.Panel, "Vertical",
      -      { alignment: go.Spot.Right, alignmentFocus: go.Spot.Left },
      -      $("Button",
      -        $(go.TextBlock, "Command 1"),
      -        {
      -          click: function(e, obj) {
      -            var node = obj.part.adornedPart;
      -            alert("Command 1 on " + node.data.text);
      -            node.removeAdornment("ContextMenuOver");
      -          }
      -        }),
      -      $("Button",
      -        $(go.TextBlock, "Command 2"),
      -        {
      -          click: function(e, obj) {
      -            var node = obj.part.adornedPart;
      -            alert("Command 2 on " + node.data.text);
      -            node.removeAdornment("ContextMenuOver");
      -          }
      -        })
      -      ));
      +
      see

      click, contextClick, Diagram.doubleClick

      +
  • +

    Gets or sets the function to execute when some containing Panel changes the value of Panel.isEnabled. +It is typically used to modify the appearance of the object. +This function must not change the value of any panel Panel.isEnabled.

    +

    If this property value is a function, it is called with two arguments, +this GraphObject and the new value. +By default this property is null -- no function is called.

    +
    see

    isEnabledObject, Panel.isEnabled

    +
    since

    1.7

    +
  • +

    Gets or sets whether the user may draw Links from this port. +This property is used by LinkingBaseTool.isValidFrom.

    +

    The default value is null, which indicates that the real value is inherited from +the parent Panel, or false if there is no containing panel.

    +

    You must set this property on a GraphObject whose portId is non-null, +unless the whole Node is acting as a single port, +in which case this property should be set on the Node, +or unless you are disabling the "linkability" of a particular GraphObject +inside a Panel whose fromLinkable has been set or bound to true.

    +
    see

    toLinkable, fromMaxLinks, portId, cursor

    +
  • +

    Gets or sets the maximum number of links that may come out of this port. +This property is used by LinkingBaseTool.isValidFrom.

    +

    The value must be non-negative. +The default value is Infinity.

    +

    You must set this property on a GraphObject whose portId is non-null, +unless the whole Node is acting as a single port, +in which case this property should be set on the Node.

    +
    see

    fromLinkable, toMaxLinks, portId

    +
  • +

    Gets or sets how far the end segment of a link coming from this port stops short of the actual port. +Positive values are limited by the fromEndSegmentLength or Link.fromEndSegmentLength. +Negative values cause the link to extend into the port. +The default value is zero.

    +

    This property is useful when you have a thick link and a pointy arrowhead. +Normally the link Shape extends all the way to the end of the arrowhead. +If the link Shape is wide, its edges will be seen behind the arrowhead. +By setting this property to a small positive value, the link Shape can end within the +body of the arrowhead, leaving only the point of the arrowhead visible at the end of the link.

    +

    A negative value for this property can also be useful when you want the link Shape to continue +into the port, perhaps because a portion of the port is transparent and you want the link to +appear to connect visually with a different point on the node.

    +

    The value of Link.fromShortLength, if not NaN, takes precedence over the value at this port +when determining the route of the link.

    +

    For examples of how to use this property, see Link Connection Points.

    +

    You must set this property on a GraphObject whose portId is non-null, +unless the whole Node is acting as a single port, +in which case this property should be set on the Node.

    +
    see

    toShortLength, Link.fromShortLength, portId

    +
  • +

    Gets or sets the desired height of this GraphObject in local coordinates. +This just gets or sets the height component of the desiredSize. +Default is NaN.

    +

    Size can also be constrained by setting minSize and maxSize.

    +

    The height does not include any transformation due to scale or angle, +nor any pen thickness due to Shape.strokeWidth if this is a Shape. +If there is a containing Panel the Panel will determine the actual size.

    +
  • +

    Gets or sets whether a GraphObject is the "main" object for some types of Panel. +Panels that use a "main" object include Panel.Auto, Panel.Spot, and Panel.Link.

    +

    Panels that use a "main" object will use the first object that has this property set to true, +or else just the first object, if none have the property set.

    +

    Do not modify this property once this object is an element of a panel.

    +
  • +

    This read-only property returns the GraphObject's containing Layer, if there is any. +A plain GraphObject cannot belong directly to a Layer -- only a Part can belong directly to a Layer.

    +

    This property is not settable. +Normally one changes which Layer that a GraphObject is in by setting Part.layerName. +Adding a Part to a Diagram will automatically add that Part to a Layer in that Diagram based on the layerName.

    +
  • +

    Gets or sets the size of empty area around this GraphObject, as a Margin, +in the containing Panel coordinates.

    +

    Negative values are permitted but may cause overlaps with adjacent +objects in a Panel. +You cannot modify the top or left or right or bottom of the value of this property -- +if you want to change the margin you must set this property to a different Margin. +Default margin is Margin(0,0,0,0).

    +

    The property setter accepts a number instead of a Margin object: providing a +number N will result in using a Margin(N, N, N, N). +The property getter will always return a Margin.

    +
    see

    desiredSize, measuredBounds, actualBounds, Panel.padding

    +
  • +

    Gets or sets the maximum size of this GraphObject in container coordinates +(either a Panel or the document). +Any new value must be of type Size; NaN values are treated as Infinity. If you want no maximum width or height, use NaN or Infinity.

    +

    You cannot modify the width or height of the value of this property -- +if you want to change the maxSize you must set this property to a different Size. +The default value is Infinity by Infinity. +A containing Panel will determine the actual size of this object.

    +
    see

    minSize, desiredSize

    +
  • +

    This read-only property returns the measuredBounds of the GraphObject in container coordinates +(either a Panel or the document). +This describes the transformed bounds with margins excluded.

    +

    You must not modify any of the properties of the Rect that is the value of this property.

    +

    As with all read-only properties, using this property as a binding source is unlikely to be useful.

    +
    see

    naturalBounds, desiredSize, actualBounds

    +
  • +

    Gets or sets the minimum size of this GraphObject in container coordinates +(either a Panel or the document). +Any new value must be of type Size; NaN values are treated as 0.

    +

    You cannot modify the width or height of the value of this property -- +if you want to change the minSize you must set this property to a different Size. +The default value is zero by zero. +A containing Panel will determine the actual size of this object.

    +
    see

    maxSize, desiredSize

    +
  • +

    Gets or sets the function to execute when the user moves the mouse +into this stationary object during a DraggingTool drag; +this allows you to provide feedback during a drag based on where it might drop.

    +

    If this property value is a function, it is called with an InputEvent, +this GraphObject, and any previous GraphObject. +The InputEvent.targetObject provides the GraphObject that was found +at the mouse point before looking up the visual tree of GraphObject.panels +to get to this object. +By default this property is null.

    +

    Note that for a drag-and-drop that originates in a different diagram, the target diagram's +selection collection will not be the parts that are being dragged. +Instead the temporary parts being dragged can be found as the source diagram's DraggingTool.copiedParts.

    +

    This function is called with Diagram.skipsUndoManager temporarily set to true, +so that any changes to GraphObjects are not recorded in the UndoManager. +You do not need to start and commit any transaction in this function, +because the DraggingTool will be conducting one already. +After calling this function the diagram will be updated immediately.

    +

    For an example of a mouseDragEnter event handler, see the node template in the +Org Chart Editor sample.

    +
    see

    mouseDragLeave, mouseHold, mouseDrop, mouseEnter, Group.handlesDragDropForMembers

    +
  • +

    Gets or sets the function to execute when the user moves the mouse +out of this stationary object during a DraggingTool drag; +this allows you to provide feedback during a drag based on where it might drop.

    +

    If this property value is a function, it is called with an InputEvent, +this GraphObject, and any new GraphObject that the mouse is in. +The InputEvent.targetObject provides the GraphObject that was found +at the mouse point before looking up the visual tree of GraphObject.panels +to get to this object. +By default this property is null.

    +

    Note that for a drag-and-drop that originates in a different diagram, the target diagram's +selection collection will not be the parts that are being dragged. +Instead the temporary parts being dragged can be found as the source diagram's DraggingTool.copiedParts.

    +

    This function is called with Diagram.skipsUndoManager temporarily set to true, +so that any changes to GraphObjects are not recorded in the UndoManager. +You do not need to start and commit any transaction in this function, +because the DraggingTool will be conducting one already. +After calling this function the diagram will be updated immediately.

    +

    For an example of a mouseDragLeave event handler, see the node template in the +Org Chart Editor sample.

    +
    see

    mouseDragEnter, mouseHold, mouseDrop, mouseLeave, Group.handlesDragDropForMembers

    +
  • +

    Gets or sets the function to execute when the user moves the mouse +into this object without holding down any buttons. +This property is used by the ToolManager.

    +

    If this property value is a function, it is called with an InputEvent, +this GraphObject that the mouse is now in, +and any previous GraphObject that the mouse was in. +The InputEvent.targetObject provides the GraphObject that was found +at the mouse point before looking up the visual tree of GraphObject.panels +to get to this object. +By default this property is null.

    +

    This function is called with Diagram.skipsUndoManager temporarily set to true, +so that any changes to GraphObjects are not recorded in the UndoManager. +You do not need to start and commit any transaction in this function. +After calling this function the diagram will be updated immediately.

    +

    For example, consider the situation where one wants to display buttons that the user can click +whenever the user passes the mouse over a node, and the buttons automatically disappear when the +mouse leaves the node. This can be implemented by showing an Adornment holding the buttons.

    +
    var nodeContextMenu =
    $(go.Adornment, "Spot",
    { background: "transparent" }, // to help detect when the mouse leaves the area
    $(go.Placeholder),
    $(go.Panel, "Vertical",
    { alignment: go.Spot.Right, alignmentFocus: go.Spot.Left },
    $("Button",
    $(go.TextBlock, "Command 1"),
    {
    click: function(e, obj) {
    var node = obj.part.adornedPart;
    alert("Command 1 on " + node.data.text);
    node.removeAdornment("ContextMenuOver");
    }
    }),
    $("Button",
    $(go.TextBlock, "Command 2"),
    {
    click: function(e, obj) {
    var node = obj.part.adornedPart;
    alert("Command 2 on " + node.data.text);
    node.removeAdornment("ContextMenuOver");
    }
    })
    ));
    -

    Then in the definition of the Node we can implement a mouseEnter event handler:

    -
    myDiagram.nodeTemplate =
    -  $(go.Node,
    -    . . .
    -    {
    -      mouseEnter: function(e, node) {
    -        nodeContextMenu.adornedObject = node;
    -        nodeContextMenu.mouseLeave = function(ev, cm) {
    -          node.removeAdornment("ContextMenuOver");
    -        }
    -        node.addAdornment("ContextMenuOver", nodeContextMenu);
    -      }
    -    });
    +

    Then in the definition of the Node we can implement a mouseEnter event handler:

    +
    myDiagram.nodeTemplate =
    $(go.Node,
    . . .
    {
    mouseEnter: function(e, node) {
    nodeContextMenu.adornedObject = node;
    nodeContextMenu.mouseLeave = function(ev, cm) {
    node.removeAdornment("ContextMenuOver");
    }
    node.addAdornment("ContextMenuOver", nodeContextMenu);
    }
    });
    -

    Note how it automatically defines a mouseLeave event handler too. - The context menu Adornment is removed either when the mouse leaves the area of the Adornment - or when the user executes a button click event handler.

    -
    -
    see
    -

    mouseLeave, mouseOver, mouseHover, mouseDragEnter

    -
    -
    -
    -
  • -
-
-
- -

- mouseHold - : (e: InputEvent, thisObj: GraphObject) => void

-
    -
  • -
    -

    Gets or sets the function to execute when the user holds the mouse still for a while - over this object while holding down a button. - This property is used by the ToolManager.

    -

    If this property value is a function, it is called with an InputEvent. - By default this property is null.

    -

    If you do provide a function that makes changes to the diagram or to its model, - you should do so within a transaction -- call Diagram.startTransaction and - Diagram.commitTransaction.

    -

    You can control how long the user must wait during a drag with a motionless mouse before - a "mouse hold" event occurs, by setting ToolManager.holdDelay. - For example:

    -
    myDiagram = new go.Diagram("myDiagramDiv",
    -    { "toolManager.holdDelay": 500 });  // 500 milliseconds
    +

    Note how it automatically defines a mouseLeave event handler too. +The context menu Adornment is removed either when the mouse leaves the area of the Adornment +or when the user executes a button click event handler.

    +
    see

    mouseLeave, mouseOver, mouseHover, mouseDragEnter

    +
  • +

    Gets or sets the function to execute when the user holds the mouse still for a while +over this object while holding down a button. +This property is used by the ToolManager.

    +

    If this property value is a function, it is called with an InputEvent. +By default this property is null.

    +

    If you do provide a function that makes changes to the diagram or to its model, +you should do so within a transaction -- call Diagram.startTransaction and +Diagram.commitTransaction.

    +

    You can control how long the user must wait during a drag with a motionless mouse before +a "mouse hold" event occurs, by setting ToolManager.holdDelay. +For example:

    +
    myDiagram = new go.Diagram("myDiagramDiv",
    { "toolManager.holdDelay": 500 }); // 500 milliseconds
    -

    or:

    -
    myDiagram.toolManager.holdDelay = 500;  // 500 milliseconds
    +

    or:

    +
    myDiagram.toolManager.holdDelay = 500;  // 500 milliseconds
     
    -
    -
    see
    -

    mouseDragEnter, mouseDragLeave, mouseHover

    -
    -
    -
    -
  • -
-
-
- -

- mouseHover - : (e: InputEvent, thisObj: GraphObject) => void

-
    -
  • -
    -

    Gets or sets the function to execute when the user holds the mouse still for a while - over this object without holding down any buttons. - This property is used by the ToolManager.

    -

    If this property value is a function, it is called with an InputEvent. - By default this property is null.

    -

    If you do provide a function that makes changes to the diagram or to its model, - you should do so within a transaction -- call Diagram.startTransaction and - Diagram.commitTransaction.

    -

    You can control how long the user must wait with a motionless mouse before - a "mouse hover" event occurs, by setting ToolManager.hoverDelay. - For example:

    -
    myDiagram = new go.Diagram("myDiagramDiv",
    -    { "toolManager.hoverDelay": 500 });  // 500 milliseconds
    +
    see

    mouseDragEnter, mouseDragLeave, mouseHover

    +
  • +

    Gets or sets the function to execute when the user holds the mouse still for a while +over this object without holding down any buttons. +This property is used by the ToolManager.

    +

    If this property value is a function, it is called with an InputEvent. +By default this property is null.

    +

    If you do provide a function that makes changes to the diagram or to its model, +you should do so within a transaction -- call Diagram.startTransaction and +Diagram.commitTransaction.

    +

    You can control how long the user must wait with a motionless mouse before +a "mouse hover" event occurs, by setting ToolManager.hoverDelay. +For example:

    +
    myDiagram = new go.Diagram("myDiagramDiv",
    { "toolManager.hoverDelay": 500 }); // 500 milliseconds
    -

    or:

    -
    myDiagram.toolManager.hoverDelay = 500;  // 500 milliseconds
    +

    or:

    +
    myDiagram.toolManager.hoverDelay = 500;  // 500 milliseconds
     
    -
    -
    see
    -

    mouseOver, mouseEnter, mouseLeave

    -
    -
    -
    -
  • -
-
-
- -

- mouseLeave - : (e: InputEvent, thisObj: GraphObject, nextObj: GraphObject) => void

-
    -
  • -
    -

    Gets or sets the function to execute when the user moves the mouse - out of this object without holding down any buttons. - This property is used by the ToolManager.

    -

    If this property value is a function, it is called with an InputEvent, - this GraphObject that the mouse has left, - and any next GraphObject that the mouse is now in. - The InputEvent.targetObject provides the GraphObject that was found - at the mouse point before looking up the visual tree of GraphObject.panels - to get to this object. - By default this property is null.

    -

    This function is called with Diagram.skipsUndoManager temporarily set to true, - so that any changes to GraphObjects are not recorded in the UndoManager. - You do not need to start and commit any transaction in this function. - After calling this function the diagram will be updated immediately.

    -

    For example, the Flow Chart sample - automatically shows and hides the ports as the mouse passes over a node. - The node template includes the following settings:

    -
    myDiagram.nodeTemplate =
    -  $(go.Node,
    -    . . .
    -    {
    -      . . .
    -      // handle mouse enter/leave events to show/hide the ports
    -      mouseEnter: function(e, obj) { showPorts(obj.part, true); },
    -      mouseLeave: function(e, obj) { showPorts(obj.part, false); }
    -      . . .
    -    });
    +
    see

    mouseOver, mouseEnter, mouseLeave

    +
  • +

    Gets or sets the function to execute when the user moves the mouse +out of this object without holding down any buttons. +This property is used by the ToolManager.

    +

    If this property value is a function, it is called with an InputEvent, +this GraphObject that the mouse has left, +and any next GraphObject that the mouse is now in. +The InputEvent.targetObject provides the GraphObject that was found +at the mouse point before looking up the visual tree of GraphObject.panels +to get to this object. +By default this property is null.

    +

    This function is called with Diagram.skipsUndoManager temporarily set to true, +so that any changes to GraphObjects are not recorded in the UndoManager. +You do not need to start and commit any transaction in this function. +After calling this function the diagram will be updated immediately.

    +

    For example, the Flow Chart sample +automatically shows and hides the ports as the mouse passes over a node. +The node template includes the following settings:

    +
    myDiagram.nodeTemplate =
    $(go.Node,
    . . .
    {
    . . .
    // handle mouse enter/leave events to show/hide the ports
    mouseEnter: function(e, obj) { showPorts(obj.part, true); },
    mouseLeave: function(e, obj) { showPorts(obj.part, false); }
    . . .
    });
    -

    where the showPorts function is defined to set the visible - property of each of the port elements of the node.

    -
    -
    see
    -

    mouseEnter, mouseOver, mouseHover, mouseDragLeave

    -
    -
    -
    -
  • -
-
-
- -

- mouseOver - : (e: InputEvent, thisObj: GraphObject) => void

-
    -
  • -
    -

    Gets or sets the function to execute when the user moves the mouse - over this object without holding down any buttons. - This property is used by the ToolManager. - This property is infrequently used -- it is more common to implement mouseEnter - and mouseLeave functions.

    -

    If this property value is a function, it is called with an InputEvent - and this GraphObject. - The InputEvent.targetObject provides the GraphObject that was found - at the mouse point before looking up the visual tree of GraphObject.panels - to get to this object. - By default this property is null.

    -

    This function is called with Diagram.skipsUndoManager temporarily set to true, - so that any changes to GraphObjects are not recorded in the UndoManager. - You do not need to start and commit any transaction in this function. - After calling this function the diagram will be updated immediately.

    -
    -
    see
    -

    mouseHover, mouseEnter, mouseLeave

    -
    -
    -
    -
  • -
-
-
- -

- name - : string

-
    -
  • -
    -

    Gets or sets the name for this object. - The default value is the empty string. - The name should be unique within a Panel, although if it isn't, - it reduces the usefulness of methods such as Panel.findObject.

    -

    You must not modify the name of a GraphObject once it is in the visual tree of a Part.

    -

    This is frequently needed to identify a particular GraphObject in the visual tree of a Part, - for example as the value of the Part.locationObjectName or - Part.selectionObjectName properties.

    -
    -
  • -
-
-
- -

- Read-only - naturalBounds - : Rect

-
    -
  • -
    -

    This read-only property returns the natural bounding rectangle of this GraphObject in local coordinates, - before any transformation by scale or angle, - and before any resizing due to minSize or maxSize or stretch. - Defaults to unknown (NaN,NaN).

    -

    You must not modify any of the properties of the Rect that is the value of this property.

    -

    The value can only be changed by changing properties of the particular GraphObject, - such as GraphObject.desiredSize, Shape.geometry, or TextBlock.font.

    -

    As with all read-only properties, using this property as a binding source is unlikely to be useful.

    -
    -
    see
    -

    desiredSize, measuredBounds, actualBounds

    -
    -
    -
    -
  • -
-
-
- -

- opacity - : number

-
    -
  • -
    -

    Gets or sets the multiplicative opacity for this GraphObject and (if a Panel) all elements. - The value must be between 0.0 (fully transparent) and 1.0 (no additional transparency).

    -

    Unlike visible, Opacity only affects drawing, it does not cause objects to be resized or remeasured. - Opacity settings do not change the shape of the object or exclude it from object-picking - (does not change whether any objects are found by the "find..." methods).

    -

    This value is multiplicative with any existing transparency, - for instance from Layer.opacity or a GraphObject's opacity higher in the visual tree, - or from a Brush or image transparency. - The default value is 1.

    -
    -
    see
    -

    visible, pickable, Layer.opacity, Diagram.opacity

    -
    -
    since
    -

    1.4

    -
    -
    -
    -
  • -
-
-
- -

- Read-only - panel - : Panel

-
    -
  • -
    -

    This read-only property returns the GraphObject's containing Panel, or null if this object is not in a Panel.

    -

    Although Part inherits from this class, a Part will never belong to a Panel, - so this property will always be null for every Node or Link.

    -

    This property is not settable. - Instead, call Panel.add in order to put a GraphObject in a Panel.

    -
    -
  • -
-
-
- -

- Read-only - part - : Part

-
    -
  • -
    -

    This read-only property returns the Part containing this object, if any. - The Part will be the root GraphObject in this GraphObject's visual tree.

    -

    It is common to refer to the containing Part of a GraphObject - in order to refer to the Panel.data to which it is bound.

    -

    This property is not settable. - If you want this GraphObject to belong to a Part, you will need to add it to a Part, - or else add it to some visual tree structure that is added to a Part using Panel.add.

    -

    Note that for objects such as buttons that are in Adornments such as tooltips or context menus, - this property will return that Adornment, not the Node or Link that is adorned.

    -

    If you want to find a Group that contains a Part, use the Part.containingGroup property: - someObj.part.containingGroup

    -
    -
  • -
-
-
- -

- pickable - : boolean

-
    -
  • -
    -

    Gets or sets whether or not this GraphObject can be chosen by visual "find" or "hit-test" methods such - as Diagram.findObjectAt.

    -

    This object does not get any mouse/touch events if it is not visible - or if it is not pickable.

    -

    The default value is true -- mouse events on this object will be noticed. - If this value is false and this object is a Panel, not only is this Panel not "hittable", - but all of the elements inside the Panel will be ignored.

    -
    -
    see
    -

    visible, opacity, Layer.pickable, Panel.isEnabled

    -
    -
    since
    -

    1.2

    -
    -
    -
    -
  • -
-
-
- -

- portId - : string

- -
-
- -

- position - : Point

-
    -
  • -
    -

    Gets or sets the position of this GraphObject in container coordinates - (either a Panel or the document). - Value must be of type Point. - You cannot modify the x or y of the value of this property -- - if you want to change the position you must set this property to a different Point. - Default is Point(NaN, NaN).

    -

    For Parts, see also Part.location.

    -
    -
  • -
-
-
- -

- row - : number

-
    -
  • -
    -

    Gets or sets the row of this GraphObject if it is in a Table Panel. - The value must be a small non-negative integer. The default is 0.

    -
    -
  • -
-
-
- -

- rowSpan - : number

-
    -
  • -
    -

    Gets or sets the number of rows spanned by this GraphObject if it is in a Table Panel. - The value must be a small positive integer. The default is 1.

    -
    -
  • -
-
-
- -

- scale - : number

-
    -
  • -
    -

    Gets or sets the scale transform of this GraphObject. - Value must be a number; larger values will make this object appear bigger. - Default is 1.

    -
    -
    see
    -

    angle, stretch

    -
    -
    -
    -
  • -
-
-
- -

- segmentFraction - : number

-
    -
  • -
    -

    Gets or sets the fractional distance along a segment of a GraphObject that is in a Link. - The value should be between zero and one, where zero is at the point at the start of the segment, - and where one is at the point at the end of the segment. - The default value is zero.

    -

    If segmentIndex is set to NaN, the fractional distance will be calculated along the entire link route.

    -

    For examples of how to use this property, see Link Labels.

    -
    -
    see
    -

    segmentIndex, segmentOffset, segmentOrientation

    -
    -
    -
    -
  • -
-
-
- -

- segmentIndex - : number

-
    -
  • -
    -

    Gets or sets the segment index of a GraphObject that is in a Link. - Non-negative numbers count up from zero, which is the first segment, at the "from" end of the Link. - Negative numbers count segments from the "to" end of the Link, where -1 means the last segment - and -2 means the next-to-last segment. - The default value is -Infinity. The value should be an integer or NaN.

    -

    Setting this value to NaN means segmentFraction's fractional distance will be calculated along the entire link route. - A NaN value also means the Link.midPoint and Link.midAngle will not be used when determining label positions.

    -

    If you do not set this property, the Link will choose a place that is approximately at the - mid-point of the link's route.

    -

    For examples of how to use this property, see Link Labels.

    -
    -
    see
    -

    segmentFraction, segmentOffset, segmentOrientation

    -
    -
    -
    -
  • -
-
-
- -

- segmentOffset - : Point

-
    -
  • -
    -

    Gets or sets the offset of a GraphObject that is in a Link from a point on a segment - or in a Panel.Graduated from a point along the main element. - The X component of the Point indicates the distance along the route, - with positive values going further toward the "to" end of the link or panel. - The Y component of the Point indicates the distance away from the route, - with positive values towards the right as seen when facing further towards the "to" end of the link or panel. - The value defaults to the Point (0, 0). - You cannot modify the x or y of the value of this property -- - if you want to change the segmentOffset you must set this property to a different Point.

    -

    For labels that are near either end of a link, it may be convenient to set the segmentOffset - to Point(NaN, NaN). This causes the offset to be half the width and half the height of the label object.

    -

    For examples of how to use this property, see Link Labels.

    -
    -
    see
    -

    segmentFraction, segmentIndex, segmentOrientation

    -
    -
    -
    -
  • -
-
-
- -

- segmentOrientation - : EnumValue

-
    -
  • -
    -

    Gets or sets the orientation of a GraphObject that is in a Link or Panel.Graduated. - This controls the automatic rotation of the object by the Link Panel or Graduated Panel. - The only accepted values are the Link "Orient..." values of Link - and the default value: Link.None.

    -

    When the value is Link.None, the angle of this object is unchanged as the link is routed. - Setting this to a value of Link.OrientAlong will cause routing to set the angle - to be the angle of the segment that this object is on. - Other values compute the angle somewhat differently. - If the value is changed back to Link.None, the angle of this object is set to zero.

    -

    Note that when this property is not Link.None, this property takes precedence - over any setting or binding of the angle property. - Changes to the angle caused by orientation might not result in Changed events, - and any original value for the angle may be lost.

    -

    In the case of Graduated Panels, if this value is Link.None, Link.OrientAlong, or Link.OrientUpright, - any TextBlock label angle will be respected. Depending on this value, the effective TextBlock angle will be either - fixed or relative to the slope of the path where it is rendered.

    -

    For examples of how to use this property, see Link Labels.

    -
    -
    see
    -

    segmentFraction, segmentIndex, segmentOffset

    -
    -
    -
    -
  • -
-
-
- -

- shadowVisible - : boolean

-
    -
  • -
    -

    Gets or sets whether or not this GraphObject will be shadowed inside a Part that has Part.isShadowed set to true.

    -

    The default is null, which means this GraphObject will obey the default shadow rules (see Part.isShadowed).

    -

    A value of true or false will ensure that this part is shadowed or not regardless of the default shadow rules, - but this GraphObject's shadowed status will not affect other GraphObjects in the Part.

    -

    Typically this property does not need to be set, but you may need to set this value to false - on GraphObjects inside a Part that you do not wish to be shadowed.

    -
    -
    see
    -

    Part.isShadowed

    -
    -
    since
    -

    1.6

    -
    -
    -
    -
  • -
-
-
- -

- stretch - : EnumValue

-
    -
  • -
    -

    Gets or sets the stretch of the GraphObject. - This controls whether the width and/or height of this object automatically adjusts to fill - the area allotted by the containing Panel.

    -

    The only accepted values are listed as constant properties of GraphObject, - such as GraphObject.None, GraphObject.Fill, GraphObject.Horizontal, or GraphObject.Vertical. - The default value is GraphObject.Default, which allows the Panel to decide how to treat this object, depending on the type of Panel.

    -

    Objects with an angle that are stretched may look incorrect unless the angle is a multiple of 90.

    -

    Stretch will have have different effects based upon the Panel containing this object. Elements of:

    -
      -
    • Auto panels will not stretch, except the main element growing to fill the panel or being made uniform
    • -
    • Horizontal panels will only stretch vertically
    • -
    • Vertical panels will only stretch horizontally
    • -
    • Spot panels will stretch to the size of the main element
    • -
    • Table panels will stretch to the size of their cell, defined by their row and column, which is usually determined by other GraphObjects in that cell that are not stretching
    • -
    • Grid panels, Link panels, and Graduated panels will not stretch
    • -
    -
    -
    see
    -

    Panel.defaultStretch, desiredSize, minSize, maxSize, measuredBounds, actualBounds, scale, Picture.imageStretch

    -
    -
    -
    -
  • -
-
-
- -

- toEndSegmentLength - : number

- -
-
- -

- toLinkable - : boolean

-
    -
  • -
    -

    Gets or sets whether the user may draw Links to this port. - This property is used by LinkingBaseTool.isValidTo.

    -

    The default value is null, which indicates that the real value is inherited from - the parent Panel, or false if there is no containing panel.

    -

    You must set this property on a GraphObject whose portId is non-null, - unless the whole Node is acting as a single port, - in which case this property should be set on the Node, - or unless you are disabling the "linkability" of a particular GraphObject - inside a Panel whose toLinkable has been set or bound to true.

    -
    -
    see
    -

    fromLinkable, toMaxLinks, portId, cursor

    -
    -
    -
    -
  • -
-
-
- -

- toLinkableDuplicates - : boolean

- -
-
- -

- toLinkableSelfNode - : boolean

- -
-
- -

- toMaxLinks - : number

-
    -
  • -
    -

    Gets or sets the maximum number of links that may go into this port. - This property is used by LinkingBaseTool.isValidTo.

    -

    The value must be non-negative. - The default value is Infinity.

    -

    You must set this property on a GraphObject whose portId is non-null, - unless the whole Node is acting as a single port, - in which case this property should be set on the Node.

    -
    -
    see
    -

    toLinkable, fromMaxLinks, portId

    -
    -
    -
    -
  • -
-
-
- -

- toShortLength - : number

-
    -
  • -
    -

    Gets or sets how far the end segment of a link going to this port stops short of the actual port. - Positive values are limited by the toEndSegmentLength or Link.toEndSegmentLength. - Negative values cause the link to extend into the port. - The default value is zero.

    -

    This property is useful when you have a thick link and a pointy arrowhead. - Normally the link Shape extends all the way to the end of the arrowhead. - If the link Shape is wide, its edges will be seen behind the arrowhead. - By setting this property to a small positive value, the link Shape can end within the - body of the arrowhead, leaving only the point of the arrowhead visible at the end of the link.

    -

    A negative value for this property can also be useful when you want the link Shape to continue - into the port, perhaps because a portion of the port is transparent and you want the link to - appear to connect visually with a different point on the node.

    -

    The value of Link.toShortLength, if not NaN, takes precedence over the value at this port - when determining the route of the link.

    -

    For examples of how to use this property, see Link Connection Points.

    -

    You must set this property on a GraphObject whose portId is non-null, - unless the whole Node is acting as a single port, - in which case this property should be set on the Node.

    -
    -
    see
    -

    fromShortLength, Link.toShortLength, portId

    -
    -
    -
    -
  • -
-
-
- -

- toSpot - : Spot

- -
-
- -

- toolTip - : Adornment | HTMLInfo

-
    -
  • -
    -

    This Adornment or HTMLInfo is shown when the mouse hovers over this object. - The default value is null, which means no tooltip is shown.

    -

    A typical tooltip is defined in the following manner, as taken from - the Kitten Monitor sample:

    -
    myDiagram.nodeTemplate =
    -  $(go.Node,
    -    . . .
    -    { // this tooltip shows the name and picture of the kitten
    -      toolTip:
    -        $("ToolTip",
    -          $(go.Panel, "Vertical",
    -            $(go.Picture,
    -              new go.Binding("source", "src", function(s) { return "images/" + s + ".png"; })),
    -            $(go.TextBlock, { margin: 3 },
    -              new go.Binding("text", "key"))))
    -    });
    +

    where the showPorts function is defined to set the visible +property of each of the port elements of the node.

    +
    see

    mouseEnter, mouseOver, mouseHover, mouseDragLeave

    +
  • +

    Gets or sets the function to execute when the user moves the mouse +over this object without holding down any buttons. +This property is used by the ToolManager. +This property is infrequently used -- it is more common to implement mouseEnter +and mouseLeave functions.

    +

    If this property value is a function, it is called with an InputEvent +and this GraphObject. +The InputEvent.targetObject provides the GraphObject that was found +at the mouse point before looking up the visual tree of GraphObject.panels +to get to this object. +By default this property is null.

    +

    This function is called with Diagram.skipsUndoManager temporarily set to true, +so that any changes to GraphObjects are not recorded in the UndoManager. +You do not need to start and commit any transaction in this function. +After calling this function the diagram will be updated immediately.

    +
    see

    mouseHover, mouseEnter, mouseLeave

    +
  • +

    Gets or sets the name for this object. +The default value is the empty string. +The name should be unique within a Panel, although if it isn't, +it reduces the usefulness of methods such as Panel.findObject.

    +

    You must not modify the name of a GraphObject once it is in the visual tree of a Part.

    +

    This is frequently needed to identify a particular GraphObject in the visual tree of a Part, +for example as the value of the Part.locationObjectName or +Part.selectionObjectName properties.

    +
  • +

    This read-only property returns the natural bounding rectangle of this GraphObject in local coordinates, +before any transformation by scale or angle, +and before any resizing due to minSize or maxSize or stretch. +Defaults to unknown (NaN,NaN).

    +

    You must not modify any of the properties of the Rect that is the value of this property.

    +

    The value can only be changed by changing properties of the particular GraphObject, +such as GraphObject.desiredSize, Shape.geometry, or TextBlock.font.

    +

    As with all read-only properties, using this property as a binding source is unlikely to be useful.

    +
    see

    desiredSize, measuredBounds, actualBounds

    +
  • +

    Gets or sets the multiplicative opacity for this GraphObject and (if a Panel) all elements. +The value must be between 0.0 (fully transparent) and 1.0 (no additional transparency).

    +

    Unlike visible, Opacity only affects drawing, it does not cause objects to be resized or remeasured. +Opacity settings do not change the shape of the object or exclude it from object-picking +(does not change whether any objects are found by the "find..." methods).

    +

    This value is multiplicative with any existing transparency, +for instance from Layer.opacity or a GraphObject's opacity higher in the visual tree, +or from a Brush or image transparency. +The default value is 1.

    +
    see

    visible, pickable, Layer.opacity, Diagram.opacity

    +
    since

    1.4

    +
  • +

    This read-only property returns the GraphObject's containing Panel, or null if this object is not in a Panel.

    +

    Although Part inherits from this class, a Part will never belong to a Panel, +so this property will always be null for every Node or Link.

    +

    This property is not settable. +Instead, call Panel.add in order to put a GraphObject in a Panel.

    +
  • +

    This read-only property returns the Part containing this object, if any. +The Part will be the root GraphObject in this GraphObject's visual tree.

    +

    It is common to refer to the containing Part of a GraphObject +in order to refer to the Panel.data to which it is bound.

    +

    This property is not settable. +If you want this GraphObject to belong to a Part, you will need to add it to a Part, +or else add it to some visual tree structure that is added to a Part using Panel.add.

    +

    Note that for objects such as buttons that are in Adornments such as tooltips or context menus, +this property will return that Adornment, not the Node or Link that is adorned.

    +

    If you want to find a Group that contains a Part, use the Part.containingGroup property: +someObj.part.containingGroup

    +
  • +

    Gets or sets whether or not this GraphObject can be chosen by visual "find" or "hit-test" methods such +as Diagram.findObjectAt.

    +

    This object does not get any mouse/touch events if it is not visible +or if it is not pickable.

    +

    The default value is true -- mouse events on this object will be noticed. +If this value is false and this object is a Panel, not only is this Panel not "hittable", +but all of the elements inside the Panel will be ignored.

    +
    see

    visible, opacity, Layer.pickable, Panel.isEnabled

    +
    since

    1.2

    +
  • +

    Gets or sets the position of this GraphObject in container coordinates +(either a Panel or the document). +Value must be of type Point. +You cannot modify the x or y of the value of this property -- +if you want to change the position you must set this property to a different Point. +Default is Point(NaN, NaN).

    +

    For Parts, see also Part.location.

    +
  • +

    Gets or sets the row of this GraphObject if it is in a Table Panel. +The value must be a small non-negative integer. The default is 0.

    +
  • +

    Gets or sets the number of rows spanned by this GraphObject if it is in a Table Panel. +The value must be a small positive integer. The default is 1.

    +
  • +

    Gets or sets the scale transform of this GraphObject. +Value must be a number; larger values will make this object appear bigger. +Default is 1.

    +
    see

    angle, stretch

    +
  • +

    Gets or sets the fractional distance along a segment of a GraphObject that is in a Link. +The value should be between zero and one, where zero is at the point at the start of the segment, +and where one is at the point at the end of the segment. +The default value is zero.

    +

    If segmentIndex is set to NaN, the fractional distance will be calculated along the entire link route.

    +

    For examples of how to use this property, see Link Labels.

    +
    see

    segmentIndex, segmentOffset, segmentOrientation

    +
  • +

    Gets or sets the segment index of a GraphObject that is in a Link. +Non-negative numbers count up from zero, which is the first segment, at the "from" end of the Link. +Negative numbers count segments from the "to" end of the Link, where -1 means the last segment +and -2 means the next-to-last segment. +The default value is -Infinity. The value should be an integer or NaN.

    +

    Setting this value to NaN means segmentFraction's fractional distance will be calculated along the entire link route. +A NaN value also means the Link.midPoint and Link.midAngle will not be used when determining label positions.

    +

    If you do not set this property, the Link will choose a place that is approximately at the +mid-point of the link's route.

    +

    For examples of how to use this property, see Link Labels.

    +
    see

    segmentFraction, segmentOffset, segmentOrientation

    +
  • +

    Gets or sets the offset of a GraphObject that is in a Link from a point on a segment +or in a Panel.Graduated from a point along the main element. +The X component of the Point indicates the distance along the route, +with positive values going further toward the "to" end of the link or panel. +The Y component of the Point indicates the distance away from the route, +with positive values towards the right as seen when facing further towards the "to" end of the link or panel. +The value defaults to the Point (0, 0). +You cannot modify the x or y of the value of this property -- +if you want to change the segmentOffset you must set this property to a different Point.

    +

    For labels that are near either end of a link, it may be convenient to set the segmentOffset +to Point(NaN, NaN). This causes the offset to be half the width and half the height of the label object.

    +

    For examples of how to use this property, see Link Labels.

    +
    see

    segmentFraction, segmentIndex, segmentOrientation

    +
  • +

    Gets or sets the orientation of a GraphObject that is in a Link or Panel.Graduated. +This controls the automatic rotation of the object by the Link Panel or Graduated Panel. +The only accepted values are the Link "Orient..." values of Link +and the default value: Link.None.

    +

    When the value is Link.None, the angle of this object is unchanged as the link is routed. +Setting this to a value of Link.OrientAlong will cause routing to set the angle +to be the angle of the segment that this object is on. +Other values compute the angle somewhat differently. +If the value is changed back to Link.None, the angle of this object is set to zero.

    +

    Note that when this property is not Link.None, this property takes precedence +over any setting or binding of the angle property. +Changes to the angle caused by orientation might not result in Changed events, +and any original value for the angle may be lost.

    +

    In the case of Graduated Panels, if this value is Link.None, Link.OrientAlong, or Link.OrientUpright, +any TextBlock label angle will be respected. Depending on this value, the effective TextBlock angle will be either +fixed or relative to the slope of the path where it is rendered.

    +

    For examples of how to use this property, see Link Labels.

    +
    see

    segmentFraction, segmentIndex, segmentOffset

    +
  • +

    Gets or sets whether or not this GraphObject will be shadowed inside a Part that has Part.isShadowed set to true.

    +

    The default is null, which means this GraphObject will obey the default shadow rules (see Part.isShadowed).

    +

    A value of true or false will ensure that this part is shadowed or not regardless of the default shadow rules, +but this GraphObject's shadowed status will not affect other GraphObjects in the Part.

    +

    Typically this property does not need to be set, but you may need to set this value to false +on GraphObjects inside a Part that you do not wish to be shadowed.

    +
    see

    Part.isShadowed

    +
    since

    1.6

    +
  • +

    Gets or sets the stretch of the GraphObject. +This controls whether the width and/or height of this object automatically adjusts to fill +the area allotted by the containing Panel.

    +

    The only accepted values are listed as constant properties of GraphObject, +such as GraphObject.None, GraphObject.Fill, GraphObject.Horizontal, or GraphObject.Vertical. +The default value is GraphObject.Default, which allows the Panel to decide how to treat this object, depending on the type of Panel.

    +

    Objects with an angle that are stretched may look incorrect unless the angle is a multiple of 90.

    +

    Stretch will have have different effects based upon the Panel containing this object. Elements of:

    +
      +
    • Auto panels will not stretch, except the main element growing to fill the panel or being made uniform
    • +
    • Horizontal panels will only stretch vertically
    • +
    • Vertical panels will only stretch horizontally
    • +
    • Spot panels will stretch to the size of the main element
    • +
    • Table panels will stretch to the size of their cell, defined by their row and column, which is usually determined by other GraphObjects in that cell that are not stretching
    • +
    • Grid panels, Link panels, and Graduated panels will not stretch
    • +
    +
    see

    Panel.defaultStretch, desiredSize, minSize, maxSize, measuredBounds, actualBounds, scale, Picture.imageStretch

    +
  • +

    Gets or sets whether the user may draw Links to this port. +This property is used by LinkingBaseTool.isValidTo.

    +

    The default value is null, which indicates that the real value is inherited from +the parent Panel, or false if there is no containing panel.

    +

    You must set this property on a GraphObject whose portId is non-null, +unless the whole Node is acting as a single port, +in which case this property should be set on the Node, +or unless you are disabling the "linkability" of a particular GraphObject +inside a Panel whose toLinkable has been set or bound to true.

    +
    see

    fromLinkable, toMaxLinks, portId, cursor

    +
  • +

    Gets or sets the maximum number of links that may go into this port. +This property is used by LinkingBaseTool.isValidTo.

    +

    The value must be non-negative. +The default value is Infinity.

    +

    You must set this property on a GraphObject whose portId is non-null, +unless the whole Node is acting as a single port, +in which case this property should be set on the Node.

    +
    see

    toLinkable, fromMaxLinks, portId

    +
  • +

    Gets or sets how far the end segment of a link going to this port stops short of the actual port. +Positive values are limited by the toEndSegmentLength or Link.toEndSegmentLength. +Negative values cause the link to extend into the port. +The default value is zero.

    +

    This property is useful when you have a thick link and a pointy arrowhead. +Normally the link Shape extends all the way to the end of the arrowhead. +If the link Shape is wide, its edges will be seen behind the arrowhead. +By setting this property to a small positive value, the link Shape can end within the +body of the arrowhead, leaving only the point of the arrowhead visible at the end of the link.

    +

    A negative value for this property can also be useful when you want the link Shape to continue +into the port, perhaps because a portion of the port is transparent and you want the link to +appear to connect visually with a different point on the node.

    +

    The value of Link.toShortLength, if not NaN, takes precedence over the value at this port +when determining the route of the link.

    +

    For examples of how to use this property, see Link Connection Points.

    +

    You must set this property on a GraphObject whose portId is non-null, +unless the whole Node is acting as a single port, +in which case this property should be set on the Node.

    +
    see

    fromShortLength, Link.toShortLength, portId

    +
  • +

    This Adornment or HTMLInfo is shown when the mouse hovers over this object. +The default value is null, which means no tooltip is shown.

    +

    A typical tooltip is defined in the following manner, as taken from +the Kitten Monitor sample:

    +
    myDiagram.nodeTemplate =
    $(go.Node,
    . . .
    { // this tooltip shows the name and picture of the kitten
    toolTip:
    $("ToolTip",
    $(go.Panel, "Vertical",
    $(go.Picture,
    new go.Binding("source", "src", function(s) { return "images/" + s + ".png"; })),
    $(go.TextBlock, { margin: 3 },
    new go.Binding("text", "key"))))
    });
    -

    Note that this Adornment depends on having the same data binding as the adorned Part - (i.e. the same value for Panel.data).

    -

    Tooltips are not copied by copy, so that tooltips may be shared by all instances of a template.

    -

    Tooltips are shown after a timed delay given by the ToolManager.hoverDelay. - You can change the delay time by:

    -
    myDiagram = new go.Diagram("myDiagramDiv",
    -    { "toolManager.hoverDelay": 500 });  // 500 milliseconds
    +

    Note that this Adornment depends on having the same data binding as the adorned Part +(i.e. the same value for Panel.data).

    +

    Tooltips are not copied by copy, so that tooltips may be shared by all instances of a template.

    +

    Tooltips are shown after a timed delay given by the ToolManager.hoverDelay. +You can change the delay time by:

    +
    myDiagram = new go.Diagram("myDiagramDiv",
    { "toolManager.hoverDelay": 500 }); // 500 milliseconds
    -

    or:

    -
    myDiagram.toolManager.hoverDelay = 500;  // 500 milliseconds
    +

    or:

    +
    myDiagram.toolManager.hoverDelay = 500;  // 500 milliseconds
     
    -

    Tooltips are normally positioned by ToolManager.positionToolTip. - However, if there is a Placeholder in the tooltip, the tooltip (i.e. an Adornment) - will be positioned so that the Placeholder is at the same position as this adorned GraphObject.

    -

    Replacing this value will not modify or remove any existing tooltip that is being shown for this object.

    -

    Read more about tooltips at ToolTips.

    -
    -
  • -
-
-
- -

- visible - : boolean

-
    -
  • -
    -

    Gets or sets whether a GraphObject is visible. - The default value is true. - A not visible object takes no space in the Panel that it is in. - Toggling visibility may cause elements in the visual tree to re-measure and re-arrange. - Making a Panel not visible causes all of its elements not to be seen or receive input events. - Changing a Panel to become visible causes all of its elements to be seen and be active, - unless those elements are themselves not visible.

    -

    This object does not get any mouse/touch events if it is not visible - or if it is not pickable.

    -

    One can have a visible Shape that is not drawn by setting its Shape.fill - and Shape.stroke to null or to "transparent". - Similarly, one can set TextBlock.stroke to null or to "transparent". - It is also possible make a GraphObjects transparent by setting GraphObject.opacity to 0. - Finally, one can make a whole Layer-full of Parts invisible by setting Layer.visible to false.

    -

    Use the isVisibleObject predicate to see if this GraphObject is visible and is inside a Panel - that is isVisibleObject, and so forth up the chain of panels until reaching the Part.

    -

    For Parts, you can call the Part.isVisible predicate to determine - if not only the Part is visible but also any containing Group or Link, - and whether the Layer it is in is visible.

    -
    -
    see
    -

    opacity, pickable, Layer.visible

    -
    -
    -
    -
  • -
-
-
- -

- width - : number

-
    -
  • -
    -

    Gets or sets the desired width of this GraphObject in local coordinates. - This just gets or sets the width component of the desiredSize. - Default is NaN.

    -

    Size can also be constrained by setting minSize and maxSize.

    -

    The width does not include any transformation due to scale or angle, - nor any pen thickness due to Shape.strokeWidth if this is a Shape. - If there is a containing Panel the Panel will determine the actual size.

    -
    -
  • -
-
- -
-

Methods

-
- -

- apply -

- -
    -
  • -
    -

    This method takes a function that can be used to apply multiple settings, bindings, - or Panel.add calls, to different GraphObjects. This is common in initialization. - If you are just adding settings, bindings, or GraphObjects to a single GraphObject, - you do not need to use this, you can just chain calls to set, bind, - and Panel.add instead. This method is mostly useful when setting the same values - across multiple GraphObjects.

    -

    For example:

    -
    // This can be used by several node templates
    -// to set multiple properties and bindings on each
    -function nodeStyle(node) {
    -  node
    -    .set({ background: 'red' })
    -    .bind("location")
    -    .bind("desiredSize", "size", go.Size.Parse)
    -}
    -
    -// ... in a Node template:
    -new go.Node("Auto")
    - .apply(nodeStyle)
    - .add(new go.Shape( ... ))
    - .add(new go.Panel( ... ))
    - // ...rest of Node template
    -
    -// ... in another Node template:
    -new go.Node("Vertical", { padding: 5 })
    - .apply(nodeStyle)
    - // ...rest of Node template
    +

    Tooltips are normally positioned by ToolManager.positionToolTip. +However, if there is a Placeholder in the tooltip, the tooltip (i.e. an Adornment) +will be positioned so that the Placeholder is at the same position as this adorned GraphObject.

    +

    Replacing this value will not modify or remove any existing tooltip that is being shown for this object.

    +

    Read more about tooltips at ToolTips.

    +
  • +

    Gets or sets whether a GraphObject is visible. +The default value is true. +A not visible object takes no space in the Panel that it is in. +Toggling visibility may cause elements in the visual tree to re-measure and re-arrange. +Making a Panel not visible causes all of its elements not to be seen or receive input events. +Changing a Panel to become visible causes all of its elements to be seen and be active, +unless those elements are themselves not visible.

    +

    This object does not get any mouse/touch events if it is not visible +or if it is not pickable.

    +

    One can have a visible Shape that is not drawn by setting its Shape.fill +and Shape.stroke to null or to "transparent". +Similarly, one can set TextBlock.stroke to null or to "transparent". +It is also possible make a GraphObjects transparent by setting GraphObject.opacity to 0. +Finally, one can make a whole Layer-full of Parts invisible by setting Layer.visible to false.

    +

    Use the isVisibleObject predicate to see if this GraphObject is visible and is inside a Panel +that is isVisibleObject, and so forth up the chain of panels until reaching the Part.

    +

    For Parts, you can call the Part.isVisible predicate to determine +if not only the Part is visible but also any containing Group or Link, +and whether the Layer it is in is visible.

    +
    see

    opacity, pickable, Layer.visible

    +
  • +

    Gets or sets the desired width of this GraphObject in local coordinates. +This just gets or sets the width component of the desiredSize. +Default is NaN.

    +

    Size can also be constrained by setting minSize and maxSize.

    +

    The width does not include any transformation due to scale or angle, +nor any pen thickness due to Shape.strokeWidth if this is a Shape. +If there is a containing Panel the Panel will determine the actual size.

    +

Methods

  • +

    This method takes a function that can be used to apply multiple settings, bindings, +or Panel.add calls, to different GraphObjects. This is common in initialization. +If you are just adding settings, bindings, or GraphObjects to a single GraphObject, +you do not need to use this, you can just chain calls to set, bind, +and Panel.add instead. This method is mostly useful when setting the same values +across multiple GraphObjects.

    +

    For example:

    +
    // This can be used by several node templates
    // to set multiple properties and bindings on each
    function nodeStyle(node) {
    node
    .set({ background: 'red' })
    .bind("location")
    .bind("desiredSize", "size", go.Size.Parse)
    }

    // ... in a Node template:
    new go.Node("Auto")
    .apply(nodeStyle)
    .add(new go.Shape( ... ))
    .add(new go.Panel( ... ))
    // ...rest of Node template

    // ... in another Node template:
    new go.Node("Vertical", { padding: 5 })
    .apply(nodeStyle)
    // ...rest of Node template
    -
    -
    since
    -

    2.2

    -
    -
    see
    -

    set a type-safe method to set a collection of properties

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      func: (thisObject: GraphObject) => void
      -
      -

      a function that takes this GraphObject

      -
      -
        -
      -
    • -
    -

    Returns GraphObject

    -

    this GraphObject

    -
  • -
-
-
- -

- attach -

- -
    -
  • -
    -

    This method sets a collection of properties according to the property/value pairs on the given Object, or array of Objects, - in the same manner as GraphObject.make does when constructing a GraphObject.

    -

    This method is used in initialization, but typically you should use set instead, - unless you need to attach new properties that do not exist on the GraphObject, or to set sub-properties. - Calling this method is much less efficient than setting properties directly, and does not do compile-time type checking.

    -
    new go.Shape()
    - .bind("fill", "color")
    - .bind("strokeWidth", "width")
    - .attach({ // use .attach for untyped property attachments
    -   "_color": "Red"
    - })
    +
    since

    2.2

    +
    see

    set a type-safe method to set a collection of properties

    +

    Parameters

    Returns GraphObject

    this GraphObject

    +
  • +

    This method sets a collection of properties according to the property/value pairs on the given Object, or array of Objects, +in the same manner as GraphObject.make does when constructing a GraphObject.

    +

    This method is used in initialization, but typically you should use set instead, +unless you need to attach new properties that do not exist on the GraphObject, or to set sub-properties. +Calling this method is much less efficient than setting properties directly, and does not do compile-time type checking.

    +
    new go.Shape()
    .bind("fill", "color")
    .bind("strokeWidth", "width")
    .attach({ // use .attach for untyped property attachments
    "_color": "Red"
    })
    -
    -
    since
    -

    2.2

    -
    -
    see
    -

    setProperties a synonym of this method, set a type-safe method to set a collection of properties

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      config: any
      -
      -

      a JavaScript object containing properties to attach, or an array of such objects.

      -
      -
    • -
    -

    Returns GraphObject

    -

    this GraphObject

    -
  • -
-
-
- -

- bind -

-
    -
  • bind(targetprop?: string, sourceprop?: string, conv?: (val: any, targetObj: any) => any, backconv?: (val: any, sourceData: any, model: Model) => any): GraphObject
  • -
  • bind(binding: Binding): GraphObject
  • -
-
    -
  • -
    -

    Add a data-binding to this GraphObject for the given property names and optional conversion function.

    -

    Do not add, modify, or remove any Bindings after this object has been copied.

    -

    An example using .bind with the shorthand arguments:

    -
    myDiagram.nodeTemplate =
    -  new go.Node("Horizontal")
    -   .bind("location", "loc")
    -   // ... rest of Node template
    +
    since

    2.2

    +
    see

    setProperties a synonym of this method, set a type-safe method to set a collection of properties

    +

    Parameters

    • config: any
      +

      a JavaScript object containing properties to attach, or an array of such objects.

      +

    Returns GraphObject

    this GraphObject

    +
  • bind(targetprop?: string, sourceprop?: string, conv?: (val: any, targetObj: any) => any, backconv?: (val: any, sourceData: any, model: Model) => any): GraphObject
  • bind(binding: Binding): GraphObject
  • +

    Add a data-binding to this GraphObject for the given property names and optional conversion function.

    +

    Do not add, modify, or remove any Bindings after this object has been copied.

    +

    An example using .bind with the shorthand arguments:

    +
    myDiagram.nodeTemplate =
    new go.Node("Horizontal")
    .bind("location", "loc")
    // ... rest of Node template
    -

    An example using both shorthand and a new go.Binding with .bind:

    -
    new go.Shape({
    -    // ... shape properties
    -  })
    -  // Shape.fill is bound to Node.data.color
    -  .bind("fill", "color")
    -  // Shape.stroke is red when Node.isHighlighted is true, black otherwise
    -  .bind(new go.Binding("stroke", "isHighlighted",
    -                function(h) { return h ? "red" : "black"; }).ofObject())
    +

    An example using both shorthand and a new go.Binding with .bind:

    +
    new go.Shape({
    // ... shape properties
    })
    // Shape.fill is bound to Node.data.color
    .bind("fill", "color")
    // Shape.stroke is red when Node.isHighlighted is true, black otherwise
    .bind(new go.Binding("stroke", "isHighlighted",
    function(h) { return h ? "red" : "black"; }).ofObject())
    -

    If you need to call Binding.makeTwoWay or Binding.ofObject, you will have to use a new go.Binding() as - the argument to this method.

    -

    Read more about Bindings at the Introduction page about Data Bindings.

    -
    -
    since
    -

    2.2

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      Optional targetprop: string
      -
      -

      A string naming the target property on the target object. - This should not be the empty string.

      -
      -
    • -
    • -
      Optional sourceprop: string
      -
      -

      A string naming the source property on the bound data object. - If this is the empty string, the whole Panel.data object is used. - If this argument is not supplied, the source property is assumed to be the same as the target property.

      -
      -
    • -
    • -
      Optional conv: (val: any, targetObj: any) => any
      -
      -

      An optional side-effect-free function converting the data property value to the value to set the target property. - If the function is null or not supplied, no conversion takes place.

      -
      -
        -
      -
    • -
    • -
      Optional backconv: (val: any, sourceData: any, model: Model) => any
      -
      -

      An optional conversion function to convert property values back to data values. - Specifying this modifies the binding to set its Binding.mode to be Binding.TwoWay. - If you want a two-way binding without a back-conversion function, call this method with the new Binding - argument instead, and call Binding.makeTwoWay on it: .bind(new go.Binding(...).makeTwoWay())

      -
      -
        -
      -
    • -
    -

    Returns GraphObject

    -

    this GraphObject

    -
  • -
  • -
    -

    Add a data-binding of a property on this GraphObject to a property on a data object.

    -

    Do not add, modify, or remove any Bindings after this object has been copied.

    -

    An example using .bind with the Binding argument:

    -
    myDiagram.nodeTemplate =
    -  new go.Part("Horizontal")
    -   .bind(new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify))
    -   // ...
    +

    If you need to call Binding.makeTwoWay or Binding.ofObject, you will have to use a new go.Binding() as +the argument to this method.

    +

    Read more about Bindings at the Introduction page about Data Bindings.

    +
    since

    2.2

    +

    Parameters

    • Optional targetprop: string
      +

      A string naming the target property on the target object. + This should not be the empty string.

      +
    • Optional sourceprop: string
      +

      A string naming the source property on the bound data object. + If this is the empty string, the whole Panel.data object is used. + If this argument is not supplied, the source property is assumed to be the same as the target property.

      +
    • Optional conv: (val: any, targetObj: any) => any
      +

      An optional side-effect-free function converting the data property value to the value to set the target property. + If the function is null or not supplied, no conversion takes place.

      +
        • (val: any, targetObj: any): any
        • Parameters

          • val: any
          • targetObj: any

          Returns any

    • Optional backconv: (val: any, sourceData: any, model: Model) => any
      +

      An optional conversion function to convert property values back to data values. +Specifying this modifies the binding to set its Binding.mode to be Binding.TwoWay. +If you want a two-way binding without a back-conversion function, call this method with the new Binding +argument instead, and call Binding.makeTwoWay on it: .bind(new go.Binding(...).makeTwoWay())

      +
        • (val: any, sourceData: any, model: Model): any
        • Parameters

          • val: any
          • sourceData: any
          • model: Model

          Returns any

    Returns GraphObject

    this GraphObject

    +
  • +

    Add a data-binding of a property on this GraphObject to a property on a data object.

    +

    Do not add, modify, or remove any Bindings after this object has been copied.

    +

    An example using .bind with the Binding argument:

    +
    myDiagram.nodeTemplate =
    new go.Part("Horizontal")
    .bind(new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify))
    // ...
    -

    Read more about Bindings at the Introduction page about Data Bindings.

    -
    -

    Parameters

    - -

    Returns GraphObject

    -

    this GraphObject

    -
  • -
-
-
- -

- Static - build -

-
    -
  • build<T>(name: string, config?: Partial<T>): T
  • -
-
    -
  • -
    -

    This static function creates an instance that was defined with GraphObject.defineBuilder. - Once this is called one can use the name as the first argument for GraphObject.make. - Names are case sensitive.

    -

    The second is an optional settings configuration object, equivalent to calling GraphObject.set - on the new object.

    -

    Predefined builder names include: "Button", "TreeExpanderButton", "SubGraphExpanderButton", - "PanelExpanderButton", and "ContextMenuButton". - The implementation of these builders is provided by Buttons.js - in the Extensions directory.

    -
    -
    since
    -

    2.2

    -
    -
    -
    -

    Type parameters

    - -

    Parameters

    -
      -
    • -
      name: string
      -
      -

      a capitalized name; must not be "" or "None"

      -
      -
    • -
    • -
      Optional config: Partial<T>
      -
      -

      a plain JavaScript object with various property values to be set on this GraphObject.

      -
      -
    • -
    -

    Returns T

    -
  • -
-
-
- -

- Protected Virtual - cloneProtected -

- -
    -
  • -
    -

    Copies properties from this object to the given object, which must be of the same class. - This is called by copy. - This method may be overridden.

    -

    For every property that you add to a subclass of a GraphObject-inheriting class, - in this method you should assign its value to the copied object. - For performance reasons you should set all of the same properties to this - that the constructor does, and in the same order.

    -

    For example, let us define a custom Link class and add two properties:

    -
    function CustomLink() {
    -  go.Link.call(this);
    -  this._someNewProperty = 17;
    -  this._someNewProperty2 = [];  // an Array
    -}
    -go.Diagram.inherit(CustomLink, go.Link);
    -
    -CustomLink.prototype.cloneProtected = function() {
    -  // Always call the base method in an override
    -  // In TypeScript you would use: super.cloneProtected(copy);
    -  go.Link.prototype.cloneProtected.call(this, copy);
    -  // assign every new property to the copy:
    -  copy._someNewProperty = this._someNewProperty;
    -  copy._someNewProperty2 = this._someNewProperty2.slice(0);  // make a copy of the Array
    -}
    +

    Read more about Bindings at the Introduction page about Data Bindings.

    +

    Parameters

    Returns GraphObject

    this GraphObject

    +
  • +

    Copies properties from this object to the given object, which must be of the same class. +This is called by copy. +This method may be overridden.

    +

    For every property that you add to a subclass of a GraphObject-inheriting class, +in this method you should assign its value to the copied object. +For performance reasons you should set all of the same properties to this +that the constructor does, and in the same order.

    +

    For example, let us define a custom Link class and add two properties:

    +
    function CustomLink() {
    go.Link.call(this);
    this._someNewProperty = 17;
    this._someNewProperty2 = []; // an Array
    }
    go.Diagram.inherit(CustomLink, go.Link);

    CustomLink.prototype.cloneProtected = function() {
    // Always call the base method in an override
    // In TypeScript you would use: super.cloneProtected(copy);
    go.Link.prototype.cloneProtected.call(this, copy);
    // assign every new property to the copy:
    copy._someNewProperty = this._someNewProperty;
    copy._someNewProperty2 = this._someNewProperty2.slice(0); // make a copy of the Array
    }
    -

    This ensures that copies of GraphObjects and their subclasses are faithful reproductions. - Consider for properties that are references to objects whether the reference should be shared - or whether that object value should be copied as well, resulting in a less shallow copy. - This is demonstrated above by making a copy of the property value that is an Array, - so that modifications to the Array will not be shared by copies of the CustomLink. - Further copies of the Array items might be warranted, depending on their purpose.

    -

    Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- Virtual - copy -

- -
    -
  • -
    -

    Creates a deep copy of this GraphObject and returns it. - This method is the same as a clone for simple GraphObjects - such as Shape, TextBlock, and Picture. - For Panel this method copies the visual tree of GraphObjects that it contains.

    -
    -

    Returns GraphObject

    -
  • -
-
-
- -

- Static - defineBuilder -

-
    -
  • defineBuilder(name: string, func: (a: any[]) => ObjectData): void
  • -
-
    -
  • -
    -

    This static function defines a named function that GraphObject.make or GraphObject.build can use to build objects. - Once this is called one can use the name as the first argument for GraphObject.make or GraphObject.build. - Names are case sensitive.

    -

    The second argument must be a function that returns a newly created object, typically a GraphObject. - It is commonplace for that object to be a Panel holding a newly created visual tree of GraphObjects. - The function receives as its only argument an Array that is holds all of the arguments that are being - passed to GraphObject.make, which it may modify in order to change the arguments that GraphObject.make receives.

    -

    Predefined builder names include: "Button", "TreeExpanderButton", "SubGraphExpanderButton", - "PanelExpanderButton", and "ContextMenuButton". - The implementation of these builders is provided by Buttons.js - in the Extensions directory.

    -
    -
    since
    -

    1.5

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      name: string
      -
      -

      a capitalized name; must not be "" or "None"

      -
      -
    • -
    • -
      func: (a: any[]) => ObjectData
      -
      -

      that takes an Array of GraphObject.make arguments and returns a new object

      -
      -
        -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- findBindingPanel -

-
    -
  • findBindingPanel(): Panel
  • -
-
    -
  • -
    -

    Walks up the visual tree and returns the first Panel whose Panel.data is bound to data. - This can be useful when you need to inspect Panel.data objects.

    -
    -
    since
    -

    2.2

    -
    -
    -
    -

    Returns Panel

    -
  • -
-
-
- -

- getDocumentAngle -

-
    -
  • getDocumentAngle(): number
  • -
-
    -
  • -
    -

    Returns the effective angle that the object is drawn at, in document coordinates, normalized to between 0 and 360.

    -

    Basically this adds together all of the rotation declared by this angle and the angles of all of its containing Panels, including the Part.

    -
    -

    Returns number

    -
  • -
-
-
- -

- getDocumentBounds -

-
    -
  • getDocumentBounds(result?: Rect): Rect
  • -
-
    -
  • -
    -

    Returns the Rect in document coordinates for this object's bounds. - If this GraphObject is a Part, the rect will be identical to its actualBounds.

    -
    -
    see
    -

    getDocumentPoint

    -
    -
    since
    -

    2.0

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      Optional result: Rect
      -
      -

      an optional Rect that is modified and returned.

      -
      -
    • -
    -

    Returns Rect

    -

    in document coordinates.

    -
  • -
-
-
- -

- getDocumentPoint -

- -
    -
  • -
    -

    Returns the Point in document coordinates for a given Spot in this object's bounds - or for a Point in local coordinates.

    -

    For example, for an instance of a Node like this:

    -
    myDiagram.nodeTemplate =
    -  $(go.Node, "Auto",
    -    $(go.Shape, "RoundedRectangle",
    -      new go.Binding("fill", "color")),
    -    $(go.TextBlock,
    -      { name: "TB", margin: 3 },
    -      new go.Binding("text", "key")));
    +

    This ensures that copies of GraphObjects and their subclasses are faithful reproductions. +Consider for properties that are references to objects whether the reference should be shared +or whether that object value should be copied as well, resulting in a less shallow copy. +This is demonstrated above by making a copy of the property value that is an Array, +so that modifications to the Array will not be shared by copies of the CustomLink. +Further copies of the Array items might be warranted, depending on their purpose.

    +

    Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    +

    Parameters

    Returns void

  • +

    Creates a deep copy of this GraphObject and returns it. +This method is the same as a clone for simple GraphObjects +such as Shape, TextBlock, and Picture. +For Panel this method copies the visual tree of GraphObjects that it contains.

    +

    Returns GraphObject

  • findBindingPanel(): Panel
  • +

    Walks up the visual tree and returns the first Panel whose Panel.data is bound to data. +This can be useful when you need to inspect Panel.data objects.

    +
    since

    2.2

    +

    Returns Panel

  • getDocumentAngle(): number
  • +

    Returns the effective angle that the object is drawn at, in document coordinates, normalized to between 0 and 360.

    +

    Basically this adds together all of the rotation declared by this angle and the angles of all of its containing Panels, including the Part.

    +

    Returns number

  • +

    Returns the Rect in document coordinates for this object's bounds. +If this GraphObject is a Part, the rect will be identical to its actualBounds.

    +
    see

    getDocumentPoint

    +
    since

    2.0

    +

    Parameters

    • Optional result: Rect
      +

      an optional Rect that is modified and returned.

      +

    Returns Rect

    in document coordinates.

    +
  • +

    Returns the Point in document coordinates for a given Spot in this object's bounds +or for a Point in local coordinates.

    +

    For example, for an instance of a Node like this:

    +
    myDiagram.nodeTemplate =
    $(go.Node, "Auto",
    $(go.Shape, "RoundedRectangle",
    new go.Binding("fill", "color")),
    $(go.TextBlock,
    { name: "TB", margin: 3 },
    new go.Binding("text", "key")));
    -

    where the Node is positioned at 100, 200,

    -
      node.findObject("TB").getDocumentPoint(go.Spot.Center)
    +

    where the Node is positioned at 100, 200,

    +
      node.findObject("TB").getDocumentPoint(go.Spot.Center)
     
    -

    could return a Point that is approximately at 122, 213.

    -
    -
    see
    -

    getDocumentBounds, getLocalPoint

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      local: Point | Spot
      -
      -

      a real Spot describing a relative location in or near this GraphObject, or a real Point in local coordinates.

      -
      -
    • -
    • -
      Optional result: Point
      -
      -

      an optional Point that is modified and returned.

      -
      -
    • -
    -

    Returns Point

    -

    in document coordinates.

    -
  • -
-
-
- -

- getDocumentScale -

-
    -
  • getDocumentScale(): number
  • -
-
    -
  • -
    -

    Returns the total scale that the object is drawn at, in document coordinates.

    -

    Basically this multiplies together this scale with the scales of all of its containing Panels, including the Part.

    -
    -

    Returns number

    -
  • -
-
-
- -

- getLocalPoint -

- -
    -
  • -
    -

    Given a Point in document coordinates, returns a new Point in local coordinates.

    -

    For example, if you have a mouse event whose InputEvent.documentPoint is at 122, 213, - and if you have a Node whose position is at 100, 200, - node.getLocalPoint(e.documentPoint) could return a Point that is at 22, 13. - For a GraphObject within the Node named "TB",

    -
      node.findObject("TB").getLocalPoint(e.documentPoint)
    +

    could return a Point that is approximately at 122, 213.

    +
    see

    getDocumentBounds, getLocalPoint

    +

    Parameters

    • local: Point | Spot
      +

      a real Spot describing a relative location in or near this GraphObject, or a real Point in local coordinates.

      +
    • Optional result: Point
      +

      an optional Point that is modified and returned.

      +

    Returns Point

    in document coordinates.

    +
  • getDocumentScale(): number
  • +

    Returns the total scale that the object is drawn at, in document coordinates.

    +

    Basically this multiplies together this scale with the scales of all of its containing Panels, including the Part.

    +

    Returns number

  • +

    Given a Point in document coordinates, returns a new Point in local coordinates.

    +

    For example, if you have a mouse event whose InputEvent.documentPoint is at 122, 213, +and if you have a Node whose position is at 100, 200, +node.getLocalPoint(e.documentPoint) could return a Point that is at 22, 13. +For a GraphObject within the Node named "TB",

    +
      node.findObject("TB").getLocalPoint(e.documentPoint)
     
    -

    could return a Point that is at 15.7, 6.7, - if that "TB" object is positioned somewhat inside the bounds of the Node.

    -
    -
    see
    -

    getDocumentPoint

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      p: Point
      -
      -

      a real Point in document coordinates.

      -
      -
    • -
    • -
      Optional result: Point
      -
      -

      an optional Point that is modified and returned.

      -
      -
    • -
    -

    Returns Point

    -

    The corresponding Point in local coordinates.

    -
  • -
-
-
- -

- isContainedBy -

- -
    -
  • -
    -

    This predicate is true if this object is an element, perhaps indirectly, - of the given panel.

    -

    For example, if this GraphObject is inside a Part but is not itself the Part, - obj.isContainedBy(obj.part) should be true.

    -
    -

    Parameters

    - -

    Returns boolean

    -

    true if this object is contained by the given panel, - or if it is contained by another panel that is contained by the given panel, - to any depth; false if the argument is null or is not a Panel.

    -
  • -
-
-
- -

- isEnabledObject -

-
    -
  • isEnabledObject(): boolean
  • -
- -
-
- -

- isVisibleObject -

-
    -
  • isVisibleObject(): boolean
  • -
-
    -
  • -
    -

    This predicate is true if this object is visible - and each of its visual containing panels are also visible. - This ignores the actual location or appearance (except visibility) - of the panel that this object is part of, as well as ignoring all - properties of the Layer or Diagram.

    -

    For Parts, you can call the Part.isVisible predicate to determine - if not only the Part is visible but also any containing Group or Link or Layer.

    -
    -

    Returns boolean

    -
  • -
-
-
- -

- Static - make -

- -
    -
  • -
    -

    This static function builds an object given its class and additional arguments - providing initial properties or GraphObjects that become Panel elements.

    -

    The first argument must be the class type or the name of a class or the name of a predefined kind of Panel. - This function will construct a new instance of that type and use the rest of the arguments to initialize the object. - The first argument cannot be a regular Object (such as a GraphObject) that you are trying to initialize; - for that you can call setProperties or Diagram.setProperties, although that would - be less efficient than setting properties directly.

    -

    If an initializer argument is an enumerated value, this tries to set the property that seems most appropriate.

    -

    If an initializer argument is a string, this sets a particular property depending on the type of object being built.

    - -

    If an initializer argument is a particular kind of object, this can add that object to the object being built.

    - -

    When the initializer argument is a plain JavaScript Object, there are several ways that that object's properties are applied. - If the property name is a string with a period inside it, this has a special meaning if the object is a Panel or a Diagram. - At the current time only a single period separator is valid syntax for a property string, and it is valid only on Panels and Diagrams.

    -

    For Panels, the substring before the period is used as the name passed to Panel.findObject - to get the actual object on which to set the property, which is the substring after the period. - This is normally useful only on the predefined Panels:

    -
      -
    • a "Button" has a Shape named "ButtonBorder" surrounding the content of the Panel.
    • -
    • a "TreeExpanderButton" has a "ButtonBorder" Shape and a "ButtonIcon" Shape that is the plus-or-minus sign.
    • -
    • a "SubGraphExpanderButton" has a "ButtonBorder" Shape and a "ButtonIcon" Shape that is the plus-or-minus sign.
    • -
    • a "ContextMenuButton" has a Shape named "ButtonBorder" surrounding the content of the Panel.
    • -
    -

    But you can define your own names that GraphObject.make can build by calling the static function GraphObject.defineBuilder.

    -

    For Diagrams, the substring before the period is used as the name of a property on the Diagram itself - to get the actual object on which to set the property. - As a special case, if such a property value does not exist on the Diagram, it looks on the Diagram.toolManager. - See some examples below.

    -

    Also for Diagrams, and only for Diagrams, if the property name is the name of a DiagramEvent, - the property value must be a DiagramEvent listener function, and Diagram.addDiagramListener is called - using that DiagramEvent name and that function. - Note that all DiagramEvent names are capitalized and do not contain any periods, - so there cannot be any name conflicts with any properties on Diagram or ToolManager. - Although you can register multiple listeners for the same DiagramEvent names, due to JavaScript limitations - those need to be declared using separate JavaScript objects, because JavaScript does not permit duplicate property names - in an Object literal.

    -

    Furthermore for Diagrams, if the property name is "Changed" or "ModelChanged", - the property value must be a ChangedEvent listener function, which is called with a ChangedEvent argument. - When the property name is "Changed", it calls Diagram.addChangedListener, - notifying about changes to the Diagram or its Layers or GraphObjects. - When the property name is "ModelChanged", it calls Model.addChangedListener on the Diagram.model, - resulting in notifications about changes to the Model or its data. - This is handy because the Diagram.model property setter will automatically call - Model.removeChangedListener on the old model, thereby avoiding any overhead if there are any - more changes to the old model and also avoiding a reference to the listener which might cause garbage collection retention. - It also will call Model.addChangedListener on the new model, helping implement the same behavior with the new model.

    -

    If the property name is a number and if the object being constructed is a Brush, - the number and value are added to the Brush by calling Brush.addColorStop.

    -

    Otherwise the property name is used as a regular property name on the object being built. - This tries to do some property name and value checking: - when a property is not defined on the object being built, it will signal an error. - Many typos can be found this way that would be ignored by JavaScript code.

    -

    If the property name begins with an underscore, this will not complain about the property being undefined. - Not only is that underscore property set on the object being built, but calls to copy - will also copy the values of such named properties to the new objects.

    -

    In the samples and in the intro pages this function is called using the alias $. - You can use a different short name if you would like to preserve the use of $ for another JavaScript library.

    -
     var $ = go.GraphObject.make;
    -
    - var diagram =
    -   $(go.Diagram, "myDiagramDiv",
    -     {
    -        // don't initialize some properties until after a new model has been loaded
    -        "InitialLayoutCompleted": loadDiagramProperties,
    -       allowZoom: false,  // don't allow the user to change the diagram's scale
    -       "grid.visible": true,  // display a background grid for the whole diagram
    -       "grid.gridCellSize": new go.Size(20, 20),
    -       // allow double-click in background to create a new node
    -       "clickCreatingTool.archetypeNodeData": { text: "Node" },
    -       // allow Ctrl-G to call the groupSelection command
    -       "commandHandler.archetypeGroupData":
    -           { text: "Group", isGroup: true, color: "blue" },
    -       "toolManager.hoverDelay": 100,  // how quickly tooltips are shown
    -       // mouse wheel zooms instead of scrolls
    -       "toolManager.mouseWheelBehavior": go.ToolManager.WheelZoom,
    -       "commandHandler.copiesTree": true,  // for the copy command
    -       "commandHandler.deletesTree": true, // for the delete command
    -       "draggingTool.dragsTree": true,  // dragging for both move and copy
    -       "draggingTool.isGridSnapEnabled": true,
    -       layout: $(go.TreeLayout,
    -                 { angle: 90, sorting: go.TreeLayout.SortingAscending })
    -     });
    -
    - diagram.nodeTemplate =
    -   $(go.Node, "Auto",  // or go.Panel.Auto
    -     new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
    -     $(go.Shape, "RoundedRectangle",
    -       {
    -         fill: $(go.Brush, "Linear", { 0: "#FEC901", 1: "#FEA200" }),
    -         stroke: "gray",
    -         strokeWidth: 2,
    -         strokeDashArray: [3, 3]
    -       }),
    -     $(go.TextBlock,
    -       { margin: 5, font: "bold 12pt sans-serif" },
    -       new go.Binding("text", "key"))
    -   );
    +

    could return a Point that is at 15.7, 6.7, +if that "TB" object is positioned somewhat inside the bounds of the Node.

    +
    see

    getDocumentPoint

    +

    Parameters

    • p: Point
      +

      a real Point in document coordinates.

      +
    • Optional result: Point
      +

      an optional Point that is modified and returned.

      +

    Returns Point

    The corresponding Point in local coordinates.

    +
  • +

    This predicate is true if this object is an element, perhaps indirectly, +of the given panel.

    +

    For example, if this GraphObject is inside a Part but is not itself the Part, +obj.isContainedBy(obj.part) should be true.

    +

    Parameters

    Returns boolean

    true if this object is contained by the given panel, +or if it is contained by another panel that is contained by the given panel, +to any depth; false if the argument is null or is not a Panel.

    +
  • isEnabledObject(): boolean
  • isVisibleObject(): boolean
  • +

    This predicate is true if this object is visible +and each of its visual containing panels are also visible. +This ignores the actual location or appearance (except visibility) +of the panel that this object is part of, as well as ignoring all +properties of the Layer or Diagram.

    +

    For Parts, you can call the Part.isVisible predicate to determine +if not only the Part is visible but also any containing Group or Link or Layer.

    +

    Returns boolean

-
-
- -

- set -

- -
    -
  • -
    -

    Set any number of properties on this GraphObject. This is common in initialization. - This method can only be used to set existing properties on this object. To attach new properties, - or to set properties of elements, use GraphObject.setProperties.

    -

    This method uses TypeScript compile-time type checking, but does no runtime type checking. - If you need to set properties without type checking, or attach new properties, use GraphObject.attach.

    -
    // Common init for use in many different shapes:
    -var shapeStyle = (() => { return { background: 'red', strokeWidth: 0 }; })
    -
    -// Constructor init is equivalent to "set"
    -// But if you use common init (eg, shapeStyle())
    -// You may wish to set additional properties via "set"
    -new go.Shape(shapeStyle())
    - .bind("fill", "color")
    - .bind("strokeWidth", "width")
    - .set({ // more init via set
    -   figure: "RoundedRectangle"
    - })
    +
    since

    2.2

    +
    see

    setProperties

    +

    Parameters

    Returns GraphObject

    this GraphObject

    +
  • +

    This method sets a collection of properties according to the property/value pairs on the given Object, +in the same manner as GraphObject.make does when constructing a GraphObject with an argument that is a simple JavaScript Object.

    +

    This method is common in initialization, but typically you should use set instead, +unless you need to attach new properties, or set sub-properties. +Calling this method is much less efficient than setting properties directly, and does not do compile-time type checking.

    +

    If this is a Panel, you can set properties on named elements within the panel by using a name.property syntax for the property name. +For example, if a Node has a Picture that is named "ICON" (because its name property has been set to "ICON") +and a TextBlock whose name is "TB", one could set properties on the Node and on each of those named elements by:

    +
    aNode.setProperties({
    background: "red",
    "ICON.source": "https://www.example.com/images/alert.jpg",
    "TB.font": "bold 12pt sans-serif"
    });
    -
    -
    since
    -

    2.2

    -
    -
    see
    -

    setProperties

    -
    -
    -
    -

    Parameters

    - -

    Returns GraphObject

    -

    this GraphObject

    -
  • -
-
-
- -

- setProperties -

- -
    -
  • -
    -

    This method sets a collection of properties according to the property/value pairs on the given Object, - in the same manner as GraphObject.make does when constructing a GraphObject with an argument that is a simple JavaScript Object.

    -

    This method is common in initialization, but typically you should use set instead, - unless you need to attach new properties, or set sub-properties. - Calling this method is much less efficient than setting properties directly, and does not do compile-time type checking.

    -

    If this is a Panel, you can set properties on named elements within the panel by using a name.property syntax for the property name. - For example, if a Node has a Picture that is named "ICON" (because its name property has been set to "ICON") - and a TextBlock whose name is "TB", one could set properties on the Node and on each of those named elements by:

    -
    aNode.setProperties({
    -  background: "red",
    -  "ICON.source": "https://www.example.com/images/alert.jpg",
    -  "TB.font": "bold 12pt sans-serif"
    -});
    +

    At the current time only a single dot is permitted in the property "name". +Note that the use of all-upper-case object names is simply a convention.

    +
    since

    1.5

    +
    see

    attach a synonym of this method, set a type-safe method to set a collection of properties

    +

    Parameters

    • props: ObjectData
      +

      a plain JavaScript object with various property values to be set on this GraphObject.

      +

    Returns GraphObject

    this GraphObject

    +
  • build<T>(name: string, config?: Partial<T>): T
  • +

    This static function creates an instance that was defined with GraphObject.defineBuilder. +Once this is called one can use the name as the first argument for GraphObject.make. +Names are case sensitive.

    +

    The second is an optional settings configuration object, equivalent to calling GraphObject.set +on the new object.

    +

    Predefined builder names include: "Button", "TreeExpanderButton", "SubGraphExpanderButton", +"PanelExpanderButton", and "ContextMenuButton". +The implementation of these builders is provided by Buttons.js +in the Extensions directory.

    +
    since

    2.2

    +

    Type parameters

    Parameters

    • name: string
      +

      a capitalized name; must not be "" or "None"

      +
    • Optional config: Partial<T>
      +

      a plain JavaScript object with various property values to be set on this GraphObject.

      +

    Returns T

  • defineBuilder(name: string, func: (a: any[]) => ObjectData): void
  • +

    This static function defines a named function that GraphObject.make or GraphObject.build can use to build objects. +Once this is called one can use the name as the first argument for GraphObject.make or GraphObject.build. +Names are case sensitive.

    +

    The second argument must be a function that returns a newly created object, typically a GraphObject. +It is commonplace for that object to be a Panel holding a newly created visual tree of GraphObjects. +The function receives as its only argument an Array that is holds all of the arguments that are being +passed to GraphObject.make, which it may modify in order to change the arguments that GraphObject.make receives.

    +

    Predefined builder names include: "Button", "TreeExpanderButton", "SubGraphExpanderButton", +"PanelExpanderButton", and "ContextMenuButton". +The implementation of these builders is provided by Buttons.js +in the Extensions directory.

    +
    since

    1.5

    +

    Parameters

    • name: string
      +

      a capitalized name; must not be "" or "None"

      +
    • func: (a: any[]) => ObjectData
      +

      that takes an Array of GraphObject.make arguments and returns a new object

      +

    Returns void

  • +

    This static function builds an object given its class and additional arguments +providing initial properties or GraphObjects that become Panel elements.

    +

    The first argument must be the class type or the name of a class or the name of a predefined kind of Panel. +This function will construct a new instance of that type and use the rest of the arguments to initialize the object. +The first argument cannot be a regular Object (such as a GraphObject) that you are trying to initialize; +for that you can call setProperties or Diagram.setProperties, although that would +be less efficient than setting properties directly.

    +

    If an initializer argument is an enumerated value, this tries to set the property that seems most appropriate.

    +

    If an initializer argument is a string, this sets a particular property depending on the type of object being built.

    + +

    If an initializer argument is a particular kind of object, this can add that object to the object being built.

    + +

    When the initializer argument is a plain JavaScript Object, there are several ways that that object's properties are applied. +If the property name is a string with a period inside it, this has a special meaning if the object is a Panel or a Diagram. +At the current time only a single period separator is valid syntax for a property string, and it is valid only on Panels and Diagrams.

    +

    For Panels, the substring before the period is used as the name passed to Panel.findObject +to get the actual object on which to set the property, which is the substring after the period. +This is normally useful only on the predefined Panels:

    +
      +
    • a "Button" has a Shape named "ButtonBorder" surrounding the content of the Panel.
    • +
    • a "TreeExpanderButton" has a "ButtonBorder" Shape and a "ButtonIcon" Shape that is the plus-or-minus sign.
    • +
    • a "SubGraphExpanderButton" has a "ButtonBorder" Shape and a "ButtonIcon" Shape that is the plus-or-minus sign.
    • +
    • a "ContextMenuButton" has a Shape named "ButtonBorder" surrounding the content of the Panel.
    • +
    +

    But you can define your own names that GraphObject.make can build by calling the static function GraphObject.defineBuilder.

    +

    For Diagrams, the substring before the period is used as the name of a property on the Diagram itself +to get the actual object on which to set the property. +As a special case, if such a property value does not exist on the Diagram, it looks on the Diagram.toolManager. +See some examples below.

    +

    Also for Diagrams, and only for Diagrams, if the property name is the name of a DiagramEvent, +the property value must be a DiagramEvent listener function, and Diagram.addDiagramListener is called +using that DiagramEvent name and that function. +Note that all DiagramEvent names are capitalized and do not contain any periods, +so there cannot be any name conflicts with any properties on Diagram or ToolManager. +Although you can register multiple listeners for the same DiagramEvent names, due to JavaScript limitations +those need to be declared using separate JavaScript objects, because JavaScript does not permit duplicate property names +in an Object literal.

    +

    Furthermore for Diagrams, if the property name is "Changed" or "ModelChanged", +the property value must be a ChangedEvent listener function, which is called with a ChangedEvent argument. +When the property name is "Changed", it calls Diagram.addChangedListener, +notifying about changes to the Diagram or its Layers or GraphObjects. +When the property name is "ModelChanged", it calls Model.addChangedListener on the Diagram.model, +resulting in notifications about changes to the Model or its data. +This is handy because the Diagram.model property setter will automatically call +Model.removeChangedListener on the old model, thereby avoiding any overhead if there are any +more changes to the old model and also avoiding a reference to the listener which might cause garbage collection retention. +It also will call Model.addChangedListener on the new model, helping implement the same behavior with the new model.

    +

    If the property name is a number and if the object being constructed is a Brush, +the number and value are added to the Brush by calling Brush.addColorStop.

    +

    Otherwise the property name is used as a regular property name on the object being built. +This tries to do some property name and value checking: +when a property is not defined on the object being built, it will signal an error. +Many typos can be found this way that would be ignored by JavaScript code.

    +

    If the property name begins with an underscore, this will not complain about the property being undefined. +Not only is that underscore property set on the object being built, but calls to copy +will also copy the values of such named properties to the new objects.

    +

    In the samples and in the intro pages this function is called using the alias $. +You can use a different short name if you would like to preserve the use of $ for another JavaScript library.

    +
     var $ = go.GraphObject.make;

    var diagram =
    $(go.Diagram, "myDiagramDiv",
    {
    // don't initialize some properties until after a new model has been loaded
    "InitialLayoutCompleted": loadDiagramProperties,
    allowZoom: false, // don't allow the user to change the diagram's scale
    "grid.visible": true, // display a background grid for the whole diagram
    "grid.gridCellSize": new go.Size(20, 20),
    // allow double-click in background to create a new node
    "clickCreatingTool.archetypeNodeData": { text: "Node" },
    // allow Ctrl-G to call the groupSelection command
    "commandHandler.archetypeGroupData":
    { text: "Group", isGroup: true, color: "blue" },
    "toolManager.hoverDelay": 100, // how quickly tooltips are shown
    // mouse wheel zooms instead of scrolls
    "toolManager.mouseWheelBehavior": go.ToolManager.WheelZoom,
    "commandHandler.copiesTree": true, // for the copy command
    "commandHandler.deletesTree": true, // for the delete command
    "draggingTool.dragsTree": true, // dragging for both move and copy
    "draggingTool.isGridSnapEnabled": true,
    layout: $(go.TreeLayout,
    { angle: 90, sorting: go.TreeLayout.SortingAscending })
    });

    diagram.nodeTemplate =
    $(go.Node, "Auto", // or go.Panel.Auto
    new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
    $(go.Shape, "RoundedRectangle",
    {
    fill: $(go.Brush, "Linear", { 0: "#FEC901", 1: "#FEA200" }),
    stroke: "gray",
    strokeWidth: 2,
    strokeDashArray: [3, 3]
    }),
    $(go.TextBlock,
    { margin: 5, font: "bold 12pt sans-serif" },
    new go.Binding("text", "key"))
    );
    -

    At the current time only a single dot is permitted in the property "name". - Note that the use of all-upper-case object names is simply a convention.

    -
    -
    since
    -

    1.5

    -
    -
    see
    -

    attach a synonym of this method, set a type-safe method to set a collection of properties

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      props: ObjectData
      -
      -

      a plain JavaScript object with various property values to be set on this GraphObject.

      -
      -
    • -
    -

    Returns GraphObject

    -

    this GraphObject

    -
  • -
-
-
- -

- Static - takeBuilderArgument -

-
    -
  • takeBuilderArgument(args: any[], defval?: any, pred?: (a: any) => boolean): any
  • -
-
    -
  • -
    -

    This static function returns the first argument from the arguments array passed - to a GraphObject.defineBuilder function by GraphObject.make. - By default this requires the first argument to be a string, - but you can provide a predicate to determine whether the argument is suitable.

    -
    -
    since
    -

    1.5

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      args: any[]
      -
      -

      the arguments Array passed to the builder function; - this may be modified if an acceptable argument is found and returned

      -
      -
    • -
    • -
      Optional defval: any
      -
      -

      the default value to return if the argument is optional and not present as the first argument; - otherwise throw an error when the argument is not there

      -
      -
    • -
    • -
      Optional pred: (a: any) => boolean
      -
      -

      a predicate to determine the acceptability of the argument; - the default predicate checks whether the argument is a string

      -
      -
        -
      -
    • -
    -

    Returns any

    -
  • -
-
-
- -

- trigger -

- - -
-
-
-

Constants

-
- -

- Static - Default - : EnumValue

-
-

GraphObjects with this enumeration as the value of GraphObject.stretch - are stretched depending on the context they are used. For instance a 'Circle' figure might - be uniformly stretched whereas an 'Ellipse' figure might be non-uniformly stretched.

-
-
-
- -

- Static - Fill - : EnumValue

-
-

GraphObjects with this enumeration as the value of GraphObject.stretch - are scaled in both directions so as to fit exactly in the given bounds; - there is no clipping but the aspect ratio may change, causing the object to appear stretched.

-
-
-
- -

- Static - FlipBoth - : EnumValue

-
-

GraphObjects with this enumeration as the value of Picture.flip or TextBlock.flip - are drawn with both X and Y coordinates reversed.

-
-
since
-

2.0

-
-
-
-
-
- -

- Static - FlipHorizontal - : EnumValue

-
-

GraphObjects with this enumeration as the value of Picture.flip or TextBlock.flip - are drawn mirror-image, with X coordinate points increasing towards the left.

-
-
since
-

2.0

-
-
-
-
-
- -

- Static - FlipVertical - : EnumValue

-
-

GraphObjects with this enumeration as the value of Picture.flip or TextBlock.flip - are drawn upside-down, with Y coordinate points increasing upwards.

-
-
since
-

2.0

-
-
-
-
-
- -

- Static - Horizontal - : any

-
-

GraphObjects with this enumeration as the value of GraphObject.stretch - are scaled as much as possible in the x-axis. In another context, can be used as a value of PanelLayout, so type is "any".

-
-
-
- -

- Static - None - : EnumValue

-
-

GraphObjects with this enumeration as the value of GraphObject.stretch - are not automatically scaled to fit in the given bounds; - there may be clipping in one or both directions if the available dimensions are too small.

-
-
-
- -

- Static - Uniform - : EnumValue

-
-

Pictures with this enumeration as the value of Picture.imageStretch are drawn with equal - scale in both directions to fit the larger side of the image bounds; - Panels of type Viewbox with this as the value of Panel.viewboxStretch - scale the contained element equally in both directions to fit the larger side - of the element's bounds in the given bounds.

-
-
-
- -

- Static - UniformToFill - : EnumValue

-
-

Pictures with this enumeration as the value of Picture.imageStretch are drawn with equal - scale in both directions to fit the arranged (actual) bounds; - Panels of type Viewbox with this as the value of Panel.viewboxStretch - scale the contained element equally in both directions to fit the smaller side - of the element's bounds in the given bounds. - There may be clipping in one dimension.

-
-
-
- -

- Static - Vertical - : any

-
-

GraphObjects with this enumeration as the value of GraphObject.stretch - are scaled as much as possible in the y-axis. In another context, can be used as a value of PanelLayout, so type is "any".

-
-
-
- - - - -
- -
-
- - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/GridLayout.html b/api/symbols/GridLayout.html index 246959076..78fb5d489 100644 --- a/api/symbols/GridLayout.html +++ b/api/symbols/GridLayout.html @@ -1,583 +1,127 @@ - - - - - - GridLayout | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class GridLayout

-
-
-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - Layout -
      -
    • - GridLayout -
    • -
    -
  • -
-
-
-
-

This simple layout places all of the Parts in a grid-like arrangement, ordered, spaced apart, - and wrapping as needed. It ignores any Links connecting the Nodes being laid out. - There are many samples that use GridLayout. - Every Palette uses a GridLayout by default.

-

- If you want to experiment interactively with most of the properties, try the Grid Layout sample. - See samples that make use of GridLayout in the samples index. -

By default this layout will sort all of the Parts alphabetically - (comparing Part.text values, respecting case) - and position them left-to-right, separated by spacing.width, - until they do not fit in the current row. - At that time it starts a new row, separated from the previous row by spacing.height. - There is a uniform cell size equal to the maximum Part width (plus spacing width) - and the maximum part height (plus spacing height). - At least one part is placed in each row, even if the part by itself is wider than the wrapping width.

-

You can specify values for the cellSize width and height. - If a part is wider than the cell size, it spans more than one cell in the row. - You can also specify a value for the wrappingWidth, - which will be used instead of the diagram's viewport width, to control when each row is considered "full". - The value of Layout.isViewportSized will be true when - the value of wrappingWidth is NaN. - This causes the layout to be performed again automatically as the viewport changes size.

-

You can also set wrappingColumn to limit the number of items in each row. - Both the wrappingWidth and the wrappingColumn are respected when deciding when to wrap to the next row.

-

This layout is sufficiently simple that it does not use a LayoutNetwork.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-

Constants

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- - -
-
-
-

Properties

-
- -

- alignment - : EnumValue

- -
-
- -

- arrangement - : EnumValue

- -
-
- -

- cellSize - : Size

-
    -
  • -
    -

    Gets or sets the minimum part size by which each part is positioned in the grid.

    -

    The default value is NaN x NaN. - The units are in document coordinates.

    -

    When the cell size is smaller than a part, the part will occupy more than one cell. - This allows parts to be positioned closer to each other, but then variations in part - sizes may cause them not to be aligned in perfect rows or columns.

    -
    -
  • -
-
-
- -

- comparer - : (a: Part, b: Part) => number

-
    -
  • -
    -

    Gets or sets the comparison function used to sort the parts.

    -

    The default value is a case-insensitive alphabetic comparison - using the Part.text property of each part.

    -
      $(go.GridLayout,
    -    {
    -      sorting: go.GridLayout.Ascending,
    -      comparer: function(pa, pb) {
    -        var da = pa.data;
    -        var db = pb.data;
    -        if (da.someProperty < db.someProperty) return -1;
    -        if (da.someProperty > db.someProperty) return 1;
    -        return 0;
    -      }
    -    }
    -  )
    +GridLayout | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class GridLayout

    Hierarchy

    +

    This simple layout places all of the Parts in a grid-like arrangement, ordered, spaced apart, +and wrapping as needed. It ignores any Links connecting the Nodes being laid out. +There are many samples that use GridLayout. +Every Palette uses a GridLayout by default.

    +

    +If you want to experiment interactively with most of the properties, try the Grid Layout sample. +See samples that make use of GridLayout in the samples index.

    By default this layout will sort all of the Parts alphabetically +(comparing Part.text values, respecting case) +and position them left-to-right, separated by spacing.width, +until they do not fit in the current row. +At that time it starts a new row, separated from the previous row by spacing.height. +There is a uniform cell size equal to the maximum Part width (plus spacing width) +and the maximum part height (plus spacing height). +At least one part is placed in each row, even if the part by itself is wider than the wrapping width.

    +

    You can specify values for the cellSize width and height. +If a part is wider than the cell size, it spans more than one cell in the row. +You can also specify a value for the wrappingWidth, +which will be used instead of the diagram's viewport width, to control when each row is considered "full". +The value of Layout.isViewportSized will be true when +the value of wrappingWidth is NaN. +This causes the layout to be performed again automatically as the viewport changes size.

    +

    You can also set wrappingColumn to limit the number of items in each row. +Both the wrappingWidth and the wrappingColumn are respected when deciding when to wrap to the next row.

    +

    This layout is sufficiently simple that it does not use a LayoutNetwork.

    +

    Index

    Inherited Members

    Constructors

    Properties

    • +

      Gets or sets the minimum part size by which each part is positioned in the grid.

      +

      The default value is NaN x NaN. +The units are in document coordinates.

      +

      When the cell size is smaller than a part, the part will occupy more than one cell. +This allows parts to be positioned closer to each other, but then variations in part +sizes may cause them not to be aligned in perfect rows or columns.

      +
    • +

      Gets or sets the comparison function used to sort the parts.

      +

      The default value is a case-insensitive alphabetic comparison +using the Part.text property of each part.

      +
        $(go.GridLayout,
      {
      sorting: go.GridLayout.Ascending,
      comparer: function(pa, pb) {
      var da = pa.data;
      var db = pb.data;
      if (da.someProperty < db.someProperty) return -1;
      if (da.someProperty > db.someProperty) return 1;
      return 0;
      }
      }
      )
      -
      -
    • -
    -
    -
    - -

    - sorting - : EnumValue

    - -
    -
    - -

    - spacing - : Size

    -
      -
    • -
      -

      Gets or sets the minimum horizontal and vertical space between parts.

      -

      The default value is 10 x 10. - The units are in document coordinates.

      -
      -
    • -
    -
    -
    - -

    - wrappingColumn - : number

    -
      -
    • -
      -

      Gets or sets the maximum number of columns.

      -

      The default is NaN, meaning not to limit the number of columns. - 1 is a common value to produce a single column of parts.

      -
      -
    • -
    -
    -
    - -

    - wrappingWidth - : number

    -
      -
    • -
      -

      Gets or sets the wrapping width.

      -

      The default is NaN, meaning to use the width of the diagram's panel's viewport. - Must be a value greater than 0.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override - doLayout -

    - - -
    -
    -
    -

    Constants

    -
    - -

    - Static - Ascending - : EnumValue

    -
    -

    Lay out each child according to the sort order given by GridLayout.comparer - This value is used for GridLayout.sorting.

    -
    -
    -
    - -

    - Static - Descending - : EnumValue

    -
    -

    Lay out each child in reverse sort order given by GridLayout.comparer - This value is used for GridLayout.sorting.

    -
    -
    -
    - -

    - Static - Forward - : EnumValue

    -
    -

    Lay out each child in the order in which they were found; - This value is used for GridLayout.sorting.

    -
    -
    -
    - -

    - Static - LeftToRight - : EnumValue

    -
    -

    Fill each row from left to right; - This value is used for GridLayout.arrangement.

    -
    -
    -
    - -

    - Static - Location - : EnumValue

    -
    -

    Position the part's Part.location at a grid point; - This value is used for GridLayout.alignment.

    -
    -
    -
    - -

    - Static - Position - : EnumValue

    -
    -

    Position the top-left corner of each part at a grid point; - This value is used for GridLayout.alignment.

    -
    -
    -
    - -

    - Static - Reverse - : EnumValue

    -
    -

    Lay out each child in reverse order from which they were found; - This value is used for GridLayout.sorting.

    -
    -
    -
    - -

    - Static - RightToLeft - : EnumValue

    -
    -

    Fill each row from right to left; - This value is used for GridLayout.arrangement.

    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Group.html b/api/symbols/Group.html index c1ac0c3bb..983083c21 100644 --- a/api/symbols/Group.html +++ b/api/symbols/Group.html @@ -1,966 +1,294 @@ - - - - - - Group | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class Group

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    A Group is a Node that can contain a subgraph of Nodes and Links, - which are members of the group.

    -

    - For more discussion, see Introduction to Groups. - See samples that make use of Groups in the samples index. -

    Although you can create a Group and Diagram.add it to a Diagram, this does not update the Model. - It is more common to create a group by adding a node data object to the model - by calling Model.addNodeData. For example:

    -
      myDiagram.startTransaction("make new group");
    -  myDiagram.model.addNodeData({ key: "Omega", isGroup: true });
    -  myDiagram.commitTransaction("make new group");
    +Group | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class Group

    Hierarchy

    +

    A Group is a Node that can contain a subgraph of Nodes and Links, +which are members of the group.

    +

    +For more discussion, see Introduction to Groups. +See samples that make use of Groups in the samples index.

    Although you can create a Group and Diagram.add it to a Diagram, this does not update the Model. +It is more common to create a group by adding a node data object to the model +by calling Model.addNodeData. For example:

    +
      myDiagram.startTransaction("make new group");
    myDiagram.model.addNodeData({ key: "Omega", isGroup: true });
    myDiagram.commitTransaction("make new group");
    -

    This will cause a Group to be created (copying the template found in Diagram.groupTemplateMap), - added to the Diagram in some Layer (based on Part.layerName), and bound to the group data - (resulting in Panel.data referring to that group data object). - Note that the JavaScript object includes setting isGroup to true, - to indicate that the object represents a Group rather than a regular Node or simple Part.

    -

    The member Parts of a Group, which you can access as the memberParts collection, - belong to the group but are not in the visual tree of the group. - All Parts are directly in Layers -- they cannot be inside a Panel. - This allows group member parts to be in layers different from the group's layer.

    -

    You can change the membership of a Node or a simple Part in a Group by setting - its Part.containingGroup property. - This is done automatically for you by the diagram if you initialize the group property on the node data - in the model to be the key of the containing group node data. - Thus you should do something like:

    -
      myDiagram.startTransaction("add new member");
    -  myDiagram.model.addNodeData({ group: someExistingGroupKey, ... });
    -  myDiagram.commitTransaction("add new member");
    +

    This will cause a Group to be created (copying the template found in Diagram.groupTemplateMap), +added to the Diagram in some Layer (based on Part.layerName), and bound to the group data +(resulting in Panel.data referring to that group data object). +Note that the JavaScript object includes setting isGroup to true, +to indicate that the object represents a Group rather than a regular Node or simple Part.

    +

    The member Parts of a Group, which you can access as the memberParts collection, +belong to the group but are not in the visual tree of the group. +All Parts are directly in Layers -- they cannot be inside a Panel. +This allows group member parts to be in layers different from the group's layer.

    +

    You can change the membership of a Node or a simple Part in a Group by setting +its Part.containingGroup property. +This is done automatically for you by the diagram if you initialize the group property on the node data +in the model to be the key of the containing group node data. +Thus you should do something like:

    +
      myDiagram.startTransaction("add new member");
    myDiagram.model.addNodeData({ group: someExistingGroupKey, ... });
    myDiagram.commitTransaction("add new member");
    -

    where you would make sure the node data object included all of the properties you need. - You can also change the relationship dynamically by calling GraphLinksModel.setGroupKeyForNodeData.

    -

    The membership of Links is computed automatically for you by the diagram based on the membership of - the connected Nodes. - For example, if the Link.fromNode is a top-level node but the Link.toNode is a member of a group, - the link is a top-level link. - If the two connected nodes both belong to the same group, the link is a member of that group. - If the two connected nodes belong to different groups, the link belongs to the common container group, if there is any. - Note that if a link connects a member of a group with the group itself, the link is a member of that group.

    -

    All of the group-member relationships effectively form a tree structure. - These properties and methods are useful in navigating these relationships:

    - -

    As the membership of a group changes, you may want to update the appearance of the group. - You can set the memberAdded and memberRemoved properties to be functions that are called. - These functions must not modify any membership relationships -- these function properties just exist to update the appearance of the Group.

    -

    You can control whether certain Nodes are added to a Group by CommandHandler.groupSelection or - addMembers or CommandHandler.addTopLevelParts by affecting the result of CommandHandler.isValidMember, - which is responsible for deciding whether it is OK to add a Node to a Group or to remove a Node from a Group to be a top-level node. - You can override that predicate on CommandHandler, but it is easier to set the memberValidation or - CommandHandler.memberValidation functional property.

    -

    - For a more general discussion of validation, see Introduction to Validation. -

    The area occupied by the subgraph is represented in the group's visual tree by a Placeholder. - As the group placeholder grows and shrinks based on the sizes and positions of the member nodes and links, - the group will grow and shrink accordingly. - The placeholder is always the Part.locationObject, - although you may specify any Spot as the Part.locationSpot. - A Group need not have a placeholder, but it may have at most one.

    -

    A group has its own layout property that is used to position the member nodes and route the member links.

    -

    The Group class also supports the notion of expanding and collapsing the subgraph, - causing the member nodes and links to be shown or hidden. - Principally this is a matter of setting isSubGraphExpanded. - Changes to this property will result in calls to collapseSubGraph or expandSubGraph, as appropriate.

    -

    If you want to change the appearance of the group you can do so in a function that you assign to - the subGraphExpandedChanged property. - This function must not modify any member relationships or expand or collapse any groups -- the functional property just exists - to update the appearance of the Group.

    -

    - For more discussion and examples, see SubGraphs. -

    If you want the user to be able to create a Group out of the currently - selected Parts using the CommandHandler.groupSelection command, - you need to first set the CommandHandler.archetypeGroupData property - to a data object with isGroup set to true. - If you want the user to be able to ungroup a Group, - using the CommandHandler.ungroupSelection command, - you need to set ungroupable to true.

    -

    - For more discussion and examples, see Groups, - SubGraphs, and - Sized Groups. -

    Only Groups that are in Diagrams can have member Parts or connections via Links. - Templates should not be connected with Links, be labels of Links, be members of Groups, have any member Parts, or have any Adornments.

    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Constructs an empty Group with no visual elements and no member parts; - typically a Group will have some visual elements surrounding a Placeholder.

      -

      The panel type must be one of the enumerated values defined on the Panel class, including: - Panel.Position, Panel.Vertical, Panel.Horizontal, Panel.Table, - Panel.Auto, Panel.Spot, or Panel.Viewbox. The string value such as "Auto" may also be used.

      -

      Usage example:

      -
      // Constructs a Group, sets properties on it,
      -// adds a data binding to it,
      -// and adds two GraphObjects to the Group:
      -const g = new go.Group("Auto", {
      -  margin: 5,
      -  background: "red"
      -})
      -.add(new go.Shape("RoundedRectangle"))
      -.add(new go.TextBlock("Some Text"))
      +

      where you would make sure the node data object included all of the properties you need. +You can also change the relationship dynamically by calling GraphLinksModel.setGroupKeyForNodeData.

      +

      The membership of Links is computed automatically for you by the diagram based on the membership of +the connected Nodes. +For example, if the Link.fromNode is a top-level node but the Link.toNode is a member of a group, +the link is a top-level link. +If the two connected nodes both belong to the same group, the link is a member of that group. +If the two connected nodes belong to different groups, the link belongs to the common container group, if there is any. +Note that if a link connects a member of a group with the group itself, the link is a member of that group.

      +

      All of the group-member relationships effectively form a tree structure. +These properties and methods are useful in navigating these relationships:

      + +

      As the membership of a group changes, you may want to update the appearance of the group. +You can set the memberAdded and memberRemoved properties to be functions that are called. +These functions must not modify any membership relationships -- these function properties just exist to update the appearance of the Group.

      +

      You can control whether certain Nodes are added to a Group by CommandHandler.groupSelection or +addMembers or CommandHandler.addTopLevelParts by affecting the result of CommandHandler.isValidMember, +which is responsible for deciding whether it is OK to add a Node to a Group or to remove a Node from a Group to be a top-level node. +You can override that predicate on CommandHandler, but it is easier to set the memberValidation or +CommandHandler.memberValidation functional property.

      +

      +For a more general discussion of validation, see Introduction to Validation. + +

      The area occupied by the subgraph is represented in the group's visual tree by a Placeholder. +As the group placeholder grows and shrinks based on the sizes and positions of the member nodes and links, +the group will grow and shrink accordingly. +The placeholder is always the Part.locationObject, +although you may specify any Spot as the Part.locationSpot. +A Group need not have a placeholder, but it may have at most one.

      +

      A group has its own layout property that is used to position the member nodes and route the member links.

      +

      The Group class also supports the notion of expanding and collapsing the subgraph, +causing the member nodes and links to be shown or hidden. +Principally this is a matter of setting isSubGraphExpanded. +Changes to this property will result in calls to collapseSubGraph or expandSubGraph, as appropriate.

      +

      If you want to change the appearance of the group you can do so in a function that you assign to +the subGraphExpandedChanged property. +This function must not modify any member relationships or expand or collapse any groups -- the functional property just exists +to update the appearance of the Group.

      +

      +For more discussion and examples, see SubGraphs. + +

      If you want the user to be able to create a Group out of the currently +selected Parts using the CommandHandler.groupSelection command, +you need to first set the CommandHandler.archetypeGroupData property +to a data object with isGroup set to true. +If you want the user to be able to ungroup a Group, +using the CommandHandler.ungroupSelection command, +you need to set ungroupable to true.

      +

      +For more discussion and examples, see Groups, +SubGraphs, and +Sized Groups. + +

      Only Groups that are in Diagrams can have member Parts or connections via Links. +Templates should not be connected with Links, be labels of Links, be members of Groups, have any member Parts, or have any Adornments.

      +

    Index

    Inherited Members

    Properties

    Methods

    Constructors

    • +

      Constructs an empty Group with no visual elements and no member parts; +typically a Group will have some visual elements surrounding a Placeholder.

      +

      The panel type must be one of the enumerated values defined on the Panel class, including: +Panel.Position, Panel.Vertical, Panel.Horizontal, Panel.Table, +Panel.Auto, Panel.Spot, or Panel.Viewbox. The string value such as "Auto" may also be used.

      +

      Usage example:

      +
      // Constructs a Group, sets properties on it,
      // adds a data binding to it,
      // and adds two GraphObjects to the Group:
      const g = new go.Group("Auto", {
      margin: 5,
      background: "red"
      })
      .add(new go.Shape("RoundedRectangle"))
      .add(new go.TextBlock("Some Text"))
      -
      -

      Parameters

      -
        -
      • -
        Optional type: string | PanelLayout
        -
        -

        Panel Type as either a string or PanelLayout. such as "Vertical", "Auto", or Panel.Vertical, Panel.Auto, are accepted. - If not supplied, the default Panel type is "Position".

        -
        -
      • -
      • -
        Optional init: Partial<Group>
        -
        -

        Optional initialization properties.

        -
        -
      • -
      -

      Returns Group

      -
    • -
    • -
      -

      Constructs an empty Panel. Default type is Panel.Position.

      -
      -

      Parameters

      -
        -
      • -
        Optional init: Partial<Group>
        -
        -

        Optional initialization properties.

        -
        -
      • -
      -

      Returns Group

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - computesBoundsAfterDrag - : boolean

    -
      -
    • -
      -

      Gets or sets whether the size of the area of the Group's placeholder - should remain the same during a DraggingTool move until a drop occurs. - Groups within temporary layers (such as new Groups during a drag-copy) are unaffected by this property.

      -

      In other words, when the value is true, re-computing the bounds of the - members is suspended until a drop occurs, at which time the border is recomputed, - perhaps not including some members that had been dragged out and reparented. - The initial value is false.

      -
      -
    • -
    -
    -
    - -

    - computesBoundsIncludingLinks - : boolean

    -
      -
    • -
      -

      Gets or sets whether a placeholder's bounds includes the bounds of member Links. - The default value is true. - If this is false, only non-Link member Parts are used to compute the Placeholder's bounds in document coordinates.

      -
      -
    • -
    -
    -
    - -

    - computesBoundsIncludingLocation - : boolean

    -
      -
    • -
      -

      Gets or sets whether a placeholder's bounds includes the previous Group.location. - The default value is false.

      -
      -
    • -
    -
    -
    - -

    - handlesDragDropForMembers - : boolean

    -
      -
    • -
      -

      Gets or sets whether drag-and-drop events may be bubbled up to this Group if not handled by member Parts. - The default value is false -- each Node or Link that is a member of the Group needs to define - its own GraphObject.mouseDragEnter, GraphObject.mouseDragLeave, and GraphObject.mouseDrop - event handlers if you want dragging/dropping on a member part to act as if the user were acting on the group.

      -

      This is currently restricted to only call the mouseDragEnter, mouseDragLeave, and mouseDrop event handlers - defined on the whole Group, not on any element inside the Group's visual tree.

      -
      -
      since
      -

      1.5

      -
      -
      -
      -
    • -
    -
    -
    - -

    - isSubGraphExpanded - : boolean

    -
      -
    • -
      -

      Gets or sets whether the subgraph contained by this group is expanded. - Changing this property's value will call collapseSubGraph or expandSubGraph, - and also will call the value of subGraphExpandedChanged if it is a function.

      -

      The initial value is true -- this group's member parts are shown.

      -

      There is an analogous property for expanded/collapsed trees of Nodes and Links: Node.isTreeExpanded.

      -
      -
    • -
    -
    -
    - -

    - layout - : Layout

    -
      -
    • -
      -

      Gets or sets the Layout used to position all of the immediate member nodes and links in this group. - By default this property is an instance of Layout -- no special layout is used, which just makes - sure each member node has a valid location.

      -
      -
    • -
    -
    -
    - -

    - memberAdded - : (thisGroup: Group, newPart: Part) => void

    -
      -
    • -
      -

      Gets or sets the function that is called after a member Part has been added to this Group. - It is typically used to modify the appearance of the group. - The first argument will be this Group. - The second argument will be a Part, typically a Node, but may be a simple Part or a Link.

      -

      If the value is a function, that function must not modify any membership relationships. - The member Part has already been added -- trying to remove it or adding or removing another member or the Group itself may produce undefined behavior.

      -

      The default value is null -- no function is called.

      -
      -
    • -
    -
    -
    - -

    - Read-only - memberParts - : Iterator<Part>

    -
      -
    • -
      -

      This read-only property returns an iterator over the member Parts of this Group. - Setting Part.containingGroup to refer to this Group - will add that part to this collection. - The Parts can be Nodes, Links, Groups, or simple Parts.

      -

      A template should not have any member parts.

      -
      -
    • -
    -
    -
    - -

    - memberRemoved - : (thisGroup: Group, oldPart: Part) => void

    -
      -
    • -
      -

      Gets or sets the function that is called after a member Part has been removed from this Group. - It is typically used to modify the appearance of the group. - The first argument will be this Group. - The second argument will be a Part, typically a Node, but may be a simple Part or a Link.

      -

      If the value is a function, that function must not modify any membership relationships. - The member Part has already been removed -- trying to add it or adding or removing another member or the Group itself may produce undefined behavior.

      -

      The default value is null -- no function is called.

      -
      -
    • -
    -
    -
    - -

    - memberValidation - : (thisGroup: Group, part: Part) => boolean

    -
      -
    • -
      -

      Gets or sets the predicate that determines whether or not a Part may become a member of this group. - If this is non-null, the predicate is called in addition to any CommandHandler.memberValidation predicate.

      -

      The default predicate is null, which is equivalent to simply returning true. - The first argument will be this Group. - The second argument will be a Part, typically a Node, but will not be a Link or an Adornment.

      -

      The function, if supplied, must not have any side-effects.

      -
      -
    • -
    -
    -
    - -

    - Read-only - placeholder - : Placeholder

    -
      -
    • -
      -

      This read-only property returns a Placeholder that this group may contain in its visual tree.

      -
      -
    • -
    -
    -
    - -

    - subGraphExpandedChanged - : (thisGroup: Group) => void

    -
      -
    • -
      -

      Gets or sets the function that is called when isSubGraphExpanded has changed value. - The argument to that function will be this Group.

      -

      If the value is a function, that function must not expand or collapse any groups. - The Group has already been expanded or collapsed -- trying to change it again may produce undefined behavior.

      -

      The default value is null -- no function is called.

      -
      -
    • -
    -
    -
    - -

    - ungroupable - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may ungroup this group. - The initial value is false.

      -
      -
      see
      -

      canUngroup

      -
      -
      -
      -
    • -
    -
    -
    - -

    - wasSubGraphExpanded - : boolean

    -
      -
    • -
      -

      Gets or sets whether the subgraph starting at this group - had been collapsed by a call to expandSubGraph on the containing Group. - The initial value is false.

      -
      -
      see
      -

      isSubGraphExpanded

      -
      -
      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Virtual - addMembers -

    -
      -
    • addMembers(coll: Iterable<Part>, check?: boolean): boolean
    • -
    -
      -
    • -
      -

      Add the Parts in the given collection as members of this Group - for those Parts for which CommandHandler.isValidMember returns true. - If the check argument to this method is not supplied or false, - this will set Part.containingGroup on each part unconditionally, not calling CommandHandler.isValidMember.

      -

      The CommandHandler predicate will use CommandHandler.memberValidation - and memberValidation, if either or both are defined.

      -

      At this time there is no "removeMembers" method. - If you want to make a collection of Parts to be top-level parts, not members of any Group but still in the Diagram, call CommandHandler.addTopLevelParts. - If you want to remove a collection of Parts not only from a Group but from the whole Diagram, call Diagram.removeParts.

      -
      -

      Parameters

      - -

      Returns boolean

      -

      true if all non-Links were added to this Group; false if some Parts or Nodes were not able to be added.

      -
    • -
    -
    -
    - -

    - Virtual - canAddMembers -

    - - -
    -
    - -

    - Virtual - canUngroup -

    -
      -
    • canUngroup(): boolean
    • -
    - -
    -
    - -

    - collapseSubGraph -

    -
      -
    • collapseSubGraph(): void
    • -
    -
      -
    • -
      -

      Hide each of the member nodes and links of this group, - and recursively collapse any member groups. - This changes the value of Part.isVisible of the whole subgraph and the parts owned by - those member nodes and links. - However, this group's visibility is unchanged.

      -

      This sets isSubGraphExpanded to false on this group and on all of the nested Groups. - For those nested Groups that were expanded, - wasSubGraphExpanded is set to true.

      -

      This method does not perform a transaction or start any animation.

      -

      To collapse trees made of Nodes and Links, use Node.collapseTree.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - expandSubGraph -

    -
      -
    • expandSubGraph(): void
    • -
    -
      -
    • -
      -

      Show each member node and link, - and perhaps recursively expand nested subgraphs. - This may change the value of Part.isVisible of the whole subgraph and the parts owned by - those member nodes and links. - However, this group's visibility is unchanged.

      -

      This sets isSubGraphExpanded to true on this group and on all of the nested Groups. - This will expand a nested group only if its wasSubGraphExpanded property was true.

      -

      This method does not perform a transaction or start any animation.

      -

      To expand trees made of Nodes and Links, use Node.expandTree.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - findExternalLinksConnected -

    - -
      -
    • -
      -

      Returns an iterator over all of the Links that connect with this group or any node contained by this group, - in either direction, but that are not internal to this group.

      -

      Links that are contained by this group (even in nested groups) are not included in the result collection.

      -
      -
      see
      -

      Node.findLinksConnected

      -
      -
      since
      -

      1.3

      -
      -
      -
      -

      Returns Iterator<Link>

      -
    • -
    -
    -
    - -

    - findExternalNodesConnected -

    - -
      -
    • -
      -

      Returns an iterator over all of the Nodes that are connected with this group or any node contained by this group, - by a link in either direction, but that are not internal to this group.

      -

      Nodes that are contained by this group (even in nested groups) are not included in the result collection. - However this group itself might be in the results if there is a reflexive link connected to this group.

      -
      -
      see
      -

      Node.findNodesConnected

      -
      -
      since
      -

      1.3

      -
      -
      -
      -

      Returns Iterator<Node>

      -
    • -
    -
    -
    - -

    - findSubGraphParts -

    -
      -
    • findSubGraphParts(): Set<Part>
    • -
    -
      -
    • -
      -

      Return a collection of Parts that are all of the nodes and links - that are members of this group, including inside nested groups and label nodes, - but excluding this group itself.

      -

      For member nodes that are Groups, this will include its members recursively.

      -

      If you want only the immediate members of this group, use the memberParts property.

      -

      If you want to find the collection of Nodes and Links that are in the subtree of a given Node, use Node.findTreeParts.

      -
      -

      Returns Set<Part>

      -
    • -
    -
    -
    - -

    - Override - move -

    -
      -
    • move(newpos: Point, useLocation?: boolean): void
    • -
    -
      -
    • -
      -

      Move this Group and all of its member parts, recursively.

      -

      This method does not perform a transaction or start any animation.

      -
      -

      Parameters

      -
        -
      • -
        newpos: Point
        -
        -

        a new Point in document coordinates.

        -
        -
      • -
      • -
        Optional useLocation: boolean
        -
        -

        true if you want to set the location instead of the position. False by default.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/GuidedDraggingTool.html b/api/symbols/GuidedDraggingTool.html index 227dcd51b..e044a029c 100644 --- a/api/symbols/GuidedDraggingTool.html +++ b/api/symbols/GuidedDraggingTool.html @@ -1,705 +1,97 @@ - - - - - - GuidedDraggingTool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class GuidedDraggingTool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    The GuidedDraggingTool class makes guidelines visible as the parts are dragged around a diagram - when the selected part is nearly aligned with another part.

    -

    If you want to experiment with this extension, try the Guided Dragging sample.

    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Constructs a GuidedDraggingTool and sets up the temporary guideline parts.

      -
      -

      Returns GuidedDraggingTool

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - centerGuidelineColor - : string

    -
      -
    • -
      -

      Gets or sets the color of center guidelines.

      -

      The default value is "gray".

      -
      -
    • -
    -
    -
    - -

    - guidelineSnapDistance - : number

    -
      -
    • -
      -

      Gets or sets the margin of error for which guidelines show up.

      -

      The default value is 6. - Guidelines will show up when the aligned nodes are ± 6px away from perfect alignment.

      -
      -
    • -
    -
    -
    - -

    - guidelineWidth - : number

    -
      -
    • -
      -

      Gets or sets the width guidelines.

      -

      The default value is 1.

      -
      -
    • -
    -
    -
    - -

    - horizontalGuidelineColor - : string

    -
      -
    • -
      -

      Gets or sets the color of horizontal guidelines.

      -

      The default value is "gray".

      -
      -
    • -
    -
    -
    - -

    - isGuidelineEnabled - : boolean

    -
      -
    • -
      -

      Gets or sets whether the guidelines are enabled or disables.

      -

      The default value is true.

      -
      -
    • -
    -
    -
    - -

    - isGuidelineSnapEnabled - : boolean

    -
      -
    • -
      -

      Gets or sets whether snapping to guidelines is enabled.

      -

      The default value is true.

      -
      -
    • -
    -
    -
    - -

    - searchDistance - : number

    -
      -
    • -
      -

      Gets or sets the distance around the selected part to search for aligned parts.

      -

      The default value is 1000. - Set this to Infinity if you want to search the entire diagram no matter how far away.

      -
      -
    • -
    -
    -
    - -

    - verticalGuidelineColor - : string

    -
      -
    • -
      -

      Gets or sets the color of vertical guidelines.

      -

      The default value is "gray".

      -
      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - guidelineHbottom - : Part

    -
    -
    - -

    - guidelineHcenter - : Part

    -
    -
    - -

    - guidelineHtop - : Part

    -
    -
    - -

    - guidelineVcenter - : Part

    -
    -
    - -

    - guidelineVleft - : Part

    -
    -
    - -

    - guidelineVright - : Part

    -
    -
    -
    -

    Methods

    -
    - -

    - clearGuidelines -

    -
      -
    • clearGuidelines(): void
    • -
    -
      -
    • -
      -

      Removes all of the guidelines from the grid.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doDeactivate -

    -
      -
    • doDeactivate(): void
    • -
    -
      -
    • -
      -

      Calls the base method and removes the guidelines from the graph.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doDragOver -

    - -
      -
    • -
      -

      Shows vertical and horizontal guidelines for the dragged part.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doDropOnto -

    - -
      -
    • -
      -

      On a mouse-up, snaps the selected part to the nearest guideline. - If not snapping, the part remains at its position.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - invalidateLinks -

    -
      -
    • invalidateLinks(node: Part): void
    • -
    -
      -
    • -
      -

      When nodes are shifted due to being guided upon a drop, make sure all connected link routes are invalidated, - since the node is likely to have moved a different amount than all its connected links in the regular - operation of the DraggingTool.

      -
      -

      Parameters

      -
        -
      • -
        node: Part
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Protected - isGuiding -

    -
      -
    • isGuiding(part: Part, guidedpart: Part): boolean
    • -
    -
      -
    • -
      -

      This predicate decides whether or not the given Part should guide the dragged part.

      -
      -

      Parameters

      -
        -
      • -
        part: Part
        -
        -

        a stationary Part to which the dragged part might be aligned

        -
        -
      • -
      • -
        guidedpart: Part
        -
        -

        the Part being dragged

        -
        -
      • -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - showHorizontalMatches -

    -
      -
    • showHorizontalMatches(part: Part, guideline: boolean, snap: boolean): void
    • -
    -
      -
    • -
      -

      This finds parts that are aligned near the selected part along horizontal lines. It compares the selected - part to all parts within a rectangle approximately twice the searchDistance wide. - The guidelines appear when a part is aligned within a margin-of-error equal to guidelineSnapDistance.

      -
      -

      Parameters

      -
        -
      • -
        part: Part
        -
      • -
      • -
        guideline: boolean
        -
        -

        if true, show guideline

        -
        -
      • -
      • -
        snap: boolean
        -
        -

        if true, snap the part to where the guideline would be

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - showVerticalMatches -

    -
      -
    • showVerticalMatches(part: Part, guideline: boolean, snap: boolean): void
    • -
    -
      -
    • -
      -

      This finds parts that are aligned near the selected part along vertical lines. It compares the selected - part to all parts within a rectangle approximately twice the searchDistance tall. - The guidelines appear when a part is aligned within a margin-of-error equal to guidelineSnapDistance.

      -
      -

      Parameters

      -
        -
      • -
        part: Part
        -
      • -
      • -
        guideline: boolean
        -
        -

        if true, show guideline

        -
        -
      • -
      • -
        snap: boolean
        -
        -

        if true, don't show guidelines but just snap the part to where the guideline would be

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class GuidedDraggingTool Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    The GuidedDraggingTool class makes guidelines visible as the parts are dragged around a diagram +when the selected part is nearly aligned with another part.

    +

    If you want to experiment with this extension, try the Guided Dragging sample.

    +

    Index

    Inherited Members

    Constructors

    • +

      Constructs a GuidedDraggingTool and sets up the temporary guideline parts.

      +

      Returns GuidedDraggingTool

    Properties

    • +

      Gets or sets the color of center guidelines.

      +

      The default value is "gray".

      +
    • +

      Gets or sets the margin of error for which guidelines show up.

      +

      The default value is 6. +Guidelines will show up when the aligned nodes are ± 6px away from perfect alignment.

      +
    • +

      Gets or sets the width guidelines.

      +

      The default value is 1.

      +
    • +

      Gets or sets the color of horizontal guidelines.

      +

      The default value is "gray".

      +
    • +

      Gets or sets whether the guidelines are enabled or disables.

      +

      The default value is true.

      +
    • +

      Gets or sets whether snapping to guidelines is enabled.

      +

      The default value is true.

      +
    • +

      Gets or sets the distance around the selected part to search for aligned parts.

      +

      The default value is 1000. +Set this to Infinity if you want to search the entire diagram no matter how far away.

      +
    • +

      Gets or sets the color of vertical guidelines.

      +

      The default value is "gray".

      +

    Properties

    Methods

    • clearGuidelines(): void
    • +

      Removes all of the guidelines from the grid.

      +

      Returns void

    • doDeactivate(): void
    • +

      Calls the base method and removes the guidelines from the graph.

      +

      Returns void

    • +

      Shows vertical and horizontal guidelines for the dragged part.

      +

      Parameters

      Returns void

    • +

      On a mouse-up, snaps the selected part to the nearest guideline. +If not snapping, the part remains at its position.

      +

      Parameters

      Returns void

    • invalidateLinks(node: Part): void
    • +

      When nodes are shifted due to being guided upon a drop, make sure all connected link routes are invalidated, +since the node is likely to have moved a different amount than all its connected links in the regular +operation of the DraggingTool.

      +

      Parameters

      Returns void

    • isGuiding(part: Part, guidedpart: Part): boolean
    • +

      This predicate decides whether or not the given Part should guide the dragged part.

      +

      Parameters

      • part: Part
        +

        a stationary Part to which the dragged part might be aligned

        +
      • guidedpart: Part
        +

        the Part being dragged

        +

      Returns boolean

    • showHorizontalMatches(part: Part, guideline: boolean, snap: boolean): void
    • +

      This finds parts that are aligned near the selected part along horizontal lines. It compares the selected +part to all parts within a rectangle approximately twice the searchDistance wide. +The guidelines appear when a part is aligned within a margin-of-error equal to guidelineSnapDistance.

      +

      Parameters

      • part: Part
      • guideline: boolean
        +

        if true, show guideline

        +
      • snap: boolean
        +

        if true, snap the part to where the guideline would be

        +

      Returns void

    • showVerticalMatches(part: Part, guideline: boolean, snap: boolean): void
    • +

      This finds parts that are aligned near the selected part along vertical lines. It compares the selected +part to all parts within a rectangle approximately twice the searchDistance tall. +The guidelines appear when a part is aligned within a margin-of-error equal to guidelineSnapDistance.

      +

      Parameters

      • part: Part
      • guideline: boolean
        +

        if true, show guideline

        +
      • snap: boolean
        +

        if true, don't show guidelines but just snap the part to where the guideline would be

        +

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/HTMLInfo.html b/api/symbols/HTMLInfo.html index e93128093..24c9e01a7 100644 --- a/api/symbols/HTMLInfo.html +++ b/api/symbols/HTMLInfo.html @@ -1,375 +1,107 @@ - - - - - - HTMLInfo | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class HTMLInfo

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - HTMLInfo -
    • -
    -
    -
    -
    -

    HTMLInfo is used to show and hide custom HTML page elements, such as a context menu, tooltip, or text editor made of HTML.

    -

    Properties that can be set to an HTMLInfo include:

    - -

    When a context menu is set to an instance of HTMLInfo, - ContextMenuTool.showContextMenu and ContextMenuTool.hideContextMenu - call show and hide respectively. You may define mainElement - instead of hide in order to automatically use a default hide method.

    -

    When a tooltip is set to an instance of HTMLInfo, - ToolManager.showToolTip and ToolManager.hideToolTip - call show and hide respectively.

    -

    When a text editor is set to an instance of HTMLInfo, - TextEditingTool.doActivate calls show and TextEditingTool.doDeactivate calls hide.

    -

    For HTMLInfo to work, you must define show - and either hide or mainElement. - Typical usage will also stop the ContextMenuTool once the desired context action occurs, - typically by calling diagram.currentTool.stopTool();.

    -

    Example usage of HTMLInfo can be found in the - Custom Context Menu and - HTML LightBox Context Menu samples, the - Custom TextEditingTool sample, and the - Text Editor implementation extension.

    -

    Here is the outline for typical usage of HTMLInfo as a context menu:

    -
    // Assign an HTMLInfo to the Diagram:
    -myDiagram.contextMenu = $(go.HTMLInfo, {
    -  show: showContextMenu,
    -  hide: hideContextMenu
    -});
    -
    -function showContextMenu(obj, diagram, tool) {
    -  // Show the context menu HTML element:
    -  SomeDOMElement.style.display = "block";
    -
    -  // Also show relevant buttons given the current state
    -  // and the GraphObject obj; if null, the context menu is for the whole Diagram
    -}
    -
    -function hideContextMenu() {
    -  SomeDOMElement.style.display = "none";
    -}
    -
    -function buttonClick() {
    -  // do some action when a context menu button is clicked
    -
    -  // then:
    -  myDiagram.currentTool.stopTool();
    -}
    +HTMLInfo | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class HTMLInfo

    Hierarchy

    • HTMLInfo
    +

    HTMLInfo is used to show and hide custom HTML page elements, such as a context menu, tooltip, or text editor made of HTML.

    +

    Properties that can be set to an HTMLInfo include:

    + +

    When a context menu is set to an instance of HTMLInfo, +ContextMenuTool.showContextMenu and ContextMenuTool.hideContextMenu +call show and hide respectively. You may define mainElement +instead of hide in order to automatically use a default hide method.

    +

    When a tooltip is set to an instance of HTMLInfo, +ToolManager.showToolTip and ToolManager.hideToolTip +call show and hide respectively.

    +

    When a text editor is set to an instance of HTMLInfo, +TextEditingTool.doActivate calls show and TextEditingTool.doDeactivate calls hide.

    +

    For HTMLInfo to work, you must define show +and either hide or mainElement. +Typical usage will also stop the ContextMenuTool once the desired context action occurs, +typically by calling diagram.currentTool.stopTool();.

    +

    Example usage of HTMLInfo can be found in the +Custom Context Menu and +HTML LightBox Context Menu samples, the +Custom TextEditingTool sample, and the +Text Editor implementation extension.

    +

    Here is the outline for typical usage of HTMLInfo as a context menu:

    +
    // Assign an HTMLInfo to the Diagram:
    myDiagram.contextMenu = $(go.HTMLInfo, {
    show: showContextMenu,
    hide: hideContextMenu
    });

    function showContextMenu(obj, diagram, tool) {
    // Show the context menu HTML element:
    SomeDOMElement.style.display = "block";

    // Also show relevant buttons given the current state
    // and the GraphObject obj; if null, the context menu is for the whole Diagram
    }

    function hideContextMenu() {
    SomeDOMElement.style.display = "none";
    }

    function buttonClick() {
    // do some action when a context menu button is clicked

    // then:
    myDiagram.currentTool.stopTool();
    }
    -

    By default, TextEditingTool.defaultTextEditor is an instance of HTMLInfo. - You can see its default implementation details here.

    -
    -
    since
    -

    1.7

    -
    -
    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - hide - : (a: Diagram, b: Tool) => void

    - -
    -
    - -

    - mainElement - : HTMLElement

    -
      -
    • -
      -

      Gets or sets the primary HTML Element that represents this HTMLInfo. - In a context menu, this would be the outermost HTML element, the one which typically - shows and hides. If this is set and hide is not, HTMLInfo will automatically execute:

      -
        tool.mainElement.style.display = "none";
      +

      By default, TextEditingTool.defaultTextEditor is an instance of HTMLInfo. +You can see its default implementation details here.

      +
      since

      1.7

      +

    Index

    Constructors

    Properties

    • +

      Gets or sets the primary HTML Element that represents this HTMLInfo. +In a context menu, this would be the outermost HTML element, the one which typically +shows and hides. If this is set and hide is not, HTMLInfo will automatically execute:

      +
        tool.mainElement.style.display = "none";
       
      -

      when hide would typically be called.

      -

      This is set only for convenience; the default value for this property is null.

      -
      -
      see
      -

      hide

      -
      -
      -
      -
    • -
    -
    -
    - -

    - show - : (a: GraphObject, b: Diagram, c: Tool) => void

    -
      -
    • -
      -

      Gets or sets the function to call when an HTMLInfo is to be shown, - such as when used as the GraphObject.contextMenu or Diagram.toolTip or TextBlock.textEditor.

      -

      If this is called by:

      - -

      If you need access to any bound data for the first argument, if it is non-null, you can get it via: - obj.part.data - and then you can look at any of the properties you have put on that data.

      -

      When used as a context menu, typically shown elements, such as buttons, should call - diagram.currentTool.stopTool(); when their action is completed.

      -
      -
    • -
    -
    -
    - -

    - valueFunction - : () => any

    -
      -
    • -
      -

      Gets or sets a function that returns the primary value associated with this HTMLInfo, - such as the string value of a text editor, which would be solicited by the TextEditingTool.

      -

      This typically returns a string.

      -
      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/IncrementalData.html b/api/symbols/IncrementalData.html index ab8147cbf..2c1c933a5 100644 --- a/api/symbols/IncrementalData.html +++ b/api/symbols/IncrementalData.html @@ -1,284 +1,50 @@ - - - - - - IncrementalData | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Interface IncrementalData

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - IncrementalData -
    • -
    -
    -
    -
    -

    Interface for the output object of Model.toIncrementalData.

    -

    All properties of this object are optional, as they are only included if changes occurred. - For instance, if a transaction didn't include any changes to modelData, the modelData property of this interface won't be included on the output object.

    -

    Any shared or cyclic references within the model data will be maintained on the data included on this output object.

    -
    -
    since
    -

    2.1

    -
    -
    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Properties

    -
    - -

    - Optional - insertedLinkKeys - : Key[]

    -
    -

    Array of link keys added. Any key included will also be included in the modifiedLinkData array.

    -
    -
    -
    - -

    - Optional - insertedNodeKeys - : Key[]

    -
    -

    Array of node keys added. Any key included will also be included in the modifiedNodeData array.

    -
    -
    -
    - -

    - Optional - modelData - : ObjectData

    -
    -

    Object containing the modified Model.modelData.

    -
    -
    -
    - -

    - Optional - modifiedLinkData - : ObjectData[]

    -
    -

    Array of link data objects modified.

    -
    -
    -
    - -

    - Optional - modifiedNodeData - : ObjectData[]

    -
    -

    Array of node data objects modified.

    -
    -
    -
    - -

    - Optional - removedLinkKeys - : Key[]

    -
    -

    Array of link keys deleted.

    -
    -
    -
    - -

    - Optional - removedNodeKeys - : Key[]

    -
    -

    Array of node keys deleted.

    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Interface IncrementalData

    Hierarchy

    • IncrementalData
    +

    Interface for the output object of Model.toIncrementalData.

    +

    All properties of this object are optional, as they are only included if changes occurred. +For instance, if a transaction didn't include any changes to modelData, the modelData property of this interface won't be included on the output object.

    +

    Any shared or cyclic references within the model data will be maintained on the data included on this output object.

    +
    since

    2.1

    +

    Index

    Properties

    +

    Array of link keys added. Any key included will also be included in the modifiedLinkData array.

    +
    +

    Array of node keys added. Any key included will also be included in the modifiedNodeData array.

    +
    +

    Object containing the modified Model.modelData.

    +
    +

    Array of link data objects modified.

    +
    +

    Array of node data objects modified.

    +
    +

    Array of link keys deleted.

    +
    +

    Array of node keys deleted.

    +

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/InputEvent.html b/api/symbols/InputEvent.html index e0bd7c34d..530b85ab1 100644 --- a/api/symbols/InputEvent.html +++ b/api/symbols/InputEvent.html @@ -1,875 +1,201 @@ - - - - - - InputEvent | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class InputEvent

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - InputEvent -
    • -
    -
    -
    -
    -

    An InputEvent represents a mouse or keyboard or touch event. - The principal properties hold information about a particular input event. - These properties include the documentPoint at which a mouse event - occurred in document coordinates, - the corresponding point in view/element coordinates, viewPoint, - the key for keyboard events, - and the modifiers and button at the time. - Additional descriptive properties include clickCount, delta, - timestamp, and the source event event (if available).

    -

    Many of its properties are provided for convenient access to the state of the input event, - such as asking whether the control key was held down at the time, - or the targetObject (a GraphObject) that the mouse was over .

    -

    When real events fire on the Diagram, InputEvents are created automatically set update the value of Diagram.lastInput. - These events set the value of event with the backing browser-defined Event, - which may be a MouseEvent, KeyboardEvent, PointerEvent, TouchEvent, and so on.

    -

    InputEvents backed by MouseEvents set both button, the button that caused the action, - and buttons, the set of buttons currently pressed after the action has happened. - By default a user-created InputEvent sets button and buttons as if the event was a left-click.

    -

    You can create InputEvents and set the value of Diagram.lastInput in order to simulate user actions in tools. - This can be useful for testing. See the Robot extension sample for - an example of creating InputEvents to simulate user input.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      The InputEvent class constructor produces an empty InputEvent. - You should never need to call this constructor. - But if you do, you must first set diagram to the Diagram before any other use.

      -
      -

      Returns InputEvent

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - alt - : boolean

    -
      -
    • -
      -

      Gets or sets whether the alt key is being held down. - This is true if the key was pressed at the time of the event.

      -
      -
      see
      -

      modifiers, control, shift, meta

      -
      -
      -
      -
    • -
    -
    -
    - -

    - bubbles - : boolean

    -
      -
    • -
      -

      Gets or sets whether the underlying event is prevented from bubbling up - the hierarchy of HTML elements outside of the Diagram and whether any default action is canceled. - Setting this is uncommon, but may be needed in some CommandHandler overrides in order to - pass along events, such as keystrokes, to parent elements of the Diagram.

      -

      Some event handlers may set this to true if the event should continue beyond the diagram's DIV - and result in any default behaviors by the user-agent. - The default value is false.

      -
      -
      since
      -

      2.2

      -
      -
      see
      -

      handled

      -
      -
      -
      -
    • -
    -
    -
    - -

    - button - : number

    -
      -
    • -
      -

      Gets or sets the numerical value representing the mouse button that caused this event.

      -

      Only one mouse button can cause an event at a time, - but the set of all buttons currently pressed is kept in buttons.

      -

      This property describes nothing during a mousemove event, - since no button press causes the event. Instead, use the convenience properties - left, middle, or right, or use the value - of buttons to determine which mouse buttons are - held during mousemove events.

      -

      Common values for this property:

      -
        -
      • 0: left mouse button
      • -
      • 1: middle mouse button
      • -
      • 2: right mouse button
      • -
      -

      Other values are possible if the mouse has additional buttons.

      -

      If there is no associated event, setting this also - sets the buttons flags to only this button.

      -

      This property is valid if this is a mouse event.

      -
      -
      see
      -

      buttons, left, middle, right

      -
      -
      -
      -
    • -
    -
    -
    - -

    - buttons - : number

    -
      -
    • -
      -

      Gets or sets the set of buttons that are currently being held down. - If this is a mouseup event, this set of buttons does not include - the button that was just released, which will be the value of button.

      -

      Common values for this property:

      -
        -
      • 0: not holding down any button
      • -
      • 1: left mouse button
      • -
      • 2: right mouse button
      • -
      • 3: both left and right mouse buttons
      • -
      • 4: middle mouse button
      • -
      • 5: middle and left mouse buttons
      • -
      • 6: middle and right mouse buttons
      • -
      • 7: all three common mouse buttons
      • -
      -

      Other values are possible if the mouse has additional buttons.

      -

      This property is valid if this is a mouse event.

      -
      -
      see
      -

      button, left, middle, right

      -
      -
      -
      -
    • -
    -
    -
    - -

    - clickCount - : number

    -
      -
    • -
      -

      Gets or sets whether this event represents a click or a double-click. - It is zero if not a click; one if a single-click; two if a double-click. - This property is valid if this is a mouse event.

      -
      -
    • -
    -
    -
    - -

    - control - : boolean

    -
      -
    • -
      -

      Gets or sets whether the control key is being held down. - This is true if the key was pressed at the time of the event.

      -
      -
      see
      -

      modifiers, shift, alt, meta

      -
      -
      -
      -
    • -
    -
    -
    - -

    - delta - : number

    -
      -
    • -
      -

      Gets or sets the amount of change associated with a mouse-wheel rotation. - It is an abstract number, either positive or negative. - This property is valid if this is a mouse-wheel event.

      -
      -
    • -
    -
    -
    - -

    - diagram - : Diagram

    -
      -
    • -
      -

      Gets the source diagram associated with the event.

      -
      -
    • -
    -
    -
    - -

    - documentPoint - : Point

    - -
    -
    - -

    - down - : boolean

    -
      -
    • -
      -

      Gets or sets whether the InputEvent represents a mouse-down or a key-down event. - The default value is false.

      -
      -
      since
      -

      1.1

      -
      -
      -
      -
    • -
    -
    -
    - -

    - event - : Event

    -
      -
    • -
      -

      Gets or sets the platform's user-agent-supplied event for this event. - It may be null if no underlying event exists.

      -
      -
      see
      -

      timestamp

      -
      -
      -
      -
    • -
    -
    -
    - -

    - handled - : boolean

    -
      -
    • -
      -

      Gets or sets whether an InputEvent that applies to a GraphObject and bubbles - up the chain of containing Panels is stopped from continuing up the chain.

      -

      Some event handlers may set this to true to avoid getting any behavior from the containing Panels. - The default value is false.

      -
      -
    • -
    -
    -
    - -

    - isMultiTouch - : boolean

    -
      -
    • -
      -

      This property is true when the InputEvent is caused by a touch event that registered more than one touch.

      -
      -
      see
      -

      isTouchEvent

      -
      -
      since
      -

      1.5

      -
      -
      -
      -
    • -
    -
    -
    - -

    - Read-only - isTouchEvent - : boolean

    -
      -
    • -
      -

      This read-only property is true when the InputEvent is caused by a touch event.

      -
      -
      see
      -

      isMultiTouch

      -
      -
      since
      -

      1.5

      -
      -
      -
      -
    • -
    -
    -
    - -

    - key - : string

    -
      -
    • -
      -

      Gets or sets the key pressed or released as this event. - This property is valid if this is a keyboard event.

      -
      -
    • -
    -
    -
    - -

    - left - : boolean

    -
      -
    • -
      -

      Gets or sets whether the logical left mouse button is being held down. - This is true if the button was pressed at the time of the event.

      -

      If this InputEvent has a event of type MouseEvent with e.type of "mouseup" or "mousedown", - this property uses the value of button. Otherwise, it uses the value of buttons.

      -

      When setting, this sets the value of buttons.

      -
      -
      see
      -

      button, middle, right

      -
      -
      -
      -
    • -
    -
    -
    - -

    - meta - : boolean

    -
      -
    • -
      -

      Gets or sets whether the meta key is being held down. - This is true if the key was pressed at the time of the event.

      -
      -
      see
      -

      modifiers, control, shift, alt

      -
      -
      -
      -
    • -
    -
    -
    - -

    - middle - : boolean

    -
      -
    • -
      -

      Gets or sets whether the logical middle mouse button is being held down. - This is true if the button was pressed at the time of the event.

      -
      -
      see
      -

      button, left, right

      -
      -
      -
      -
    • -
    -
    -
    - -

    - modifiers - : number

    -
      -
    • -
      -

      Gets or sets the modifier keys that were used with the mouse or keyboard event. - The number will be a combination of flags representing Control, Shift, Alt or Meta.

      -
      -
      see
      -

      control, shift, alt, meta

      -
      -
      -
      -
    • -
    -
    -
    - -

    - right - : boolean

    -
      -
    • -
      -

      Gets or sets whether the logical right mouse button is being held down. - This is true if the button was pressed at the time of the event.

      -
      -
      see
      -

      button, left, middle

      -
      -
      -
      -
    • -
    -
    -
    - -

    - shift - : boolean

    -
      -
    • -
      -

      Gets or sets whether the shift key is being held down. - This is true if the key was pressed at the time of the event.

      -
      -
      see
      -

      modifiers, control, alt, meta

      -
      -
      -
      -
    • -
    -
    -
    - -

    - targetDiagram - : Diagram

    -
      -
    • -
      -

      Gets or sets the diagram associated with the canvas that the event is currently targeting.

      -
      -
    • -
    -
    -
    - -

    - targetObject - : GraphObject

    -
      -
    • -
      -

      Gets or sets the GraphObject that is at the current mouse point, if any.

      -

      For those events that are bubbled up the chain of parent Panels, - this property provides access to the original GraphObject where the input event occurred.

      -
      -
      see
      -

      handled

      -
      -
      -
      -
    • -
    -
    -
    - -

    - timestamp - : number

    -
      -
    • -
      -

      Gets or sets the time at which the event occurred, in milliseconds.

      -
      -
    • -
    -
    -
    - -

    - up - : boolean

    -
      -
    • -
      -

      Gets or sets whether the InputEvent represents a mouse-up or a key-up event. - The default value is false.

      -
      -
      since
      -

      1.1

      -
      -
      -
      -
    • -
    -
    -
    - -

    - viewPoint - : Point

    -
      -
    • -
      -

      Gets or sets the point at which this input event occurred. - The Point is in view coordinates within the viewport, not in document coordinates. - This should be valid for mouse events. - For keyboard events, this is the last available mouse point.

      -
      -
      see
      -

      documentPoint, Diagram.transformViewToDoc, Diagram.transformDocToView

      -
      -
      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Virtual - copy -

    - -
      -
    • -
      -

      Make a copy of this InputEvent.

      -
      -

      Returns InputEvent

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class InputEvent

    Hierarchy

    • InputEvent
    +

    An InputEvent represents a mouse or keyboard or touch event. +The principal properties hold information about a particular input event. +These properties include the documentPoint at which a mouse event +occurred in document coordinates, +the corresponding point in view/element coordinates, viewPoint, +the key for keyboard events, +and the modifiers and button at the time. +Additional descriptive properties include clickCount, delta, +timestamp, and the source event event (if available).

    +

    Many of its properties are provided for convenient access to the state of the input event, +such as asking whether the control key was held down at the time, +or the targetObject (a GraphObject) that the mouse was over .

    +

    When real events fire on the Diagram, InputEvents are created automatically set update the value of Diagram.lastInput. +These events set the value of event with the backing browser-defined Event, +which may be a MouseEvent, KeyboardEvent, PointerEvent, TouchEvent, and so on.

    +

    InputEvents backed by MouseEvents set both button, the button that caused the action, +and buttons, the set of buttons currently pressed after the action has happened. +By default a user-created InputEvent sets button and buttons as if the event was a left-click.

    +

    You can create InputEvents and set the value of Diagram.lastInput in order to simulate user actions in tools. +This can be useful for testing. See the Robot extension sample for +an example of creating InputEvents to simulate user input.

    +

    Index

    Constructors

    • +

      The InputEvent class constructor produces an empty InputEvent. +You should never need to call this constructor. +But if you do, you must first set diagram to the Diagram before any other use.

      +

      Returns InputEvent

    Properties

    • +

      Gets or sets whether the alt key is being held down. +This is true if the key was pressed at the time of the event.

      +
      see

      modifiers, control, shift, meta

      +
    • +

      Gets or sets whether the underlying event is prevented from bubbling up +the hierarchy of HTML elements outside of the Diagram and whether any default action is canceled. +Setting this is uncommon, but may be needed in some CommandHandler overrides in order to +pass along events, such as keystrokes, to parent elements of the Diagram.

      +

      Some event handlers may set this to true if the event should continue beyond the diagram's DIV +and result in any default behaviors by the user-agent. +The default value is false.

      +
      since

      2.2

      +
      see

      handled

      +
    • +

      Gets or sets the numerical value representing the mouse button that caused this event.

      +

      Only one mouse button can cause an event at a time, +but the set of all buttons currently pressed is kept in buttons.

      +

      This property describes nothing during a mousemove event, +since no button press causes the event. Instead, use the convenience properties +left, middle, or right, or use the value +of buttons to determine which mouse buttons are +held during mousemove events.

      +

      Common values for this property:

      +
        +
      • 0: left mouse button
      • +
      • 1: middle mouse button
      • +
      • 2: right mouse button
      • +
      +

      Other values are possible if the mouse has additional buttons.

      +

      If there is no associated event, setting this also +sets the buttons flags to only this button.

      +

      This property is valid if this is a mouse event.

      +
      see

      buttons, left, middle, right

      +
    • +

      Gets or sets the set of buttons that are currently being held down. +If this is a mouseup event, this set of buttons does not include +the button that was just released, which will be the value of button.

      +

      Common values for this property:

      +
        +
      • 0: not holding down any button
      • +
      • 1: left mouse button
      • +
      • 2: right mouse button
      • +
      • 3: both left and right mouse buttons
      • +
      • 4: middle mouse button
      • +
      • 5: middle and left mouse buttons
      • +
      • 6: middle and right mouse buttons
      • +
      • 7: all three common mouse buttons
      • +
      +

      Other values are possible if the mouse has additional buttons.

      +

      This property is valid if this is a mouse event.

      +
      see

      button, left, middle, right

      +
    • +

      Gets or sets whether this event represents a click or a double-click. +It is zero if not a click; one if a single-click; two if a double-click. +This property is valid if this is a mouse event.

      +
    • +

      Gets or sets whether the control key is being held down. +This is true if the key was pressed at the time of the event.

      +
      see

      modifiers, shift, alt, meta

      +
    • +

      Gets or sets the amount of change associated with a mouse-wheel rotation. +It is an abstract number, either positive or negative. +This property is valid if this is a mouse-wheel event.

      +
    • +

      Gets the source diagram associated with the event.

      +
    • +

      Gets or sets whether the InputEvent represents a mouse-down or a key-down event. +The default value is false.

      +
      since

      1.1

      +
    • +

      Gets or sets the platform's user-agent-supplied event for this event. +It may be null if no underlying event exists.

      +
      see

      timestamp

      +
    • +

      Gets or sets whether an InputEvent that applies to a GraphObject and bubbles +up the chain of containing Panels is stopped from continuing up the chain.

      +

      Some event handlers may set this to true to avoid getting any behavior from the containing Panels. +The default value is false.

      +
    • +

      This property is true when the InputEvent is caused by a touch event that registered more than one touch.

      +
      see

      isTouchEvent

      +
      since

      1.5

      +
    • +

      This read-only property is true when the InputEvent is caused by a touch event.

      +
      see

      isMultiTouch

      +
      since

      1.5

      +
    • +

      Gets or sets the key pressed or released as this event. +This property is valid if this is a keyboard event.

      +
    • +

      Gets or sets whether the logical left mouse button is being held down. +This is true if the button was pressed at the time of the event.

      +

      If this InputEvent has a event of type MouseEvent with e.type of "mouseup" or "mousedown", +this property uses the value of button. Otherwise, it uses the value of buttons.

      +

      When setting, this sets the value of buttons.

      +
      see

      button, middle, right

      +
    • +

      Gets or sets whether the meta key is being held down. +This is true if the key was pressed at the time of the event.

      +
      see

      modifiers, control, shift, alt

      +
    • +

      Gets or sets whether the logical middle mouse button is being held down. +This is true if the button was pressed at the time of the event.

      +
      see

      button, left, right

      +
    • +

      Gets or sets the modifier keys that were used with the mouse or keyboard event. +The number will be a combination of flags representing Control, Shift, Alt or Meta.

      +
      see

      control, shift, alt, meta

      +
    • +

      Gets or sets whether the logical right mouse button is being held down. +This is true if the button was pressed at the time of the event.

      +
      see

      button, left, middle

      +
    • +

      Gets or sets whether the shift key is being held down. +This is true if the key was pressed at the time of the event.

      +
      see

      modifiers, control, alt, meta

      +
    • +

      Gets or sets the diagram associated with the canvas that the event is currently targeting.

      +
    • +

      Gets or sets the GraphObject that is at the current mouse point, if any.

      +

      For those events that are bubbled up the chain of parent Panels, +this property provides access to the original GraphObject where the input event occurred.

      +
      see

      handled

      +
    • +

      Gets or sets the time at which the event occurred, in milliseconds.

      +
    • +

      Gets or sets whether the InputEvent represents a mouse-up or a key-up event. +The default value is false.

      +
      since

      1.1

      +

    Methods

    • +

      Make a copy of this InputEvent.

      +

      Returns InputEvent

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Inspector.html b/api/symbols/Inspector.html index 106cec6a1..214e26e0e 100644 --- a/api/symbols/Inspector.html +++ b/api/symbols/Inspector.html @@ -1,782 +1,165 @@ - - - - - - Inspector | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class Inspector

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    -
      -
    • - Inspector -
    • -
    -
    -
    -
    -

    This class implements an inspector for GoJS model data objects. - The constructor takes three arguments:

    -
      -
    • divid string a string referencing the HTML ID of the to-be inspector's div
    • -
    • diagram Diagram a reference to a GoJS Diagram
    • -
    • options Object an optional JS Object describing options for the inspector
    • -
    -

    Options:

    - -

    Options for properties:

    -
      -
    • show boolean | function a boolean value to show or hide the property from the inspector, or a predicate function to show conditionally.
    • -
    • readOnly boolean | function whether or not the property is read-only
    • -
    • type string a string describing the data type. Supported values: "string|number|boolean|color|arrayofnumber|point|rect|size|spot|margin|select|date|datetime-local|time"
    • -
    • defaultValue any a default value for the property. Defaults to the empty string.
    • -
    • choices Array | function when type === "select", the Array of choices to use or a function that returns the Array of choices.
    • -
    -

    Example usage of Inspector:

    -
    var inspector = new Inspector("myInspector", myDiagram,
    -  {
    -    includesOwnProperties: false,
    -    properties: {
    -      "key": { show: Inspector.showIfPresent, readOnly: true },
    -      "comments": { show: Inspector.showIfNode  },
    -      "LinkComments": { show: Inspector.showIfLink },
    -      "chosen": { show: Inspector.showIfNode, type: "checkbox" },
    -      "state": { show: Inspector.showIfNode, type: "select", choices: ["Stopped", "Parked", "Moving"] }
    -    }
    -  });
    +Inspector | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class Inspector Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    • Inspector
    +

    This class implements an inspector for GoJS model data objects. +The constructor takes three arguments:

    +
      +
    • divid string a string referencing the HTML ID of the to-be inspector's div
    • +
    • diagram Diagram a reference to a GoJS Diagram
    • +
    • options Object an optional JS Object describing options for the inspector
    • +
    +

    Options:

    + +

    Options for properties:

    +
      +
    • show boolean | function a boolean value to show or hide the property from the inspector, or a predicate function to show conditionally.
    • +
    • readOnly boolean | function whether or not the property is read-only
    • +
    • type string a string describing the data type. Supported values: "string|number|boolean|color|arrayofnumber|point|rect|size|spot|margin|select|date|datetime-local|time"
    • +
    • defaultValue any a default value for the property. Defaults to the empty string.
    • +
    • choices Array | function when type === "select", the Array of choices to use or a function that returns the Array of choices.
    • +
    +

    Example usage of Inspector:

    +
    var inspector = new Inspector("myInspector", myDiagram,
    {
    includesOwnProperties: false,
    properties: {
    "key": { show: Inspector.showIfPresent, readOnly: true },
    "comments": { show: Inspector.showIfNode },
    "LinkComments": { show: Inspector.showIfLink },
    "chosen": { show: Inspector.showIfNode, type: "checkbox" },
    "state": { show: Inspector.showIfNode, type: "select", choices: ["Stopped", "Parked", "Moving"] }
    }
    });
    -

    This is the basic HTML Structure that the Inspector creates within the given DIV element:

    -
    <div id="divid" class="inspector">
    -  <tr>
    -    <td>propertyName</td>
    -    <td><input value=propertyValue /></td>
    -  </tr>
    -  ...
    -</div>
    +

    This is the basic HTML Structure that the Inspector creates within the given DIV element:

    +
    <div id="divid" class="inspector">
    <tr>
    <td>propertyName</td>
    <td><input value=propertyValue /></td>
    </tr>
    ...
    </div>
    -

    If you want to experiment with this extension, try the Data Inspector sample.

    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Constructs an Inspector and sets up properties based on the options provided. - Also sets up change listeners on the Diagram so the Inspector stays up-to-date.

      -
      -

      Parameters

      -
        -
      • -
        divid: string
        -
        -

        a string referencing the HTML ID of the to-be Inspector's div

        -
        -
      • -
      • -
        diagram: Diagram
        -
        -

        a reference to a GoJS Diagram

        -
        -
      • -
      • -
        Optional options: {}
        -
        -

        an optional JS Object describing options for the inspector

        -
        -
          -
        • -
          [index: string]: any
          -
        • -
        -
      • -
      -

      Returns Inspector

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - diagram - : Diagram

    -
      -
    • -
      -

      Gets or sets the Diagram associated with this Inspector.

      -
      -
    • -
    -
    -
    - -

    - Read-only - div - : HTMLDivElement

    -
      -
    • -
      -

      This read-only property returns the HTMLElement containing the Inspector.

      -
      -
    • -
    -
    -
    - -

    - includesOwnProperties - : boolean

    -
      -
    • -
      -

      Gets or sets whether the Inspector includes all properties currently on the inspected object.

      -

      The default value is true.

      -
      -
    • -
    -
    -
    - -

    - inspectSelection - : boolean

    -
      -
    • -
      -

      Gets or sets whether the Inspector automatically inspects the associated Diagram's selection. - When set to false, the Inspector won't show anything until inspectObject is called.

      -

      The default value is true.

      -
      -
    • -
    -
    -
    - -

    - Read-only - inspectedObject - : ObjectData

    -
      -
    • -
      -

      This read-only property returns the object currently being inspected.

      -

      To set the inspected object, call inspectObject.

      -
      -
    • -
    -
    -
    - -

    - multipleSelection - : boolean

    -
      -
    • -
      -

      Gets or sets whether the Inspector displays properties for multiple selected objects or just the first.

      -

      The default value is false, meaning only the first item in the Diagram.selection is inspected.

      -
      -
    • -
    -
    -
    - -

    - properties - : ObjectData

    -
      -
    • -
      -

      Gets or sets the properties that the Inspector will inspect, maybe setting options for those properties. - The object should contain string: Object pairs represnting propertyName: propertyOptions. - Can be used to include or exclude additional properties.

      -

      The default value is an empty object.

      -
      -
    • -
    -
    -
    - -

    - propertyModified - : (a: string, b: string, c: Inspector) => void

    -
      -
    • -
      -

      Gets or sets the function to be called when a property is modified by the Inspector. - The first paremeter will be the property name, the second will be the new value, and the third will be a reference to this Inspector.

      -

      The default value is null, meaning nothing will be done.

      -
      -
    • -
    -
    -
    - -

    - showLimit - : number

    -
      -
    • -
      -

      Gets or sets how many objects will be displayed when multipleSelection is true.

      -

      The default value is 0, meaning all selected objects will be displayed for a given property.

      -
      -
    • -
    -
    -
    - -

    - showUnionProperties - : boolean

    -
      -
    • -
      -

      Gets or sets whether the Inspector displays the union or intersection of properties for multiple selected objects.

      -

      The default value is false, meaning the intersection of properties is inspected.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - buildPropertyRow -

    -
      -
    • buildPropertyRow(propertyName: string, propertyValue: any): HTMLTableRowElement
    • -
    -
      -
    • -
      -

      This sets inspectedProperties[propertyName] and creates the HTML table row for a given property:

      -
      <tr>
      -  <td>propertyName</td>
      -  <td><input value=propertyValue /></td>
      -</tr>
      +

      If you want to experiment with this extension, try the Data Inspector sample.

      +

    Index

    Constructors

    • +

      Constructs an Inspector and sets up properties based on the options provided. +Also sets up change listeners on the Diagram so the Inspector stays up-to-date.

      +

      Parameters

      • divid: string
        +

        a string referencing the HTML ID of the to-be Inspector's div

        +
      • diagram: Diagram
        +

        a reference to a GoJS Diagram

        +
      • Optional options: {}
        +

        an optional JS Object describing options for the inspector

        +
        • [index: string]: any

      Returns Inspector

    Properties

    • +

      Gets or sets the Diagram associated with this Inspector.

      +
    • +

      This read-only property returns the HTMLElement containing the Inspector.

      +
    • +

      Gets or sets whether the Inspector includes all properties currently on the inspected object.

      +

      The default value is true.

      +
    • +

      Gets or sets whether the Inspector automatically inspects the associated Diagram's selection. +When set to false, the Inspector won't show anything until inspectObject is called.

      +

      The default value is true.

      +
    • +

      This read-only property returns the object currently being inspected.

      +

      To set the inspected object, call inspectObject.

      +
    • +

      Gets or sets whether the Inspector displays properties for multiple selected objects or just the first.

      +

      The default value is false, meaning only the first item in the Diagram.selection is inspected.

      +
    • +

      Gets or sets the properties that the Inspector will inspect, maybe setting options for those properties. +The object should contain string: Object pairs represnting propertyName: propertyOptions. +Can be used to include or exclude additional properties.

      +

      The default value is an empty object.

      +
    • +

      Gets or sets the function to be called when a property is modified by the Inspector. +The first paremeter will be the property name, the second will be the new value, and the third will be a reference to this Inspector.

      +

      The default value is null, meaning nothing will be done.

      +
    • +

      Gets or sets how many objects will be displayed when multipleSelection is true.

      +

      The default value is 0, meaning all selected objects will be displayed for a given property.

      +
    • +

      Gets or sets whether the Inspector displays the union or intersection of properties for multiple selected objects.

      +

      The default value is false, meaning the intersection of properties is inspected.

      +

    Methods

    • buildPropertyRow(propertyName: string, propertyValue: any): HTMLTableRowElement
    • +

      This sets inspectedProperties[propertyName] and creates the HTML table row for a given property:

      +
      <tr>
      <td>propertyName</td>
      <td><input value=propertyValue /></td>
      </tr>
      -

      This method can be customized to change how an Inspector row is rendered.

      -
      -

      Parameters

      -
        -
      • -
        propertyName: string
        -
        -

        the property name

        -
        -
      • -
      • -
        propertyValue: any
        -
        -

        the property value

        -
        -
      • -
      -

      Returns HTMLTableRowElement

      -

      the table row

      -
    • -
    -
    -
    - -

    - canEditProperty -

    -
      -
    • canEditProperty(propertyName: string, propertyDesc: ObjectData, inspectedObject: ObjectData): boolean
    • -
    -
      -
    • -
      -

      This predicate should be false if the given property should not be editable by the user. - Normally it only checks the value of "readOnly" on the property descriptor.

      -

      The default value is true.

      -
      -

      Parameters

      -
        -
      • -
        propertyName: string
        -
        -

        the property name

        -
        -
      • -
      • -
        propertyDesc: ObjectData
        -
        -

        the property descriptor

        -
        -
      • -
      • -
        inspectedObject: ObjectData
        -
        -

        the data object

        -
        -
      • -
      -

      Returns boolean

      -

      whether a particular property should be shown in this Inspector

      -
    • -
    -
    -
    - -

    - canShowProperty -

    -
      -
    • canShowProperty(propertyName: string, propertyDesc: ObjectData, inspectedObject: ObjectData): boolean
    • -
    -
      -
    • -
      -

      This predicate should be false if the given property should not be shown. - Normally it only checks the value of "show" on the property descriptor.

      -

      The default value is true.

      -
      -

      Parameters

      -
        -
      • -
        propertyName: string
        -
        -

        the property name

        -
        -
      • -
      • -
        propertyDesc: ObjectData
        -
        -

        the property descriptor

        -
        -
      • -
      • -
        inspectedObject: ObjectData
        -
        -

        the data object

        -
        -
      • -
      -

      Returns boolean

      -

      whether a particular property should be shown in this Inspector

      -
    • -
    -
    -
    - -

    - inspectObject -

    - -
      -
    • -
      -

      Update the HTML state of this Inspector with the given object.

      -

      If passed an object, the Inspector will inspect that object. - If passed null, this will do nothing. - If no parameter is supplied, the inspectedObject will be set based on the value of inspectSelection.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - Static - showIfGroup -

    -
      -
    • showIfGroup(part: Part): boolean
    • -
    -
      -
    • -
      -

      This predicate function can be used as a value for the show option for properties. - When used, the property will only be shown when inspecting a Group.

      -
      -

      Parameters

      -
        -
      • -
        part: Part
        -
        -

        the Part being inspected

        -
        -
      • -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Static - showIfLink -

    -
      -
    • showIfLink(part: Part): boolean
    • -
    -
      -
    • -
      -

      This predicate function can be used as a value for the show option for properties. - When used, the property will only be shown when inspecting a Link.

      -
      -

      Parameters

      -
        -
      • -
        part: Part
        -
        -

        the Part being inspected

        -
        -
      • -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Static - showIfNode -

    -
      -
    • showIfNode(part: Part): boolean
    • -
    -
      -
    • -
      -

      This predicate function can be used as a value for the show option for properties. - When used, the property will only be shown when inspecting a Node.

      -
      -

      Parameters

      -
        -
      • -
        part: Part
        -
        -

        the Part being inspected

        -
        -
      • -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Static - showIfPresent -

    -
      -
    • showIfPresent(data: Part, propname: string): boolean
    • -
    -
      -
    • -
      -

      This predicate function can be used as a value for the show option for properties. - When used, the property will only be shown if present. - Useful for properties such as key, which will be shown on Nodes and Groups, but normally not on Links

      -
      -

      Parameters

      -
        -
      • -
        data: Part
        -
      • -
      • -
        propname: string
        -
        -

        the property to check presence of

        -
        -
      • -
      -

      Returns boolean

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Iterable.html b/api/symbols/Iterable.html index 5c305acb2..a8c2e4e77 100644 --- a/api/symbols/Iterable.html +++ b/api/symbols/Iterable.html @@ -1,268 +1,46 @@ - - - - - - Iterable | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Interface Iterable<T>

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    This interface is implemented by the List, Set, and Map - classes; it provides the iterator read-only property that returns an Iterator.

    -

    Typical usage is:

    -
    var it = anIterableCollection.iterator;
    -while (it.next()) {
    -  var item = it.value;
    -}
    +Iterable | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Interface Iterable<T>

    Hierarchy

    +

    This interface is implemented by the List, Set, and Map +classes; it provides the iterator read-only property that returns an Iterator.

    +

    Typical usage is:

    +
    var it = anIterableCollection.iterator;
    while (it.next()) {
    var item = it.value;
    }
    -
    -
    -
    -

    Type parameters

    -
      -
    • -

      T

      -
    • -
    -
    -
    -

    Implemented by

    - -
    -
    -

    Index

    -
    -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Properties

    -
    - -

    - Readonly - count - : number

    -
    -

    This read-only property is the number of elements in the collection.

    -
    -
    -
    - -

    - iterator - : Iterator<T>

    -
    -

    Gets an Iterator that can iterate over the items in the collection.

    -

    Typical usage is:

    -
     var it = anIterableCollection.iterator;
    - while (it.next()) {
    -   var item = it.value;
    - }
    +

    Type parameters

    • T

    Implemented by

    Index

    Properties

    Methods

    Properties

    +

    This read-only property is the number of elements in the collection.

    +
    +

    Gets an Iterator that can iterate over the items in the collection.

    +

    Typical usage is:

    +
     var it = anIterableCollection.iterator;
    while (it.next()) {
    var item = it.value;
    }
    -
    -
    -
    -
    -

    Methods

    -
    - -

    - first -

    -
      -
    • first(): T
    • -
    -
      -
    • -
      -

      Returns the first item in the list, or null if there is none.

      -
      -

      Returns T

      -

      This returns null if there are no items in the list.

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Iterator.html b/api/symbols/Iterator.html index c46e0e93b..be0d3b78d 100644 --- a/api/symbols/Iterator.html +++ b/api/symbols/Iterator.html @@ -1,469 +1,90 @@ - - - - - - Iterator | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Interface Iterator<T>

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - Iterable<T> -
        -
      • - Iterator -
      • -
      -
    • -
    -
    -
    -
    -

    This interface defines properties and methods for iterating over a collection; - it provides the next predicate and the value read-only property. - Some Iterators also provide key property values along with each value.

    -

    Typical usage is:

    -
     var it = anIterableCollection.iterator;
    - while (it.next()) {
    -   var item = it.value;
    - }
    +Iterator | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Interface Iterator<T>

    Hierarchy

    +

    This interface defines properties and methods for iterating over a collection; +it provides the next predicate and the value read-only property. +Some Iterators also provide key property values along with each value.

    +

    Typical usage is:

    +
     var it = anIterableCollection.iterator;
    while (it.next()) {
    var item = it.value;
    }
    -

    Many iterators will signal an error if next is called - after the underlying collection has been modified.

    -

    To avoid confusion when dealing with Iterables, - iterators implement the Iterable.iterator property - by just returning themselves.

    -
    -
    -
    -

    Type parameters

    -
      -
    • -

      T

      -
    • -
    -
    -
    -

    Index

    -
    -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Properties

    -
    - -

    - Readonly Override - count - : number

    -
    -

    This read-only property is the total number of items in the iterated collection.

    -
    -
    -
    - -

    - Override - iterator - : Iterator<T>

    -
    -

    Returns itself, which is convenient for code that expects an Iterable - instead of an Iterator.

    -
    -
    -
    - -

    - Readonly - key - : any

    -
    -

    Gets the current index to the item in the collection, assuming next has just returned true.

    -
    -
    -
    - -

    - Readonly - value - : T

    -
    -

    Gets the current item in the collection, assuming next has just returned true.

    -
    -
    -
    -
    -

    Methods

    -
    - -

    - Virtual - all -

    -
      -
    • all(pred: (x: T) => boolean): boolean
    • -
    -
      -
    • -
      -

      This is true if all invocations of the given predicate on items in the collection are true.

      -

      Call the given predicate on each item in the collection. - As soon as a call returns false, this returns false. - Otherwise this returns true. - For an empty collection this returns true.

      -

      This automatically reset's itself when it is called.

      -
      -
      since
      -

      1.4

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        pred: (x: T) => boolean
        -
        -

        This function must not have any side-effects.

        -
        -
          -
        -
      • -
      -

      Returns boolean

      -

      True if all predicate calls are true; false otherwise.

      -
    • -
    -
    -
    - -

    - Virtual - any -

    -
      -
    • any(pred: (x: T) => boolean): boolean
    • -
    -
      -
    • -
      -

      This is true if any invocation of the given predicate on items in the collection is true.

      -

      Call the given predicate on each item in the collection. - As soon as a call returns true, this returns true. - Otherwise this returns false. - For an empty collection this returns false.

      -

      This automatically reset's itself when it is called.

      -
      -
      since
      -

      1.4

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        pred: (x: T) => boolean
        -
        -

        This function must not have any side-effects.

        -
        -
          -
        -
      • -
      -

      Returns boolean

      -

      True if any predicate call is true; false otherwise.

      -
    • -
    -
    -
    - -

    - Virtual - each -

    -
      -
    • each(func: (x: T) => void): void
    • -
    -
      -
    • -
      -

      Call the given function on each item in the collection.

      -

      This automatically reset's itself when it is called.

      -
      -
      since
      -

      1.4

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        func: (x: T) => void
        -
        -

        This function must not modify the collection.

        -
        -
          -
        -
      • -
      -

      Returns void

      -

      this iterator itself

      -
    • -
    -
    -
    - -

    - Override - first -

    -
      -
    • first(): T
    • -
    -
      -
    • -
      -

      Advance if needed to the first item in the collection and return it, or return null if there is none.

      -

      Caution: this returns a key/value pair, not a value, for Map iterators.

      -
      -
      since
      -

      1.1

      -
      -
      -
      -

      Returns T

      -
    • -
    -
    -
    - -

    - next -

    -
      -
    • next(): boolean
    • -
    -
      -
    • -
      -

      Call this method to advance the iterator to the next item in the collection. - This should be called before accessing any value.

      -
      -

      Returns boolean

      -

      whether another item is available; when true the value of value will be that item.

      -
    • -
    -
    -
    - -

    - reset -

    -
      -
    • reset(): void
    • -
    -
      -
    • -
      -

      Start this iterator all over again.

      -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Layer.html b/api/symbols/Layer.html index 30eb0e6f0..e4953c9af 100644 --- a/api/symbols/Layer.html +++ b/api/symbols/Layer.html @@ -1,972 +1,232 @@ - - - - - - Layer | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class Layer

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - Layer -
    • -
    -
    -
    -
    -

    Layers are how named collections of Parts are drawn in front or behind other collections of Parts in a Diagram. - Layers can only contain Parts, such as Nodes and Links. They cannot hold GraphObjects directly.

    -

    You put a Part into a Layer by assigning Part.layerName with the name of the Layer. - You can use data binding to initialize and remember a Part's layer's name. - You can change a Part's layer by modifying its Part.layerName, which changes its Part.layer.

    -

    Each Diagram starts off with the following list of Layers: - "Grid", "Background", "" (the default layer), "Foreground", "Adornment", "Tool". - Parts are normally put in the default layer. - The "Grid", "Adornment", and "Tool" layers are considered isTemporary. - Changes to objects in temporary layers are not recorded by the UndoManager. - Parts in temporary layers are not selected and are not considered to be part of the document. - Objects in temporary layers do not receive click events unless you set their GraphObject.isActionable to true. - The "Grid" layer is the furthest back; it also contains "temporary" parts that cannot be selected. - Furthermore the "Grid" layer has pickable set to false so that mouse or touch events - and calls to the "find..." methods do not even consider any parts in that layer.

    -

    Layers have many properties that control what actions users are permitted to perform involving the parts in the layer. - These properties are very much like the similarly named properties on Diagram.

    -

    Z-ordering

    -

    Layers are drawn and presented in order. - You can add your own layers by calling Diagram.addLayerBefore or Diagram.addLayerAfter - to insert a new layer at a particular place in the Z-order, or to re-order existing layers. - Use Diagram.findLayer to get the Layer with a particular name. - Parts can be individually z-ordered within a layer by setting Part.zOrder.

    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      This constructs an empty Layer; you should set the name before adding the Layer to a Diagram.

      -
      -

      Parameters

      -
        -
      • -
        Optional init: Partial<Layer>
        -
        -

        Optional properties to initialize.

        -
        -
      • -
      -

      Returns Layer

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - allowCopy - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may copy objects in this layer. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowDelete - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may delete objects in this layer. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowGroup - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may group parts together in this layer. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowLink - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may draw new links in this layer. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowMove - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may move objects in this layer. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowRelink - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may reconnect existing links in this layer. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowReshape - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may reshape parts in this layer. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowResize - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may resize parts in this layer. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowRotate - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may rotate parts in this layer. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowSelect - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may select objects in this layer. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowTextEdit - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may do in-place text editing in this layer. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - allowUngroup - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may ungroup existing groups in this layer. - The initial value is true.

      -
      -
    • -
    -
    -
    - -

    - Read-only - diagram - : Diagram

    -
      -
    • -
      -

      This read-only property returns the Diagram that is using this Layer.

      -
      -
    • -
    -
    -
    - -

    - isInDocumentBounds - : boolean

    -
      -
    • -
      -

      Gets or sets whether or not a layer is included in the documentBounds computation. - Default value is true. However, setting isTemporary to true also sets this property to false before version 3.

      -
      -
      since
      -

      2.2

      -
      -
      see
      -

      isTemporary

      -
      -
      -
      -
    • -
    -
    -
    - -

    - isTemporary - : boolean

    -
      -
    • -
      -

      Gets or sets whether the objects in this layer are considered temporary.

      -

      Parts in temporary layers are not selectable, - and changes to Parts in temporary layers are not recorded in the UndoManager. - Objects in temporary layers do not receive click events unless you set their GraphObject.isActionable to true.

      -

      Temporary layers are excluded from bounds calculations, with the exception of the "Tool" layer, - so that temporary objects created while dragging are included in the bounds.

      -

      Default value is false.

      -

      When this is set to true, isInDocumentBounds on this layer is set to false. - You can override this behavior by setting isInDocumentBounds after setting this property.

      -
      -
      see
      -

      isInDocumentBounds

      -
      -
      -
      -
    • -
    -
    -
    - -

    - name - : string

    -
      -
    • -
      -

      Gets or sets the name for this layer. - The initial value is an empty string, which is also the name of the default layer. - The name should be unique among the diagram's Diagram.layers.

      -
      -
    • -
    -
    -
    - -

    - opacity - : number

    -
      -
    • -
      -

      Gets or sets the opacity for all parts in this layer. - The value must be between 0.0 (fully transparent) and 1.0 (no additional transparency). - This value is multiplicative with any existing transparency, - for instance from a Brush or image transparency. - The default value is 1.

      -

      This property, unlike visible, does not change whether any objects are found by the "find..." methods.

      -
      -
      since
      -

      1.1

      -
      -
      see
      -

      GraphObject.opacity, Diagram.opacity

      -
      -
      -
      -
    • -
    -
    -
    - -

    - Read-only - parts - : Iterator<Part>

    -
      -
    • -
      -

      This read-only property returns an iterator for this Layer's Parts. - The Parts can be Nodes, Links, Groups, Adornments, or simple Parts.

      -
      -
    • -
    -
    -
    - -

    - Read-only - partsBackwards - : Iterator<Part>

    -
      -
    • -
      -

      This read-only property returns a backwards iterator for this Layer's Parts, - for iterating over the parts in reverse order. - The Parts can be Nodes, Links, Groups, Adornments, or simple Parts.

      -
      -
    • -
    -
    -
    - -

    - pickable - : boolean

    -
      -
    • -
      -

      Gets or sets whether methods such as findObjectAt find any of the objects in this layer.

      -

      The default value is true. - When this property is false, all of the "find..." methods will fail to find parts that are in this layer.

      -

      Note that setting pickable to false does not prevent users from selecting nodes. - It does prevent them from selecting nodes by clicking on them, - but does not prevent selection through other mechanisms such as the DragSelectingTool or - CommandHandler.selectAll or calls to Diagram.select.

      -

      You can control whether individual GraphObjects are "hittable" by setting GraphObject.pickable.

      -
      -
      since
      -

      1.2

      -
      -
      see
      -

      GraphObject.pickable

      -
      -
      -
      -
    • -
    -
    -
    - -

    - visible - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may view any of the objects in this layer.

      -

      The default value is true -- all visible Parts are drawn. - When this property is false, all of the "find..." methods will fail to find parts that are in this layer.

      -
      -
      see
      -

      GraphObject.visible

      -
      -
      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - findObjectAt -

    -
      -
    • findObjectAt<T>(p: Point, navig?: (a: GraphObject) => T, pred?: (a: T) => boolean): T
    • -
    -
      -
    • -
      -

      Find the front-most GraphObject in this layer - at the given point in document coordinates.

      -

      If visible is false, this method will not find any objects in this layer. - However, opacity does not affect this method.

      -
      -

      Type parameters

      - -

      Parameters

      -
        -
      • -
        p: Point
        -
        -

        A Point in document coordinates.

        -
        -
      • -
      • -
        Optional navig: (a: GraphObject) => T
        -
        -

        A function taking a GraphObject and - returning a GraphObject, defaulting to the identity.

        -
        -
          -
        -
      • -
      • -
        Optional pred: (a: T) => boolean
        -
        -

        A function taking the GraphObject - returned by navig and returning true if that object should be returned, - defaulting to a predicate that always returns true.

        -
        -
          -
        -
      • -
      -

      Returns T

      -

      The first GraphObject in the Z-order, or else null.

      -
    • -
    -
    -
    - -

    - findObjectsAt -

    -
      -
    • findObjectsAt<T, S>(p: Point, navig?: (a: GraphObject) => T, pred?: (a: T) => boolean, coll?: S): S
    • -
    -
      -
    • -
      -

      Return a collection of the GraphObjects of this layer - at the given point in document coordinates.

      -

      If visible is false, this method will not find any objects in this layer. - However, opacity does not affect this method.

      -
      -

      Type parameters

      - -

      Parameters

      -
        -
      • -
        p: Point
        -
        -

        A Point in document coordinates.

        -
        -
      • -
      • -
        Optional navig: (a: GraphObject) => T
        -
        -

        A function taking a GraphObject and - returning a GraphObject, defaulting to the identity. - If this function returns null, the given GraphObject will not be included in the results.

        -
        -
          -
        -
      • -
      • -
        Optional pred: (a: T) => boolean
        -
        -

        A function taking the GraphObject - returned by navig and returning true if that object should be returned, - defaulting to a predicate that always returns true.

        -
        -
          -
        -
      • -
      • -
        Optional coll: S
        -
        -

        An optional collection (List or Set) to add the results to.

        -
        -
      • -
      -

      Returns S

      -

      a collection of GraphObjects that will contain all GraphObjects - located at Point p, or else an empty collection. - If a List or Set was passed in, it is returned.

      -
    • -
    -
    -
    - -

    - findObjectsIn -

    -
      -
    • findObjectsIn<T, S>(r: Rect, navig?: (a: GraphObject) => T, pred?: (a: T) => boolean, partialInclusion?: boolean, coll?: S): S
    • -
    -
      -
    • -
      -

      Returns a collection of all GraphObjects that are inside or that intersect - a given Rect in document coordinates.

      -

      If visible is false, this method will not find any objects in this layer. - However, opacity does not affect this method.

      -
      -

      Type parameters

      - -

      Parameters

      -
        -
      • -
        r: Rect
        -
        -

        A Rect in document coordinates.

        -
        -
      • -
      • -
        Optional navig: (a: GraphObject) => T
        -
        -

        A function taking a GraphObject and - returning a GraphObject, defaulting to the identity. - If this function returns null, the given GraphObject will not be included in the results.

        -
        -
          -
        -
      • -
      • -
        Optional pred: (a: T) => boolean
        -
        -

        A function taking the GraphObject - returned by navig and returning true if that object should be returned, - defaulting to a predicate that always returns true.

        -
        -
          -
        -
      • -
      • -
        Optional partialInclusion: boolean
        -
        -

        Whether an object can match if it merely intersects the rectangular area (true) or - if it must be entirely inside the rectangular area (false). The default value is false.

        -
        -
      • -
      • -
        Optional coll: S
        -
        -

        An optional collection (List or Set) to add the results to.

        -
        -
      • -
      -

      Returns S

      -

      a collection of GraphObjects that will contain all GraphObjects - located in or near Rect r, or else an empty collection. - If a List or Set was passed in, it is returned.

      -
    • -
    -
    -
    - -

    - findObjectsNear -

    -
      -
    • findObjectsNear<T, S>(p: Point, dist: number, navig?: (a: GraphObject) => T, pred?: (a: T) => boolean, partialInclusion?: boolean | S, coll?: S): S
    • -
    -
      -
    • -
      -

      Returns a collection of all GraphObjects that are within a certain distance - of a given point in document coordinates.

      -

      If visible is false, this method will not find any objects in this layer. - However, opacity does not affect this method.

      -
      -

      Type parameters

      - -

      Parameters

      -
        -
      • -
        p: Point
        -
        -

        A Point in document coordinates.

        -
        -
      • -
      • -
        dist: number
        -
        -

        The distance from the point.

        -
        -
      • -
      • -
        Optional navig: (a: GraphObject) => T
        -
        -

        A function taking a GraphObject and - returning a GraphObject, defaulting to the identity. - If this function returns null, the given GraphObject will not be included in the results.

        -
        -
          -
        -
      • -
      • -
        Optional pred: (a: T) => boolean
        -
        -

        A function taking the GraphObject - returned by navig and returning true if that object should be returned, - defaulting to a predicate that always returns true.

        -
        -
          -
        -
      • -
      • -
        Optional partialInclusion: boolean | S
        -
        -

        Whether an object can match if it merely intersects the circular area (true) or - if it must be entirely inside the circular area (false). The default value is true.

        -
        -
      • -
      • -
        Optional coll: S
        -
        -

        An optional collection (List or Set) to add the results to.

        -
        -
      • -
      -

      Returns S

      -

      a collection of GraphObjects that will contain all GraphObjects - located at Point p, or else an empty collection. - If a List or Set was passed in, it is returned.

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class Layer

    Hierarchy

    • Layer
    +

    Layers are how named collections of Parts are drawn in front or behind other collections of Parts in a Diagram. +Layers can only contain Parts, such as Nodes and Links. They cannot hold GraphObjects directly.

    +

    You put a Part into a Layer by assigning Part.layerName with the name of the Layer. +You can use data binding to initialize and remember a Part's layer's name. +You can change a Part's layer by modifying its Part.layerName, which changes its Part.layer.

    +

    Each Diagram starts off with the following list of Layers: +"Grid", "Background", "" (the default layer), "Foreground", "Adornment", "Tool". +Parts are normally put in the default layer. +The "Grid", "Adornment", and "Tool" layers are considered isTemporary. +Changes to objects in temporary layers are not recorded by the UndoManager. +Parts in temporary layers are not selected and are not considered to be part of the document. +Objects in temporary layers do not receive click events unless you set their GraphObject.isActionable to true. +The "Grid" layer is the furthest back; it also contains "temporary" parts that cannot be selected. +Furthermore the "Grid" layer has pickable set to false so that mouse or touch events +and calls to the "find..." methods do not even consider any parts in that layer.

    +

    Layers have many properties that control what actions users are permitted to perform involving the parts in the layer. +These properties are very much like the similarly named properties on Diagram.

    +

    Z-ordering

    - // topnav - var topButton = document.getElementById("topnavButton"); - var topnavList = document.getElementById("topnavList"); - topButton.addEventListener("click", function() { - this.classList.toggle("active"); - topnavList.classList.toggle("hidden"); - document.getElementById("topnavOpen").classList.toggle("hidden"); - document.getElementById("topnavClosed").classList.toggle("hidden"); - }); - - - \ No newline at end of file +

    Layers are drawn and presented in order. +You can add your own layers by calling Diagram.addLayerBefore or Diagram.addLayerAfter +to insert a new layer at a particular place in the Z-order, or to re-order existing layers. +Use Diagram.findLayer to get the Layer with a particular name. +Parts can be individually z-ordered within a layer by setting Part.zOrder.

    +

    Index

    Constructors

    • +

      This constructs an empty Layer; you should set the name before adding the Layer to a Diagram.

      +

      Parameters

      • Optional init: Partial<Layer>
        +

        Optional properties to initialize.

        +

      Returns Layer

    Properties

    • +

      Gets or sets whether the user may copy objects in this layer. +The initial value is true.

      +
    • +

      Gets or sets whether the user may delete objects in this layer. +The initial value is true.

      +
    • +

      Gets or sets whether the user may group parts together in this layer. +The initial value is true.

      +
    • +

      Gets or sets whether the user may draw new links in this layer. +The initial value is true.

      +
    • +

      Gets or sets whether the user may move objects in this layer. +The initial value is true.

      +
    • +

      Gets or sets whether the user may reconnect existing links in this layer. +The initial value is true.

      +
    • +

      Gets or sets whether the user may reshape parts in this layer. +The initial value is true.

      +
    • +

      Gets or sets whether the user may resize parts in this layer. +The initial value is true.

      +
    • +

      Gets or sets whether the user may rotate parts in this layer. +The initial value is true.

      +
    • +

      Gets or sets whether the user may select objects in this layer. +The initial value is true.

      +
    • +

      Gets or sets whether the user may do in-place text editing in this layer. +The initial value is true.

      +
    • +

      Gets or sets whether the user may ungroup existing groups in this layer. +The initial value is true.

      +
    • +

      This read-only property returns the Diagram that is using this Layer.

      +
    • +

      Gets or sets whether or not a layer is included in the documentBounds computation. +Default value is true. However, setting isTemporary to true also sets this property to false before version 3.

      +
      since

      2.2

      +
      see

      isTemporary

      +
    • +

      Gets or sets whether the objects in this layer are considered temporary.

      +

      Parts in temporary layers are not selectable, +and changes to Parts in temporary layers are not recorded in the UndoManager. +Objects in temporary layers do not receive click events unless you set their GraphObject.isActionable to true.

      +

      Temporary layers are excluded from bounds calculations, with the exception of the "Tool" layer, +so that temporary objects created while dragging are included in the bounds.

      +

      Default value is false.

      +

      When this is set to true, isInDocumentBounds on this layer is set to false. +You can override this behavior by setting isInDocumentBounds after setting this property.

      +
      see

      isInDocumentBounds

      +
    • +

      Gets or sets the name for this layer. +The initial value is an empty string, which is also the name of the default layer. +The name should be unique among the diagram's Diagram.layers.

      +
    • +

      Gets or sets the opacity for all parts in this layer. +The value must be between 0.0 (fully transparent) and 1.0 (no additional transparency). +This value is multiplicative with any existing transparency, +for instance from a Brush or image transparency. +The default value is 1.

      +

      This property, unlike visible, does not change whether any objects are found by the "find..." methods.

      +
      since

      1.1

      +
      see

      GraphObject.opacity, Diagram.opacity

      +
    • +

      This read-only property returns a backwards iterator for this Layer's Parts, +for iterating over the parts in reverse order. +The Parts can be Nodes, Links, Groups, Adornments, or simple Parts.

      +
    • +

      Gets or sets whether methods such as findObjectAt find any of the objects in this layer.

      +

      The default value is true. +When this property is false, all of the "find..." methods will fail to find parts that are in this layer.

      +

      Note that setting pickable to false does not prevent users from selecting nodes. +It does prevent them from selecting nodes by clicking on them, +but does not prevent selection through other mechanisms such as the DragSelectingTool or +CommandHandler.selectAll or calls to Diagram.select.

      +

      You can control whether individual GraphObjects are "hittable" by setting GraphObject.pickable.

      +
      since

      1.2

      +
      see

      GraphObject.pickable

      +
    • +

      Gets or sets whether the user may view any of the objects in this layer.

      +

      The default value is true -- all visible Parts are drawn. +When this property is false, all of the "find..." methods will fail to find parts that are in this layer.

      +
      see

      GraphObject.visible

      +

    Methods

    • findObjectAt<T>(p: Point, navig?: (a: GraphObject) => T, pred?: (a: T) => boolean): T
    • +

      Find the front-most GraphObject in this layer +at the given point in document coordinates.

      +

      If visible is false, this method will not find any objects in this layer. +However, opacity does not affect this method.

      +

      Type parameters

      Parameters

      • p: Point
        +

        A Point in document coordinates.

        +
      • Optional navig: (a: GraphObject) => T
        +

        A function taking a GraphObject and +returning a GraphObject, defaulting to the identity.

        +
      • Optional pred: (a: T) => boolean
        +

        A function taking the GraphObject +returned by navig and returning true if that object should be returned, +defaulting to a predicate that always returns true.

        +
          • (a: T): boolean
          • Parameters

            • a: T

            Returns boolean

      Returns T

      The first GraphObject in the Z-order, or else null.

      +
    • findObjectsAt<T, S>(p: Point, navig?: (a: GraphObject) => T, pred?: (a: T) => boolean, coll?: S): S
    • +

      Return a collection of the GraphObjects of this layer +at the given point in document coordinates.

      +

      If visible is false, this method will not find any objects in this layer. +However, opacity does not affect this method.

      +

      Type parameters

      Parameters

      • p: Point
        +

        A Point in document coordinates.

        +
      • Optional navig: (a: GraphObject) => T
        +

        A function taking a GraphObject and +returning a GraphObject, defaulting to the identity. +If this function returns null, the given GraphObject will not be included in the results.

        +
      • Optional pred: (a: T) => boolean
        +

        A function taking the GraphObject +returned by navig and returning true if that object should be returned, +defaulting to a predicate that always returns true.

        +
          • (a: T): boolean
          • Parameters

            • a: T

            Returns boolean

      • Optional coll: S
        +

        An optional collection (List or Set) to add the results to.

        +

      Returns S

      a collection of GraphObjects that will contain all GraphObjects +located at Point p, or else an empty collection. +If a List or Set was passed in, it is returned.

      +
    • findObjectsIn<T, S>(r: Rect, navig?: (a: GraphObject) => T, pred?: (a: T) => boolean, partialInclusion?: boolean, coll?: S): S
    • +

      Returns a collection of all GraphObjects that are inside or that intersect +a given Rect in document coordinates.

      +

      If visible is false, this method will not find any objects in this layer. +However, opacity does not affect this method.

      +

      Type parameters

      Parameters

      • r: Rect
        +

        A Rect in document coordinates.

        +
      • Optional navig: (a: GraphObject) => T
        +

        A function taking a GraphObject and +returning a GraphObject, defaulting to the identity. +If this function returns null, the given GraphObject will not be included in the results.

        +
      • Optional pred: (a: T) => boolean
        +

        A function taking the GraphObject +returned by navig and returning true if that object should be returned, +defaulting to a predicate that always returns true.

        +
          • (a: T): boolean
          • Parameters

            • a: T

            Returns boolean

      • Optional partialInclusion: boolean
        +

        Whether an object can match if it merely intersects the rectangular area (true) or +if it must be entirely inside the rectangular area (false). The default value is false.

        +
      • Optional coll: S
        +

        An optional collection (List or Set) to add the results to.

        +

      Returns S

      a collection of GraphObjects that will contain all GraphObjects +located in or near Rect r, or else an empty collection. +If a List or Set was passed in, it is returned.

      +
    • findObjectsNear<T, S>(p: Point, dist: number, navig?: (a: GraphObject) => T, pred?: (a: T) => boolean, partialInclusion?: boolean | S, coll?: S): S
    • +

      Returns a collection of all GraphObjects that are within a certain distance +of a given point in document coordinates.

      +

      If visible is false, this method will not find any objects in this layer. +However, opacity does not affect this method.

      +

      Type parameters

      Parameters

      • p: Point
        +

        A Point in document coordinates.

        +
      • dist: number
        +

        The distance from the point.

        +
      • Optional navig: (a: GraphObject) => T
        +

        A function taking a GraphObject and +returning a GraphObject, defaulting to the identity. +If this function returns null, the given GraphObject will not be included in the results.

        +
      • Optional pred: (a: T) => boolean
        +

        A function taking the GraphObject +returned by navig and returning true if that object should be returned, +defaulting to a predicate that always returns true.

        +
          • (a: T): boolean
          • Parameters

            • a: T

            Returns boolean

      • Optional partialInclusion: boolean | S
        +

        Whether an object can match if it merely intersects the circular area (true) or +if it must be entirely inside the circular area (false). The default value is true.

        +
      • Optional coll: S
        +

        An optional collection (List or Set) to add the results to.

        +

      Returns S

      a collection of GraphObjects that will contain all GraphObjects +located at Point p, or else an empty collection. +If a List or Set was passed in, it is returned.

      +

    Settings

    Theme

    + \ No newline at end of file diff --git a/api/symbols/LayeredDigraphEdge.html b/api/symbols/LayeredDigraphEdge.html index 3196f78dc..94156127e 100644 --- a/api/symbols/LayeredDigraphEdge.html +++ b/api/symbols/LayeredDigraphEdge.html @@ -1,382 +1,64 @@ - - - - - - LayeredDigraphEdge | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class LayeredDigraphEdge

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    This holds LayeredDigraphLayout-specific information about Links.

    -

    This class inherits from LayoutEdge.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - forest - : boolean

    -
      -
    • -
      -

      True if the link is part of the depth first forest. - The default value is false.

      -
      -
    • -
    -
    -
    - -

    - Override - fromVertex - : LayeredDigraphVertex

    - -
    -
    - -

    - portFromColOffset - : number

    -
      -
    • -
      -

      Approximate column offset of the from port of the link from the from node column used in straightening. - The default value is 0.

      -
      -
    • -
    -
    -
    - -

    - portFromPos - : number

    -
      -
    • -
      -

      Location of the port at the from node of the link. - Allows the crossing matrix to correctly calculate the crossings for nodes with multiple ports. - The default value is NaN.

      -
      -
    • -
    -
    -
    - -

    - portToColOffset - : number

    -
      -
    • -
      -

      Approximate column offset of the to port of the link from the to node column used in straightening. - The default value is 0.

      -
      -
    • -
    -
    -
    - -

    - portToPos - : number

    -
      -
    • -
      -

      Location of the port at the to node of the link. - Allows the crossing matrix to correctly calculate the crossings for nodes with multiple ports. - The default value is NaN.

      -
      -
    • -
    -
    -
    - -

    - rev - : boolean

    -
      -
    • -
      -

      True if the link was reversed during cycle removal. - The default value is false.

      -
      -
    • -
    -
    -
    - -

    - Override - toVertex - : LayeredDigraphVertex

    - -
    -
    - -

    - valid - : boolean

    -
      -
    • -
      -

      True if the link is part of the proper digraph. - The default value is false.

      -
      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class LayeredDigraphEdge

    Hierarchy

    +

    This holds LayeredDigraphLayout-specific information about Links.

    +

    This class inherits from LayoutEdge.

    +

    Index

    Inherited Members

    Constructors

    Properties

    • +

      True if the link is part of the depth first forest. +The default value is false.

      +
    • +

      Approximate column offset of the from port of the link from the from node column used in straightening. +The default value is 0.

      +
    • +

      Location of the port at the from node of the link. +Allows the crossing matrix to correctly calculate the crossings for nodes with multiple ports. +The default value is NaN.

      +
    • +

      Approximate column offset of the to port of the link from the to node column used in straightening. +The default value is 0.

      +
    • +

      Location of the port at the to node of the link. +Allows the crossing matrix to correctly calculate the crossings for nodes with multiple ports. +The default value is NaN.

      +
    • +

      True if the link was reversed during cycle removal. +The default value is false.

      +
    • +

      True if the link is part of the proper digraph. +The default value is false.

      +

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/LayeredDigraphLayout.html b/api/symbols/LayeredDigraphLayout.html index 31c8a1855..146e00ce4 100644 --- a/api/symbols/LayeredDigraphLayout.html +++ b/api/symbols/LayeredDigraphLayout.html @@ -1,1028 +1,221 @@ - - - - - - LayeredDigraphLayout | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class LayeredDigraphLayout

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    This arranges nodes of directed graphs into layers (rows or columns). - There are many samples that use LayeredDigraphLayout.

    -

    - If you want to experiment interactively with most of the properties, try the Layered Digraph Layout sample. - See samples that make use of LayeredDigraphLayout in the samples index. -

    The layerSpacing property controls the distance between layers. - The columnSpacing property controls the breadth of each "column" -- - this affects the distance between nodes within a layer, although the exact distance also depends on the breadth of each node. - The layeringOption property determines whether nodes without links coming in or without links going out are - lined up at the edge of the graph, or whether they are positioned close to their connected nodes.

    -

    By default the layout will route the links in a manner that is consistent with the direction. - So, for example, if the direction is 90 degrees (i.e. downward), the links are expected to go from the top towards the bottom. - That means the links should come out from the bottom of the ports and should go into the top of the ports. - Basically the layout will set Link.fromSpot to Spot.Bottom and Link.toSpot to Spot.Top.

    -

    If you want to the links to use the spots that are given by the ports or by the links themselves, you will need to set - setsPortSpots to false to prevent this layout from setting the spots on the links. - For example, if each node only has one port that is the whole node, and if you want the links to be spread out along the sides - of the nodes, then you should set setsPortSpots to false and set the node's GraphObject.fromSpot to - Spot.BottomSide and GraphObject.toSpot to Spot.TopSide.

    -

    This layout handles links that form cycles better than TreeLayout does. - The normal routing behavior for "backwards" links is to route them "around" the source node and "around" the destination node, - so that all links come in one side and go out the other side. - However if you want "backwards" links to go more directly between nodes, set setsPortSpots to false and - the node's GraphObject.fromSpot and GraphObject.toSpot both to Spot.TopBottomSides. - (Of course if the direction is zero or 180, you'll want to use Spot.LeftRightSides.)

    -

    If the diagram is structured in a tree-like fashion, - it may be better to use TreeLayout, - which has more options specific to trees. - TreeLayout is much faster than LayeredDigraphLayout, - and can handle a limited number of links that would prevent the - graph structure from being a true tree (i.e. some nodes having multiple parents).

    -

    This layout makes use of a LayoutNetwork of - LayeredDigraphVertexes and LayeredDigraphEdges that normally - correspond to the Nodes and Links of the Diagram.

    -

    The layout algorithm consists of four-major steps: Cycle Removal, - Layer Assignment, Crossing Reduction, and Straightening and Packing. - The layout cannot guarantee that it provides optimal positioning of nodes or routing of links.

    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - aggressiveOption - : EnumValue

    - -
    -
    - -

    - columnSpacing - : number

    -
      -
    • -
      -

      Gets or sets the size of each column. - This value must be positive and it defaults to 25.

      -
      -
    • -
    -
    -
    - -

    - cycleRemoveOption - : EnumValue

    - -
    -
    - -

    - direction - : number

    -
      -
    • -
      -

      Gets or sets the direction the graph grows towards. - 0 is towards the right, 90 is downwards, 180 is towards the left, and 270 is upwards. - The default value is 0.

      -
      -
    • -
    -
    -
    - -

    - initializeOption - : EnumValue

    - -
    -
    - -

    - iterations - : number

    -
      -
    • -
      -

      Gets or sets the number of iterations to be done. - The value must be non-negative. The default value is 4.

      -
      -
    • -
    -
    -
    - -

    - layerSpacing - : number

    -
      -
    • -
      -

      Gets or sets the space between each layer. - This value must be positive and it defaults to 25.

      -
      -
    • -
    -
    -
    - -

    - layeringOption - : EnumValue

    - -
    -
    - -

    - Read-only - maxColumn - : number

    -
      -
    • -
      -

      This read-only property returns the largest column value.

      -
      -
    • -
    -
    -
    - -

    - Read-only - maxIndex - : number

    -
      -
    • -
      -

      This read-only property returns the largest index value.

      -
      -
    • -
    -
    -
    - -

    - Read-only - maxIndexLayer - : number

    -
      -
    • -
      -

      This read-only property returns the larges index layer.

      -
      -
    • -
    -
    -
    - -

    - Read-only - maxLayer - : number

    -
      -
    • -
      -

      This read-only property returns the largest layer value.

      -
      -
    • -
    -
    -
    - -

    - Read-only - minIndexLayer - : number

    -
      -
    • -
      -

      This read-only property returns the smallest index layer.

      -
      -
    • -
    -
    -
    - -

    - packOption - : number

    - -
    -
    - -

    - setsPortSpots - : boolean

    -
      -
    • -
      -

      Gets or sets whether the FromSpot and ToSpot of each link should be set - to values appropriate for the given value of LayeredDigraphLayout.direction. - The default value is true.

      -

      If you set this to false, the spot values of the links and port objects will be used. - If you do not set the spot values to sensible values matching the direction, - the routing results may be poor and they may cross over nodes.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Protected Virtual - assignLayers -

    -
      -
    • assignLayers(): void
    • -
    -
      -
    • -
      -

      Assigns every vertex in the input network to a layer. - The layer is a non-negative integer describing which row of vertexes each vertex belongs in. - (Do not confuse this concept of "layer" with Layers that control the Z-ordering of Parts.)

      -

      The layering satisfies the following relationship: - if L is a link from node U to node V, then U.layer > V.layer.

      -

      This method can be overridden to customize how nodes are assigned layers. - Please read the Introduction page on Extensions for how to override methods and how to call this base method. - By default, this does the appropriate assignments given the value of layeringOption.

      -
      -
      since
      -

      1.1

      -
      -
      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Protected Virtual - commitLayers -

    -
      -
    • commitLayers(layerRects: Rect[], offset: Point): void
    • -
    -
      -
    • -
      -

      This overridable method is called by commitLayout - to support custom arrangement of bands or labels across each layout layer. - By default this method does nothing.

      -

      The coordinates used in the resulting Rects may need to be offset by the Layout.arrangementOrigin.

      -
      -
      since
      -

      1.4

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        layerRects: Rect[]
        -
        -

        an Array of Rects with the bounds of each of the "layers"

        -
        -
      • -
      • -
        offset: Point
        -
        -

        the position of the top-left corner of the banded area relative to the coordinates given by the layerRects

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Protected Override - commitLayout -

    -
      -
    • commitLayout(): void
    • -
    -
      -
    • -
      -

      Set the fromSpot and toSpot on each Link, position each Node according - to the vertex position, and then position/route the Links.

      -

      This calls the commitNodes and commitLinks methods, the latter only if isRouting is true. - You should not call this method -- it is a "protected virtual" method. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Protected Virtual - commitLinks -

    -
      -
    • commitLinks(): void
    • -
    -
      -
    • -
      -

      Routes the links.

      -

      This is called by commitLayout. - This is only called if Layout.isRouting is true. - See also commitNodes. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Protected Virtual - commitNodes -

    -
      -
    • commitNodes(): void
    • -
    -
      -
    • -
      -

      Commit the position of all nodes.

      -

      This is called by commitLayout. - See also commitLinks. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - createNetwork -

    - - -
    -
    - -

    - Override - doLayout -

    - - -
    -
    -
    -

    Constants

    -
    - -

    - Static - AggressiveLess - : EnumValue

    -
    -

    The faster, less aggressive, crossing reduction algorithm; - a valid value for LayeredDigraphLayout.aggressiveOption.

    -
    -
    -
    - -

    - Static - AggressiveMore - : EnumValue

    -
    -

    The slower, more aggressive, crossing reduction algorithm, - a valid value for LayeredDigraphLayout.aggressiveOption.

    -
    -
    -
    - -

    - Static - AggressiveNone - : EnumValue

    -
    -

    The fastest, but poorest, crossing reduction algorithm; - a valid value for LayeredDigraphLayout.aggressiveOption.

    -
    -
    -
    - -

    - Static - CycleDepthFirst - : EnumValue

    -
    -

    Remove cycles using depth first cycle removal; - a valid value of LayeredDigraphLayout.cycleRemoveOption.

    -
    -
    -
    - -

    - Static - CycleFromLayers - : EnumValue

    -
    -

    Remove cycles depending on assignLayers determining entirely which links are backwards links; - a valid value of LayeredDigraphLayout.cycleRemoveOption.

    -
    -
    -
    - -

    - Static - CycleGreedy - : EnumValue

    -
    -

    Remove cycles using greedy cycle removal; - a valid value of LayeredDigraphLayout.cycleRemoveOption.

    -
    -
    -
    - -

    - Static - InitDepthFirstIn - : EnumValue

    -
    -

    Initialize using depth first in initialization; - a valid value for LayeredDigraphLayout.initializeOption.

    -
    -
    -
    - -

    - Static - InitDepthFirstOut - : EnumValue

    -
    -

    Initialize using depth first out initialization; - a valid value for LayeredDigraphLayout.initializeOption.

    -
    -
    -
    - -

    - Static - InitNaive - : EnumValue

    -
    -

    Initialize using naive initialization; - a valid value for LayeredDigraphLayout.initializeOption.

    -
    -
    -
    - -

    - Static - LayerLongestPathSink - : EnumValue

    -
    -

    Assign layers using longest path sink layering; - a valid value for LayeredDigraphLayout.layeringOption.

    -
    -
    -
    - -

    - Static - LayerLongestPathSource - : EnumValue

    -
    -

    Assign layers using longest path source layering; - a valid value for LayeredDigraphLayout.layeringOption.

    -
    -
    -
    - -

    - Static - LayerOptimalLinkLength - : EnumValue

    -
    -

    Assign layers using optimal link length layering; - A valid value for LayeredDigraphLayout.layeringOption.

    -
    -
    -
    - -

    - Static - PackAll - : number

    - -
    -
    - -

    - Static - PackExpand - : number

    -
    -

    This option gives more chances for the packing algorithm to improve the network, - but is very expensive in time for large networks; - a valid value for LayeredDigraphLayout.packOption.

    -
    -
    -
    - -

    - Static - PackMedian - : number

    -
    -

    This option tries to have the packing algorithm center groups of nodes - based on their relationships with nodes in other layers, - a valid value for LayeredDigraphLayout.packOption.

    -
    -
    -
    - -

    - Static - PackNone - : number

    -
    -

    Does minimal work in packing the nodes; - a valid value for LayeredDigraphLayout.packOption.

    -
    -
    -
    - -

    - Static - PackStraighten - : number

    -
    -

    This option tries to have the packing algorithm straighten many of the - links that cross layers, - a valid value for LayeredDigraphLayout.packOption.

    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class LayeredDigraphLayout

    Hierarchy

    +

    This arranges nodes of directed graphs into layers (rows or columns). +There are many samples that use LayeredDigraphLayout.

    +

    +If you want to experiment interactively with most of the properties, try the Layered Digraph Layout sample. +See samples that make use of LayeredDigraphLayout in the samples index.

    The layerSpacing property controls the distance between layers. +The columnSpacing property controls the breadth of each "column" -- +this affects the distance between nodes within a layer, although the exact distance also depends on the breadth of each node. +The layeringOption property determines whether nodes without links coming in or without links going out are +lined up at the edge of the graph, or whether they are positioned close to their connected nodes.

    +

    By default the layout will route the links in a manner that is consistent with the direction. +So, for example, if the direction is 90 degrees (i.e. downward), the links are expected to go from the top towards the bottom. +That means the links should come out from the bottom of the ports and should go into the top of the ports. +Basically the layout will set Link.fromSpot to Spot.Bottom and Link.toSpot to Spot.Top.

    +

    If you want to the links to use the spots that are given by the ports or by the links themselves, you will need to set +setsPortSpots to false to prevent this layout from setting the spots on the links. +For example, if each node only has one port that is the whole node, and if you want the links to be spread out along the sides +of the nodes, then you should set setsPortSpots to false and set the node's GraphObject.fromSpot to +Spot.BottomSide and GraphObject.toSpot to Spot.TopSide.

    +

    This layout handles links that form cycles better than TreeLayout does. +The normal routing behavior for "backwards" links is to route them "around" the source node and "around" the destination node, +so that all links come in one side and go out the other side. +However if you want "backwards" links to go more directly between nodes, set setsPortSpots to false and +the node's GraphObject.fromSpot and GraphObject.toSpot both to Spot.TopBottomSides. +(Of course if the direction is zero or 180, you'll want to use Spot.LeftRightSides.)

    +

    If the diagram is structured in a tree-like fashion, +it may be better to use TreeLayout, +which has more options specific to trees. +TreeLayout is much faster than LayeredDigraphLayout, +and can handle a limited number of links that would prevent the +graph structure from being a true tree (i.e. some nodes having multiple parents).

    +

    This layout makes use of a LayoutNetwork of +LayeredDigraphVertexes and LayeredDigraphEdges that normally +correspond to the Nodes and Links of the Diagram.

    +

    The layout algorithm consists of four-major steps: Cycle Removal, +Layer Assignment, Crossing Reduction, and Straightening and Packing. +The layout cannot guarantee that it provides optimal positioning of nodes or routing of links.

    +

    Index

    Inherited Members

    Constructors

    Properties

    • +

      Gets or sets the size of each column. +This value must be positive and it defaults to 25.

      +
    • +

      Gets or sets the direction the graph grows towards. +0 is towards the right, 90 is downwards, 180 is towards the left, and 270 is upwards. +The default value is 0.

      +
    • +

      Gets or sets the number of iterations to be done. +The value must be non-negative. The default value is 4.

      +
    • +

      Gets or sets the space between each layer. +This value must be positive and it defaults to 25.

      +
    • +

      This read-only property returns the largest column value.

      +
    • +

      This read-only property returns the largest index value.

      +
    • +

      This read-only property returns the larges index layer.

      +
    • +

      This read-only property returns the largest layer value.

      +
    • +

      This read-only property returns the smallest index layer.

      +
    • +

      Gets or sets whether the FromSpot and ToSpot of each link should be set +to values appropriate for the given value of LayeredDigraphLayout.direction. +The default value is true.

      +

      If you set this to false, the spot values of the links and port objects will be used. +If you do not set the spot values to sensible values matching the direction, +the routing results may be poor and they may cross over nodes.

      +

    Methods

    • assignLayers(): void
    • +

      Assigns every vertex in the input network to a layer. +The layer is a non-negative integer describing which row of vertexes each vertex belongs in. +(Do not confuse this concept of "layer" with Layers that control the Z-ordering of Parts.)

      +

      The layering satisfies the following relationship: +if L is a link from node U to node V, then U.layer > V.layer.

      +

      This method can be overridden to customize how nodes are assigned layers. +Please read the Introduction page on Extensions for how to override methods and how to call this base method. +By default, this does the appropriate assignments given the value of layeringOption.

      +
      since

      1.1

      +

      Returns void

    • commitLayers(layerRects: Rect[], offset: Point): void
    • +

      This overridable method is called by commitLayout +to support custom arrangement of bands or labels across each layout layer. +By default this method does nothing.

      +

      The coordinates used in the resulting Rects may need to be offset by the Layout.arrangementOrigin.

      +
      since

      1.4

      +

      Parameters

      • layerRects: Rect[]
        +

        an Array of Rects with the bounds of each of the "layers"

        +
      • offset: Point
        +

        the position of the top-left corner of the banded area relative to the coordinates given by the layerRects

        +

      Returns void

    • commitLayout(): void
    • +

      Set the fromSpot and toSpot on each Link, position each Node according +to the vertex position, and then position/route the Links.

      +

      This calls the commitNodes and commitLinks methods, the latter only if isRouting is true. +You should not call this method -- it is a "protected virtual" method. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • commitLinks(): void
    • +

      Routes the links.

      +

      This is called by commitLayout. +This is only called if Layout.isRouting is true. +See also commitNodes. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • commitNodes(): void
    • +

      Commit the position of all nodes.

      +

      This is called by commitLayout. +See also commitLinks. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    Constants

    +

    The faster, less aggressive, crossing reduction algorithm; +a valid value for LayeredDigraphLayout.aggressiveOption.

    +
    +

    The slower, more aggressive, crossing reduction algorithm, +a valid value for LayeredDigraphLayout.aggressiveOption.

    +
    +

    The fastest, but poorest, crossing reduction algorithm; +a valid value for LayeredDigraphLayout.aggressiveOption.

    +
    +

    Remove cycles using depth first cycle removal; +a valid value of LayeredDigraphLayout.cycleRemoveOption.

    +
    +

    Remove cycles depending on assignLayers determining entirely which links are backwards links; +a valid value of LayeredDigraphLayout.cycleRemoveOption.

    +
    +

    Remove cycles using greedy cycle removal; +a valid value of LayeredDigraphLayout.cycleRemoveOption.

    +
    +

    Initialize using depth first in initialization; +a valid value for LayeredDigraphLayout.initializeOption.

    +
    +

    Initialize using depth first out initialization; +a valid value for LayeredDigraphLayout.initializeOption.

    +
    +

    Initialize using naive initialization; +a valid value for LayeredDigraphLayout.initializeOption.

    +
    +

    Assign layers using longest path sink layering; +a valid value for LayeredDigraphLayout.layeringOption.

    +
    +

    Assign layers using longest path source layering; +a valid value for LayeredDigraphLayout.layeringOption.

    +
    +

    Assign layers using optimal link length layering; +A valid value for LayeredDigraphLayout.layeringOption.

    +
    +

    This option gives more chances for the packing algorithm to improve the network, +but is very expensive in time for large networks; +a valid value for LayeredDigraphLayout.packOption.

    +
    +

    This option tries to have the packing algorithm center groups of nodes +based on their relationships with nodes in other layers, +a valid value for LayeredDigraphLayout.packOption.

    +
    +

    Does minimal work in packing the nodes; +a valid value for LayeredDigraphLayout.packOption.

    +
    +

    This option tries to have the packing algorithm straighten many of the +links that cross layers, +a valid value for LayeredDigraphLayout.packOption.

    +

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/LayeredDigraphNetwork.html b/api/symbols/LayeredDigraphNetwork.html index 05a321ae4..3ddfabaef 100644 --- a/api/symbols/LayeredDigraphNetwork.html +++ b/api/symbols/LayeredDigraphNetwork.html @@ -1,211 +1,40 @@ - - - - - - LayeredDigraphNetwork | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class LayeredDigraphNetwork

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    This class represents an abstract graph of LayeredDigraphVertexes and LayeredDigraphEdges - that can be constructed based on the Nodes and Links of a Diagram - so that the LayeredDigraphLayout can operate independently of the diagram until it - is time to commit any node positioning or link routing.

    -

    This class inherits from LayoutNetwork.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class LayeredDigraphNetwork

    Hierarchy

    +

    This class represents an abstract graph of LayeredDigraphVertexes and LayeredDigraphEdges +that can be constructed based on the Nodes and Links of a Diagram +so that the LayeredDigraphLayout can operate independently of the diagram until it +is time to commit any node positioning or link routing.

    +

    This class inherits from LayoutNetwork.

    +

    Index

    Constructors

    Inherited Members

    Constructors

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/LayeredDigraphVertex.html b/api/symbols/LayeredDigraphVertex.html index 4c4b1c192..96c689ff4 100644 --- a/api/symbols/LayeredDigraphVertex.html +++ b/api/symbols/LayeredDigraphVertex.html @@ -1,274 +1,48 @@ - - - - - - LayeredDigraphVertex | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class LayeredDigraphVertex

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    This holds LayeredDigraphLayout-specific information about Nodes.

    -

    This class inherits from LayoutVertex.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Properties

    - -
    -
    -
    -
    -
    -

    Properties

    -
    - -

    - column - : number

    -
      -
    • -
      -

      Gets or sets the column to which the node is assigned. - The default value is -1.

      -
      -
    • -
    -
    -
    - -

    - component - : number

    -
      -
    • -
      -

      Gets or sets the connected component to which the node is assigned. - The default value is NaN.

      -
      -
    • -
    -
    -
    - -

    - index - : number

    -
      -
    • -
      -

      Gets or sets the index to which the node is assigned. - The default value is -1.

      -
      -
    • -
    -
    -
    - -

    - layer - : number

    -
      -
    • -
      -

      Gets or sets the layer to which the node is assigned. - The default value is -1.

      -
      -
    • -
    -
    -
    - -

    - near - : LayeredDigraphVertex

    -
      -
    • -
      -

      Gets or sets another LayeredDigraphVertex in the same layer that this node should be near. - The default value is null.

      -
      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class LayeredDigraphVertex

    Hierarchy

    +

    This holds LayeredDigraphLayout-specific information about Nodes.

    +

    This class inherits from LayoutVertex.

    +

    Index

    Inherited Members

    Properties

    • +

      Gets or sets the column to which the node is assigned. +The default value is -1.

      +
    • +

      Gets or sets the connected component to which the node is assigned. +The default value is NaN.

      +
    • +

      Gets or sets the index to which the node is assigned. +The default value is -1.

      +
    • +

      Gets or sets the layer to which the node is assigned. +The default value is -1.

      +
    • +

      Gets or sets another LayeredDigraphVertex in the same layer that this node should be near. +The default value is null.

      +

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Layout.html b/api/symbols/Layout.html index e355e01cd..691ede84c 100644 --- a/api/symbols/Layout.html +++ b/api/symbols/Layout.html @@ -1,1018 +1,297 @@ - - - - - - Layout | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class Layout

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    This is the base class for all of the predefined diagram layout implementations. - They only arrange Parts (primarily Nodes and Links) in a Diagram, - not to GraphObjects in Panels (i.e. panel layout).

    -

    The layout classes include TreeLayout, ForceDirectedLayout, - LayeredDigraphLayout, CircularLayout, and GridLayout. - This base class is not abstract -- in fact an instance of this base class is the default - value for Diagram.layout and for Group.layout.

    -

    An instance of a Layout class will be the value of Diagram.layout. - That layout positions the graph of top-level nodes and links. - Nodes and links that belong to a Group are laid out by that group's Group.layout. - The Diagram will automatically perform all nested group layouts before laying out the whole diagram.

    -

    If you have position information for all of the nodes when you load a model, - you will typically have data bound the Part.location to some property on your node data. - In order to avoid an initial layout causing those saved node positions to be discarded, - you can either not set the Diagram.layout to a predefined layout or you can - set isInitial to false.

    -

    Because performing layouts can be expensive in space and time, automatic layouts - are performed only on "invalid" layouts, and only well after a layout has been invalidated. - This state is held by the isValidLayout property. - Many standard operations, such as adding or removing nodes or links, will cause - the layout that is responsible for positioning those nodes or routing those links - to be invalidated. - Such invalidation is performed by calling invalidateLayout, - which not only clears the isValidLayout state but also requests that the diagram - do an automatic layout soon. - You can avoid such invalidations by setting isOngoing to false.

    -

    Layouts will ignore parts that have Part.isLayoutPositioned set to false - or parts that are not GraphObject.visible. - Layouts will also ignore parts that are in layers that are Layer.isTemporary.

    -

    Various operations on Parts will cause the responsible Layout to be invalidated. - This includes adding or removing parts, changing their visibility, and changing their size. - You can disable such automatic layout invalidations by setting Part.layoutConditions - to the combination of Part flags named "Layout..." that you want.

    -

    But operations on parts are not the only way in which layouts become invalidated. - Setting most properties on the layouts, thereby changing their behavior, will invalidate that layout. - Replacing the Diagram.layout or Group.layout will automatically invalidate the new layout. - If isViewportSized is true, when a diagram's Diagram.viewportBounds changes size, - the Diagram.layout is invalidated. - (This is normally only true for GridLayouts when its GridLayout.wrappingWidth is NaN. - Most layouts do not care about the size of the viewport.)

    -

    You can also explicitly call Diagram.layoutDiagram, which can invalidate all layouts and - then perform them all. - But we recommend that you avoid doing so, to allow the normal updating process perform layouts as needed.

    -

    If an automatic layout is the first time that a layout has been performed for the model, - the diagram first raises the DiagramEvent named "InitialLayoutCompleted". - Whenever a Diagram finishes an automatic layout, it raises the DiagramEvent named "LayoutCompleted".

    -

    It is also possible to call doLayout explicitly, but this is uncommon and only used with - instances of Layout that are not the Diagram.layout or Group.layout. - It should only be needed when you want to layout a collection of nodes and links that is not - the normal graph of top-level parts of a Diagram or a subgraph of a Group.

    -

    More complicated layouts make use of a separate LayoutNetwork, consisting of LayoutVertexes and LayoutEdges, - that normally holds a graph that is isomorphic to the graph consisting of Nodes and Links in the Diagram or Group. - The implementation of doLayout will call makeNetwork and remember the result as the network. - makeNetwork will call createNetwork and initialize it by adding new instances of LayoutVertexes and LayoutEdges - corresponding to the given collection of Nodes and Links.

    -

    When doLayout is finished with its work it will call updateParts, which will call commitLayout - to set new node locations and route links. It then normally discards the network.

    -

    The LayoutVertex and LayoutEdge instances allow the layout to work with more information about each Node and Link without - actually modifying those Nodes and Links until commitLayout is called to actually set the Node locations and route the Links. - The use of a LayoutNetwork also allows the Layout to work with a graph that is not isomorphic to the given collection of Nodes and Links. - This is useful when needing to use dummy vertexes and/or edges to achieve certain layout behaviors, - or when one wants to ignore certain vertexes or edges, without actually modifying or adding or removing the diagram's nodes or links.

    -

    An instance of this base class provides a rudimentary default layout that will position - all of the parts that have no position (i.e. the Part.location is (NaN,NaN). - Parts that already have a position are ignored. - This primitive layout class does not make use of a LayoutNetwork because - it ignores all links.

    -

    To implement your own custom layouts, you can inherit from either this class or - from one of the other predefined layout classes. - If you inherit from this base class, you will want to override the doLayout method. - You can call the Part.move method to re-position a part, including whole groups. - Please read the Introduction page on Extensions for how to override methods and how to call a base method.

    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Create a minimal layout that only positions Nodes that do not have a location.

      -
      -

      Parameters

      -
        -
      • -
        Optional init: Partial<Layout>
        -
        -

        Optional initialization properties.

        -
        -
      • -
      -

      Returns Layout

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - arrangementOrigin - : Point

    -
      -
    • -
      -

      Gets or sets the top-left point for where the graph should be positioned when laid out. - The default value for this property is the Point(0, 0). - Setting this property to a new value invalidates this layout. - This property is likely to be set by many Layouts that belong to a Group when the layout is performed.

      -
      -
    • -
    -
    -
    - -

    - boundsComputation - : (part: Part, lay: Layout, rect: Rect) => Rect

    -
      -
    • -
      -

      Gets or sets a function that determines the initial size and position in document coordinates of a LayoutVertex corresponding to a Node. - This function is called by getLayoutBounds. - The default value for this property is null, in which case the GraphObject.actualBounds of the Node is used. - Setting this property to a new value invalidates this layout.

      -

      The non-null value must be a function that takes 3 arguments. - The first argument will be the Part whose bounds the Layout should use. - The second argument will be this Layout. - The third argument will be a Rect that must be modified and returned - The return value must be in document coordinates. You may find it convenient to call GraphObject.getDocumentBounds - to get the bounds in document coordinates of an object within the node.

      -
      -
      since
      -

      2.0

      -
      -
      -
      -
    • -
    -
    -
    - -

    - diagram - : Diagram

    -
      -
    • -
      -

      Gets the Diagram that owns this layout, if it is the value of Diagram.layout.

      -

      If this property and group are non-null, the Group should be in this Diagram.

      -
      -
      see
      -

      group

      -
      -
      -
      -
    • -
    -
    -
    - -

    - group - : Group

    -
      -
    • -
      -

      Gets the Group that uses this layout, if it is the value of a group's Group.layout.

      -

      If this property is set to a Group, the diagram is automatically set to be the Group's Diagram.

      -
      -
      see
      -

      diagram

      -
      -
      -
      -
    • -
    -
    -
    - -

    - isInitial - : boolean

    -
      -
    • -
      -

      Gets or sets whether this layout is performed on an initial layout. - The default value is true. - Setting this property to false causes isValidLayout to be set to true - so that the diagram does not perform this layout.

      -

      If you set both isInitial and isOngoing to false, - there will be no automatic layout invalidation, because invalidateLayout - will not set isValidLayout to false. - To get your nodes to appear, you will need to explicitly set or data-bind their Part.location - or GraphObject.position to real Point values, because automatic layout will not assign any positions.

      -

      Another way of controlling when layouts are invalidated is by setting - Part.isLayoutPositioned or Part.layoutConditions.

      -
      -
    • -
    -
    -
    - -

    - isOngoing - : boolean

    -
      -
    • -
      -

      Gets or sets whether this layout can be invalidated by invalidateLayout. - Set this to false to prevent actions such as adding or removing Parts from invalidating this layout. - The default value is true. - Setting this property does not invalidate this layout.

      -

      If you set both isInitial and isOngoing to false, - there will be no automatic layout invalidation, because invalidateLayout - will not set isValidLayout to false. - To get your nodes to appear, you will need to explicitly set or data-bind their Part.location - or GraphObject.position to real Point values, because automatic layout will not assign any positions.

      -

      Another way of controlling when layouts are invalidated is by setting - Part.isLayoutPositioned or Part.layoutConditions.

      -
      -
    • -
    -
    -
    - -

    - isRealtime - : boolean

    -
      -
    • -
      -

      Gets or sets whether this layout be performed in real-time, before the end of a transaction. - All layouts that are invalidated will be performed at the end of a transaction. - The default value is null. - A null value is treated as true for a Diagram.layout but false for a Group.layout. - Setting this property does not invalidate this layout.

      -
      -
      since
      -

      1.2

      -
      -
      -
      -
    • -
    -
    -
    - -

    - isRouting - : boolean

    -
      -
    • -
      -

      Gets or sets whether this layout routes Links. - The default value is true. - When false, this layout will not explicitly set the Link.points, - and the default routing of each individual Link will take place after the Nodes are moved by commitLayout. - Setting this property does not invalidate this layout.

      -

      Some layouts ignore links, in which case this property is ignored.

      -
      -
      since
      -

      1.1

      -
      -
      -
      -
    • -
    -
    -
    - -

    - isValidLayout - : boolean

    -
      -
    • -
      -

      Gets or sets whether this layout needs to be performed again (if false). - Instead of setting this property directly, it is normal to set it to false by calling invalidateLayout, - since that also requests performing a layout in the near future.

      -
      -
    • -
    -
    -
    - -

    - isViewportSized - : boolean

    -
      -
    • -
      -

      Gets or sets whether this layout depends on the Diagram.viewportBounds's size. - If set to true, the layout will invalidate when the Diagram's viewport changes size. - This only applies to diagram layouts, not to group layouts, - and only when Diagram.autoScale is set to Diagram.None.

      -

      The default value is false. - Setting this property to true will invalidate this layout.

      -

      It is possible that a viewport-sized layout will trigger the Diagram to require scrollbars, - which modifies the Diagram.viewportBounds, which will in turn trigger another layout. - This is uncommon, but possible with GridLayout if the results require a vertical scrollbar, - and that vertical scrollbar shrinks the viewport width enough that a grid column can no longer fit. - When designing custom layouts, one should be careful that this behavior does not result in an infinite loop.

      -
      -
    • -
    -
    -
    - -

    - network - : LayoutNetwork

    -
      -
    • -
      -

      Gets or sets the LayoutNetwork used by this Layout, if any. - The default value is null. - Setting this property does not invalidate this layout. - Not all kinds of layout make use of a LayoutNetwork. - Call createNetwork or makeNetwork to create a network.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Protected Virtual - cloneProtected -

    -
      -
    • cloneProtected(copy: Layout): void
    • -
    -
      -
    • -
      -

      Copies properties from this object to the given object, which is of the same class. - This is called by copy and should be overridden for each class that adds properties. - There are examples of such overrides in the samples. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -
      since
      -

      1.6

      -
      -
      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - Protected - collectParts -

    - -
      -
    • -
      -

      A convenient way of converting the Diagram|Group|Iterable argument to doLayout to an actual collection of eligible Parts. - The resulting Set will not include any Nodes or Links for which Part.canLayout is false. - If the argument includes a Group for which Group.layout is null, the resulting Set - will include the member parts of that group rather than that group itself. - You will not need to call collectParts if you call makeNetwork, - because that method does effectively the same thing when building the LayoutNetwork.

      -

      Typical usage:

      -
      public doLayout(coll) {
      -  // COLL might be a Diagram or a Group or some Iterable<Part>
      -  var it = this.collectParts(coll).iterator;
      -  while (it.next()) {
      -    var node = it.value;
      -    if (node instanceof go.Node) {
      -      . . . position the node . . .
      -    }
      -  }
      -}
      +Layout | GoJS API
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class Layout

      Hierarchy

      +

      This is the base class for all of the predefined diagram layout implementations. +They only arrange Parts (primarily Nodes and Links) in a Diagram, +not to GraphObjects in Panels (i.e. panel layout).

      +

      The layout classes include TreeLayout, ForceDirectedLayout, +LayeredDigraphLayout, CircularLayout, and GridLayout. +This base class is not abstract -- in fact an instance of this base class is the default +value for Diagram.layout and for Group.layout.

      +

      An instance of a Layout class will be the value of Diagram.layout. +That layout positions the graph of top-level nodes and links. +Nodes and links that belong to a Group are laid out by that group's Group.layout. +The Diagram will automatically perform all nested group layouts before laying out the whole diagram.

      +

      If you have position information for all of the nodes when you load a model, +you will typically have data bound the Part.location to some property on your node data. +In order to avoid an initial layout causing those saved node positions to be discarded, +you can either not set the Diagram.layout to a predefined layout or you can +set isInitial to false.

      +

      Because performing layouts can be expensive in space and time, automatic layouts +are performed only on "invalid" layouts, and only well after a layout has been invalidated. +This state is held by the isValidLayout property. +Many standard operations, such as adding or removing nodes or links, will cause +the layout that is responsible for positioning those nodes or routing those links +to be invalidated. +Such invalidation is performed by calling invalidateLayout, +which not only clears the isValidLayout state but also requests that the diagram +do an automatic layout soon. +You can avoid such invalidations by setting isOngoing to false.

      +

      Layouts will ignore parts that have Part.isLayoutPositioned set to false +or parts that are not GraphObject.visible. +Layouts will also ignore parts that are in layers that are Layer.isTemporary.

      +

      Various operations on Parts will cause the responsible Layout to be invalidated. +This includes adding or removing parts, changing their visibility, and changing their size. +You can disable such automatic layout invalidations by setting Part.layoutConditions +to the combination of Part flags named "Layout..." that you want.

      +

      But operations on parts are not the only way in which layouts become invalidated. +Setting most properties on the layouts, thereby changing their behavior, will invalidate that layout. +Replacing the Diagram.layout or Group.layout will automatically invalidate the new layout. +If isViewportSized is true, when a diagram's Diagram.viewportBounds changes size, +the Diagram.layout is invalidated. +(This is normally only true for GridLayouts when its GridLayout.wrappingWidth is NaN. +Most layouts do not care about the size of the viewport.)

      +

      You can also explicitly call Diagram.layoutDiagram, which can invalidate all layouts and +then perform them all. +But we recommend that you avoid doing so, to allow the normal updating process perform layouts as needed.

      +

      If an automatic layout is the first time that a layout has been performed for the model, +the diagram first raises the DiagramEvent named "InitialLayoutCompleted". +Whenever a Diagram finishes an automatic layout, it raises the DiagramEvent named "LayoutCompleted".

      +

      It is also possible to call doLayout explicitly, but this is uncommon and only used with +instances of Layout that are not the Diagram.layout or Group.layout. +It should only be needed when you want to layout a collection of nodes and links that is not +the normal graph of top-level parts of a Diagram or a subgraph of a Group.

      +

      More complicated layouts make use of a separate LayoutNetwork, consisting of LayoutVertexes and LayoutEdges, +that normally holds a graph that is isomorphic to the graph consisting of Nodes and Links in the Diagram or Group. +The implementation of doLayout will call makeNetwork and remember the result as the network. +makeNetwork will call createNetwork and initialize it by adding new instances of LayoutVertexes and LayoutEdges +corresponding to the given collection of Nodes and Links.

      +

      When doLayout is finished with its work it will call updateParts, which will call commitLayout +to set new node locations and route links. It then normally discards the network.

      +

      The LayoutVertex and LayoutEdge instances allow the layout to work with more information about each Node and Link without +actually modifying those Nodes and Links until commitLayout is called to actually set the Node locations and route the Links. +The use of a LayoutNetwork also allows the Layout to work with a graph that is not isomorphic to the given collection of Nodes and Links. +This is useful when needing to use dummy vertexes and/or edges to achieve certain layout behaviors, +or when one wants to ignore certain vertexes or edges, without actually modifying or adding or removing the diagram's nodes or links.

      +

      An instance of this base class provides a rudimentary default layout that will position +all of the parts that have no position (i.e. the Part.location is (NaN,NaN). +Parts that already have a position are ignored. +This primitive layout class does not make use of a LayoutNetwork because +it ignores all links.

      +

      To implement your own custom layouts, you can inherit from either this class or +from one of the other predefined layout classes. +If you inherit from this base class, you will want to override the doLayout method. +You can call the Part.move method to re-position a part, including whole groups. +Please read the Introduction page on Extensions for how to override methods and how to call a base method.

      +

      Index

      Constructors

      • +

        Create a minimal layout that only positions Nodes that do not have a location.

        +

        Parameters

        • Optional init: Partial<Layout>
          +

          Optional initialization properties.

          +

        Returns Layout

      Properties

      • +

        Gets or sets the top-left point for where the graph should be positioned when laid out. +The default value for this property is the Point(0, 0). +Setting this property to a new value invalidates this layout. +This property is likely to be set by many Layouts that belong to a Group when the layout is performed.

        +
      • +

        Gets or sets a function that determines the initial size and position in document coordinates of a LayoutVertex corresponding to a Node. +This function is called by getLayoutBounds. +The default value for this property is null, in which case the GraphObject.actualBounds of the Node is used. +Setting this property to a new value invalidates this layout.

        +

        The non-null value must be a function that takes 3 arguments. +The first argument will be the Part whose bounds the Layout should use. +The second argument will be this Layout. +The third argument will be a Rect that must be modified and returned +The return value must be in document coordinates. You may find it convenient to call GraphObject.getDocumentBounds +to get the bounds in document coordinates of an object within the node.

        +
        since

        2.0

        +
      • +

        Gets the Diagram that owns this layout, if it is the value of Diagram.layout.

        +

        If this property and group are non-null, the Group should be in this Diagram.

        +
        see

        group

        +
      • +

        Gets the Group that uses this layout, if it is the value of a group's Group.layout.

        +

        If this property is set to a Group, the diagram is automatically set to be the Group's Diagram.

        +
        see

        diagram

        +
      • +

        Gets or sets whether this layout is performed on an initial layout. +The default value is true. +Setting this property to false causes isValidLayout to be set to true +so that the diagram does not perform this layout.

        +

        If you set both isInitial and isOngoing to false, +there will be no automatic layout invalidation, because invalidateLayout +will not set isValidLayout to false. +To get your nodes to appear, you will need to explicitly set or data-bind their Part.location +or GraphObject.position to real Point values, because automatic layout will not assign any positions.

        +

        Another way of controlling when layouts are invalidated is by setting +Part.isLayoutPositioned or Part.layoutConditions.

        +
      • +

        Gets or sets whether this layout can be invalidated by invalidateLayout. +Set this to false to prevent actions such as adding or removing Parts from invalidating this layout. +The default value is true. +Setting this property does not invalidate this layout.

        +

        If you set both isInitial and isOngoing to false, +there will be no automatic layout invalidation, because invalidateLayout +will not set isValidLayout to false. +To get your nodes to appear, you will need to explicitly set or data-bind their Part.location +or GraphObject.position to real Point values, because automatic layout will not assign any positions.

        +

        Another way of controlling when layouts are invalidated is by setting +Part.isLayoutPositioned or Part.layoutConditions.

        +
      • +

        Gets or sets whether this layout be performed in real-time, before the end of a transaction. +All layouts that are invalidated will be performed at the end of a transaction. +The default value is null. +A null value is treated as true for a Diagram.layout but false for a Group.layout. +Setting this property does not invalidate this layout.

        +
        since

        1.2

        +
      • +

        Gets or sets whether this layout routes Links. +The default value is true. +When false, this layout will not explicitly set the Link.points, +and the default routing of each individual Link will take place after the Nodes are moved by commitLayout. +Setting this property does not invalidate this layout.

        +

        Some layouts ignore links, in which case this property is ignored.

        +
        since

        1.1

        +
      • +

        Gets or sets whether this layout needs to be performed again (if false). +Instead of setting this property directly, it is normal to set it to false by calling invalidateLayout, +since that also requests performing a layout in the near future.

        +
      • +

        Gets or sets whether this layout depends on the Diagram.viewportBounds's size. +If set to true, the layout will invalidate when the Diagram's viewport changes size. +This only applies to diagram layouts, not to group layouts, +and only when Diagram.autoScale is set to Diagram.None.

        +

        The default value is false. +Setting this property to true will invalidate this layout.

        +

        It is possible that a viewport-sized layout will trigger the Diagram to require scrollbars, +which modifies the Diagram.viewportBounds, which will in turn trigger another layout. +This is uncommon, but possible with GridLayout if the results require a vertical scrollbar, +and that vertical scrollbar shrinks the viewport width enough that a grid column can no longer fit. +When designing custom layouts, one should be careful that this behavior does not result in an infinite loop.

        +
      • +

        Gets or sets the LayoutNetwork used by this Layout, if any. +The default value is null. +Setting this property does not invalidate this layout. +Not all kinds of layout make use of a LayoutNetwork. +Call createNetwork or makeNetwork to create a network.

        +

      Methods

      • cloneProtected(copy: Layout): void
      • +

        Copies properties from this object to the given object, which is of the same class. +This is called by copy and should be overridden for each class that adds properties. +There are examples of such overrides in the samples. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        +
        since

        1.6

        +

        Parameters

        Returns void

      • +

        A convenient way of converting the Diagram|Group|Iterable argument to doLayout to an actual collection of eligible Parts. +The resulting Set will not include any Nodes or Links for which Part.canLayout is false. +If the argument includes a Group for which Group.layout is null, the resulting Set +will include the member parts of that group rather than that group itself. +You will not need to call collectParts if you call makeNetwork, +because that method does effectively the same thing when building the LayoutNetwork.

        +

        Typical usage:

        +
        public doLayout(coll) {
        // COLL might be a Diagram or a Group or some Iterable<Part>
        var it = this.collectParts(coll).iterator;
        while (it.next()) {
        var node = it.value;
        if (node instanceof go.Node) {
        . . . position the node . . .
        }
        }
        }
        -
        -
        since
        -

        1.7

        -
        -
        -
        -

        Parameters

        - -

        Returns Set<Part>

        -
      • -
      -
      -
      - -

      - Protected Virtual - commitLayout -

      -
        -
      • commitLayout(): void
      • -
      -
        -
      • -
        -

        When using a LayoutNetwork, commit changes to the diagram - by setting Node positions and by routing the Links. - This is called by updateParts within a transaction.

        -

        You should not call this method -- it is a "protected virtual" method. - This may be overridden by subclasses of Layout. - By default this method is implemented as follows:

        -
        protected commitLayout() {
        -  if (this.network === null) return;
        -  var vit = this.network.vertexes.iterator;
        -  while (vit.next()) {
        -    var vert = vit.value;
        -    vert.commit();
        -  }
        -  if (this.isRouting) {
        -    var eit = this.network.edges.iterator;
        -    while (eit.next()) {
        -      var edge = eit.value;
        -      edge.commit();
        -    }
        -  }
        -}
        +
        since

        1.7

        +

      Parameters

      Returns Set<Part>

    • commitLayout(): void
    • +

      When using a LayoutNetwork, commit changes to the diagram +by setting Node positions and by routing the Links. +This is called by updateParts within a transaction.

      +

      You should not call this method -- it is a "protected virtual" method. +This may be overridden by subclasses of Layout. +By default this method is implemented as follows:

      +
      protected commitLayout() {
      if (this.network === null) return;
      var vit = this.network.vertexes.iterator;
      while (vit.next()) {
      var vert = vit.value;
      vert.commit();
      }
      if (this.isRouting) {
      var eit = this.network.edges.iterator;
      while (eit.next()) {
      var edge = eit.value;
      edge.commit();
      }
      }
      }
      -

      Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - copy -

    - -
      -
    • -
      -

      Creates a copy of this Layout and returns it. - When a Group is copied that has a Group.layout, the Layout must also be copied. - This calls cloneProtected on a newly constructed Layout.

      -
      -

      Returns Layout

      -
    • -
    -
    -
    - -

    - Virtual - createNetwork -

    - - -
    -
    - -

    - Virtual - doLayout -

    - -
      -
    • -
      -

      Position all of the nodes that do not have an assigned Part.location - in the manner of a simple rectangular array. - The default implementation ignores all Groups and Links; - many subclasses of Layout ignore all instances of Parts - that are not Nodes or Links.

      -

      You can override this method to do whatever node positioning and link routing - that you wish.

      -

      When the layout makes use of a LayoutNetwork, - this method should call makeNetwork and updateParts. - The updateParts method will call commitLayout within a transaction. - The outline of such an override should be like:

      -
      public doLayout(coll) {
      -  if (this.network === null) this.network = this.makeNetwork(coll);
      -  // assign LayoutVertex.bounds to all vertexes in the network:
      -  var vit = this.network.vertexes.iterator;
      -  while (vit.next()) {
      -    var v = vit.value;
      -    v.centerX = ...
      -    v.centerY = ...
      -  }
      -  this.updateParts();
      -  this.network = null;
      -}
      +

      Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

    Returns void

  • +

    Position all of the nodes that do not have an assigned Part.location +in the manner of a simple rectangular array. +The default implementation ignores all Groups and Links; +many subclasses of Layout ignore all instances of Parts +that are not Nodes or Links.

    +

    You can override this method to do whatever node positioning and link routing +that you wish.

    +

    When the layout makes use of a LayoutNetwork, +this method should call makeNetwork and updateParts. +The updateParts method will call commitLayout within a transaction. +The outline of such an override should be like:

    +
    public doLayout(coll) {
    if (this.network === null) this.network = this.makeNetwork(coll);
    // assign LayoutVertex.bounds to all vertexes in the network:
    var vit = this.network.vertexes.iterator;
    while (vit.next()) {
    var v = vit.value;
    v.centerX = ...
    v.centerY = ...
    }
    this.updateParts();
    this.network = null;
    }
    -

    Override commitLayout to actually position nodes and route links.

    -

    When the layout does not make use of a LayoutNetwork, - this method should make direct changes to Nodes and Links - within a transaction, and it should call collectParts on the argument coll in order - to get the proper set of Nodes and Links to work on. - Examples are provided in the Extensions directory.

    -

    If this Layout belongs to a Diagram, the argument must be either the same Diagram or must denote Parts that belong to the Diagram. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- getLayoutBounds -

- -
    -
  • -
    -

    This method is called by layouts to determine the size and initial position of the nodes that it is laying out. - Normally this just returns the part's GraphObject.actualBounds. - However, if boundsComputation has been set to a function, that function will be called - in order to return the bounds of the given Part in document coordinates that the layout should pretend it has.

    -
    -
    since
    -

    2.0

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      part: Part
      -
      -

      the Part being laid out

      -
      -
    • -
    • -
      Optional rect: Rect
      -
      -

      an optional Rect that will be modified and returned

      -
      -
    • -
    -

    Returns Rect

    -

    a Rect in document coordinates

    -
  • -
-
-
- -

- Protected Virtual - initialOrigin -

- -
    -
  • -
    -

    Compute the desired value of arrangementOrigin if this Layout is being performed for a Group. - This is typically called near the beginning of the implementation of doLayout: - this.arrangementOrigin = this.initialOrigin(this.arrangementOrigin); - if the layout wants to respect the pre-layout location of the Group when deciding where to position its member nodes.

    -
    -

    Parameters

    - -

    Returns Point

    -
  • -
-
-
- -

- invalidateLayout -

-
    -
  • invalidateLayout(): void
  • -
-
    -
  • -
    -

    If isOngoing is true and if an initial layout has not yet been performed, - set the isValidLayout property to false, and ask to perform another layout in the near future. - If isInitial is true, this layout is invalidated only when the Diagram.model is replaced, - not under the normal circumstances such as when parts are added or removed or - due to other calls to Layout.invalidateLayout.

    -

    If you set both isInitial and isOngoing to false, - there will be no automatic layout invalidation, because this method - will not set isValidLayout to false. - However you can still set isValidLayout explicitly.

    -

    This is typically called when a layout property value has changed, - or when a Part is added or removed or changes visibility, if Part.layoutConditions includes the pertinent flags.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Virtual - makeNetwork -

- -
    -
  • -
    -

    Create and initialize a LayoutNetwork with the given nodes and links. - This should be called by doLayout when this layout uses a network. - This method calls createNetwork to allocate the network. - This may be overridden in Layout subclasses to customize the initialization. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Parameters

    - -

    Returns LayoutNetwork

    -

    normally the value of a call to createNetwork initialized by vertexes and edges corresponding to the coll argument.

    -
  • -
-
-
- -

- Virtual - updateParts -

-
    -
  • updateParts(): void
  • -
-
    -
  • -
    -

    When using a LayoutNetwork, update the "physical" node positionings and link routings. - This should be called by doLayout when this layout uses a network. - This calls commitLayout to actually set Node positions and route Links. - This performs the changes within a transaction. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Returns void

    -
  • -
-
-
-
- -
-
-
- -
-
- - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/LayoutEdge.html b/api/symbols/LayoutEdge.html index 9fc2adb60..def8ea7f5 100644 --- a/api/symbols/LayoutEdge.html +++ b/api/symbols/LayoutEdge.html @@ -1,397 +1,71 @@ - - - - - - LayoutEdge | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class LayoutEdge

-
-
-
-
-
-
-
-
-
-

Hierarchy

- -
-
-
-

An edge represents a Link in a LayoutNetwork, - along with its fromVertex and toVertex. - The link property may be null for edges that represent "dummy" links, - when the layout wants to work with a network that is not isomorphic with the collection of Nodes and Links being laid out.

-

It holds layout-specific data for the link. - For each kind of layout that uses a LayoutNetwork there is a subclass of LayoutVertex and a subclass of LayoutEdge:

- -

Modifying a LayoutNetwork or a LayoutVertex or a LayoutEdge does not - invalidate the Layout or raise any changed events.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- -
    -
  • -
    -

    This constructs an edge that does not know about any Link.

    -
    -

    Parameters

    - -

    Returns LayoutEdge

    -
  • -
-
-
-
-

Properties

-
- -

- data - : ObjectData

-
    -
  • -
    -

    For virtualized layouts working on model data instead of a Link.

    -
    -
    since
    -

    1.6

    -
    -
    -
    -
  • -
-
-
- -

- fromVertex - : LayoutVertex

- -
-
- -

- link - : Link

-
    -
  • -
    -

    Gets or sets the Link associated with this edge, if any. - The value may be null if this edge is a "dummy" edge, - not represented by a real Link in the Diagram.

    -
    -
  • -
-
-
- -

- network - : LayoutNetwork

- -
-
- -

- toVertex - : LayoutVertex

- -
-
-
-

Methods

-
- -

- Virtual - commit -

-
    -
  • commit(): void
  • -
-
    -
  • -
    -

    Commits the route of this edge to the corresponding Link, if any. - By default this does nothing. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Returns void

    -
  • -
-
-
- -

- getOtherVertex -

- -
    -
  • -
    -

    Returns the edge's vertex at the other of this edge from the given vertex.

    -
    -

    Parameters

    - -

    Returns LayoutVertex

    -
  • -
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class LayoutEdge

Hierarchy

+

An edge represents a Link in a LayoutNetwork, +along with its fromVertex and toVertex. +The link property may be null for edges that represent "dummy" links, +when the layout wants to work with a network that is not isomorphic with the collection of Nodes and Links being laid out.

+

It holds layout-specific data for the link. +For each kind of layout that uses a LayoutNetwork there is a subclass of LayoutVertex and a subclass of LayoutEdge:

+ +

Modifying a LayoutNetwork or a LayoutVertex or a LayoutEdge does not +invalidate the Layout or raise any changed events.

+

Index

Constructors

Properties

  • +

    For virtualized layouts working on model data instead of a Link.

    +
    since

    1.6

    +
  • +

    Gets or sets the Link associated with this edge, if any. +The value may be null if this edge is a "dummy" edge, +not represented by a real Link in the Diagram.

    +

Methods

  • commit(): void
  • +

    Commits the route of this edge to the corresponding Link, if any. +By default this does nothing. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    +

    Returns void

  • +

    Returns the edge's vertex at the other of this edge from the given vertex.

    +

    Parameters

    Returns LayoutVertex

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/LayoutNetwork.html b/api/symbols/LayoutNetwork.html index b8cdd7e77..4f1e06c54 100644 --- a/api/symbols/LayoutNetwork.html +++ b/api/symbols/LayoutNetwork.html @@ -1,880 +1,155 @@ - - - - - - LayoutNetwork | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class LayoutNetwork

-
-
-
-
-
-
-
-
-
-

Hierarchy

- -
-
-
-

This provides an abstract view of a diagram as a - network (graph) of vertexes and directed edges. - The network contains vertexes and edges corresponding to Nodes and Links.

-

This class provides a framework for manipulating the - state of nodes and links without modifying the structure of the diagram. - Having a separate representation also permits adding or removing vertexes or edges - from the network so that the graph that is laid out is not isomorphic to the diagram's graph.

-

For each kind of layout that uses a LayoutNetwork there is a subclass of LayoutVertex and a subclass of LayoutEdge:

- -

Modifying a LayoutNetwork or a LayoutVertex or a LayoutEdge does not - invalidate the Layout or raise any changed events.

-
-
-
-

Index

-
- -
-
-
-

Constructors

-
- -

- constructor -

- -
    -
  • -
    -

    This constructs an empty network. - It is commonplace to call addParts to build up the network - to have the same structure as a Diagram's or Group's nodes and links.

    -
    -

    Parameters

    - -

    Returns LayoutNetwork

    -
  • -
-
-
-
-

Properties

-
- -

- Read-only - edges - : Set<LayoutEdge>

- -
-
- -

- layout - : Layout

- -
-
- -

- Read-only - vertexes - : Set<LayoutVertex>

- -
-
-
-

Methods

-
- -

- addEdge -

- -
    -
  • -
    -

    Adds a LayoutEdge to the network. - Although this method is provided for completeness, - linkVertexes provides a more efficient manner of linking - vertexes already in the network.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- addLink -

- - -
-
- -

- addNode -

- -
    -
  • -
    -

    This convenience method makes sure there is a LayoutVertex - in this network corresponding to a Node.

    -
    -

    Parameters

    -
      -
    • -
      node: Node
      -
    • -
    -

    Returns LayoutVertex

    -

    a vertex in this network.

    -
  • -
-
-
- -

- addParts -

-
    -
  • addParts(parts: Iterable<Part>, toplevelonly?: boolean, pred?: (a: Part) => boolean): void
  • -
-
    -
  • -
    -

    Creates a network of LayoutVertexes and LayoutEdges - corresponding to the given Nodes and Links. - This is usually more convenient than repeatedly calling addNode and addLink. - This method ignores all instances of Parts that are not Nodes or Links. - This will recurse through Groups that have no Group.layout.

    -
    -

    Parameters

    -
      -
    • -
      parts: Iterable<Part>
      -
      -

      A collection of Nodes or Links.

      -
      -
    • -
    • -
      Optional toplevelonly: boolean
      -
      -

      whether to skip Parts in the given collection that are contained by Groups; default is false

      -
      -
    • -
    • -
      Optional pred: (a: Part) => boolean
      -
      -

      optional predicate to apply to each Part -- - if it returns false do not include Vertex or Edge in the network; - default ignores link label nodes or links connecting with them

      -
      -
        -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- addVertex -

- - -
-
- -

- Virtual - createEdge -

- -
    -
  • -
    -

    Allocate a new instance of LayoutEdge. - This is overridden in LayoutNetwork subclasses to create instances of subclasses of LayoutEdge. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Returns LayoutEdge

    -
  • -
-
-
- -

- Virtual - createVertex -

- -
    -
  • -
    -

    Allocate a new instance of LayoutVertex. - This is overridden in LayoutNetwork subclasses to create instances of subclasses of LayoutVertex. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Returns LayoutVertex

    -
  • -
-
-
- -

- Virtual - deleteArtificialVertexes -

-
    -
  • deleteArtificialVertexes(): void
  • -
-
    -
  • -
    -

    Deletes all vertexes and edges that have no Part associated with them.

    -
    -

    Returns void

    -
  • -
-
-
- -

- deleteEdge -

- -
    -
  • -
    -

    Removes a LayoutEdge from the network.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- deleteLink -

-
    -
  • deleteLink(link: Link): void
  • -
-
    -
  • -
    -

    This convenience method deletes from this network any LayoutEdge - corresponding to a Link.

    -
    -

    Parameters

    -
      -
    • -
      link: Link
      -
      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- deleteNode -

-
    -
  • deleteNode(node: Node): void
  • -
-
    -
  • -
    -

    This convenience method deletes any LayoutVertex - corresponding to a Node.

    -
    -

    Parameters

    -
      -
    • -
      node: Node
      -
      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- deleteSelfEdges -

-
    -
  • deleteSelfEdges(): void
  • -
-
    -
  • -
    -

    Deletes all LayoutEdges whose "to vertex" and "from vertex" are the same vertex.

    -
    -

    Returns void

    -
  • -
-
-
- -

- deleteVertex -

- -
    -
  • -
    -

    Removes a LayoutVertex from the network. - This function also deletes all edges to or from the vertex.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- findAllParts -

- - -
-
- -

- findEdge -

- -
    -
  • -
    -

    Returns the LayoutEdge that was constructed for the Link.

    -
    -

    Parameters

    -
      -
    • -
      link: Link
      -
    • -
    -

    Returns LayoutEdge

    -

    an edge in this network, or null if no such edge exists.

    -
  • -
-
-
- -

- findVertex -

- -
    -
  • -
    -

    Returns the LayoutVertex that was constructed for the Node.

    -
    -

    Parameters

    -
      -
    • -
      node: Node
      -
    • -
    -

    Returns LayoutVertex

    -

    a vertex in this network, or null if no such vertex exists.

    -
  • -
-
-
- -

- linkVertexes -

- -
    -
  • -
    -

    Links two vertexes already in the network and returns the created LayoutEdge.

    -
    -

    Parameters

    - -

    Returns LayoutEdge

    -

    an edge in this network, or null if both vertexes don't exist.

    -
  • -
-
-
- -

- reverseEdge -

- -
    -
  • -
    -

    Reverses the direction of a LayoutEdge in the network.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- splitIntoSubNetworks -

- -
    -
  • -
    -

    Modify this network by splitting it up into separate subnetworks, - each of which has all of its vertexes connected to each other, but not - to any vertexes in any other subnetworks.

    -

    This method will first delete from this network all artificial vertexes and - all edges that do not connect two different vertexes. - Afterwards, this original network may be empty or may contain all of the - singleton vertexes, each of which had no edges connecting it to any other vertexes.

    -
    -

    Parameters

    -
      -
    • -
      Optional clean: boolean
      -
      -

      whether to delete artificial vertexes and edges, disconnected edges, and reflexive edges; default is true

      -
      -
    • -
    -

    Returns List<LayoutNetwork>

    -

    a collection of LayoutNetworks, - sorted in order of decreasing vertex count.

    -
  • -
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class LayoutNetwork

Hierarchy

+

This provides an abstract view of a diagram as a +network (graph) of vertexes and directed edges. +The network contains vertexes and edges corresponding to Nodes and Links.

+

This class provides a framework for manipulating the +state of nodes and links without modifying the structure of the diagram. +Having a separate representation also permits adding or removing vertexes or edges +from the network so that the graph that is laid out is not isomorphic to the diagram's graph.

+

For each kind of layout that uses a LayoutNetwork there is a subclass of LayoutVertex and a subclass of LayoutEdge:

+ +

Modifying a LayoutNetwork or a LayoutVertex or a LayoutEdge does not +invalidate the Layout or raise any changed events.

+

Index

Constructors

  • +

    This constructs an empty network. +It is commonplace to call addParts to build up the network +to have the same structure as a Diagram's or Group's nodes and links.

    +

    Parameters

    Returns LayoutNetwork

Properties

Methods

  • +

    Adds a LayoutEdge to the network. +Although this method is provided for completeness, +linkVertexes provides a more efficient manner of linking +vertexes already in the network.

    +

    Parameters

    Returns void

  • +

    This convenience method makes sure there is a LayoutVertex +in this network corresponding to a Node.

    +

    Parameters

    Returns LayoutVertex

    a vertex in this network.

    +
  • addParts(parts: Iterable<Part>, toplevelonly?: boolean, pred?: (a: Part) => boolean): void
  • +

    Creates a network of LayoutVertexes and LayoutEdges +corresponding to the given Nodes and Links. +This is usually more convenient than repeatedly calling addNode and addLink. +This method ignores all instances of Parts that are not Nodes or Links. +This will recurse through Groups that have no Group.layout.

    +

    Parameters

    • parts: Iterable<Part>
      +

      A collection of Nodes or Links.

      +
    • Optional toplevelonly: boolean
      +

      whether to skip Parts in the given collection that are contained by Groups; default is false

      +
    • Optional pred: (a: Part) => boolean
      +

      optional predicate to apply to each Part -- + if it returns false do not include Vertex or Edge in the network; + default ignores link label nodes or links connecting with them

      +
        • Parameters

          Returns boolean

    Returns void

  • +

    Allocate a new instance of LayoutEdge. +This is overridden in LayoutNetwork subclasses to create instances of subclasses of LayoutEdge. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    +

    Returns LayoutEdge

  • +

    Allocate a new instance of LayoutVertex. +This is overridden in LayoutNetwork subclasses to create instances of subclasses of LayoutVertex. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    +

    Returns LayoutVertex

  • deleteArtificialVertexes(): void
  • +

    Deletes all vertexes and edges that have no Part associated with them.

    +

    Returns void

  • deleteLink(link: Link): void
  • +

    This convenience method deletes from this network any LayoutEdge +corresponding to a Link.

    +

    Parameters

    Returns void

  • deleteNode(node: Node): void
  • +

    This convenience method deletes any LayoutVertex +corresponding to a Node.

    +

    Parameters

    Returns void

  • deleteSelfEdges(): void
  • +

    Deletes all LayoutEdges whose "to vertex" and "from vertex" are the same vertex.

    +

    Returns void

  • +

    Removes a LayoutVertex from the network. +This function also deletes all edges to or from the vertex.

    +

    Parameters

    Returns void

  • +

    Returns the LayoutEdge that was constructed for the Link.

    +

    Parameters

    Returns LayoutEdge

    an edge in this network, or null if no such edge exists.

    +
  • +

    Returns the LayoutVertex that was constructed for the Node.

    +

    Parameters

    Returns LayoutVertex

    a vertex in this network, or null if no such vertex exists.

    +
  • +

    Modify this network by splitting it up into separate subnetworks, +each of which has all of its vertexes connected to each other, but not +to any vertexes in any other subnetworks.

    +

    This method will first delete from this network all artificial vertexes and +all edges that do not connect two different vertexes. +Afterwards, this original network may be empty or may contain all of the +singleton vertexes, each of which had no edges connecting it to any other vertexes.

    +

    Parameters

    • Optional clean: boolean
      +

      whether to delete artificial vertexes and edges, disconnected edges, and reflexive edges; default is true

      +

    Returns List<LayoutNetwork>

    a collection of LayoutNetworks, +sorted in order of decreasing vertex count.

    +

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/LayoutVertex.html b/api/symbols/LayoutVertex.html index 25010626e..0b68be867 100644 --- a/api/symbols/LayoutVertex.html +++ b/api/symbols/LayoutVertex.html @@ -1,855 +1,161 @@ - - - - - - LayoutVertex | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class LayoutVertex

-
-
-
-
-
-
-
-
-
-

Hierarchy

- -
-
-
-

A vertex represents a Node in a LayoutNetwork, - along with its bounds and focus and collections of LayoutEdges that come into and go out of the vertex. - The node property may be null for vertexes that represent "dummy" nodes, - when the layout wants to work with a network that is not isomorphic with the collection of Nodes and Links being laid out.

-

This holds layout-specific data for the node. - For each kind of layout that uses a LayoutNetwork there is a subclass of LayoutVertex and a subclass of LayoutEdge:

- -

Modifying a LayoutNetwork or a LayoutVertex or a LayoutEdge does not - invalidate the Layout or raise any changed events.

-
-
-
-

Index

-
- -
-
-
-

Constructors

-
- -

- constructor -

- - -
-
-
-

Properties

-
- -

- bounds - : Rect

-
    -
  • -
    -

    Gets or sets the bounds of this vertex, in document coordinates. - Setting this property does not directly modify the position of any Node, - but it will modify the value of centerX and centerY, - as well as the subsidiary convenience properties x, y, width, and height.

    -
    -
  • -
-
-
- -

- centerX - : number

-
    -
  • -
    -

    Gets or sets the center Point.x of this vertex, in document coordinates. - This property depends on both bounds and focus. - Setting this property does not modify the position of any Node, - but it will modify the value of bounds.

    -
    -
  • -
-
-
- -

- centerY - : number

-
    -
  • -
    -

    Gets or sets the center Point.y of this vertex, in document coordinates. - This property depends on both bounds and focus. - Setting this property does not modify the position of any Node, - but it will modify the value of bounds.

    -
    -
  • -
-
-
- -

- data - : ObjectData

-
    -
  • -
    -

    Gets or sets the data object in the model that should be associated with this vertex, if any. - The value will be non-null if this vertex is virtualized, - not represented by a real Node in the Diagram. - Each data object should have a 'bounds' property that is a Rect - or any JavaScript Object with 'x', 'y', 'width', and 'height' properties that are real numbers, - and non-negative numbers for the width and the height. - Setting this data property will also set the bounds and focus properties.

    -
    -
    since
    -

    1.6

    -
    -
    -
    -
  • -
-
-
- -

- Read-only - destinationEdges - : Iterator<LayoutEdge>

-
    -
  • -
    -

    This read-only property returns an iterator for all of the edges that go out of this vertex.

    -
    -
  • -
-
-
- -

- Read-only - destinationVertexes - : Iterator<LayoutVertex>

-
    -
  • -
    -

    This read-only property returns an iterator for all of the vertexes that are connected with edges going out of this vertex.

    -

    Note that this is inefficient compared to iterating over the edges (destinationEdges) due to the need - to avoid duplicate vertexes if there happen to be multiple edges connecting with the same vertex.

    -
    -
  • -
-
-
- -

- Read-only - edges - : Iterator<LayoutEdge>

-
    -
  • -
    -

    This read-only property returns an iterator for all of the edges that are connected with this vertex in either direction.

    -

    Note that this is inefficient compared to iterating over the edges: sourceEdges and destinationEdges.

    -
    -
  • -
-
-
- -

- Read-only - edgesCount - : number

-
    -
  • -
    -

    This read-only property returns the total number of edges that are connected with this vertex in either direction.

    -
    -
  • -
-
-
- -

- focus - : Point

-
    -
  • -
    -

    Gets or sets the offset of the focusX and focusY - from the bounds position. - Setting this property does not directly modify the position of any Node, - but it does affect the value of centerX and centerY.

    -

    The "focus" is normally the center of the Node's Part.locationObject.

    -
    -
  • -
-
-
- -

- focusX - : number

-
    -
  • -
    -

    Gets or sets the relative X position of the "center" point, the focus.

    -
    -
  • -
-
-
- -

- focusY - : number

-
    -
  • -
    -

    Gets or sets the relative Y position of the "center" point, the focus.

    -
    -
  • -
-
-
- -

- height - : number

-
    -
  • -
    -

    Gets or sets the height of this vertex. - This is always the vertical distance reserved for the node.

    -
    -
  • -
-
-
- -

- network - : LayoutNetwork

- -
-
- -

- node - : Node

-
    -
  • -
    -

    Gets or sets the Node associated with this vertex, if any. - The value may be null if this vertex is a "dummy" vertex, - not represented by a real Node in the Diagram.

    -

    This property setter also sets the bounds and focus properties - according to the value of the Node's actualBounds and its Part.locationObject's center point.

    -
    -
  • -
-
-
- -

- Read-only - sourceEdges - : Iterator<LayoutEdge>

-
    -
  • -
    -

    This read-only property returns an iterator for all of the edges that come into this vertex.

    -
    -
  • -
-
-
- -

- Read-only - sourceVertexes - : Iterator<LayoutVertex>

-
    -
  • -
    -

    This read-only property returns an iterator for all of the vertexes that are connected with edges coming into this vertex.

    -

    Note that this is inefficient compared to iterating over the edges (sourceEdges) due to the need - to avoid duplicate vertexes if there happen to be multiple edges connecting with the same vertex.

    -
    -
  • -
-
-
- -

- Read-only - vertexes - : Iterator<LayoutVertex>

-
    -
  • -
    -

    This read-only property returns an iterator for all of the vertexes that are connected in either direction with this vertex.

    -

    Note that this is inefficient compared to iterating over the edges (sourceEdges and destinationEdges) due to the need - to avoid duplicate vertexes if there happen to be multiple edges connecting with the same vertex.

    -
    -
  • -
-
-
- -

- width - : number

-
    -
  • -
    -

    Gets or sets the width of this vertex. - This is always the horizontal distance reserved for the node.

    -
    -
  • -
-
-
- -

- x - : number

-
    -
  • -
    -

    Gets or sets the left point of this vertex.

    -
    -
  • -
-
-
- -

- y - : number

-
    -
  • -
    -

    Gets or sets the top point of this vertex.

    -
    -
  • -
-
-
-
-

Methods

-
- -

- addDestinationEdge -

- -
    -
  • -
    -

    Adds a LayoutEdge to the list of successors - (the edge will be going out from this vertex). - Calling this method does not modify the LayoutEdge.fromVertex of the LayoutEdge.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- addSourceEdge -

- -
    -
  • -
    -

    Adds a LayoutEdge to the list of predecessors - (the edge will be coming into this vertex). - Calling this method does not modify the LayoutEdge.toVertex of the LayoutEdge.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- Virtual - commit -

-
    -
  • commit(): void
  • -
-
    -
  • -
    -

    Moves the Node corresponding to this vertex - so that its position is at the current bounds point.

    -

    To make the most common cases look right, the Node's Part.locationObject - is centered. Thus iconic nodes will have the center of the icon be positioned - according to the center of this vertex, ignoring any labels. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Returns void

    -
  • -
-
-
- -

- deleteDestinationEdge -

-
    -
  • deleteDestinationEdge(edge: LayoutEdge): void
  • -
-
    -
  • -
    -

    Deletes a LayoutEdge from the list of successors - (the edge was going out from this vertex). - Calling this method does not modify the LayoutEdge.fromVertex of the LayoutEdge.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- deleteSourceEdge -

- -
    -
  • -
    -

    Deletes a LayoutEdge from the list of predecessors - (the edge was coming into this vertex). - Calling this method does not modify the LayoutEdge.toVertex of the LayoutEdge.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- Static - smartComparer -

- -
    -
  • -
    -

    This static function is used to compare the Part.text values of the nodes of - the argument LayoutVertexes. - If the text ends in a number, the values are compared as numbers rather than lexicographically. - Naturally this comparison is significantly slower than LayoutVertex.standardComparer.

    -
    -

    Parameters

    - -

    Returns number

    -

    int -1, 0, or 1, depending on whether the comparison between M and N is less than, equal, or greater than.

    -
  • -
-
-
- -

- Static - standardComparer -

- -
    -
  • -
    -

    This static function is used to compare the Part.text values of the nodes of - the argument LayoutVertexes. - This just does a simple case-sensitive string comparison. - Alternatively you may wish to use LayoutVertex.smartComparer or write your own comparison function.

    -
    -

    Parameters

    - -

    Returns number

    -

    int -1, 0, or 1, depending on whether the comparison between M and N is less than, equal, or greater than.

    -
  • -
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class LayoutVertex

Hierarchy

+

A vertex represents a Node in a LayoutNetwork, +along with its bounds and focus and collections of LayoutEdges that come into and go out of the vertex. +The node property may be null for vertexes that represent "dummy" nodes, +when the layout wants to work with a network that is not isomorphic with the collection of Nodes and Links being laid out.

+

This holds layout-specific data for the node. +For each kind of layout that uses a LayoutNetwork there is a subclass of LayoutVertex and a subclass of LayoutEdge:

+ +

Modifying a LayoutNetwork or a LayoutVertex or a LayoutEdge does not +invalidate the Layout or raise any changed events.

+

Index

Constructors

Properties

  • +

    Gets or sets the bounds of this vertex, in document coordinates. +Setting this property does not directly modify the position of any Node, +but it will modify the value of centerX and centerY, +as well as the subsidiary convenience properties x, y, width, and height.

    +
  • +

    Gets or sets the center Point.x of this vertex, in document coordinates. +This property depends on both bounds and focus. +Setting this property does not modify the position of any Node, +but it will modify the value of bounds.

    +
  • +

    Gets or sets the center Point.y of this vertex, in document coordinates. +This property depends on both bounds and focus. +Setting this property does not modify the position of any Node, +but it will modify the value of bounds.

    +
  • +

    Gets or sets the data object in the model that should be associated with this vertex, if any. +The value will be non-null if this vertex is virtualized, +not represented by a real Node in the Diagram. +Each data object should have a 'bounds' property that is a Rect +or any JavaScript Object with 'x', 'y', 'width', and 'height' properties that are real numbers, +and non-negative numbers for the width and the height. +Setting this data property will also set the bounds and focus properties.

    +
    since

    1.6

    +
  • +

    This read-only property returns an iterator for all of the edges that go out of this vertex.

    +
  • +

    This read-only property returns an iterator for all of the vertexes that are connected with edges going out of this vertex.

    +

    Note that this is inefficient compared to iterating over the edges (destinationEdges) due to the need +to avoid duplicate vertexes if there happen to be multiple edges connecting with the same vertex.

    +
  • +

    This read-only property returns an iterator for all of the edges that are connected with this vertex in either direction.

    +

    Note that this is inefficient compared to iterating over the edges: sourceEdges and destinationEdges.

    +
  • +

    This read-only property returns the total number of edges that are connected with this vertex in either direction.

    +
  • +

    Gets or sets the offset of the focusX and focusY +from the bounds position. +Setting this property does not directly modify the position of any Node, +but it does affect the value of centerX and centerY.

    +

    The "focus" is normally the center of the Node's Part.locationObject.

    +
  • +

    Gets or sets the relative X position of the "center" point, the focus.

    +
  • +

    Gets or sets the relative Y position of the "center" point, the focus.

    +
  • +

    Gets or sets the height of this vertex. +This is always the vertical distance reserved for the node.

    +
  • +

    Gets or sets the Node associated with this vertex, if any. +The value may be null if this vertex is a "dummy" vertex, +not represented by a real Node in the Diagram.

    +

    This property setter also sets the bounds and focus properties +according to the value of the Node's actualBounds and its Part.locationObject's center point.

    +
  • +

    This read-only property returns an iterator for all of the edges that come into this vertex.

    +
  • +

    This read-only property returns an iterator for all of the vertexes that are connected with edges coming into this vertex.

    +

    Note that this is inefficient compared to iterating over the edges (sourceEdges) due to the need +to avoid duplicate vertexes if there happen to be multiple edges connecting with the same vertex.

    +
  • +

    This read-only property returns an iterator for all of the vertexes that are connected in either direction with this vertex.

    +

    Note that this is inefficient compared to iterating over the edges (sourceEdges and destinationEdges) due to the need +to avoid duplicate vertexes if there happen to be multiple edges connecting with the same vertex.

    +
  • +

    Gets or sets the width of this vertex. +This is always the horizontal distance reserved for the node.

    +
  • +

    Gets or sets the left point of this vertex.

    +
  • +

    Gets or sets the top point of this vertex.

    +

Methods

  • +

    Adds a LayoutEdge to the list of successors +(the edge will be going out from this vertex). +Calling this method does not modify the LayoutEdge.fromVertex of the LayoutEdge.

    +

    Parameters

    Returns void

  • +

    Adds a LayoutEdge to the list of predecessors +(the edge will be coming into this vertex). +Calling this method does not modify the LayoutEdge.toVertex of the LayoutEdge.

    +

    Parameters

    Returns void

  • commit(): void
  • +

    Moves the Node corresponding to this vertex +so that its position is at the current bounds point.

    +

    To make the most common cases look right, the Node's Part.locationObject +is centered. Thus iconic nodes will have the center of the icon be positioned +according to the center of this vertex, ignoring any labels. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    +

    Returns void

  • +

    Deletes a LayoutEdge from the list of successors +(the edge was going out from this vertex). +Calling this method does not modify the LayoutEdge.fromVertex of the LayoutEdge.

    +

    Parameters

    Returns void

  • +

    Deletes a LayoutEdge from the list of predecessors +(the edge was coming into this vertex). +Calling this method does not modify the LayoutEdge.toVertex of the LayoutEdge.

    +

    Parameters

    Returns void

  • +

    This static function is used to compare the Part.text values of the nodes of +the argument LayoutVertexes. +If the text ends in a number, the values are compared as numbers rather than lexicographically. +Naturally this comparison is significantly slower than LayoutVertex.standardComparer.

    +

    Parameters

    Returns number

    int -1, 0, or 1, depending on whether the comparison between M and N is less than, equal, or greater than.

    +
  • +

    This static function is used to compare the Part.text values of the nodes of +the argument LayoutVertexes. +This just does a simple case-sensitive string comparison. +Alternatively you may wish to use LayoutVertex.smartComparer or write your own comparison function.

    +

    Parameters

    Returns number

    int -1, 0, or 1, depending on whether the comparison between M and N is less than, equal, or greater than.

    +

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Link.html b/api/symbols/Link.html index 80611daa2..6376f0b63 100644 --- a/api/symbols/Link.html +++ b/api/symbols/Link.html @@ -1,2625 +1,714 @@ - - - - - - Link | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class Link

-
-
-
-
-
-
-
-
-
-

Hierarchy

- -
-
-
-

A Link is a Part that connects Nodes. - The link relationship is directional, going from Link.fromNode to Link.toNode. - A link can connect to a specific port element in a node, as named by the Link.fromPortId - and Link.toPortId properties.

-

- For more discussion, see Introduction to Links. -

To add a Link to a Diagram when using a GraphLinksModel you should do something like:

-
  myDiagram.startTransaction("make new link");
-  myDiagram.model.addLinkData({ from: "Alpha", to: "Beta" });
-  myDiagram.commitTransaction("make new link");
+Link | GoJS API
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class Link

Hierarchy

+

A Link is a Part that connects Nodes. +The link relationship is directional, going from Link.fromNode to Link.toNode. +A link can connect to a specific port element in a node, as named by the Link.fromPortId +and Link.toPortId properties.

+

+For more discussion, see Introduction to Links.

To add a Link to a Diagram when using a GraphLinksModel you should do something like:

+
  myDiagram.startTransaction("make new link");
myDiagram.model.addLinkData({ from: "Alpha", to: "Beta" });
myDiagram.commitTransaction("make new link");
-

where you would substitute the keys of the actual nodes that you want to connect with a link. - This will cause a Link to be created (copying the template found in Diagram.linkTemplateMap), - added to the Diagram in some Layer (based on Part.layerName), and bound to the link data - (resulting in Panel.data referring to that link data object). - Note that link data objects, unlike Node data, do not have their own unique keys or identifiers, - because other Parts do not refer to them.

-

If you are using a TreeModel, there are no link data objects, so you just need to call - TreeModel.setParentKeyForNodeData to specify the "parent" node's key for a "child" node data.

-

To find a Link given a link data object in the GraphLinksModel, - call Diagram.findLinkForData. When using a TreeModel, call either Diagram.findNodeForData - or Diagram.findNodeForKey to get a Node, and then call Node.findTreeParentLink to get the Link, if any exists.

-

To find a link that connects two nodes, call Node.findLinksTo or Node.findLinksBetween. - With the former method, the direction matters; with the latter method it returns links in either direction.

-

A link's position and size are determined by the two nodes that it connects. - Normally there should be a Shape as the main element in this Link. - This shape is what users will see as the "line" or "wire" -- - you can set its Shape.stroke and other "stroke..." properties to control its appearance.

-

The link will compute a route (a sequence of points) going from the fromNode's port element - to the toNode's port element. - That route is used to generate the path of the main shape. - Properties that affect the nature of the route and the geometry of the path include:

- -

- For more discussion and examples, see Links. -

There are additional properties that affect how the end of the link connects to a port element of a node. - There are duplicate properties, ones for the "to" end and ones for the "from" end:

- -

These properties normally have "default" values, causing the link's routing and path-geometry generating - to get the corresponding values from the connected port element. - This scheme permits an individual link to have its own specific connection to a port, - taking precedence over how the port normally expects links to connect to it. - For example, several of the Layout classes sets these properties on each Link - as part of their route computation for links.

-

- For more discussion and examples, see Link Points. -

Elements other than the main Shape in the Link may act as decorations on the link, including arrowheads and labels. - You can control where they are located along the link route and how they are oriented. - Because these decorations may be any GraphObject, they are all properties of that class. - The properties include:

- -

If you do not set the GraphObject.segmentIndex property, the object is positioned - to be at the middle of the link.

-

- For more discussion and examples, see Link Labels. -

GoJS makes it easy to add arrowheads to your link template. - Just add a Shape with the appearance properties that you want, - and also set the Shape.toArrow or Shape.fromArrow property - to the name of the kind of arrowhead that you want. - Doing so automatically sets the "segment..." properties that are appropriate for the chosen arrowhead.

-

More than one shape may automatically get the route geometry. - This is useful when you want to have multiple link shapes with different thicknesses - to create a gradient effect across the path of the link or to produce parallel lines along the path. - Just set GraphObject.isPanelMain to true on each such Shape.

-

If you want the user to be able to reconnect a link, using the RelinkingTool, - you need to set one or both of relinkableFrom and relinkableTo to true. - The RelinkingTool shows a RelinkingTool.fromHandleArchetype and/or a - RelinkingTool.toHandleArchetype when the link is selected. - Such a relink handle can be dragged by the user to start a relinking operation.

-

If you want the user to be able to change the path of the link, using the LinkReshapingTool, - set Part.reshapable to true. - The LinkReshapingTool shows reshape handles that the user can drag to shift the position - of a point in the link's route. - The LinkReshapingTool.handleArchetype is copied for each reshape handle.

-

Often if a Link is reshapable, you will want to save the route in the model so that it can be restored - upon load. To save the route automatically, add a TwoWay Binding on the points property: - new go.Binding("points").makeTwoWay(). Model.toJson will automatically - convert the List of Points into an Array of numbers in the JSON representation, - if the property is named "points".

-

If a Link is Part.reshapable, it is also possible to allow the user to add and remove segments - from the link's route by setting resegmentable to true. - This causes the LinkReshapingTool to add resegmenting handles at the midpoints of each segment. - The LinkReshapingTool.midHandleArchetype is copied for each resegment handle. - When the user drags such a resegmenting handle, a new segment is inserted into the route. - Also, when the user drags a reshape handle such that two adjacent segments end up in a straight line, - a segment is removed from the route.

-

- For more discussion and examples, see Links, - Link Labels, and - Link Points. -

- To control what links a user may draw or reconnect, please read about - Validation. -

- To customize linking and relinking behavior, please read - Introduction to the Linking Tools - and Introduction to the RelinkingTool. - For customizing the reshaping of Links, - see Introduction to the LinkReshapingTool. -

Only Links that are in Diagrams can have connections with Nodes. - Templates should not be connected with Nodes, be members of Groups, or have any Adornments.

-
-
-
-

Index

-
- -
-
-
-

Constructors

-
- -

- constructor -

-
    -
  • new Link(init?: Partial<Link>): Link
  • -
-
    -
  • -
    -

    Constructs an empty link that does not connect any nodes. - If you want the link to be seen, you must provide a Shape as an element - to be used as the visual path for the link.

    -

    Usage example:

    -
    // Constructs a Link, sets properties on it,
    -// adds a data binding to it,
    -// and adds two Shapes to the Link:
    -const l = new go.Link({
    -  routing: go.Link.Orthogonal
    -})
    -.add(new go.Shape({ strokeWidth: 2 }))
    -.add(new go.Shape({ toArrow: "Standard" }))
    +

    where you would substitute the keys of the actual nodes that you want to connect with a link. +This will cause a Link to be created (copying the template found in Diagram.linkTemplateMap), +added to the Diagram in some Layer (based on Part.layerName), and bound to the link data +(resulting in Panel.data referring to that link data object). +Note that link data objects, unlike Node data, do not have their own unique keys or identifiers, +because other Parts do not refer to them.

    +

    If you are using a TreeModel, there are no link data objects, so you just need to call +TreeModel.setParentKeyForNodeData to specify the "parent" node's key for a "child" node data.

    +

    To find a Link given a link data object in the GraphLinksModel, +call Diagram.findLinkForData. When using a TreeModel, call either Diagram.findNodeForData +or Diagram.findNodeForKey to get a Node, and then call Node.findTreeParentLink to get the Link, if any exists.

    +

    To find a link that connects two nodes, call Node.findLinksTo or Node.findLinksBetween. +With the former method, the direction matters; with the latter method it returns links in either direction.

    +

    A link's position and size are determined by the two nodes that it connects. +Normally there should be a Shape as the main element in this Link. +This shape is what users will see as the "line" or "wire" -- +you can set its Shape.stroke and other "stroke..." properties to control its appearance.

    +

    The link will compute a route (a sequence of points) going from the fromNode's port element +to the toNode's port element. +That route is used to generate the path of the main shape. +Properties that affect the nature of the route and the geometry of the path include:

    + +

    +For more discussion and examples, see Links. + +

    There are additional properties that affect how the end of the link connects to a port element of a node. +There are duplicate properties, ones for the "to" end and ones for the "from" end:

    + +

    These properties normally have "default" values, causing the link's routing and path-geometry generating +to get the corresponding values from the connected port element. +This scheme permits an individual link to have its own specific connection to a port, +taking precedence over how the port normally expects links to connect to it. +For example, several of the Layout classes sets these properties on each Link +as part of their route computation for links.

    +

    +For more discussion and examples, see Link Points. + +

    Elements other than the main Shape in the Link may act as decorations on the link, including arrowheads and labels. +You can control where they are located along the link route and how they are oriented. +Because these decorations may be any GraphObject, they are all properties of that class. +The properties include:

    + +

    If you do not set the GraphObject.segmentIndex property, the object is positioned +to be at the middle of the link.

    +

    +For more discussion and examples, see Link Labels. + +

    GoJS makes it easy to add arrowheads to your link template. +Just add a Shape with the appearance properties that you want, +and also set the Shape.toArrow or Shape.fromArrow property +to the name of the kind of arrowhead that you want. +Doing so automatically sets the "segment..." properties that are appropriate for the chosen arrowhead.

    +

    More than one shape may automatically get the route geometry. +This is useful when you want to have multiple link shapes with different thicknesses +to create a gradient effect across the path of the link or to produce parallel lines along the path. +Just set GraphObject.isPanelMain to true on each such Shape.

    +

    If you want the user to be able to reconnect a link, using the RelinkingTool, +you need to set one or both of relinkableFrom and relinkableTo to true. +The RelinkingTool shows a RelinkingTool.fromHandleArchetype and/or a +RelinkingTool.toHandleArchetype when the link is selected. +Such a relink handle can be dragged by the user to start a relinking operation.

    +

    If you want the user to be able to change the path of the link, using the LinkReshapingTool, +set Part.reshapable to true. +The LinkReshapingTool shows reshape handles that the user can drag to shift the position +of a point in the link's route. +The LinkReshapingTool.handleArchetype is copied for each reshape handle.

    +

    Often if a Link is reshapable, you will want to save the route in the model so that it can be restored +upon load. To save the route automatically, add a TwoWay Binding on the points property: +new go.Binding("points").makeTwoWay(). Model.toJson will automatically +convert the List of Points into an Array of numbers in the JSON representation, +if the property is named "points".

    +

    If a Link is Part.reshapable, it is also possible to allow the user to add and remove segments +from the link's route by setting resegmentable to true. +This causes the LinkReshapingTool to add resegmenting handles at the midpoints of each segment. +The LinkReshapingTool.midHandleArchetype is copied for each resegment handle. +When the user drags such a resegmenting handle, a new segment is inserted into the route. +Also, when the user drags a reshape handle such that two adjacent segments end up in a straight line, +a segment is removed from the route.

    +

    +For more discussion and examples, see Links, +Link Labels, and +Link Points. +

    +To control what links a user may draw or reconnect, please read about +Validation. +

    +To customize linking and relinking behavior, please read +Introduction to the Linking Tools +and Introduction to the RelinkingTool. +For customizing the reshaping of Links, +see Introduction to the LinkReshapingTool. + +

    Only Links that are in Diagrams can have connections with Nodes. +Templates should not be connected with Nodes, be members of Groups, or have any Adornments.

    +

Index

Inherited Members

Properties

Methods

Constructors

  • +

    Constructs an empty link that does not connect any nodes. +If you want the link to be seen, you must provide a Shape as an element +to be used as the visual path for the link.

    +

    Usage example:

    +
    // Constructs a Link, sets properties on it,
    // adds a data binding to it,
    // and adds two Shapes to the Link:
    const l = new go.Link({
    routing: go.Link.Orthogonal
    })
    .add(new go.Shape({ strokeWidth: 2 }))
    .add(new go.Shape({ toArrow: "Standard" }))
    -
    -

    Parameters

    -
      -
    • -
      Optional init: Partial<Link>
      -
      -

      Optional initialization properties.

      -
      -
    • -
    -

    Returns Link

    -
  • -
-
-
-
-

Properties

-
- -

- adjusting - : EnumValue

-
    -
  • -
    -

    Gets or sets how the route is computed, including whether it uses the points of its old route to determine the new route. - The value must be one of None, End, Scale, or Stretch.

    -

    The default value is None -- the route is completely recalculated each time.

    -
    -
    see
    -

    computeAdjusting

    -
    -
    -
    -
  • -
-
-
- -

- corner - : number

-
    -
  • -
    -

    Gets or sets how rounded the corners are for adjacent line segments when the curve - is None, JumpGap, or JumpOver and - the two line segments are orthogonal to each other.

    -

    The default value is zero -- there is no curve at a corner.

    -
    -
  • -
-
-
- -

- curve - : EnumValue

-
    -
  • -
    -

    Gets or sets the way the path is generated from the route's points. - The value must be one of None, Bezier, JumpGap, or JumpOver.

    -

    Setting this property to JumpOver or JumpGap requires the Diagram to do - considerable computation when calculating Link routes. Consider not using - a Jump... value with Diagrams that contain large numbers of Links - if you are targeting slow devices.

    -

    The default value is None -- each link segment is a straight line.

    -
    -
    see
    -

    computeCurve

    -
    -
    -
    -
  • -
-
-
- -

- curviness - : number

-
    -
  • -
    -

    Gets or sets how far the control points are offset when the curve is Bezier - or when there are multiple links between the same two ports.

    -

    The default value is NaN -- the actual curviness is computed based on how many links connect the same pair of ports.

    -
    -
    see
    -

    computeCurviness

    -
    -
    -
    -
  • -
-
-
- -

- Override - fromEndSegmentLength - : number

- -
-
- -

- fromNode - : Node

-
    -
  • -
    -

    Gets or sets the Node that this link comes from. - The fromPortId specifies which port the link comes from. - The default value is null -- this link is not coming from any node.

    -

    A template should not be connected with any node.

    -
    -
  • -
-
-
- -

- Read-only - fromPort - : GraphObject

-
    -
  • -
    -

    This read-only property returns a GraphObject that is the "from" port that this link is connected from. - The fromNode provides the node that the link is coming from. - The fromPortId provides the identifier for which port this link is coming from; - you can set that property in order to change the value of this property. - This method may return null.

    -
    -
  • -
-
-
- -

- fromPortChanged - : (thisLink: Link, oldPort: GraphObject, newPort: GraphObject) => void

-
    -
  • -
    -

    Gets or sets the function that is called after this Link changes which Node or port it connects from. - The first argument will be this Link. - The second argument will be the old GraphObject port. - The third argument will be the new GraphObject port.

    -

    If the value is a function, that function must not modify which nodes or links this link connects with. - The "from" node and/or port has already been changed -- trying to change it again may produce undefined behavior.

    -

    The default value is null -- no function is called.

    -
    -
  • -
-
-
- -

- fromPortId - : string

-
    -
  • -
    -

    Gets or sets the identifier of the port that this link comes from. - The default value is the empty string.

    -
    -
  • -
-
-
- -

- Override - fromShortLength - : number

- -
-
- -

- Override - fromSpot - : Spot

- -
-
- -

- Read-only - geometry - : Geometry

-
    -
  • -
    -

    This read-only property returns the Geometry that is used by the path, the link Shape based on the route points.

    -

    This geometry is automatically generated using the route points and other properties - such as the curve. - The points of the Geometry are in local coordinates, whereas the points of the link route are in document coordinates.

    -

    More than one Shape may share this geometry as its Shape.geometry, - if there is more than one shape element in the Link with GraphObject.isPanelMain set to true.

    -
    -
  • -
-
-
- -

- Read-only - isLabeledLink - : boolean

-
    -
  • -
    -

    This read-only property is true when this Link has any label Nodes, Nodes that are owned by this Link - and are arranged along its path in the same manner as elements of the Link Panel.

    -
    -
    see
    -

    labelNodes

    -
    -
    since
    -

    1.1

    -
    -
    -
    -
  • -
-
-
- -

- Read-only - isOrthogonal - : boolean

-
    -
  • -
    -

    This read-only property is true if routing is a value that implies that the points - of the route should be orthogonal, such that each point shares a common X or a common Y value - with the immediately previous and next points. - This property is completely dependent on the routing property. - Values of Link.Orthogonal and Link.AvoidsNodes causes this property to be true.

    -

    The points in the route might not actually form an orthogonal route, but when the route is computed - the intent is to maintain orthogonality.

    -
    -
    since
    -

    1.2

    -
    -
    -
    -
  • -
-
-
- -

- isTreeLink - : boolean

- -
-
- -

- Override - Read-only - key - : Key

-
    -
  • -
    -

    This read-only property returns the Links's Model data key if it is in a Diagram and is backed by Model data. - Otherwise this returns undefined.

    -

    If the link data is in a GraphLinksModel, the GraphLinksModel.linkKeyProperty must not be an empty string.

    -
    -
    since
    -

    1.8

    -
    -
    see
    -

    GraphLinksModel.getKeyForLinkData

    -
    -
    -
    -
  • -
-
-
- -

- Read-only - labelNodes - : Iterator<Node>

-
    -
  • -
    -

    This read-only property returns an iterator over the Nodes that act as labels on this Link. - Setting Node.labeledLink to refer to this Link - will add that Node to this collection.

    -

    Do not confuse these Nodes with the GraphObjects that - are part of this Link Panel. - Those objects can also be used as "labels", but not as objects to which - there can be link connections, because those panel elements cannot be Nodes. - Those panel objects can be used for other purposes too, such as arrowheads.

    -

    A template should not have any label nodes.

    -
    -
    see
    -

    isLabeledLink

    -
    -
    -
    -
  • -
-
-
- -

- Read-only - midAngle - : number

-
    -
  • -
    -

    This read-only property returns the angle of the path at the midPoint.

    -
    -
  • -
-
-
- -

- Read-only - midPoint - : Point

-
    -
  • -
    -

    This read-only property returns the point at the middle of the path, in document coordinates.

    -
    -
  • -
-
-
- -

- Read-only - path - : Shape

-
    -
  • -
    -

    This read-only property returns the main Shape representing the path of this Link.

    -

    The value depends on there being an element in this Link that is - a Shape and that has GraphObject.isPanelMain set to true. - This shape is what displays the stroke going from one node to another node.

    -

    This path shape's geometry is automatically generated based on the points - of this link's route, depending on other properties such as curve. - Note that the points are in document coordinates, but the path's Shape.geometry - will have points that are in local Shape coordinates. - This Shape's GraphObject.scale should be one and GraphObject.angle should be zero.

    -

    If there is no Shape with GraphObject.isPanelMain set to true, - the Link will use the first Shape for its path.

    -
    -
  • -
-
-
- -

- points - : List<Point>

-
    -
  • -
    -

    Gets or sets the List of Points in the route. - All of the Points must be Point.isReal -- no NaN or infinite values -- - and all of the points are in document coordinates. - Although this list may be replaced by setting this property, - one must not modify the contents of the List directly.

    -

    The setter also accepts an Array of alternating X,Y point values [1, 2, 3, 4, 5, 6], - or an Array of Objects each of which has (lowercase) 'x' and 'y' properties that are numbers - [{"x":1,"y":2}, {"x":3,"y":4}, {"x":5,"y":6}].

    -

    Ownership of the List and all of its Points that is provided to the setter - is transferred to this Link.

    -
    -
  • -
-
-
- -

- Read-only - pointsCount - : number

-
    -
  • -
    -

    This read-only property returns the number of points in the route.

    -
    -
  • -
-
-
- -

- relinkableFrom - : boolean

-
    -
  • -
    -

    Gets or sets whether the user may reconnect an existing link at the "from" end. - This affects the behavior of the RelinkingTool.

    -

    The initial value is false.

    -
    -
  • -
-
-
- -

- relinkableTo - : boolean

-
    -
  • -
    -

    Gets or sets whether the user may reconnect an existing link at the "to" end. - This affects the behavior of the RelinkingTool.

    -

    The initial value is false.

    -
    -
  • -
-
-
- -

- resegmentable - : boolean

-
    -
  • -
    -

    Gets or sets whether the user may change the number of segments in this Link, - if the link has straight segments. - This affects the behavior of the LinkReshapingTool when curve is not Link.Bezier.

    -

    The initial value is false.

    -
    -
    since
    -

    1.2

    -
    -
    -
    -
  • -
-
-
- -

- Read-only - routeBounds - : Rect

-
    -
  • -
    -

    This read-only property returns the bounds of the link geometry in document coordinates.

    -
    -
    since
    -

    2.2

    -
    -
    -
    -
  • -
-
-
- -

- routing - : EnumValue

- -
-
- -

- smoothness - : number

-
    -
  • -
    -

    Gets or sets how far the control points are from the points of the route - when routing is Orthogonal and curve is Bezier.

    -

    The default value is 0.5. - Values of this property typically fall in the range of 0.0 to 1.0. - A value of 0.0 indicates that the control points of the curve are at the end points, - which will result in straight line segments. - A value of 1.0 indicates that the control points are one-third of the link's - length away from the end point along the direction of the link, - and the same distance away in a perpendicular direction. - The distance scales linearly with the value of this property, - even with negative values and values greater than 1.0.

    -
    -
  • -
-
-
- -

- Override - toEndSegmentLength - : number

- -
-
- -

- toNode - : Node

-
    -
  • -
    -

    Gets or sets the Node that this link goes to. - The toPortId specifies which port the link goes to. - The default value is null -- this link is not going to any node.

    -

    A template should not be connected with any node.

    -
    -
  • -
-
-
- -

- Read-only - toPort - : GraphObject

-
    -
  • -
    -

    This read-only property returns a GraphObject that is the "to" port that this link is connected to. - The toNode provides the node that the link is going to. - The toPortId provides the identifier for which port this link is going to; - you can set that property in order to change the value of this property. - This method may return null.

    -
    -
  • -
-
-
- -

- toPortChanged - : (thisLink: Link, oldPort: GraphObject, newPort: GraphObject) => void

-
    -
  • -
    -

    Gets or sets the function that is called after this Link changes which Node or port it connects to. - The first argument will be this Link. - The second argument will be the old GraphObject port. - The third argument will be the new GraphObject port.

    -

    If the value is a function, that function must not modify which nodes or links this link connects with. - The "to" node and/or port has already been changed -- trying to change it again may produce undefined behavior.

    -

    The default value is null -- no function is called.

    -
    -
  • -
-
-
- -

- toPortId - : string

-
    -
  • -
    -

    Gets or sets the identifier of the port that this link goes to. - The default value is the empty string.

    -
    -
  • -
-
-
- -

- Override - toShortLength - : number

- -
-
- -

- Override - toSpot - : Spot

- -
-
-
-

Methods

-
- -

- addPoint -

-
    -
  • addPoint(p: Point): void
  • -
-
    -
  • -
    -

    Add a point at the end of the route; this may only be called within an override of computePoints.

    -
    -
    see
    -

    getPoint, setPoint, insertPoint, removePoint

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      p: Point
      -
      -

      The new point in document coordinates, which should not have infinite or NaN coordinate values, and which must not be modified afterwards.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- Virtual - canRelinkFrom -

-
    -
  • canRelinkFrom(): boolean
  • -
- -
-
- -

- Virtual - canRelinkTo -

-
    -
  • canRelinkTo(): boolean
  • -
- -
-
- -

- clearPoints -

-
    -
  • clearPoints(): void
  • -
- -
-
- -

- Virtual - computeAdjusting -

-
    -
  • computeAdjusting(): EnumValue
  • -
-
    -
  • -
    -

    Returns the adjusting value, unless this Link's Diagram is animating and the routing is AvoidsNodes -- - then it will return End

    -

    This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -
    since
    -

    2.1

    -
    -
    see
    -

    adjusting

    -
    -
    -
    -

    Returns EnumValue

    -
  • -
-
-
- -

- Virtual - computeCurve -

-
    -
  • computeCurve(): EnumValue
  • -
-
    -
  • -
    -

    Returns the curve, unless this link is supposed to pretend to be curved, as with reflexive links.

    -

    This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Returns EnumValue

    -
  • -
-
-
- -

- Virtual - computeCurviness -

-
    -
  • computeCurviness(): number
  • -
-
    -
  • -
    -

    Returns the curviness, if it's a number, - or else a computed value based on how many links connect this pair of nodes/ports, - by calling computeSpacing on each link.

    -

    This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -
    see
    -

    computeSpacing

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Returns number

    -

    must be a real number, not NaN or infinity

    -
  • -
-
-
- -

- Virtual - computeEndSegmentLength -

-
    -
  • computeEndSegmentLength(node: Node, port: GraphObject, spot: Spot, from: boolean): number
  • -
-
    -
  • -
    -

    Get the length of the end segment in document coordinates, typically a short distance, in document units. - For spot values that are Spot.isSide, this returns a computed value. - Depending on the from argument, this will return fromEndSegmentLength or toEndSegmentLength. - If the value is NaN, this will return the fromPort's GraphObject.fromEndSegmentLength - or the toPort's GraphObject.toEndSegmentLength.

    -

    This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      node: Node
      -
    • -
    • -
      port: GraphObject
      -
      -

      the GraphObject representing a port on the node.

      -
      -
    • -
    • -
      spot: Spot
      -
      -

      a Spot value describing where the link should connect.

      -
      -
    • -
    • -
      from: boolean
      -
      -

      true if the link is coming out of the port; false if going to the port.

      -
      -
    • -
    -

    Returns number

    -

    a distance in document coordinates; must be a real number, not NaN or infinity.

    -
  • -
-
-
- -

- Virtual - computeOtherPoint -

- -
    -
  • -
    -

    Find the approximate point of the other end of the link in document coordinates. - This is useful when computing the connection point when there is no specific spot, to have an idea of which general direction the link should be going. - By default this will return the center of the other port.

    -

    This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Parameters

    - -

    Returns Point

    -

    approximately where the other end of this link might end, in document coordinates

    -
  • -
-
-
- -

- Virtual - computePoints -

-
    -
  • computePoints(): boolean
  • -
- -
-
- -

- Virtual - computeSpacing -

-
    -
  • computeSpacing(): number
  • -
-
    -
  • -
    -

    Returns the expected spacing between this link and others that connect this link's fromPort and toPort. - This calls computeThickness and also takes any "mid label"'s breadth into account.

    -

    This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -
    see
    -

    computeCurviness

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Returns number

    -

    must be a real number, not NaN or infinity

    -
  • -
-
-
- -

- Virtual - computeSpot -

- - -
-
- -

- Virtual - computeThickness -

-
    -
  • computeThickness(): number
  • -
-
    -
  • -
    -

    Returns the thickness of this link. - By default it uses the strokeWidth of the main element, assuming it's a Shape. - This is called by computeSpacing.

    -

    This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Returns number

    -

    a non-negative real number

    -
  • -
-
-
- -

- findClosestSegment -

-
    -
  • findClosestSegment(p: Point): number
  • -
-
    -
  • -
    -

    Find the index of the segment that is closest to a given point. - This assumes the route only has straight line segments. - It ignores any jump-overs or jump-gaps.

    -
    -

    Parameters

    -
      -
    • -
      p: Point
      -
      -

      the Point, in document coordinates.

      -
      -
    • -
    -

    Returns number

    -

    int the index of the segment, from zero to the number of points minus 2.

    -
  • -
-
-
- -

- Virtual - getLinkDirection -

- -
    -
  • -
    -

    Compute the direction in which a link should go from a given connection point.

    -
    -
    since
    -

    1.2

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      node: Node
      -
    • -
    • -
      port: GraphObject
      -
      -

      the GraphObject representing a port on the node.

      -
      -
    • -
    • -
      linkpoint: Point
      -
      -

      the connection point, in document coordinates.

      -
      -
    • -
    • -
      spot: Spot
      -
      -

      a Spot value describing where the link should connect.

      -
      -
    • -
    • -
      from: boolean
      -
      -

      true if the link is coming out of the port; false if going to the port.

      -
      -
    • -
    • -
      ortho: boolean
      -
      -

      whether the link should have orthogonal segments.

      -
      -
    • -
    • -
      othernode: Node
      -
      -

      the node at the other end of the link.

      -
      -
    • -
    • -
      otherport: GraphObject
      -
      -

      the GraphObject port at the other end of the link.

      -
      -
    • -
    -

    Returns number

    -

    the absolute angle, in degrees.

    -
  • -
-
-
- -

- Virtual - getLinkPoint -

- -
    -
  • -
    -

    Compute the point on a node/port in document coordinates at which the route of a link should end.

    -
    -
    since
    -

    1.2

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      node: Node
      -
    • -
    • -
      port: GraphObject
      -
      -

      the GraphObject representing a port on the node.

      -
      -
    • -
    • -
      spot: Spot
      -
      -

      a Spot value describing where the link should connect.

      -
      -
    • -
    • -
      from: boolean
      -
      -

      true if the link is coming out of the port; false if going to the port.

      -
      -
    • -
    • -
      ortho: boolean
      -
      -

      whether the link should have orthogonal segments.

      -
      -
    • -
    • -
      othernode: Node
      -
      -

      the node at the other end of the link.

      -
      -
    • -
    • -
      otherport: GraphObject
      -
      -

      the GraphObject port at the other end of the link.

      -
      -
    • -
    • -
      Optional result: Point
      -
      -

      an optional Point that is modified and returned; otherwise it allocates and returns a new Point

      -
      -
    • -
    -

    Returns Point

    -

    in document coordinates.

    -
  • -
-
-
- -

- Virtual - getLinkPointFromPoint -

- -
    -
  • -
    -

    Compute the intersection point in document coordinates for the edge of a particular port GraphObject, given a point, - when no particular spot or side has been specified.

    -
    -
    since
    -

    1.2

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      node: Node
      -
    • -
    • -
      port: GraphObject
      -
      -

      the GraphObject representing a port on the node.

      -
      -
    • -
    • -
      focus: Point
      -
      -

      the point in document coordinates to/from which the link should point, - normally the center of the port.

      -
      -
    • -
    • -
      p: Point
      -
      -

      often this point is far away from the node, to give a general direction, - particularly an orthogonal one.

      -
      -
    • -
    • -
      from: boolean
      -
      -

      true if the link is coming out of the port; false if going to the port.

      -
      -
    • -
    • -
      Optional result: Point
      -
      -

      an optional Point that is modified and returned; otherwise it allocates and returns a new Point

      -
      -
    • -
    -

    Returns Point

    -

    the point in document coordinates of the intersection point on the edge of the port.

    -
  • -
-
-
- -

- getOtherNode -

- -
    -
  • -
    -

    Given a Node, return the node at the other end of this link.

    -
    -

    Parameters

    -
      -
    • -
      node: Node
      -
    • -
    -

    Returns Node

    -

    This may return the same node, if the link is reflexive.

    -
  • -
-
-
- -

- getOtherPort -

- -
    -
  • -
    -

    Given a GraphObject that is a "port", return the port at the other end of this link.

    -
    -

    Parameters

    - -

    Returns GraphObject

    -

    This may return the same object, if the link is reflexive.

    -
  • -
-
-
- -

- getPoint -

-
    -
  • getPoint(i: number): Point
  • -
-
    -
  • -
    -

    Gets a particular point of the route.

    -
    -

    Parameters

    -
      -
    • -
      i: number
      -
      -

      int The zero-based index of the desired point.

      -
      -
    • -
    -

    Returns Point

    -

    in document coordinates

    -
  • -
-
-
- -

- Virtual - hasCurviness -

-
    -
  • hasCurviness(): boolean
  • -
-
    -
  • -
    -

    Returns true if an extra or a different point is needed based on curviness.

    -

    This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Returns boolean

    -
  • -
-
-
- -

- insertPoint -

-
    -
  • insertPoint(i: number, p: Point): void
  • -
-
    -
  • -
    -

    Insert a point at a particular position in the route, without replacing an existing point; this may only be called within an override of computePoints.

    -
    -
    see
    -

    getPoint, setPoint, addPoint, removePoint

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      i: number
      -
      -

      int The zero-based index of the new point.

      -
      -
    • -
    • -
      p: Point
      -
      -

      The new point in document coordinates, which should not have infinite or NaN coordinate values, and which must not be modified afterwards.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- invalidateRoute -

-
    -
  • invalidateRoute(): void
  • -
-
    -
  • -
    -

    Declare that the route (the points) of this Link need to be recomputed soon. - This causes updateRoute to be called, which will call computePoints - to perform the actual determination of the route.

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Returns void

    -
  • -
-
-
- -

- Virtual - makeGeometry -

- -
    -
  • -
    -

    Produce a Geometry given the points of this route, - depending on the value of curve and corner and perhaps other properties. - The points of the Geometry are in local coordinates, whereas the points of the link route are in document coordinates.

    -

    This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Returns Geometry

    -
  • -
-
-
- -

- Override - move -

-
    -
  • move(newpos: Point, useLocation?: boolean): void
  • -
-
    -
  • -
    -

    Move this link to a new position. - This also shifts all of the Points in the route accordingly. - This also moves any labelNodes.

    -
    -

    Parameters

    -
      -
    • -
      newpos: Point
      -
      -

      a new Point in document coordinates.

      -
      -
    • -
    • -
      Optional useLocation: boolean
      -
      -

      true if you want to set the location instead of the position. False by default.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- removePoint -

-
    -
  • removePoint(i: number): void
  • -
-
    -
  • -
    -

    Remove a particular point from the route; this may only be called within an override of computePoints.

    -
    -
    see
    -

    getPoint, setPoint, insertPoint, addPoint, clearPoints

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      i: number
      -
      -

      int The zero-based index of the point to extract.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- setPoint -

-
    -
  • setPoint(i: number, p: Point): void
  • -
-
    -
  • -
    -

    Sets a particular point of the route; this may only be called within an override of computePoints.

    -
    -
    see
    -

    getPoint, insertPoint, addPoint, removePoint

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      i: number
      -
      -

      int The zero-based index of the desired point.

      -
      -
    • -
    • -
      p: Point
      -
      -

      The new point in document coordinates, which should not have infinite or NaN coordinate values, and which must not be modified afterwards.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- updateRoute -

-
    -
  • updateRoute(): void
  • -
-
    -
  • -
    -

    This method recomputes the route if the route is invalid, - to make sure the points are up-to-date. - This method calls computePoints in order to calculate a new route.

    -

    The route may become invalid if either connected node is moved, - or if various properties are modified, such as routing. - Such changes will call invalidateRoute.

    -

    It is unusual for you to have to call this method.

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Returns void

    -
  • -
-
-
-
-

Constants

-
- -

- Static - AvoidsNodes - : EnumValue

-
-

Used as a value for Link.routing: - each segment is horizontal or vertical, but the route tries to avoid crossing over nodes.

-
-
-
- -

- Static - Bezier - : EnumValue

-
-

Used as a value for Link.curve, to indicate that - the link path uses Bezier curve segments.

-
-
-
- -

- Static - End - : EnumValue

-
-

Used as a value for Link.adjusting, - to indicate that the link route computation should keep the - intermediate points of the previous route, just modifying the first and/or last points; - if the routing is orthogonal, it will only modify the first two and/or last two points.

-
-
-
- -

- Static - JumpGap - : EnumValue

-
-

Used as a value for Link.curve, to indicate that - orthogonal link segments will be discontinuous where they cross over - other orthogonal link segments that have a Link.curve of JumpOver or JumpGap.

-
-
-
- -

- Static - JumpOver - : EnumValue

-
-

Used as a value for Link.curve, to indicate that - orthogonal link segments will veer around where they cross over - other orthogonal link segments that have a Link.curve of JumpOver or JumpGap.

-
-
-
- -

- Static Override - None - : EnumValue

-
-

This is the default value for Link.curve and Link.adjusting, - to indicate that the path geometry consists of straight line segments and - to indicate that the link route computation does not depend on any previous route points; - this can also be used as a value for GraphObject.segmentOrientation - to indicate that the object is never rotated along the link route -- its angle is unchanged.

-
-
-
- -

- Static - Normal - : EnumValue

-
-

Used as the default value for Link.routing: - the route goes fairly straight between ports.

-
-
-
- -

- Static - OrientAlong - : EnumValue

-
-

This value for GraphObject.segmentOrientation results in - the GraphObject turned to have the same angle as the route: - the GraphObject's angle is always the same as the angle of the link's route - at the segment where the GraphObject is attached; - use this orientation for arrow heads.

-
-
-
- -

- Static - OrientMinus90 - : EnumValue

-
-

This value for GraphObject.segmentOrientation results in - the GraphObject being turned counter-clockwise to be perpendicular to the route: - the GraphObject's angle is always 90 degrees less than the angle of the link's route - at the segment where the GraphObject is attached.

-
-
-
- -

- Static - OrientMinus90Upright - : EnumValue

-
-

This value for GraphObject.segmentOrientation results in - the GraphObject turned counter-clockwise to be perpendicular to the route, just like Link.OrientMinus90, but is never upside down: - the GraphObject's angle always being 90 degrees less than the angle of the link's route - at the segment where the GraphObject is attached; - this is typically only used for TextBlocks or Panels that contain text.

-
-
-
- -

- Static - OrientOpposite - : EnumValue

-
-

This value for GraphObject.segmentOrientation results in - the GraphObject's angle always being 180 degrees opposite from the angle of the link's route - at the segment where the GraphObject is attached.

-
-
-
- -

- Static - OrientPlus90 - : EnumValue

-
-

This value for GraphObject.segmentOrientation results in - the GraphObject is turned clockwise to be perpendicular to the route: - the GraphObject's angle is always 90 degrees more than the angle of the link's route - at the segment where the GraphObject is attached.

-
-
-
- -

- Static - OrientPlus90Upright - : EnumValue

-
-

This value for GraphObject.segmentOrientation results in - the GraphObject turned clockwise to be perpendicular to the route, just like Link.OrientPlus90, but is never upside down: - the GraphObject's angle always being 90 degrees more than the angle of the link's route - at the segment where the GraphObject is attached; - this is typically only used for TextBlocks or Panels that contain text.

-
-
-
- -

- Static - OrientUpright - : EnumValue

-
-

This value for GraphObject.segmentOrientation results in - the GraphObject turned to have the same angle as the route, just like Link.OrientAlong, but is never upside down: - the GraphObject's angle always following the angle of the link's route - at the segment where the GraphObject is attached; - this is typically only used for TextBlocks or Panels that contain text.

-
-
-
- -

- Static - OrientUpright45 - : EnumValue

-
-

This value for GraphObject.segmentOrientation results in - the GraphObject's angle always following the angle of the link's route - at the segment where the GraphObject is attached, but never upside down - and never angled more than +/- 45 degrees: - when the route's angle is within 45 degrees of vertical (90 or 270 degrees), - the GraphObject's angle is set to zero; - this is typically only used for TextBlocks or Panels that contain text.

-
-
-
- -

- Static - Orthogonal - : EnumValue

-
-

Used as a value for Link.routing: - each segment is horizontal or vertical.

-
-
-
- -

- Static - Scale - : EnumValue

-
-

Used as a value for Link.adjusting, - to indicate that the link route computation should scale and rotate the intermediate points - so that the link's shape looks approximately the same; - if the routing is orthogonal, this value is treated as if it were Link.End.

-
-
-
- -

- Static - Stretch - : EnumValue

-
-

Used as a value for Link.adjusting, - to indicate that the link route computation should linearly interpolate the intermediate points - so that the link's shape looks stretched; - if the routing is orthogonal, this value is treated as if it were Link.End.

-
-
-
-
- -
-
-
- -
-
- - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/LinkLabelDraggingTool.html b/api/symbols/LinkLabelDraggingTool.html index ccc7955cd..fafc6ce94 100644 --- a/api/symbols/LinkLabelDraggingTool.html +++ b/api/symbols/LinkLabelDraggingTool.html @@ -1,451 +1,66 @@ - - - - - - LinkLabelDraggingTool | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class LinkLabelDraggingTool

-
-
-
-
-
-
-
-
-
-

- This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

-
-
-

Hierarchy

-
    -
  • - Tool -
      -
    • - LinkLabelDraggingTool -
    • -
    -
  • -
-
-
-
-

The LinkLabelDraggingTool class lets the user move a label on a Link.

-

This tool only works when the Link has a label - that is positioned at the Link.midPoint plus some offset. - It does not work for labels that have a particular GraphObject.segmentIndex.

-

If you want to experiment with this extension, try the Link Label Dragging sample.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- -
    -
  • -
    -

    Constructs a LinkLabelDraggingTool and sets the name for the tool.

    -
    -

    Returns LinkLabelDraggingTool

    -
  • -
-
-
-
-

Properties

-
- -

- label - : GraphObject

-
-

The label being dragged.

-
-
-
-
-

Methods

-
- -

- Override - canStart -

-
    -
  • canStart(): boolean
  • -
-
    -
  • -
    -

    This tool can only start if the mouse has moved enough so that it is not a click, - and if the mouse down point is on a GraphObject "label" in a Link Panel, - as determined by findLabel.

    -
    -

    Returns boolean

    -
  • -
-
-
- -

- Override - doActivate -

-
    -
  • doActivate(): void
  • -
-
    -
  • -
    -

    Start a transaction, call findLabel and remember it as the "label" property, - and remember the original value for the label's GraphObject.segmentOffset property.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doCancel -

-
    -
  • doCancel(): void
  • -
- -
-
- -

- Override - doDeactivate -

-
    -
  • doDeactivate(): void
  • -
-
    -
  • -
    -

    Stop any ongoing transaction.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doMouseMove -

-
    -
  • doMouseMove(): void
  • -
- -
-
- -

- Override - doMouseUp -

-
    -
  • doMouseUp(): void
  • -
-
    -
  • -
    -

    At the end of the drag, update the segment offset of the label and finish the tool, - completing a transaction.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doStop -

-
    -
  • doStop(): void
  • -
-
    -
  • -
    -

    Clear any reference to a label element.

    -
    -

    Returns void

    -
  • -
-
-
- -

- findLabel -

- -
    -
  • -
    -

    From the GraphObject at the mouse point, search up the visual tree until we get to - an object that is a label of a Link.

    -
    -

    Returns GraphObject

    -

    This returns null if no such label is at the mouse down point.

    -
  • -
-
-
- -

- updateSegmentOffset -

-
    -
  • updateSegmentOffset(): void
  • -
-
    -
  • -
    -

    Save the label's GraphObject.segmentOffset as a rotated offset from the midpoint of the - Link that the label is in.

    -
    -

    Returns void

    -
  • -
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class LinkLabelDraggingTool Extension

This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

Hierarchy

  • Tool
    • LinkLabelDraggingTool
+

The LinkLabelDraggingTool class lets the user move a label on a Link.

+

This tool only works when the Link has a label +that is positioned at the Link.midPoint plus some offset. +It does not work for labels that have a particular GraphObject.segmentIndex.

+

If you want to experiment with this extension, try the Link Label Dragging sample.

+

Index

Inherited Members

Constructors

Properties

+

The label being dragged.

+

Methods

  • canStart(): boolean
  • +

    This tool can only start if the mouse has moved enough so that it is not a click, +and if the mouse down point is on a GraphObject "label" in a Link Panel, +as determined by findLabel.

    +

    Returns boolean

  • doActivate(): void
  • +

    Start a transaction, call findLabel and remember it as the "label" property, +and remember the original value for the label's GraphObject.segmentOffset property.

    +

    Returns void

  • doCancel(): void
  • doDeactivate(): void
  • +

    Stop any ongoing transaction.

    +

    Returns void

  • doMouseMove(): void
  • doMouseUp(): void
  • +

    At the end of the drag, update the segment offset of the label and finish the tool, +completing a transaction.

    +

    Returns void

  • doStop(): void
  • +

    Clear any reference to a label element.

    +

    Returns void

  • +

    From the GraphObject at the mouse point, search up the visual tree until we get to +an object that is a label of a Link.

    +

    Returns GraphObject

    This returns null if no such label is at the mouse down point.

    +
  • updateSegmentOffset(): void
  • +

    Save the label's GraphObject.segmentOffset as a rotated offset from the midpoint of the +Link that the label is in.

    +

    Returns void

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/LinkLabelOnPathDraggingTool.html b/api/symbols/LinkLabelOnPathDraggingTool.html index c9fe63546..4f3cc67a8 100644 --- a/api/symbols/LinkLabelOnPathDraggingTool.html +++ b/api/symbols/LinkLabelOnPathDraggingTool.html @@ -1,448 +1,63 @@ - - - - - - LinkLabelOnPathDraggingTool | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class LinkLabelOnPathDraggingTool

-
-
-
-
-
-
-
-
-
-

- This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

-
-
-

Hierarchy

-
    -
  • - Tool -
      -
    • - LinkLabelOnPathDraggingTool -
    • -
    -
  • -
-
-
-
-

The LinkLabelOnPathDraggingTool class lets the user move a label on a Link while keeping the label on the link's path. - This tool only works when the Link has a label marked by the "_isLinkLabel" property.

-

If you want to experiment with this extension, try the Link Label On Path Dragging sample.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- - -
-
-
-

Properties

-
- -

- label - : GraphObject

-
-

The label being dragged.

-
-
-
-
-

Methods

-
- -

- Override - canStart -

-
    -
  • canStart(): boolean
  • -
-
    -
  • -
    -

    This tool can only start if the mouse has moved enough so that it is not a click, - and if the mouse down point is on a GraphObject "label" in a Link Panel, - as determined by findLabel.

    -
    -

    Returns boolean

    -
  • -
-
-
- -

- Override - doActivate -

-
    -
  • doActivate(): void
  • -
-
    -
  • -
    -

    Start a transaction, call findLabel and remember it as the "label" property, - and remember the original values for the label's segment properties.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doCancel -

-
    -
  • doCancel(): void
  • -
-
    -
  • -
    -

    Restore the label's original value for GraphObject.segment... properties.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doDeactivate -

-
    -
  • doDeactivate(): void
  • -
-
    -
  • -
    -

    Stop any ongoing transaction.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doMouseMove -

-
    -
  • doMouseMove(): void
  • -
-
    -
  • -
    -

    During the drag, call updateSegmentOffset in order to set the segment... properties of the label.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doMouseUp -

-
    -
  • doMouseUp(): void
  • -
-
    -
  • -
    -

    At the end of the drag, update the segment properties of the label and finish the tool, - completing a transaction.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doStop -

-
    -
  • doStop(): void
  • -
-
    -
  • -
    -

    Clear any reference to a label element.

    -
    -

    Returns void

    -
  • -
-
-
- -

- findLabel -

- -
    -
  • -
    -

    From the GraphObject at the mouse point, search up the visual tree until we get to - an object that has the "_isLinkLabel" property set to true and that is an immediate child of a Link Panel.

    -
    -

    Returns GraphObject

    -

    This returns null if no such label is at the mouse down point.

    -
  • -
-
-
- -

- updateSegmentOffset -

-
    -
  • updateSegmentOffset(): void
  • -
- -
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class LinkLabelOnPathDraggingTool Extension

This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

Hierarchy

  • Tool
    • LinkLabelOnPathDraggingTool
+

The LinkLabelOnPathDraggingTool class lets the user move a label on a Link while keeping the label on the link's path. +This tool only works when the Link has a label marked by the "_isLinkLabel" property.

+

If you want to experiment with this extension, try the Link Label On Path Dragging sample.

+

Index

Inherited Members

Constructors

Properties

+

The label being dragged.

+

Methods

  • canStart(): boolean
  • +

    This tool can only start if the mouse has moved enough so that it is not a click, +and if the mouse down point is on a GraphObject "label" in a Link Panel, +as determined by findLabel.

    +

    Returns boolean

  • doActivate(): void
  • +

    Start a transaction, call findLabel and remember it as the "label" property, +and remember the original values for the label's segment properties.

    +

    Returns void

  • doCancel(): void
  • +

    Restore the label's original value for GraphObject.segment... properties.

    +

    Returns void

  • doDeactivate(): void
  • +

    Stop any ongoing transaction.

    +

    Returns void

  • doMouseMove(): void
  • +

    During the drag, call updateSegmentOffset in order to set the segment... properties of the label.

    +

    Returns void

  • doMouseUp(): void
  • +

    At the end of the drag, update the segment properties of the label and finish the tool, +completing a transaction.

    +

    Returns void

  • doStop(): void
  • +

    Clear any reference to a label element.

    +

    Returns void

  • +

    From the GraphObject at the mouse point, search up the visual tree until we get to +an object that has the "_isLinkLabel" property set to true and that is an immediate child of a Link Panel.

    +

    Returns GraphObject

    This returns null if no such label is at the mouse down point.

    +
  • updateSegmentOffset(): void

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/LinkReshapingTool.html b/api/symbols/LinkReshapingTool.html index 71d7b58e4..558046da6 100644 --- a/api/symbols/LinkReshapingTool.html +++ b/api/symbols/LinkReshapingTool.html @@ -1,781 +1,146 @@ - - - - - - LinkReshapingTool | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class LinkReshapingTool

-
-
-
-
-
-
-
-
-
-

Hierarchy

- -
-
-
-

The LinkReshapingTool is used to interactively change the route of a Link - by setting its Link.points list. - You may want to save the route to the model by using a TwoWay Binding on the "points" property of the Link.

-

This tool makes use of an Adornment, shown when the adorned Link is selected, - that includes some number of reshape handles. - This tool conducts a transaction while the tool is active. - A successful reshaping will result in a "LinkReshaped" DiagramEvent and a "LinkReshaping" transaction.

-

- For a general discussion of link routing, see: - Introduction to Links, - Introduction to Link Labels, and - Introduction to Link Connection Points. - For customizing the linking tools, see Introduction to the Linking Tools. - For a general discussion of validation, see Introduction to Validation. -

-
-
-

Index

-
- -
-
-
-

Constructors

-
- -

- constructor -

- - -
-
-
-

Properties

-
- -

- Read-only - adornedLink - : Link

-
    -
  • -
    -

    This read-only property returns the Link that is being routed manually.

    -
    -
  • -
-
-
- -

- handle - : GraphObject

- -
-
- -

- handleArchetype - : GraphObject

-
  • +

    Gets or sets a small GraphObject that is copied as a resegment handle at each mid-point in the selected Link's route. +By default this is a Shape that is a small blue diamond. +Setting this property does not raise any events.

    +

    Here is an example of changing the default handle to be larger cyan triangles:

    +
      myDiagram.toolManager.linkReshapingTool.midHandleArchetype =
    $(go.Shape, "Triangle", { width: 10, height: 10, fill: "cyan" });
    -
    -
    see
    -

    handleArchetype

    -
    -
    since
    -

    1.2

    -
    -
    -
    -
  • -
-
-
- -

- Read-only - originalPoint - : Point

-
    -
  • -
    -

    This read-only property returns the Point that was the original location of the handle that is being dragged to reshape the Link.

    -
    -
    since
    -

    1.1

    -
    -
    -
    -
  • -
-
-
- -

- Read-only - originalPoints - : List<Point>

-
    -
  • -
    -

    This read-only property returns the List of Points that was the original route of the Link that is being reshaped. - This List should not be modified; its value is indeterminate until a reshaping has been activated.

    -
    -
    since
    -

    1.1

    -
    -
    -
    -
  • -
-
-
-
-

Methods

-
- -

- Override Virtual - canStart -

-
    -
  • canStart(): boolean
  • -
-
    -
  • -
    -

    This tool may run when there is a mouse-down event on a reshape handle.

    -

    This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Returns boolean

    -
  • -
-
-
- -

- Virtual - computeReshape -

- -
    -
  • -
    -

    This is called by doMouseMove and doMouseUp to limit the input point - before calling reshape.

    -

    This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Parameters

    -
      -
    • -
      p: Point
      -
      -

      the point where the handle is being dragged.

      -
      -
    • -
    -

    Returns Point

    -

    Either the same Point p or one constrained by the reshape behavior to be moved - only vertically or only horizontally.

    -
  • -
-
-
- -

- Override - doActivate -

-
    -
  • doActivate(): void
  • -
-
    -
  • -
    -

    Start reshaping, if findToolHandleAt finds a reshape handle at the mouse down point.

    -

    If successful this sets handle to be the reshape handle that it finds - and adornedLink to be the Link being routed. - It also remembers the original link route (a list of Points) in case this tool is cancelled. - And it starts a transaction.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doCancel -

-
    -
  • doCancel(): void
  • -
-
    -
  • -
    -

    Restore the link route to be the original points and stop this tool.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doDeactivate -

-
    -
  • doDeactivate(): void
  • -
-
    -
  • -
    -

    This stops the current reshaping operation with the link route shaped the way it is.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doMouseMove -

-
    -
  • doMouseMove(): void
  • -
-
    -
  • -
    -

    Call reshape with a new point determined by the mouse - to change the route of the adornedLink.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doMouseUp -

-
    -
  • doMouseUp(): void
  • -
-
    -
  • -
    -

    Reshape the route with a point based on the most recent mouse point by calling reshape, - and then raise a "LinkReshaped" DiagramEvent before stopping this tool.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Protected - getReshapingBehavior -

-
    -
  • getReshapingBehavior(obj: GraphObject): EnumValue
  • -
-
    -
  • -
    -

    Get the permitted reshaping behavior for a particular reshape handle.

    -
    -
    since
    -

    1.3

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      obj: GraphObject
      -
      -

      a reshape handle in the "LinkReshaping" Adornment.

      -
      -
    • -
    -

    Returns EnumValue

    -

    one of LinkReshapingTool.All, .Vertical, .Horizontal, or .None

    -
  • -
-
-
- -

- Virtual - reshape -

-
    -
  • reshape(newPoint: Point): void
  • -
-
    -
  • -
    -

    Change the route of the adornedLink by moving the point corresponding to the current - handle to be at the given Point. - This is called by doMouseMove and doMouseUp with the result of calling - computeReshape to constrain the input point.

    -

    This method respects the orthogonality of the link, if necessary limiting movement along only one axis. - To maintain orthogonality it may need to modify more than one point in the route.

    -

    This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- Protected - setReshapingBehavior -

-
    -
  • setReshapingBehavior(obj: GraphObject, behavior: EnumValue): void
  • -
-
    -
  • -
    -

    Set the permitted reshaping behavior for a particular reshape handle.

    -
    -
    since
    -

    1.3

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      obj: GraphObject
      -
      -

      a reshape handle in the "LinkReshaping" Adornment.

      -
      -
    • -
    • -
      behavior: EnumValue
      -
      -

      one of LinkReshapingTool.All, .Vertical, .Horizontal, or .None

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- Override Virtual - updateAdornments -

-
    -
  • updateAdornments(part: Part): void
  • -
-
    -
  • -
    -

    Show an Adornment with reshape handles at each of the interesting points of the link's route, - if the link is selected and visible and if Part.canReshape is true.

    -

    This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Parameters

    -
      -
    • -
      part: Part
      -
      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
-
-

Constants

-
- -

- Static - All - : EnumValue

-
-

Allow dragging in any direction.

-
-
-
- -

- Static - Horizontal - : EnumValue

-
-

Allow only horizontal (left-and-right) dragging.

-
-
-
- -

- Static - None - : EnumValue

-
-

Disallow dragging.

-
-
-
- -

- Static - Vertical - : EnumValue

-
-

Allow only vertical (up-and-down) dragging.

-
-
-
-
- -
-
-
- -
-
- - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/LinkShiftingTool.html b/api/symbols/LinkShiftingTool.html index f1b743a4e..17ad318d5 100644 --- a/api/symbols/LinkShiftingTool.html +++ b/api/symbols/LinkShiftingTool.html @@ -1,482 +1,65 @@ - - - - - - LinkShiftingTool | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class LinkShiftingTool

-
-
-
-
-
-
-
-
-
-

- This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

-
-
-

Hierarchy

-
    -
  • - Tool -
      -
    • - LinkShiftingTool -
    • -
    -
  • -
-
-
-
-

The LinkShiftingTool class lets the user shift the end of a link to be anywhere along the edges of the port; - use it in a diagram.toolManager.mouseDownTools list:

-
myDiagram.toolManager.mouseDownTools.add(new LinkShiftingTool());
+LinkShiftingTool | GoJS API
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class LinkShiftingTool Extension

This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

Hierarchy

  • Tool
    • LinkShiftingTool
+

The LinkShiftingTool class lets the user shift the end of a link to be anywhere along the edges of the port; +use it in a diagram.toolManager.mouseDownTools list:

+
myDiagram.toolManager.mouseDownTools.add(new LinkShiftingTool());
 
-

If you want to experiment with this extension, try the Link Shifting sample.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- -
    -
  • -
    -

    Constructs a LinkShiftingTool and sets the handles and name of the tool.

    -
    -

    Returns LinkShiftingTool

    -
  • -
-
-
-
-

Properties

-
- -

- fromHandleArchetype - : GraphObject

-
    -
  • -
    -

    A small GraphObject used as a shifting handle.

    -
    -
  • -
-
-
- -

- toHandleArchetype - : GraphObject

-
    -
  • -
    -

    A small GraphObject used as a shifting handle.

    -
    -
  • -
-
-
-
-

Methods

-
- -

- Override - canStart -

-
    -
  • canStart(): boolean
  • -
-
    -
  • -
    -

    This tool may run when there is a mouse-down event on a reshaping handle.

    -
    -

    Returns boolean

    -
  • -
-
-
- -

- Override - doActivate -

-
    -
  • doActivate(): void
  • -
-
    -
  • -
    -

    Start shifting, if findToolHandleAt finds a reshaping handle at the mouse down point.

    -

    If successful this sets the handle to be the reshape handle that it finds. - It also remembers the original points in case this tool is cancelled. - And it starts a transaction.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doCancel -

-
    -
  • doCancel(): void
  • -
-
    -
  • -
    -

    Restore the link route to be the original points and stop this tool.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doDeactivate -

-
    -
  • doDeactivate(): void
  • -
-
    -
  • -
    -

    This stops the current shifting operation with the link as it is.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doMouseMove -

-
    -
  • doMouseMove(): void
  • -
-
    -
  • -
    -

    Call doReshape with a new point determined by the mouse - to change the end point of the link.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doMouseUp -

-
    -
  • doMouseUp(): void
  • -
-
    -
  • -
    -

    Reshape the link's end with a point based on the most recent mouse point by calling doReshape, - and then stop this tool.

    -
    -

    Returns void

    -
  • -
-
-
- -

- doReshape -

-
    -
  • doReshape(pt: Point): void
  • -
-
    -
  • -
    -

    Find the closest point along the edge of the link's port and shift the end of the link to that point.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- Override - doStop -

-
    -
  • doStop(): void
  • -
-
    -
  • -
    -

    Perform cleanup of tool state.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - updateAdornments -

-
    -
  • updateAdornments(part: Part): void
  • -
-
    -
  • -
    -

    Show an Adornment with a reshape handle at each end of the link which allows for shifting of the end points.

    -
    -

    Parameters

    -
      -
    • -
      part: Part
      -
    • -
    -

    Returns void

    -
  • -
-
-
-
- -
-
-
- -
-
- - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/LinkingBaseTool.html b/api/symbols/LinkingBaseTool.html index b4a131a30..cd176d9e2 100644 --- a/api/symbols/LinkingBaseTool.html +++ b/api/symbols/LinkingBaseTool.html @@ -1,1025 +1,242 @@ - - - - - - LinkingBaseTool | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class LinkingBaseTool

-
-
-
-
-
-
-
-
-
-

Hierarchy

- -
-
-
-

This abstract class is the base class for the LinkingTool and RelinkingTool classes.

-

This class includes properties for defining and accessing any temporary nodes and temporary link - that are used during any linking operation, as well as access to the existing diagram's nodes and link - (if any) that are involved with the linking operation.

-

- For a general discussion of link routing, see: - Introduction to Links, - Introduction to Link Labels, and - Introduction to Link Connection Points. - For customizing the linking tools, see Introduction to the Linking Tools. - For customizing the reshaping of Links, see Introduction to the LinkReshapingTool. - For a general discussion of validation, see Introduction to Validation. -

-
-
-

Index

-
- -
-
-
-

Constructors

-
- -

- constructor -

- -
    -
  • -
    -

    Don't construct this directly -- this is an abstract class.

    -
    -

    Returns LinkingBaseTool

    -
  • -
-
-
-
-

Properties

-
- -

- isForwards - : boolean

-
    -
  • -
    -

    Gets whether the linking operation is in the forwards direction, - connecting from the "From" port to the "To" port.

    -
    -
  • -
-
-
- -

- isUnconnectedLinkValid - : boolean

-
    -
  • -
    -

    Gets or sets whether it is valid to have partly or completely unconnected links.

    -

    The default value is false -- the user cannot draw or reconnect a link to "nowhere". - Setting this property does not raise any events.

    -
    -
    since
    -

    1.3

    -
    -
    -
    -
  • -
-
-
- -

- linkValidation - : (fromNode: Node, fromPort: GraphObject, toNode: Node, toPort: GraphObject, link: Link) => boolean

-
    -
  • -
    -

    Gets or sets a predicate that determines whether or not a new link between two ports would be valid. - This predicate is called in addition to the normal link checking performed by isValidLink - and any Node.linkValidation predicates on the "from" and "to" nodes. - When relinking, the Link being considered for reconnection is passed as the fifth argument. - The default predicate is null, which is equivalent to simply returning true.

    -

    - For a more general discussion of validation, see Introduction to Validation. -

    The function, if supplied, must not have any side-effects.

    -
    -
  • -
-
-
- -

- linkingCursor - : string

-
    -
  • -
    -

    Gets or sets the cursor used during the linking or relinking operation. - This defaults to 'pointer'.

    -
    -
    since
    -

    2.2

    -
    -
    -
    -
  • -
-
-
- -

- originalFromNode - : Node

-
    -
  • -
    -

    Gets or sets the original Node from which the new link is being drawn - or from which the originalLink was connected when being relinked. - Setting this property does not raise any events.

    -
    -
  • -
-
-
- -

- originalFromPort - : GraphObject

-
    -
  • -
    -

    Gets or sets the GraphObject that is the port in the originalFromNode. - Setting this property does not raise any events.

    -
    -
  • -
-
-
- -

- originalLink - : Link

-
    -
  • -
    -

    Gets or sets the original Link being reconnected by the RelinkingTool. - Setting this property does not raise any events.

    -
    -
  • -
-
-
- -

- originalToNode - : Node

-
    -
  • -
    -

    Gets or sets the original Node to which the new link is being drawn - or to which the originalLink was connected when being relinked. - Setting this property does not raise any events.

    -
    -
  • -
-
-
- -

- originalToPort - : GraphObject

-
    -
  • -
    -

    Gets or sets the GraphObject that is the port in the originalToNode. - Setting this property does not raise any events.

    -
    -
  • -
-
-
- -

- portGravity - : number

-
    -
  • -
    -

    Gets or sets the distance at which link snapping occurs. - The default value is 100.0. - The value must be non-negative. - Setting this property does not raise any events.

    -
    -
  • -
-
-
- -

- portTargeted - : (node: Node, port: GraphObject, tempNode: Node, tempPort: GraphObject, toEnd: boolean) => void

-
    -
  • -
    -

    Gets or sets a function that is called as the tool targets the nearest valid port. - The first two arguments specify the port by providing the Node that it is in - and the GraphObject that is the actual port object. - The next two arguments are the temporary port that has been moved and styled to be like the valid port. - These values will be either the temporaryToNode and temporaryToPort - or the temporaryFromNode and temporaryFromPort, depending on - which end of the temporary link is being updated. - The fifth argument is true if the target port represents a potential "to" end of a link; - it is false if it is for the "from" end of a link.

    -

    When there is no valid port within the portGravity, the first two arguments are null.

    -

    The function, if supplied, must not add or remove any links or nodes or port objects, - nor may it change the validity of any potential link connection.

    -
    -
    since
    -

    1.2

    -
    -
    -
    -
  • -
-
-
- -

- targetPort - : GraphObject

-
    -
  • -
    -

    Gets or sets a proposed GraphObject port for connecting a link. - Whether this is a "to" port or a "from" port depends on the direction - (isForwards) in which the link is being drawn or reconnected.

    -

    This is set when the mouse is being dragged and when a mouse-up event occurs - with the result of a call to findTargetPort. - Setting this property does not raise any events.

    -
    -
  • -
-
-
- -

- temporaryFromNode - : Node

-
    -
  • -
    -

    Gets or sets the temporary Node at the "from" end of the temporaryLink - while the user is drawing or reconnecting a link. - Setting this property does not raise any events.

    -
    -
  • -
-
-
- -

- temporaryFromPort - : GraphObject

-
    -
  • -
    -

    Gets or sets the GraphObject that is the port at the "from" end of the temporaryLink - while the user is drawing or reconnecting a link. - Setting this property does not raise any events.

    -
    -
  • -
-
-
- -

- temporaryLink - : Link

-
    -
  • -
    -

    Gets or sets the temporary Link that is shown while the user is drawing or reconnecting a link. - Setting this property does not raise any events.

    -
    -
  • -
-
-
- -

- temporaryToNode - : Node

-
    -
  • -
    -

    Gets or sets the temporary Node at the "to" end of the temporaryLink - while the user is drawing or reconnecting a link. - Setting this property does not raise any events.

    -
    -
  • -
-
-
- -

- temporaryToPort - : GraphObject

-
    -
  • -
    -

    Gets or sets the GraphObject that is the port at the "to" end of the temporaryLink - while the user is drawing or reconnecting a link. - Setting this property does not raise any events.

    -
    -
  • -
-
-
-
-

Methods

-
- -

- Protected Virtual - copyPortProperties -

- -
    -
  • -
    -

    Make a temporary port look and act like a real one.

    -

    This is called by doMouseMove as the tool finds new valid target ports. - If findTargetPort returns null, it calls setNoTargetPortProperties instead.

    -

    If the portTargeted property is a function, that function is called. - It is easier to customize the behavior by setting that functional property than it is to override - this method and the setNoTargetPortProperties method. - But you may want to call this method to get the standard behavior for dynamically adapting - the temporary node/port to "act like" the target port. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -
    since
    -

    1.2

    -
    -
    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- Override - doMouseMove -

-
    -
  • doMouseMove(): void
  • -
-
    -
  • -
    -

    Mouse movement results in a temporary node moving to where a valid target port is located, - or to where the mouse is if there is no valid target port nearby.

    -

    This calls findTargetPort to update the targetPort - given the new mouse point. - If a valid target port is found this moves the temporary node/port and - makes them appear like the target node/port by calling copyPortProperties. - If no valid target port is found, this moves the temporary node to - where the mouse currently is and removes any node/port appearance, - by calling setNoTargetPortProperties.

    -

    This method may be overridden, but we recommend that you call this base method.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Virtual - findTargetPort -

- -
    -
  • -
    -

    Find a port with which the user could complete a valid link.

    -

    This finds objects near to the current mouse point for which a valid link connection is possible.

    -

    For each port element found, this calls isValidLink to find out if a link between - the original node/port and the found node/port would be valid. - The result is saved in a cache for faster decisions later during operation of this tool. - The closest valid port is returned.

    -

    This method may be overridden, but we recommend that you call this base method. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Parameters

    -
      -
    • -
      toend: boolean
      -
      -

      true if looking for a "to" port.

      -
      -
    • -
    -

    Returns GraphObject

    -

    a valid port, or null if no such port is near the current mouse point - within the portGravity distance.

    -
  • -
-
-
- -

- Virtual - isInSameNode -

- -
    -
  • -
    -

    This predicate is true if both argument ports are in the same Node. - This is called by isValidLink.

    -

    This method may be overridden, but we recommend that you call this base method. - It is rare that you will want to override this method. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Parameters

    - -

    Returns boolean

    -
  • -
-
-
- -

- Virtual - isLinked -

- -
    -
  • -
    -

    This predicate is true if there is a link in the diagram going from the given port to the given port. - This is called by isValidLink.

    -

    This method may be overridden, but we recommend that you call this base method. - It is rare that you will want to override this method. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Parameters

    - -

    Returns boolean

    -
  • -
-
-
- -

- Virtual - isValidCycle -

-
    -
  • isValidCycle(from: Node, to: Node, ignore?: Link): boolean
  • -
-
    -
  • -
    -

    Checks whether a proposed link would be valid according to Diagram.validCycle. - This does not distinguish between different ports on a node, so this method does not need to take port arguments. - This is called by isValidLink.

    -

    This method may be overridden, but we recommend that you call this base method. - It is rare that you will want to override this method. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -
    since
    -

    1.5

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      from: Node
      -
    • -
    • -
      to: Node
      -
    • -
    • -
      Optional ignore: Link
      -
      -

      may be null; this is useful during relinking to ignore the originalLink

      -
      -
    • -
    -

    Returns boolean

    -
  • -
-
-
- -

- Virtual - isValidFrom -

- -
    -
  • -
    -

    This predicate is true if it is permissible to connect a link from a given node/port. - This is called by isValidLink.

    -

    - For a more general discussion of validation, see Introduction to Validation. -

    This method may be overridden, but we recommend that you call this base method. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Parameters

    - -

    Returns boolean

    -

    False if the node is in a Layer that does not Layer.allowLink. - False if the port's GraphObject.fromLinkable is either false or null. - False if the number of links connected to the port would exceed the port's GraphObject.fromMaxLinks. - Otherwise true.

    -
  • -
-
-
- -

- Virtual - isValidLink -

- - -
-
- -

- Virtual - isValidTo -

- -
    -
  • -
    -

    This predicate is true if it is permissible to connect a link to a given node/port. - This is called by isValidLink.

    -

    - For a more general discussion of validation, see Introduction to Validation. -

    This method may be overridden, but we recommend that you call this base method. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -

    Parameters

    - -

    Returns boolean

    -

    False if the node is in a Layer that does not Layer.allowLink. - False if the port's GraphObject.toLinkable is either false or null. - False if the number of links connected from the port would exceed the port's GraphObject.toMaxLinks. - Otherwise true.

    -
  • -
-
-
- -

- Protected Virtual - setNoTargetPortProperties -

-
    -
  • setNoTargetPortProperties(tempnode: Node, tempport: GraphObject, toend: boolean): void
  • -
-
    -
  • -
    -

    Reset a temporary port's properties to neutral values when there is no target port.

    -

    This is called by doMouseMove when the tool finds no new valid target port. - If findTargetPort returns non-null, it calls copyPortProperties instead.

    -

    If the portTargeted property is a function, that function is called with null values as the first two arguments. - It is easier to customize the behavior by setting that functional property than it is to override - this method and the copyPortProperties method. - But you may want to call this method to get the standard behavior for dynamically adapting - the temporary node/port to "act like" it is not connecting with any target port. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -
    since
    -

    1.2

    -
    -
    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class LinkingBaseTool Abstract

Hierarchy

+

This abstract class is the base class for the LinkingTool and RelinkingTool classes.

+

This class includes properties for defining and accessing any temporary nodes and temporary link +that are used during any linking operation, as well as access to the existing diagram's nodes and link +(if any) that are involved with the linking operation.

+

+For a general discussion of link routing, see: +Introduction to Links, +Introduction to Link Labels, and +Introduction to Link Connection Points. +For customizing the linking tools, see Introduction to the Linking Tools. +For customizing the reshaping of Links, see Introduction to the LinkReshapingTool. +For a general discussion of validation, see Introduction to Validation.

Index

Inherited Members

Constructors

  • +

    Don't construct this directly -- this is an abstract class.

    +

    Returns LinkingBaseTool

Properties

  • +

    Gets whether the linking operation is in the forwards direction, +connecting from the "From" port to the "To" port.

    +
  • +

    Gets or sets whether it is valid to have partly or completely unconnected links.

    +

    The default value is false -- the user cannot draw or reconnect a link to "nowhere". +Setting this property does not raise any events.

    +
    since

    1.3

    +
  • +

    Gets or sets a predicate that determines whether or not a new link between two ports would be valid. +This predicate is called in addition to the normal link checking performed by isValidLink +and any Node.linkValidation predicates on the "from" and "to" nodes. +When relinking, the Link being considered for reconnection is passed as the fifth argument. +The default predicate is null, which is equivalent to simply returning true.

    +

    +For a more general discussion of validation, see Introduction to Validation.

    The function, if supplied, must not have any side-effects.

    +
  • +

    Gets or sets the cursor used during the linking or relinking operation. +This defaults to 'pointer'.

    +
    since

    2.2

    +
  • +

    Gets or sets the original Node from which the new link is being drawn +or from which the originalLink was connected when being relinked. +Setting this property does not raise any events.

    +
  • +

    Gets or sets the original Link being reconnected by the RelinkingTool. +Setting this property does not raise any events.

    +
  • +

    Gets or sets the original Node to which the new link is being drawn +or to which the originalLink was connected when being relinked. +Setting this property does not raise any events.

    +
  • +

    Gets or sets the distance at which link snapping occurs. +The default value is 100.0. +The value must be non-negative. +Setting this property does not raise any events.

    +
  • +

    Gets or sets a function that is called as the tool targets the nearest valid port. +The first two arguments specify the port by providing the Node that it is in +and the GraphObject that is the actual port object. +The next two arguments are the temporary port that has been moved and styled to be like the valid port. +These values will be either the temporaryToNode and temporaryToPort +or the temporaryFromNode and temporaryFromPort, depending on +which end of the temporary link is being updated. +The fifth argument is true if the target port represents a potential "to" end of a link; +it is false if it is for the "from" end of a link.

    +

    When there is no valid port within the portGravity, the first two arguments are null.

    +

    The function, if supplied, must not add or remove any links or nodes or port objects, +nor may it change the validity of any potential link connection.

    +
    since

    1.2

    +
  • +

    Gets or sets a proposed GraphObject port for connecting a link. +Whether this is a "to" port or a "from" port depends on the direction +(isForwards) in which the link is being drawn or reconnected.

    +

    This is set when the mouse is being dragged and when a mouse-up event occurs +with the result of a call to findTargetPort. +Setting this property does not raise any events.

    +
  • +

    Gets or sets the temporary Node at the "from" end of the temporaryLink +while the user is drawing or reconnecting a link. +Setting this property does not raise any events.

    +
  • +

    Gets or sets the GraphObject that is the port at the "from" end of the temporaryLink +while the user is drawing or reconnecting a link. +Setting this property does not raise any events.

    +
  • +

    Gets or sets the temporary Link that is shown while the user is drawing or reconnecting a link. +Setting this property does not raise any events.

    +
  • +

    Gets or sets the temporary Node at the "to" end of the temporaryLink +while the user is drawing or reconnecting a link. +Setting this property does not raise any events.

    +
  • +

    Gets or sets the GraphObject that is the port at the "to" end of the temporaryLink +while the user is drawing or reconnecting a link. +Setting this property does not raise any events.

    +

Methods

  • +

    Make a temporary port look and act like a real one.

    +

    This is called by doMouseMove as the tool finds new valid target ports. +If findTargetPort returns null, it calls setNoTargetPortProperties instead.

    +

    If the portTargeted property is a function, that function is called. +It is easier to customize the behavior by setting that functional property than it is to override +this method and the setNoTargetPortProperties method. +But you may want to call this method to get the standard behavior for dynamically adapting +the temporary node/port to "act like" the target port. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    +
    since

    1.2

    +

    Parameters

    Returns void

  • doMouseMove(): void
  • +

    Mouse movement results in a temporary node moving to where a valid target port is located, +or to where the mouse is if there is no valid target port nearby.

    +

    This calls findTargetPort to update the targetPort +given the new mouse point. +If a valid target port is found this moves the temporary node/port and +makes them appear like the target node/port by calling copyPortProperties. +If no valid target port is found, this moves the temporary node to +where the mouse currently is and removes any node/port appearance, +by calling setNoTargetPortProperties.

    +

    This method may be overridden, but we recommend that you call this base method.

    +

    Returns void

  • +

    Find a port with which the user could complete a valid link.

    +

    This finds objects near to the current mouse point for which a valid link connection is possible.

    +

    For each port element found, this calls isValidLink to find out if a link between +the original node/port and the found node/port would be valid. +The result is saved in a cache for faster decisions later during operation of this tool. +The closest valid port is returned.

    +

    This method may be overridden, but we recommend that you call this base method. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    +

    Parameters

    • toend: boolean
      +

      true if looking for a "to" port.

      +

    Returns GraphObject

    a valid port, or null if no such port is near the current mouse point +within the portGravity distance.

    +
  • +

    This predicate is true if both argument ports are in the same Node. +This is called by isValidLink.

    +

    This method may be overridden, but we recommend that you call this base method. +It is rare that you will want to override this method. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    +

    Parameters

    Returns boolean

  • +

    This predicate is true if there is a link in the diagram going from the given port to the given port. +This is called by isValidLink.

    +

    This method may be overridden, but we recommend that you call this base method. +It is rare that you will want to override this method. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    +

    Parameters

    Returns boolean

  • +

    Checks whether a proposed link would be valid according to Diagram.validCycle. +This does not distinguish between different ports on a node, so this method does not need to take port arguments. +This is called by isValidLink.

    +

    This method may be overridden, but we recommend that you call this base method. +It is rare that you will want to override this method. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    +
    since

    1.5

    +

    Parameters

    Returns boolean

  • +

    This predicate is true if it is permissible to connect a link from a given node/port. +This is called by isValidLink.

    +

    +For a more general discussion of validation, see Introduction to Validation.

    This method may be overridden, but we recommend that you call this base method. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    +

    Parameters

    Returns boolean

    False if the node is in a Layer that does not Layer.allowLink. +False if the port's GraphObject.fromLinkable is either false or null. +False if the number of links connected to the port would exceed the port's GraphObject.fromMaxLinks. +Otherwise true.

    +
  • +

    This predicate is true if it is permissible to connect a link to a given node/port. +This is called by isValidLink.

    +

    +For a more general discussion of validation, see Introduction to Validation.

    This method may be overridden, but we recommend that you call this base method. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    +

    Parameters

    Returns boolean

    False if the node is in a Layer that does not Layer.allowLink. +False if the port's GraphObject.toLinkable is either false or null. +False if the number of links connected from the port would exceed the port's GraphObject.toMaxLinks. +Otherwise true.

    +
  • setNoTargetPortProperties(tempnode: Node, tempport: GraphObject, toend: boolean): void
  • +

    Reset a temporary port's properties to neutral values when there is no target port.

    +

    This is called by doMouseMove when the tool finds no new valid target port. +If findTargetPort returns non-null, it calls copyPortProperties instead.

    +

    If the portTargeted property is a function, that function is called with null values as the first two arguments. +It is easier to customize the behavior by setting that functional property than it is to override +this method and the copyPortProperties method. +But you may want to call this method to get the standard behavior for dynamically adapting +the temporary node/port to "act like" it is not connecting with any target port. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    +
    since

    1.2

    +

    Parameters

    Returns void

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/LinkingTool.html b/api/symbols/LinkingTool.html index 3082c3409..c4f97efe7 100644 --- a/api/symbols/LinkingTool.html +++ b/api/symbols/LinkingTool.html @@ -1,667 +1,180 @@ - - - - - - LinkingTool | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class LinkingTool

-
-
-
-
-
-
-
-
-
-

Hierarchy

- -
-
-
-

The LinkingTool lets a user draw a new Link between two ports, - using a mouse-drag operation.

-

By default an instance of this tool is installed as a mouse-move tool in the - Diagram.toolManager as the ToolManager.linkingTool. - However this tool may be used modally, as described below.

-

canStart calls findLinkablePort to find a valid "port" element - from which (or to which) the user may interactively draw a new link. - doActivate sets up a temporary link and two temporary nodes, - one at the start port and one following the mouse.

-

- For a general discussion of validation, see Introduction to Validation. -

This tool does not utilize any Adornments or tool handles.

-

This tool conducts a transaction while the tool is active. - A successful linking will result in a "LinkDrawn" DiagramEvent and a "Linking" transaction.

-

If you want to programmatically start a new user mouse-gesture to draw a new link - from a given GraphObject that either is a "port" or may be within - the visual tree of a "port", set the startObject property - to let findLinkablePort find the real "port" element. - Then start and activate this tool:

-
  var tool = myDiagram.toolManager.linkingTool;
-  tool.startObject = ...;
-  myDiagram.currentTool = tool;
-  tool.doActivate();
+LinkingTool | GoJS API
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class LinkingTool

Hierarchy

+

The LinkingTool lets a user draw a new Link between two ports, +using a mouse-drag operation.

+

By default an instance of this tool is installed as a mouse-move tool in the +Diagram.toolManager as the ToolManager.linkingTool. +However this tool may be used modally, as described below.

+

canStart calls findLinkablePort to find a valid "port" element +from which (or to which) the user may interactively draw a new link. +doActivate sets up a temporary link and two temporary nodes, +one at the start port and one following the mouse.

+

+For a general discussion of validation, see Introduction to Validation. + +

This tool does not utilize any Adornments or tool handles.

+

This tool conducts a transaction while the tool is active. +A successful linking will result in a "LinkDrawn" DiagramEvent and a "Linking" transaction.

+

If you want to programmatically start a new user mouse-gesture to draw a new link +from a given GraphObject that either is a "port" or may be within +the visual tree of a "port", set the startObject property +to let findLinkablePort find the real "port" element. +Then start and activate this tool:

+
  var tool = myDiagram.toolManager.linkingTool;
tool.startObject = ...;
myDiagram.currentTool = tool;
tool.doActivate();
-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-

Constants

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- -
    -
  • -
    -

    You do not normally need to create an instance of this tool - because one already exists as the ToolManager.linkingTool, which you can modify.

    -

    The Tool.name of this tool is "Linking".

    -
    -

    Returns LinkingTool

    -
  • -
-
-
-
-

Properties

-
- -

- archetypeLabelNodeData - : ObjectData

-
    -
  • -
    -

    Gets or sets an optional node data object representing a link label, that is copied by insertLink - and added to the GraphLinksModel when creating a new Link.

    -

    The default value is null, which causes no such label node data to be added to the model - along with the new link data.

    -

    insertLink calls GraphLinksModel.addLabelKeyForLinkData - to associate the label node data with the link data.

    -

    Setting this property does not raise any events. - This property is ignored if the Diagram.model is not a GraphLinksModel.

    -
    -
  • -
-
-
- -

- archetypeLinkData - : ObjectData

- -
-
- -

- direction - : EnumValue

- -
-
- -

- startObject - : GraphObject

-
    -
  • -
    -

    Gets or sets the GraphObject at which findLinkablePort should start its search. - The default value is null. - Setting this property does not raise any events.

    -

    If you want to explicitly start a new user mouse-gesture to draw a new link - from a given GraphObject that may be a "port" object or may be within - the visual tree of a "port" object, set this property to that object - to let findLinkablePort find the real "port" object. - Then start and activate this tool:

    -
      var tool = myDiagram.toolManager.linkingTool;
    -  tool.startObject = ...;
    -  myDiagram.currentTool = tool;
    -  tool.doActivate();
    +

Index

Inherited Members

Constructors

Properties

  • +

    Gets or sets the GraphObject at which findLinkablePort should start its search. +The default value is null. +Setting this property does not raise any events.

    +

    If you want to explicitly start a new user mouse-gesture to draw a new link +from a given GraphObject that may be a "port" object or may be within +the visual tree of a "port" object, set this property to that object +to let findLinkablePort find the real "port" object. +Then start and activate this tool:

    +
      var tool = myDiagram.toolManager.linkingTool;
    tool.startObject = ...;
    myDiagram.currentTool = tool;
    tool.doActivate();
    -
    -
  • -
-
-
-
-

Methods

-
- -

- Override - canStart -

-
    -
  • canStart(): boolean
  • -
-
    -
  • -
    -

    This tool can run when the diagram allows linking, the model is modifiable, - the left-button mouse drag has moved far enough away to not be a click, and - when findLinkablePort has returned a valid port - or when startObject is a valid port.

    -

    This method may be overridden, but we recommend that you call this base method.

    -
    -

    Returns boolean

    -
  • -
-
-
- -

- Override - doActivate -

-
    -
  • doActivate(): void
  • -
- -
-
- -

- Override - doDeactivate -

-
    -
  • doDeactivate(): void
  • -
-
    -
  • -
    -

    Finishing the linking operation stops the transaction, releases the mouse, and resets the cursor.

    -

    This method may be overridden, but we recommend that you call this base method.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doMouseUp -

-
    -
  • doMouseUp(): void
  • -
-
    -
  • -
    -

    A mouse-up ends the linking operation; if there is a valid targetPort nearby, - this adds a new Link by calling insertLink.

    -

    If there is a new link, it is selected and the "LinkDrawn" DiagramEvent is raised - with the new link as the DiagramEvent.subject. - If there is no new link, this calls doNoLink. - In any case this stops the tool.

    -

    This method also raises the "ChangingSelection" and "ChangedSelection" diagram events. - Changes are performed in a "Linking" transaction, but the "ChangedSelection" event is raised outside the transaction.

    -

    This method may be overridden, but we recommend that you call this base method. - It is usually easier to override insertLink or just set archetypeLinkData. - It is also common to implement a "LinkDrawn" DiagramEvent listener on the Diagram.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Virtual - doNoLink -

- -
    -
  • -
    -

    This method is called upon a mouse up when no new link is drawn, - either because no valid LinkingBaseTool.targetPort was found or because - insertLink returned null.

    -

    This method may be overridden. By default this method does nothing. - If you want to successfully perform any side-effects, you will need to set Tool.transactionResult to a string; - otherwise this tool's transaction will be rolled-back. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -
    since
    -

    1.7

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      fromnode: Node
      -
    • -
    • -
      fromport: GraphObject
      -
      -

      the from-port, or null to use the node itself

      -
      -
    • -
    • -
      tonode: Node
      -
    • -
    • -
      toport: GraphObject
      -
      -

      the to-port, or null to use the node itself

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- Virtual - findLinkablePort -

- - -
-
- -

- Virtual - insertLink -

- -
    -
  • -
    -

    Make a copy of the archetypeLinkData, set its node and port properties, and add it to the GraphLinksModel. - If the model is a TreeModel, set the parent key of the child's node data object.

    -

    For GraphLinksModels, if archetypeLabelNodeData is non-null, this method also adds that node data as an initial label node - for the new link data.

    -

    For TreeModels, if Diagram.isTreePathToChildren is false, the roles of the fromnode and tonode arguments are exchanged.

    -

    This method may be overridden, but we recommend that you call this base method. - Usually though it is easiest to just set archetypeLinkData to control what kind of link is created. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -
    see
    -

    doNoLink

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      fromnode: Node
      -
    • -
    • -
      fromport: GraphObject
      -
      -

      the from-port, or null to use the node itself

      -
      -
    • -
    • -
      tonode: Node
      -
    • -
    • -
      toport: GraphObject
      -
      -

      the to-port, or null to use the node itself

      -
      -
    • -
    -

    Returns Link

    -

    the newly created Link, or null if it failed.

    -
  • -
-
-
-
-

Constants

-
- -

- Static - BackwardsOnly - : EnumValue

-
-

This value for LinkingTool.direction indicates that users may draw new links backwards only - (i.e. from "to" node to "from" node).

-
-
-
- -

- Static - Either - : EnumValue

-
-

This value for LinkingTool.direction indicates that users may draw new links in either direction.

-
-
-
- -

- Static - ForwardsOnly - : EnumValue

-
-

This value for LinkingTool.direction indicates that users may draw new links forwards only - (i.e. from "from" node to "to" node).

-
-
-
-
- -
-
-
- -
-
- - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/List.html b/api/symbols/List.html index 15721201b..863964b6a 100644 --- a/api/symbols/List.html +++ b/api/symbols/List.html @@ -1,1243 +1,246 @@ - - - - - - List | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class List<T>

-
-
-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - List -
  • -
-
-
-
-

NOTE: For 2.0 the constructor argument has changed. - List now optionally accepts a collection, and only checks types in TypeScript.

-

An ordered iterable collection. - In TypeScript it is a generic class that enforces at compile-time the type of elements that may be added to the List.

-

An example usage:

-
  var list = new go.List();  // or in TypeScript: new go.List<go.Point>();
-  list.add(new go.Point(0, 0));
-  list.add(new go.Point(20, 10));
-  list.add(new go.Point(10, 20));
-  // now list.length === 3
-  // and list.elt(1) instanceof go.Point
+List | GoJS API
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class List<T>

Hierarchy

  • List
+

NOTE: For 2.0 the constructor argument has changed. +List now optionally accepts a collection, and only checks types in TypeScript.

+

An ordered iterable collection. +In TypeScript it is a generic class that enforces at compile-time the type of elements that may be added to the List.

+

An example usage:

+
  var list = new go.List();  // or in TypeScript: new go.List<go.Point>();
list.add(new go.Point(0, 0));
list.add(new go.Point(20, 10));
list.add(new go.Point(10, 20));
// now list.length === 3
// and list.elt(1) instanceof go.Point
-

You can iterate over the items in a List:

-
  var it = aList.iterator;
-  while (it.next()) {
-    console.log("#" + it.key + " is " + it.value);
-  }
+

You can iterate over the items in a List:

+
  var it = aList.iterator;
while (it.next()) {
console.log("#" + it.key + " is " + it.value);
}
-

Or:

-
  aList.each(function(val) {
-    console.log(val);
-  });
+

Or:

+
  aList.each(function(val) {
console.log(val);
});
-

The key will range from zero to count-1.

-

For convenience this GoJS List class has synonyms for the following methods and property:

- -

The constructor now takes an optional Iterable or Array argument that provides the initial elements for the new List.

-

Note that GoJS iteration is quite different than ES6 iteration, so that functionality has not been made somewhat compatible. - These collection classes were defined in GoJS before the ES6 collection classes were proposed.

-
-
-
-

Type parameters

-
    -
  • -

    T

    -
  • -
-
-
-

Implements

- -
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- -
    -
  • -
    -

    There are two possible constructors:

    -

    new go.List(), for JavaScript

    -

    new go.List<type>() for TypeScript, to enforce type checking.

    -

    Typical usage would be something like:

    -
      var list = new go.List();  // keep a list of GraphObjects
    +

    The key will range from zero to count-1.

    +

    For convenience this GoJS List class has synonyms for the following methods and property:

    + +

    The constructor now takes an optional Iterable or Array argument that provides the initial elements for the new List.

    +

    Note that GoJS iteration is quite different than ES6 iteration, so that functionality has not been made somewhat compatible. +These collection classes were defined in GoJS before the ES6 collection classes were proposed.

    +

Type parameters

  • T

Implements

Index

Constructors

  • +

    There are two possible constructors:

    +

    new go.List(), for JavaScript

    +

    new go.List<type>() for TypeScript, to enforce type checking.

    +

    Typical usage would be something like:

    +
      var list = new go.List();  // keep a list of GraphObjects
     
    -
    -

    Type parameters

    -
      -
    • -

      T

      -
    • -
    -

    Parameters

    -
      -
    • -
      Optional coll: Iterable<T> | T[]
      -
      -

      an optional collection of items to add.

      -
      -
    • -
    -

    Returns List<T>

    -
  • -
-
-
-
-

Properties

-
- -

- Read-only - count - : number

-
    -
  • -
    -

    This read-only property is the length of the List.

    -
    -
  • -
-
-
- -

- Read-only - iterator - : Iterator<T>

-
    -
  • -
    -

    Gets an object that you can use for iterating over the List. - The key will be an integer from zero to the count-1. - The value will be the item at that index in the list. - Typical usage:

    -
      var it = aList.iterator;
    -  while (it.next()) {
    -    . . . "index: " + it.key + " value: " + it.value . . .
    -  }
    +

Type parameters

  • T

Parameters

  • Optional coll: Iterable<T> | T[]
    +

    an optional collection of items to add.

    +

Returns List<T>

Properties

  • +

    This read-only property is the length of the List.

    +
  • +

    Gets an object that you can use for iterating over the List. +The key will be an integer from zero to the count-1. +The value will be the item at that index in the list. +Typical usage:

    +
      var it = aList.iterator;
    while (it.next()) {
    . . . "index: " + it.key + " value: " + it.value . . .
    }
    -
    -
  • -
-
-
- -

- Read-only - iteratorBackwards - : Iterator<T>

-
    -
  • -
    -

    Gets an object that you can use for iterating over the List in backwards order. - The key will be an integer from count-1 to zero. - The value will be the item at that index in the list. - The list is not modified by traversing in reverse order. - Typical usage:

    -
      var it = aList.iteratorBackwards;
    -  while (it.next()) {
    -    . . . 'key: ' + it.key + ' value: ' + it.value . . .
    -  }
    +
  • +

    Gets an object that you can use for iterating over the List in backwards order. +The key will be an integer from count-1 to zero. +The value will be the item at that index in the list. +The list is not modified by traversing in reverse order. +Typical usage:

    +
      var it = aList.iteratorBackwards;
    while (it.next()) {
    . . . 'key: ' + it.key + ' value: ' + it.value . . .
    }
    -
    -
  • -
-
-
- -

- Read-only - length - : number

-
    -
  • -
    -

    This read-only property is the length of the List, a synonym for the count property.

    -
    -
  • -
-
-
- -

- Read-only - size - : number

-
    -
  • -
    -

    This read-only property is the length of the List.

    -
    -
  • -
-
-
-
-

Methods

-
- -

- add -

-
    -
  • add(val: T): List<T>
  • -
-
    -
  • -
    -

    Adds a given value to the end of the List.

    -

    Be careful not to call this method while iterating over the collection.

    -
    -

    Parameters

    -
      -
    • -
      val: T
      -
    • -
    -

    Returns List<T>

    -

    This modified List.

    -
  • -
-
-
- -

- addAll -

- -
    -
  • -
    -

    Adds all of the values of a collection to the end of this List.

    -

    Be careful not to call this method while iterating over the collection.

    -
    -

    Parameters

    -
      -
    • -
      coll: Iterable<T> | T[]
      -
      -

      the collection of items to add.

      -
      -
    • -
    -

    Returns List<T>

    -

    This modified List.

    -
  • -
-
-
- -

- Virtual - all -

-
    -
  • all(pred: (a: T) => boolean): boolean
  • -
-
    -
  • -
    -

    This is true if all invocations of the given predicate on items in the collection are true.

    -

    Call the given predicate on each item in the collection. - As soon as a call returns false, this returns false. - Otherwise this returns true. - For an empty collection this returns true.

    -
    -
    since
    -

    1.4

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      pred: (a: T) => boolean
      -
      -

      This function must not have any side-effects.

      -
      -
        -
      -
    • -
    -

    Returns boolean

    -

    True if all predicate calls are true; false otherwise.

    -
  • -
-
-
- -

- Virtual - any -

-
    -
  • any(pred: (a: T) => boolean): boolean
  • -
-
    -
  • -
    -

    This is true if any invocation of the given predicate on items in the collection is true.

    -

    Call the given predicate on each item in the collection. - As soon as a call returns true, this returns true. - Otherwise this returns false. - For an empty collection this returns false.

    -
    -
    since
    -

    1.4

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      pred: (a: T) => boolean
      -
      -

      This function must not have any side-effects.

      -
      -
        -
      -
    • -
    -

    Returns boolean

    -

    True if any predicate call is true; false otherwise.

    -
  • -
-
-
- -

- clear -

-
    -
  • clear(): void
  • -
-
    -
  • -
    -

    Clears the List. - This sets the count to zero.

    -

    Be careful not to call this method while iterating over the collection.

    -
    -

    Returns void

    -
  • -
-
-
- -

- contains -

-
    -
  • contains(val: T): boolean
  • -
-
    -
  • -
    -

    Returns whether the given value is in this List.

    -
    -

    Parameters

    -
      -
    • -
      val: T
      -
      -

      The value to check.

      -
      -
    • -
    -

    Returns boolean

    -

    Whether or not the value is contained within the List.

    -
  • -
-
-
- -

- Virtual - copy -

-
    -
  • copy(): List<T>
  • -
-
    -
  • -
    -

    Makes a shallow copy of this List. - The values are not copied, - so if they are objects they may continue to be shared with the original List.

    -
    -

    Returns List<T>

    -

    The new List with the same elements.

    -
  • -
-
-
- -

- delete -

-
    -
  • delete(val: T): boolean
  • -
-
    -
  • -
    -

    Removes a given value (if found) from the List.

    -

    Be careful not to call this method while iterating over the collection.

    -
    -

    Parameters

    -
      -
    • -
      val: T
      -
      -

      The value to remove.

      -
      -
    • -
    -

    Returns boolean

    -

    true if the value was found and removed, false otherwise.

    -
  • -
-
-
- -

- Virtual - each -

-
    -
  • each(func: (a: T) => void): List<T>
  • -
-
    -
  • -
    -

    Call the given function on each item in the collection.

    -
    -
    since
    -

    1.4

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      func: (a: T) => void
      -
      -

      This function must not modify the collection.

      -
      -
        -
      -
    • -
    -

    Returns List<T>

    -

    This List itself

    -
  • -
-
-
- -

- elt -

-
    -
  • elt(i: number): T
  • -
-
    -
  • -
    -

    Returns the element at the given index.

    -
    -

    Parameters

    -
      -
    • -
      i: number
      -
      -

      int The index of the element to return.

      -
      -
    • -
    -

    Returns T

    -

    the value at the given index.

    -
  • -
-
-
- -

- first -

-
    -
  • first(): T
  • -
-
    -
  • -
    -

    Returns the first item in the list, or null if there is none.

    -
    -

    Returns T

    -

    This returns null if there are no items in the list.

    -
  • -
-
-
- -

- get -

-
    -
  • get(i: number): T
  • -
-
    -
  • -
    -

    Returns the element at the given index.

    -
    -

    Parameters

    -
      -
    • -
      i: number
      -
      -

      int The index of the element to return.

      -
      -
    • -
    -

    Returns T

    -

    the value at the given index.

    -
  • -
-
-
- -

- has -

-
    -
  • has(val: T): boolean
  • -
-
    -
  • -
    -

    Returns whether the given value is in this List.

    -
    -

    Parameters

    -
      -
    • -
      val: T
      -
      -

      The value to check.

      -
      -
    • -
    -

    Returns boolean

    -

    Whether or not the value is contained within the List.

    -
  • -
-
-
- -

- indexOf -

-
    -
  • indexOf(val: T): number
  • -
-
    -
  • -
    -

    Returns the index of the given value if it is in this List.

    -
    -

    Parameters

    -
      -
    • -
      val: T
      -
      -

      The value to check.

      -
      -
    • -
    -

    Returns number

    -

    int returns -1 if the value is not in this list.

    -
  • -
-
-
- -

- insertAt -

-
    -
  • insertAt(i: number, val: T): void
  • -
-
    -
  • -
    -

    Insert a value before the index i.

    -

    Be careful not to call this method while iterating over the collection.

    -
    -

    Parameters

    -
      -
    • -
      i: number
      -
      -

      int The index to insert before.

      -
      -
    • -
    • -
      val: T
      -
      -

      The value to insert.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- last -

-
    -
  • last(): T
  • -
-
    -
  • -
    -

    Returns the last item in the list, or null if these is none.

    -
    -
    since
    -

    1.5

    -
    -
    -
    -

    Returns T

    -

    This returns null if there are no items in the list.

    -
  • -
-
-
- -

- pop -

-
    -
  • pop(): T
  • -
-
    -
  • -
    -

    Returns the last item in the list and removes it from the list, or just return null if these is none. - Use add to push an item onto the end of the list. - Use last to get the last item without reducing the length of the list.

    -
    -
    since
    -

    1.5

    -
    -
    -
    -

    Returns T

    -

    This returns null if there are no items in the list.

    -
  • -
-
-
- -

- push -

-
    -
  • push(val: T): void
  • -
-
    -
  • -
    -

    Adds a given value to the end of the List.

    -

    Be careful not to call this method while iterating over the collection.

    -
    -

    Parameters

    -
      -
    • -
      val: T
      -
      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- remove -

-
    -
  • remove(val: T): boolean
  • -
-
    -
  • -
    -

    Removes a given value (if found) from the List.

    -

    Be careful not to call this method while iterating over the collection.

    -
    -

    Parameters

    -
      -
    • -
      val: T
      -
      -

      The value to remove.

      -
      -
    • -
    -

    Returns boolean

    -

    true if the value was found and removed, false otherwise.

    -
  • -
-
-
- -

- removeAt -

-
    -
  • removeAt(i: number): void
  • -
-
    -
  • -
    -

    Removes a value at a given index from the List.

    -

    Be careful not to call this method while iterating over the collection.

    -
    -

    Parameters

    -
      -
    • -
      i: number
      -
      -

      int The index to remove.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- removeRange -

-
    -
  • removeRange(from: number, to: number): List<T>
  • -
-
    -
  • -
    -

    Removes a range of values from the List, given both the starting and the ending zero-based indexes. - For example,

    -
    list.removeRange(2, 4)
    +
  • +

    This read-only property is the length of the List, a synonym for the count property.

    +
  • +

    This read-only property is the length of the List.

    +

Methods

  • add(val: T): List<T>
  • +

    Adds a given value to the end of the List.

    +

    Be careful not to call this method while iterating over the collection.

    +

    Parameters

    • val: T

    Returns List<T>

    This modified List.

    +
  • +

    Adds all of the values of a collection to the end of this List.

    +

    Be careful not to call this method while iterating over the collection.

    +

    Parameters

    • coll: Iterable<T> | T[]
      +

      the collection of items to add.

      +

    Returns List<T>

    This modified List.

    +
  • all(pred: (a: T) => boolean): boolean
  • +

    This is true if all invocations of the given predicate on items in the collection are true.

    +

    Call the given predicate on each item in the collection. +As soon as a call returns false, this returns false. +Otherwise this returns true. +For an empty collection this returns true.

    +
    since

    1.4

    +

    Parameters

    • pred: (a: T) => boolean
      +

      This function must not have any side-effects.

      +
        • (a: T): boolean
        • Parameters

          • a: T

          Returns boolean

    Returns boolean

    True if all predicate calls are true; false otherwise.

    +
  • any(pred: (a: T) => boolean): boolean
  • +

    This is true if any invocation of the given predicate on items in the collection is true.

    +

    Call the given predicate on each item in the collection. +As soon as a call returns true, this returns true. +Otherwise this returns false. +For an empty collection this returns false.

    +
    since

    1.4

    +

    Parameters

    • pred: (a: T) => boolean
      +

      This function must not have any side-effects.

      +
        • (a: T): boolean
        • Parameters

          • a: T

          Returns boolean

    Returns boolean

    True if any predicate call is true; false otherwise.

    +
  • clear(): void
  • +

    Clears the List. +This sets the count to zero.

    +

    Be careful not to call this method while iterating over the collection.

    +

    Returns void

  • contains(val: T): boolean
  • +

    Returns whether the given value is in this List.

    +

    Parameters

    • val: T
      +

      The value to check.

      +

    Returns boolean

    Whether or not the value is contained within the List.

    +
  • +

    Makes a shallow copy of this List. +The values are not copied, +so if they are objects they may continue to be shared with the original List.

    +

    Returns List<T>

    The new List with the same elements.

    +
  • delete(val: T): boolean
  • +

    Removes a given value (if found) from the List.

    +

    Be careful not to call this method while iterating over the collection.

    +

    Parameters

    • val: T
      +

      The value to remove.

      +

    Returns boolean

    true if the value was found and removed, false otherwise.

    +
  • each(func: (a: T) => void): List<T>
  • +

    Call the given function on each item in the collection.

    +
    since

    1.4

    +

    Parameters

    • func: (a: T) => void
      +

      This function must not modify the collection.

      +
        • (a: T): void
        • Parameters

          • a: T

          Returns void

    Returns List<T>

    This List itself

    +
  • elt(i: number): T
  • +

    Returns the element at the given index.

    +

    Parameters

    • i: number
      +

      int The index of the element to return.

      +

    Returns T

    the value at the given index.

    +
  • first(): T
  • +

    Returns the first item in the list, or null if there is none.

    +

    Returns T

    This returns null if there are no items in the list.

    +
  • get(i: number): T
  • +

    Returns the element at the given index.

    +

    Parameters

    • i: number
      +

      int The index of the element to return.

      +

    Returns T

    the value at the given index.

    +
  • has(val: T): boolean
  • +

    Returns whether the given value is in this List.

    +

    Parameters

    • val: T
      +

      The value to check.

      +

    Returns boolean

    Whether or not the value is contained within the List.

    +
  • indexOf(val: T): number
  • +

    Returns the index of the given value if it is in this List.

    +

    Parameters

    • val: T
      +

      The value to check.

      +

    Returns number

    int returns -1 if the value is not in this list.

    +
  • insertAt(i: number, val: T): void
  • +

    Insert a value before the index i.

    +

    Be careful not to call this method while iterating over the collection.

    +

    Parameters

    • i: number
      +

      int The index to insert before.

      +
    • val: T
      +

      The value to insert.

      +

    Returns void

  • last(): T
  • +

    Returns the last item in the list, or null if these is none.

    +
    since

    1.5

    +

    Returns T

    This returns null if there are no items in the list.

    +
  • pop(): T
  • +

    Returns the last item in the list and removes it from the list, or just return null if these is none. +Use add to push an item onto the end of the list. +Use last to get the last item without reducing the length of the list.

    +
    since

    1.5

    +

    Returns T

    This returns null if there are no items in the list.

    +
  • push(val: T): void
  • +

    Adds a given value to the end of the List.

    +

    Be careful not to call this method while iterating over the collection.

    +

    Parameters

    • val: T
      +

    Returns void

  • remove(val: T): boolean
  • +

    Removes a given value (if found) from the List.

    +

    Be careful not to call this method while iterating over the collection.

    +

    Parameters

    • val: T
      +

      The value to remove.

      +

    Returns boolean

    true if the value was found and removed, false otherwise.

    +
  • removeAt(i: number): void
  • +

    Removes a value at a given index from the List.

    +

    Be careful not to call this method while iterating over the collection.

    +

    Parameters

    • i: number
      +

      int The index to remove.

      +

    Returns void

  • removeRange(from: number, to: number): List<T>
  • +

    Removes a range of values from the List, given both the starting and the ending zero-based indexes. +For example,

    +
    list.removeRange(2, 4)
     
    -

    will remove elements 2, 3, and 4 from the list. - If there were two or fewer elements in the list to begin with, the list is unchanged. - If from is greater than to, the list is unchanged. - If from is greater than or equal to the length, the list is unchanged. - If to is less than zero, the list is unchanged.

    -

    Be careful not to call this method while iterating over the collection.

    -
    -

    Parameters

    -
      -
    • -
      from: number
      -
      -

      int The starting index of the range to remove, inclusive; negative values are treated as zero

      -
      -
    • -
    • -
      to: number
      -
      -

      int The ending index of the range to remove, inclusive; values greater than the length of the list are treated as referring to the last element

      -
      -
    • -
    -

    Returns List<T>

    -

    This modified List

    -
  • -
-
-
- -

- reverse -

-
    -
  • reverse(): List<T>
  • -
-
    -
  • -
    -

    Reverse the order of items in this List.

    -
    -

    Returns List<T>

    -

    This modified List.

    -
  • -
-
-
- -

- set -

-
    -
  • set(i: number, val: T): void
  • -
-
    -
  • -
    -

    Set the element at the given index to a given value.

    -
    -

    Parameters

    -
      -
    • -
      i: number
      -
      -

      int The index of the element to set.

      -
      -
    • -
    • -
      val: T
      -
      -

      The value to set at the index.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- setElt -

-
    -
  • setElt(i: number, val: T): void
  • -
-
    -
  • -
    -

    Set the element at the given index to a given value.

    -
    -

    Parameters

    -
      -
    • -
      i: number
      -
      -

      int The index of the element to set.

      -
      -
    • -
    • -
      val: T
      -
      -

      The value to set at the index.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- sort -

-
    -
  • sort(sortfunc: (a: T, b: T) => number): List<T>
  • -
-
    -
  • -
    -

    Sort the List according to a comparison function.

    -
    -

    Parameters

    -
      -
    • -
      sortfunc: (a: T, b: T) => number
      -
      -

      This function is passed two items in the list. - It should return zero if they are equal, - less than zero if the first value should come before the second value, - or greater than zero if the first value should come after the second value.

      -
      -
        -
      -
    • -
    -

    Returns List<T>

    -

    This modified List.

    -
  • -
-
-
- -

- toArray -

-
    -
  • toArray(): T[]
  • -
-
    -
  • -
    -

    Produces a JavaScript Array from the contents of this List.

    -
    -

    Returns T[]

    -

    A copy of the List in Array form.

    -
  • -
-
-
- -

- toSet -

-
    -
  • toSet(): Set<T>
  • -
-
    -
  • -
    -

    Converts the List to a Set. - The count of the resulting Set may be less than the count of this List - if any duplicates were removed.

    -
    -

    Returns Set<T>

    -

    A copy of the contents of this List, - but with duplicates removed and ordering lost.

    -
  • -
-
-
-
- -
-
-
- -
-
- - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/LocalStorageCommandHandler.html b/api/symbols/LocalStorageCommandHandler.html index 7016bc605..9bafebf75 100644 --- a/api/symbols/LocalStorageCommandHandler.html +++ b/api/symbols/LocalStorageCommandHandler.html @@ -1,324 +1,58 @@ - - - - - - LocalStorageCommandHandler | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class LocalStorageCommandHandler

-
-
-
-
-
-
-
-
-
-

- This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

-
-
-

Hierarchy

- -
-
-
-

This CommandHandler class uses localStorage as the repository for the clipboard, - rather than an in-memory global variable. - It requires that the Diagram.model be serializable and deserializable using Model.toJson and Model.fromJson.

-

The copyToClipboard and pasteFromClipboard functions fall back to using the standard definitions - if there are any errors calling Storage.getItem or Storage.setItem.

-

Typical usage:

-
  $(go.Diagram, "myDiagramDiv",
-    {
-      commandHandler: $(LocalStorageCommandHandler),
-      ...
-    }
-  )
+LocalStorageCommandHandler | GoJS API
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class LocalStorageCommandHandler Extension

This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

Hierarchy

+

This CommandHandler class uses localStorage as the repository for the clipboard, +rather than an in-memory global variable. +It requires that the Diagram.model be serializable and deserializable using Model.toJson and Model.fromJson.

+

The copyToClipboard and pasteFromClipboard functions fall back to using the standard definitions +if there are any errors calling Storage.getItem or Storage.setItem.

+

Typical usage:

+
  $(go.Diagram, "myDiagramDiv",
{
commandHandler: $(LocalStorageCommandHandler),
...
}
)
-

or:

-
  myDiagram.commandHandler = new LocalStorageCommandHandler();
+

or:

+
  myDiagram.commandHandler = new LocalStorageCommandHandler();
 
-

If you want to experiment with this extension, try the Local Storage Commands sample.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- - -
-
-
-

Methods

-
- -

- Override - canPasteSelection -

-
    -
  • canPasteSelection(pos?: Point): boolean
  • -
-
    -
  • -
    -

    This predicate controls whether or not the user can invoke the pasteSelection command.

    -

    This works just like CommandHandler.canPasteSelection, but looks at LocalStorage instead of a static variable.

    -
    -

    Parameters

    -
      -
    • -
      Optional pos: Point
      -
    • -
    -

    Returns boolean

    -
  • -
-
-
- -

- Override - copyToClipboard -

- -
    -
  • -
    -

    Makes a copy of the given collection of Parts - and stores it as JSON in LocalStorage.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- Override - pasteFromClipboard -

-
    -
  • pasteFromClipboard(): Set<Part>
  • -
-
    -
  • -
    -

    If LocalStorage holds JSON for a collection of Parts, - and if the Model.dataFormat matches that stored in the clipboard, - this makes a copy of the clipboard's parts and adds the copies to this Diagram.

    -
    -

    Returns Set<Part>

    -

    a collection of newly pasted Parts

    -
  • -
-
-
-
- -
-
-
- -
-
- - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Map.html b/api/symbols/Map.html index 51ae41c74..a78999fbb 100644 --- a/api/symbols/Map.html +++ b/api/symbols/Map.html @@ -1,960 +1,202 @@ - - - - - - Map | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class Map<K, V>

-
-
-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - Map -
  • -
-
-
-
-

NOTE: For 2.0 the constructor arguments have changed. - Map now optionally accepts a collection, and only checks types in TypeScript.

-

An unordered iterable collection of key/value pairs that cannot contain two instances of the same key. - In TypeScript it is a generic class that enforces at compile-time the type of the key and the type of the associated value.

-

To create a Map:

-
  var map = new go.Map(); // In TypeScript: new go.Map<string, number>();
-  map.add("one", 1);
-  map.add("two", 2);
-  map.add("three", 3);
-  // now map.count === 3
-  // and map.getValue("two") === 2
-  // and map.contains("zero") === false
+Map | GoJS API
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class Map<K, V>

Hierarchy

  • Map
+

NOTE: For 2.0 the constructor arguments have changed. +Map now optionally accepts a collection, and only checks types in TypeScript.

+

An unordered iterable collection of key/value pairs that cannot contain two instances of the same key. +In TypeScript it is a generic class that enforces at compile-time the type of the key and the type of the associated value.

+

To create a Map:

+
  var map = new go.Map(); // In TypeScript: new go.Map<string, number>();
map.add("one", 1);
map.add("two", 2);
map.add("three", 3);
// now map.count === 3
// and map.getValue("two") === 2
// and map.contains("zero") === false
-

You can iterate over the key/value pairs in a Map:

-
  var it = aMap.iterator;
-  while (it.next()) {
-    console.log(it.key + ": " + it.value);
-  }
+

You can iterate over the key/value pairs in a Map:

+
  var it = aMap.iterator;
while (it.next()) {
console.log(it.key + ": " + it.value);
}
-

Or:

-
  aMap.each(function(kvp) {
-    console.log(kvp.key + ": " + kvp.value);
-  });
+

Or:

+
  aMap.each(function(kvp) {
console.log(kvp.key + ": " + kvp.value);
});
-

But note that there is no guaranteed ordering amongst the key/value pairs.

-

Call toKeySet to get a read-only Set that holds all of the keys of a Map. - Iterating over that Set will produce values that are the keys in the Map.

-

Although not precisely implementing the features and semantics of the EcmaScript 6 Map class, - this GoJS Map class has synonyms for the following methods and property:

-
    -
  • get(key): getValue, but returns null instead of undefined when key is not present
  • -
  • set(key,val): add
  • -
  • has(key): contains
  • -
  • delete(key): remove
  • -
  • clear(): clear
  • -
  • size: count
  • -
-

The constructor now takes an optional Iterable or Array argument that provides the initial entries for the new Map.

-

Note that GoJS iteration is quite different than ES6 iteration, so that functionality has not been made somewhat compatible. - These collection classes were defined in GoJS before the ES6 collection classes were proposed.

-
-
-
-

Type parameters

-
    -
  • -

    K

    -
  • -
  • -

    V

    -
  • -
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

-
    -
  • new Map<K, V>(coll?: Map<K, V> | Iterable<KeyValuePair<K, V>> | KeyValuePair<K, V>[]): Map<K, V>
  • -
-
    -
  • -
    -

    There are two possible constructors:

    -

    new go.Map(), for JavaScript

    -

    new go.Map<K, V>() for TypeScript

    -

    In TypeScript, the two optional generic arguments describe the types of keys - and the types of values that this Map may hold.

    -

    For example, the expression:

    -
    // TypeScript:
    -new go.Map<string, go.Point>()
    +

    But note that there is no guaranteed ordering amongst the key/value pairs.

    +

    Call toKeySet to get a read-only Set that holds all of the keys of a Map. +Iterating over that Set will produce values that are the keys in the Map.

    +

    Although not precisely implementing the features and semantics of the EcmaScript 6 Map class, +this GoJS Map class has synonyms for the following methods and property:

    + +

    The constructor now takes an optional Iterable or Array argument that provides the initial entries for the new Map.

    +

    Note that GoJS iteration is quite different than ES6 iteration, so that functionality has not been made somewhat compatible. +These collection classes were defined in GoJS before the ES6 collection classes were proposed.

    +

Type parameters

  • K

  • V

Index

Constructors

  • new Map<K, V>(coll?: Map<K, V> | Iterable<KeyValuePair<K, V>> | KeyValuePair<K, V>[]): Map<K, V>
  • +

    There are two possible constructors:

    +

    new go.Map(), for JavaScript

    +

    new go.Map<K, V>() for TypeScript

    +

    In TypeScript, the two optional generic arguments describe the types of keys +and the types of values that this Map may hold.

    +

    For example, the expression:

    +
    // TypeScript:
    new go.Map<string, go.Point>()
    -

    produces a Map that has keys that must be strings and whose associated values - must be Points.

    -
    -

    Type parameters

    -
      -
    • -

      K

      -
    • -
    • -

      V

      -
    • -
    -

    Parameters

    -
      -
    • -
      Optional coll: Map<K, V> | Iterable<KeyValuePair<K, V>> | KeyValuePair<K, V>[]
      -
      -

      an optional collection of keys/values to add, or an Array of { key: ..., value: ... } objects. - Note that the key/value pairs are objects with "key" and "value" properties, not Arrays of length 2.

      -
      -
    • -
    -

    Returns Map<K, V>

    -
  • -
-
-
-
-

Properties

-
- -

- Read-only - count - : number

-
    -
  • -
    -

    This read-only property is the number of associations in the Map.

    -
    -
  • -
-
-
- -

- Read-only - iterator - : IMapIterator<K, V>

-
    -
  • -
    -

    Gets an object that you can use for iterating over the key-value pairs of a Map. - Typical usage:

    -
      var it = aMap.iterator;
    -  while (it.next()) {
    -    console.log("the key: " + it.key + " has value: " + it.value);
    -  }
    +

    produces a Map that has keys that must be strings and whose associated values +must be Points.

    +

Type parameters

  • K

  • V

Parameters

  • Optional coll: Map<K, V> | Iterable<KeyValuePair<K, V>> | KeyValuePair<K, V>[]
    +

    an optional collection of keys/values to add, or an Array of { key: ..., value: ... } objects. +Note that the key/value pairs are objects with "key" and "value" properties, not Arrays of length 2.

    +

Returns Map<K, V>

Properties

  • +

    This read-only property is the number of associations in the Map.

    +
  • +

    Gets an object that you can use for iterating over the key-value pairs of a Map. +Typical usage:

    +
      var it = aMap.iterator;
    while (it.next()) {
    console.log("the key: " + it.key + " has value: " + it.value);
    }
    -
    -
  • -
-
-
- -

- Read-only - iteratorKeys - : Iterator<K>

-
    -
  • -
    -

    Gets an object that you can use for iterating over the keys of a Map. - Typical usage:

    -
      var it = aMap.iteratorKeys;
    -  while (it.next()) {
    -    console.log("key: " + it.value);
    -  }
    +
  • +

    Gets an object that you can use for iterating over the keys of a Map. +Typical usage:

    +
      var it = aMap.iteratorKeys;
    while (it.next()) {
    console.log("key: " + it.value);
    }
    -
    -
    since
    -

    1.4

    -
    -
    -
    -
  • -
-
-
- -

- Read-only - iteratorValues - : Iterator<V>

-
    -
  • -
    -

    Gets an object that you can use for iterating over the values of a Map. - Typical usage:

    -
      var it = aMap.iteratorValues;
    -  while (it.next()) {
    -    console.log("value: " + it.value);
    -  }
    +
    since

    1.4

    +
  • +

    Gets an object that you can use for iterating over the values of a Map. +Typical usage:

    +
      var it = aMap.iteratorValues;
    while (it.next()) {
    console.log("value: " + it.value);
    }
    -
    -
    since
    -

    1.4

    -
    -
    -
    -
  • -
-
-
- -

- Read-only - size - : number

-
    -
  • -
    -

    This read-only property is the number of associations in the Map.

    -
    -
  • -
-
-
-
-

Methods

-
- -

- add -

-
    -
  • add(key: K, val: V): Map<K, V>
  • -
-
    -
  • -
    -

    Adds a key-value association to the Map, or replaces the value associated with the key - if the key was already present in the map.

    -

    Be careful not to call this method while iterating over the collection.

    -
    -

    Parameters

    -
      -
    • -
      key: K
      -
      -

      The key or index for storing the value in the Map.

      -
      -
    • -
    • -
      val: V
      -
      -

      The value to add to the Map, associated with the key.

      -
      -
    • -
    -

    Returns Map<K, V>

    -

    This modified Map.

    -
  • -
-
-
- -

- addAll -

-
    -
  • addAll(coll: Map<K, V> | Iterable<KeyValuePair<K, V>> | KeyValuePair<K, V>[]): Map<K, V>
  • -
-
    -
  • -
    -

    Adds all of the key-value pairs of another Map to this Map. - If a key is already present in this Map, - its value is replaced with the corresponding value from the given map.

    -

    Be careful not to call this method while iterating over the collection.

    -
    -

    Parameters

    -
      -
    • -
      coll: Map<K, V> | Iterable<KeyValuePair<K, V>> | KeyValuePair<K, V>[]
      -
      -

      the collection of keys/values to add, or an Array of { key: ..., value: ... } objects.

      -
      -
    • -
    -

    Returns Map<K, V>

    -

    This modified Map.

    -
  • -
-
-
- -

- Virtual - all -

-
    -
  • all(pred: (a: KeyValuePair<K, V>) => boolean): boolean
  • -
-
    -
  • -
    -

    This is true if all invocations of the given predicate on items in the collection are true.

    -

    Call the given predicate on each key/value pair in the collection. - As soon as a call returns false, this returns false. - Otherwise this returns true. - For an empty collection this returns true.

    -
    -
    since
    -

    1.4

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      pred: (a: KeyValuePair<K, V>) => boolean
      -
      -

      The argument to the predicate will be an object with both "key" and "value" properties. - This function must not have any side-effects.

      -
      -
        -
      -
    • -
    -

    Returns boolean

    -

    True if all predicate calls are true; false otherwise.

    -
  • -
-
-
- -

- Virtual - any -

-
    -
  • any(pred: (a: KeyValuePair<K, V>) => boolean): boolean
  • -
-
    -
  • -
    -

    This is true if any invocation of the given predicate on items in the collection is true.

    -

    Call the given predicate on each key/value pair in the collection. - As soon as a call returns true, this returns true. - Otherwise this returns false. - For an empty collection this returns false.

    -
    -
    since
    -

    1.4

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      pred: (a: KeyValuePair<K, V>) => boolean
      -
      -

      The argument to the predicate will be an object with both "key" and "value" properties. - This function must not have any side-effects.

      -
      -
        -
      -
    • -
    -

    Returns boolean

    -

    True if any predicate call is true; false otherwise.

    -
  • -
-
-
- -

- clear -

-
    -
  • clear(): void
  • -
-
    -
  • -
    -

    Clears the Map, removing all key-value associations. - This sets the count to zero.

    -

    Be careful not to call this method while iterating over the collection.

    -
    -

    Returns void

    -
  • -
-
-
- -

- contains -

-
    -
  • contains(key: K): boolean
  • -
-
    -
  • -
    -

    Returns whether the given key is in this Map.

    -
    -

    Parameters

    -
      -
    • -
      key: K
      -
      -

      The key to look up in the Map.

      -
      -
    • -
    -

    Returns boolean

    -

    Whether or not the key is contained within the Map.

    -
  • -
-
-
- -

- Virtual - copy -

-
    -
  • copy(): Map<K, V>
  • -
-
    -
  • -
    -

    Makes a shallow copy of this Map. - The keys and their values are not copied, - so if they are objects they may continue to be shared with the original Map.

    -
    -

    Returns Map<K, V>

    -

    The new Map with copies of the same entries.

    -
  • -
-
-
- -

- delete -

-
    -
  • delete(key: K): boolean
  • -
-
    -
  • -
    -

    Removes a key (if found) from the Map.

    -

    Be careful not to call this method while iterating over the collection.

    -
    -

    Parameters

    -
      -
    • -
      key: K
      -
      -

      The key to insert.

      -
      -
    • -
    -

    Returns boolean

    -

    true if the key was found and removed, false otherwise.

    -
  • -
-
-
- -

- Virtual - each -

-
    -
  • each(func: (a: KeyValuePair<K, V>) => void): Map<K, V>
  • -
-
    -
  • -
    -

    Call the given function on each key/value pair in the collection.

    -
    -
    since
    -

    1.4

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      func: (a: KeyValuePair<K, V>) => void
      -
      -

      The argument to the function will be an object with both "key" and "value" properties. - This function must not modify the collection.

      -
      -
        -
      -
    • -
    -

    Returns Map<K, V>

    -

    This Map itself

    -
  • -
-
-
- -

- first -

-
    -
  • first(): KeyValuePair<K, V>
  • -
-
    -
  • -
    -

    Returns the first key/value pair in the collection, or null if there is none.

    -
    -
    since
    -

    1.4

    -
    -
    -
    -

    Returns KeyValuePair<K, V>

    -

    This returns null if there are no items in the collection.

    -
  • -
-
-
- -

- get -

-
    -
  • get(key: K): V
  • -
-
    -
  • -
    -

    Returns the value associated with a key.

    -
    -

    Parameters

    -
      -
    • -
      key: K
      -
      -

      The key to look up in the Map.

      -
      -
    • -
    -

    Returns V

    -

    The value associated with the given key, or null if not present in the Map.

    -
  • -
-
-
- -

- getValue -

-
    -
  • getValue(key: K): V
  • -
-
    -
  • -
    -

    Returns the value associated with a key.

    -
    -

    Parameters

    -
      -
    • -
      key: K
      -
      -

      The key to look up in the Map.

      -
      -
    • -
    -

    Returns V

    -

    The value associated with the given key, or null if not present in the Map.

    -
  • -
-
-
- -

- has -

-
    -
  • has(key: K): boolean
  • -
-
    -
  • -
    -

    Returns whether the given key is in this Map.

    -
    -

    Parameters

    -
      -
    • -
      key: K
      -
      -

      The key to look up in the Map.

      -
      -
    • -
    -

    Returns boolean

    -

    Whether or not the key is contained within the Map.

    -
  • -
-
-
- -

- remove -

-
    -
  • remove(key: K): boolean
  • -
-
    -
  • -
    -

    Removes a key (if found) from the Map.

    -

    Be careful not to call this method while iterating over the collection.

    -
    -

    Parameters

    -
      -
    • -
      key: K
      -
      -

      The key to remove.

      -
      -
    • -
    -

    Returns boolean

    -

    true if the key was found and removed, false otherwise.

    -
  • -
-
-
- -

- set -

-
    -
  • set(key: K, val: V): Map<K, V>
  • -
-
    -
  • -
    -

    Adds a key-value association to the Map, or replaces the value associated with the key - if the key was already present in the map.

    -

    Be careful not to call this method while iterating over the collection.

    -
    -

    Parameters

    -
      -
    • -
      key: K
      -
      -

      The key or index for storing the value in the Map.

      -
      -
    • -
    • -
      val: V
      -
      -

      The value to add to the Map, associated with the key.

      -
      -
    • -
    -

    Returns Map<K, V>

    -

    This modified Map.

    -
  • -
-
-
- -

- toArray -

-
    -
  • toArray(): KeyValuePair<K, V>[]
  • -
-
    -
  • -
    -

    Produces a JavaScript Array of key/value pair objects from the contents of this Map.

    -
    -

    Returns KeyValuePair<K, V>[]

    -

    A copy of the Map in Array form, - each element being an Object with 'key' and 'value' properties.

    -
  • -
-
-
- -

- toKeySet -

-
    -
  • toKeySet(): Set<K>
  • -
-
    -
  • -
    -

    Produces a Set that provides a read-only view onto the keys of this Map. - The collection of keys is not copied.

    -
    -

    Returns Set<K>

    -
  • -
-
-
-
- -
-
-
- -
-
- - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Margin.html b/api/symbols/Margin.html index 4d0fcef53..96e5f055e 100644 --- a/api/symbols/Margin.html +++ b/api/symbols/Margin.html @@ -1,609 +1,122 @@ - - - - - - Margin | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class Margin

-
-
-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - Margin -
  • -
-
-
-
-

A Margin represents a band of space outside or inside a rectangular area, - with possibly different values on each of the four sides.

-

Example uses include GraphObject.margin, Panel.padding, and Diagram.padding.

-

Use the static functions Margin.parse and Margin.stringify to convert to and from - a standard string representation that is independent of the current locale.

-

When an instance of this class is the value of a property of a GraphObject class or Diagram - or CommandHandler or a Tool class, you should treat the object - as if it were frozen or read-only -- you cannot modify its properties. - This allows the property to return a value without allocating a new instance. - If you need to do your own calculations with the value, call copy to make - a new instance with the same values that you can modify.

-

Many methods modify the object's properties and then return a reference to "this" object. - The only instance method to allocate a new object is the copy method. - The static Margin.parse method also allocates a new object.

-

The "Debug" implementation of this class is significantly slower than the "Release" implementation, - mostly due to additional error checking.

-

You cannot inherit from this class.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

-
    -
  • new Margin(t?: number, r?: number, b?: number, l?: number): Margin
  • -
-
    -
  • -
    -

    If zero arguments are supplied, zero is used for all four sides. - If one argument is supplied, that number is used for all four sides. - If two arguments are supplied, the top and bottom sides get the first value, - and the left and right sides get the second value. - Otherwise there must be four arguments, in the order: top, right, bottom, left.

    -
    -

    Parameters

    -
      -
    • -
      Optional t: number
      -
      -

      the margin for the top side; - if not supplied, all sides are zero.

      -
      -
    • -
    • -
      Optional r: number
      -
      -

      the margin for the right side; - if not supplied, all sides have the value of the first argument.

      -
      -
    • -
    • -
      Optional b: number
      -
      -

      the margin for all bottom side; - if not supplied, the top and bottom get the value of the first argument, - and the right and left sides get the value of the second argument.

      -
      -
    • -
    • -
      Optional l: number
      -
      -

      the margin for the left side; - must be supplied if the third argument was supplied.

      -
      -
    • -
    -

    Returns Margin

    -
  • -
-
-
-
-

Properties

-
- -

- bottom - : number

-
    -
  • -
    -

    Gets or sets the bottom value of this margin. Default is 0.

    -
    -
  • -
-
-
- -

- left - : number

-
    -
  • -
    -

    Gets or sets the left value of this margin. Default is 0.

    -
    -
  • -
-
-
- -

- right - : number

-
    -
  • -
    -

    Gets or sets the right value of this margin. Default is 0.

    -
    -
  • -
-
-
- -

- top - : number

-
    -
  • -
    -

    Gets or sets the top value of this margin. Default is 0.

    -
    -
  • -
-
-
-
-

Methods

-
- -

- Virtual - copy -

- -
    -
  • -
    -

    Create a copy of this Margin, with the same values.

    -
    -

    Returns Margin

    -
  • -
-
-
- -

- equalTo -

-
    -
  • equalTo(t: number, r: number, b: number, l: number): boolean
  • -
-
    -
  • -
    -

    Indicates whether the given margin is equal to this Margin.

    -
    -
    see
    -

    equals

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      t: number
      -
      -

      top.

      -
      -
    • -
    • -
      r: number
      -
      -

      right.

      -
      -
    • -
    • -
      b: number
      -
      -

      bottom.

      -
      -
    • -
    • -
      l: number
      -
      -

      left.

      -
      -
    • -
    -

    Returns boolean

    -

    True if the two Margins have identical Top and Right and Bottom and Left values, - false otherwise.

    -
  • -
-
-
- -

- equals -

-
    -
  • equals(m: Margin): boolean
  • -
-
    -
  • -
    -

    Indicates whether the given Margin is equal to this Margin.

    -
    -
    see
    -

    equalTo

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      m: Margin
      -
      -

      The Margin to compare to this Margin.

      -
      -
    • -
    -

    Returns boolean

    -

    True if the two Margins have identical Top and Right and Bottom and Left values, - false otherwise.

    -
  • -
-
-
- -

- isReal -

-
    -
  • isReal(): boolean
  • -
-
    -
  • -
    -

    True if this Margin has values that are real numbers and not infinity.

    -
    -

    Returns boolean

    -
  • -
-
-
- -

- Static - parse -

-
    -
  • parse(str: string): Margin
  • -
-
    -
  • -
    -

    This static function can be used to read in a Margin from a string that was produced by Margin.stringify.

    -

    go.Margin.parse("1 2 3 4") produces the Margin new go.Margin(1, 2, 3, 4).

    -
    -

    Parameters

    -
      -
    • -
      str: string
      -
    • -
    -

    Returns Margin

    -
  • -
-
-
- -

- set -

- -
    -
  • -
    -

    Modify this Margin so that its Top, Right, Bottom, and Left values - are the same as the given Margin.

    -
    -

    Parameters

    -
      -
    • -
      m: Margin
      -
      -

      the given Margin.

      -
      -
    • -
    -

    Returns Margin

    -

    this.

    -
  • -
-
-
- -

- setTo -

-
    -
  • setTo(t: number, r: number, b: number, l: number): Margin
  • -
-
    -
  • -
    -

    Modify this Margin with new Top, Right, Bottom, and Left values.

    -
    -

    Parameters

    -
      -
    • -
      t: number
      -
      -

      top.

      -
      -
    • -
    • -
      r: number
      -
      -

      right.

      -
      -
    • -
    • -
      b: number
      -
      -

      bottom.

      -
      -
    • -
    • -
      l: number
      -
      -

      left.

      -
      -
    • -
    -

    Returns Margin

    -

    this.

    -
  • -
-
-
- -

- Static - stringify -

-
    -
  • stringify(val: Margin): string
  • -
-
    -
  • -
    -

    This static function can be used to write out a Margin as a string that can be read by Margin.parse.

    -

    go.Margin.stringify(new go.Margin(1, 2, 3, 4)) produces the string "1 2 3 4".

    -
    -

    Parameters

    - -

    Returns string

    -
  • -
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class Margin

Hierarchy

  • Margin
+

A Margin represents a band of space outside or inside a rectangular area, +with possibly different values on each of the four sides.

+

Example uses include GraphObject.margin, Panel.padding, and Diagram.padding.

+

Use the static functions Margin.parse and Margin.stringify to convert to and from +a standard string representation that is independent of the current locale.

+

When an instance of this class is the value of a property of a GraphObject class or Diagram +or CommandHandler or a Tool class, you should treat the object +as if it were frozen or read-only -- you cannot modify its properties. +This allows the property to return a value without allocating a new instance. +If you need to do your own calculations with the value, call copy to make +a new instance with the same values that you can modify.

+

Many methods modify the object's properties and then return a reference to "this" object. +The only instance method to allocate a new object is the copy method. +The static Margin.parse method also allocates a new object.

+

The "Debug" implementation of this class is significantly slower than the "Release" implementation, +mostly due to additional error checking.

+

You cannot inherit from this class.

+

Index

Constructors

  • new Margin(t?: number, r?: number, b?: number, l?: number): Margin
  • +

    If zero arguments are supplied, zero is used for all four sides. +If one argument is supplied, that number is used for all four sides. +If two arguments are supplied, the top and bottom sides get the first value, +and the left and right sides get the second value. +Otherwise there must be four arguments, in the order: top, right, bottom, left.

    +

    Parameters

    • Optional t: number
      +

      the margin for the top side; + if not supplied, all sides are zero.

      +
    • Optional r: number
      +

      the margin for the right side; + if not supplied, all sides have the value of the first argument.

      +
    • Optional b: number
      +

      the margin for all bottom side; + if not supplied, the top and bottom get the value of the first argument, + and the right and left sides get the value of the second argument.

      +
    • Optional l: number
      +

      the margin for the left side; + must be supplied if the third argument was supplied.

      +

    Returns Margin

Properties

  • +

    Gets or sets the bottom value of this margin. Default is 0.

    +
  • +

    Gets or sets the left value of this margin. Default is 0.

    +
  • +

    Gets or sets the right value of this margin. Default is 0.

    +
  • +

    Gets or sets the top value of this margin. Default is 0.

    +

Methods

  • +

    Create a copy of this Margin, with the same values.

    +

    Returns Margin

  • equalTo(t: number, r: number, b: number, l: number): boolean
  • +

    Indicates whether the given margin is equal to this Margin.

    +
    see

    equals

    +

    Parameters

    • t: number
      +

      top.

      +
    • r: number
      +

      right.

      +
    • b: number
      +

      bottom.

      +
    • l: number
      +

      left.

      +

    Returns boolean

    True if the two Margins have identical Top and Right and Bottom and Left values, +false otherwise.

    +
  • +

    Indicates whether the given Margin is equal to this Margin.

    +
    see

    equalTo

    +

    Parameters

    • m: Margin
      +

      The Margin to compare to this Margin.

      +

    Returns boolean

    True if the two Margins have identical Top and Right and Bottom and Left values, +false otherwise.

    +
  • isReal(): boolean
  • +

    True if this Margin has values that are real numbers and not infinity.

    +

    Returns boolean

  • +

    Modify this Margin so that its Top, Right, Bottom, and Left values +are the same as the given Margin.

    +

    Parameters

    • m: Margin
      +

      the given Margin.

      +

    Returns Margin

    this.

    +
  • setTo(t: number, r: number, b: number, l: number): Margin
  • +

    Modify this Margin with new Top, Right, Bottom, and Left values.

    +

    Parameters

    • t: number
      +

      top.

      +
    • r: number
      +

      right.

      +
    • b: number
      +

      bottom.

      +
    • l: number
      +

      left.

      +

    Returns Margin

    this.

    +
  • +

    This static function can be used to read in a Margin from a string that was produced by Margin.stringify.

    +

    go.Margin.parse("1 2 3 4") produces the Margin new go.Margin(1, 2, 3, 4).

    +

    Parameters

    • str: string

    Returns Margin

  • stringify(val: Margin): string
  • +

    This static function can be used to write out a Margin as a string that can be read by Margin.parse.

    +

    go.Margin.stringify(new go.Margin(1, 2, 3, 4)) produces the string "1 2 3 4".

    +

    Parameters

    Returns string

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Model.html b/api/symbols/Model.html index 1a8af0d9d..51f8e3587 100644 --- a/api/symbols/Model.html +++ b/api/symbols/Model.html @@ -1,2411 +1,778 @@ - - - - - - Model | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class Model

-
-
-
-
-
-
-
-
-
-

Hierarchy

- -
-
-
-

Models hold the essential data of a diagram, describing the basic entities and their properties and relationships - without specifying the appearance and behavior of the Nodes and Links and Groups that represent them visually. - Models tend to hold only relatively simple data, making them easy to persist by serialization as JSON or XML formatted text.

-

Models hold simple data objects, not Parts such as Nodes or Links. - Node data is normally represented in a Diagram by instances of Node, - but they could be represented by simple Parts or by Groups. - A Diagram constructs Parts for its Diagram.model's data by copying templates. - Templates are Panels of GraphObjects that get some property values from the model data, - accessible via the Panel.data property, using data Binding. - See Using Models and Data Binding for an introduction.

-

This Model class only supports holding an array of node data - and interpreting properties on that data to be able to refer to them - using unique key values. - To support simple tree-structured graphs, use a TreeModel, which inherits from this class. - To support links and grouping, use a GraphLinksModel.

-

Each node data object is assumed to have a unique key value. - The nodeKeyProperty property names the property on the node data whose value - is the unique key for that node data object. - The default value for this property is "key". - You should not have a TwoWay data binding on the node key property, - because that might cause the property value to be set to a duplicate key value.

-

The key values must be either strings or numbers or undefined. - If the key is undefined, or if there are duplicate key values, - the model will automatically try to assign a new unique key value. - Caution: if your keys are numbers, do not try to use string representations of those numbers as keys. - Conversely, if your keys are strings that happen to have number syntax, do not try to use those number values. - Sometimes JavaScript will automatically convert from string to number or vice-versa, but sometimes it won't.

-

For example, one can define a graph consisting of just two nodes:

-
 model.nodeDataArray = [
-   { key: "Alpha" },
-   { key: "Beta" }
- ];
+Model | GoJS API
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class Model

Hierarchy

+

Models hold the essential data of a diagram, describing the basic entities and their properties and relationships +without specifying the appearance and behavior of the Nodes and Links and Groups that represent them visually. +Models tend to hold only relatively simple data, making them easy to persist by serialization as JSON or XML formatted text.

+

Models hold simple data objects, not Parts such as Nodes or Links. +Node data is normally represented in a Diagram by instances of Node, +but they could be represented by simple Parts or by Groups. +A Diagram constructs Parts for its Diagram.model's data by copying templates. +Templates are Panels of GraphObjects that get some property values from the model data, +accessible via the Panel.data property, using data Binding. +See Using Models and Data Binding for an introduction.

+

This Model class only supports holding an array of node data +and interpreting properties on that data to be able to refer to them +using unique key values. +To support simple tree-structured graphs, use a TreeModel, which inherits from this class. +To support links and grouping, use a GraphLinksModel.

+

Each node data object is assumed to have a unique key value. +The nodeKeyProperty property names the property on the node data whose value +is the unique key for that node data object. +The default value for this property is "key". +You should not have a TwoWay data binding on the node key property, +because that might cause the property value to be set to a duplicate key value.

+

The key values must be either strings or numbers or undefined. +If the key is undefined, or if there are duplicate key values, +the model will automatically try to assign a new unique key value. +Caution: if your keys are numbers, do not try to use string representations of those numbers as keys. +Conversely, if your keys are strings that happen to have number syntax, do not try to use those number values. +Sometimes JavaScript will automatically convert from string to number or vice-versa, but sometimes it won't.

+

For example, one can define a graph consisting of just two nodes:

+
 model.nodeDataArray = [
{ key: "Alpha" },
{ key: "Beta" }
];
-

This model cannot detect the modification of the nodeDataArray array - or the modification of any node data object. - If you want to add or remove node data from the nodeDataArray, - call the addNodeData or removeNodeData methods.

-

If you want to modify a node data object, it depends on whether the property you want to change - is a structural property that the model needs to know about, or whether it is a property - that is only used for data binding or other application-specific purposes.

-

For the former case, call the appropriate method, such as - setKeyForNodeData, setCategoryForNodeData, - GraphLinksModel.setToKeyForLinkData, or GraphLinksModel.setGroupKeyForNodeData. - These methods have names that start with "set", "add", "insert", or "remove".

-

For the latter case, when setting an application-specific property, typically for data binding, - and to support undo/redo, call setDataProperty.

-

The copyNodeData method can be called to make a shallow copy of a node data object. - However, if some of those property values are Arrays that want not to be shared but to be copied, - you can set copiesArrays to true. This is typically very useful when dealing - with data bound item arrays. - Furthermore if the items in those copied Arrays are in fact Objects that need to be copied, - you can also set copiesArrayObjects to true, causing a copied Array to refer to - newly shallow-copied objects of the original array.

-

Each model raises ChangedEvents that you can follow by registering a listener via addChangedListener. - Read more at the Introduction page: Changed Events.

-

Each model comes with its own UndoManager that is initially not enabled. - You will need to set UndoManager.isEnabled to true in order for the - UndoManager to record model changes and for your users to perform undo and redo.

-

You can temporarily turn off the recording of changes by setting skipsUndoManager to true. - A number of places within the system do that routinely in order to avoid recording temporary changes, - so be sure to remember the original value beforehand and restore it afterwards. - Note that in a ChangedEvent listener you may want to ignore events that happen when skipsUndoManager is true.

-

One normally saves a diagram by just saving its model. - If you can use JSON-formatted text, this is easy to do -- just call toJson - to get the string representation of the model, and save that string. - Load the diagram by replacing the Diagram.model with one created by calling - the static function Model.fromJson:

-
  myDiagram.model = go.Model.fromJson(loadedString);
+

This model cannot detect the modification of the nodeDataArray array +or the modification of any node data object. +If you want to add or remove node data from the nodeDataArray, +call the addNodeData or removeNodeData methods.

+

If you want to modify a node data object, it depends on whether the property you want to change +is a structural property that the model needs to know about, or whether it is a property +that is only used for data binding or other application-specific purposes.

+

For the former case, call the appropriate method, such as +setKeyForNodeData, setCategoryForNodeData, +GraphLinksModel.setToKeyForLinkData, or GraphLinksModel.setGroupKeyForNodeData. +These methods have names that start with "set", "add", "insert", or "remove".

+

For the latter case, when setting an application-specific property, typically for data binding, +and to support undo/redo, call setDataProperty.

+

The copyNodeData method can be called to make a shallow copy of a node data object. +However, if some of those property values are Arrays that want not to be shared but to be copied, +you can set copiesArrays to true. This is typically very useful when dealing +with data bound item arrays. +Furthermore if the items in those copied Arrays are in fact Objects that need to be copied, +you can also set copiesArrayObjects to true, causing a copied Array to refer to +newly shallow-copied objects of the original array.

+

Each model raises ChangedEvents that you can follow by registering a listener via addChangedListener. +Read more at the Introduction page: Changed Events.

+

Each model comes with its own UndoManager that is initially not enabled. +You will need to set UndoManager.isEnabled to true in order for the +UndoManager to record model changes and for your users to perform undo and redo.

+

You can temporarily turn off the recording of changes by setting skipsUndoManager to true. +A number of places within the system do that routinely in order to avoid recording temporary changes, +so be sure to remember the original value beforehand and restore it afterwards. +Note that in a ChangedEvent listener you may want to ignore events that happen when skipsUndoManager is true.

+

One normally saves a diagram by just saving its model. +If you can use JSON-formatted text, this is easy to do -- just call toJson +to get the string representation of the model, and save that string. +Load the diagram by replacing the Diagram.model with one created by calling +the static function Model.fromJson:

+
  myDiagram.model = go.Model.fromJson(loadedString);
 
-

Note that JSON and other textual data formats cannot faithfully store all JavaScript functions. - toJson and Model.fromJson do not try to save and load functional property values. - You should arrange that all such functions, including event handlers, are established by your app. - toJson and Model.fromJson also cannot handle circular references; any sharing of - references will be lost too. - They also skip properties that are not enumerable, those whose names start with an underscore, and those whose values are undefined.

-

Note that models also do not store the templates used by diagrams, - nor any transient or temporary parts such as Adornments, nor any tools, - nor any UndoManager state, nor any event listeners. - These objects and all other properties of diagrams must be established by your app.

-

You can add any number of properties to the modelData object, which is serialized and deserialized - into JSON just like any other model data for nodes or links. - However modelData is associated with the model as a whole and does not depend on the existence - of any node data or link data.

-

It is also easy to save the changes that were recorded in the most recent transaction. - Call toIncrementalJson to generate a JSON-format string that holds the current state of modified data - plus the keys of inserted or removed data. - That method requires as an argument a ChangedEvent that represents a transaction that completed or - an undo or a redo that just finished.

-

It is also possible to use such "incremental" JSON to modify an existing model. - Call applyIncrementalJson, giving it a string generated by toIncrementalJson, - to modify this model by making all of the changes recorded in the JSON text. - Note how this method is a regular instance method, whereas Model.fromJson is a static function.

-
-
-
-

Index

-
- -
-
-
-

Constructors

-
- -

- constructor -

- -
    -
  • -
    -

    You probably don't want to call this constructor, because this class - does not support links (relationships between nodes) or groups (nodes and links and subgraphs as nodes): - instead, create instances of a subclass such as GraphLinksModel or TreeModel.

    -
    -

    Parameters

    -
      -
    • -
      Optional nodedataarray: ObjectData[]
      -
      -

      an optional Array containing JavaScript objects to be represented by Parts.

      -
      -
    • -
    • -
      Optional init: Partial<Model>
      -
      -

      Optional initialization properties.

      -
      -
    • -
    -

    Returns Model

    -
  • -
  • -
    -

    You probably don't want to call this constructor, because this class - does not support links (relationships between nodes) or groups (nodes and links and subgraphs as nodes): - instead, create instances of a subclass such as GraphLinksModel or TreeModel.

    -
    -

    Parameters

    -
      -
    • -
      Optional init: Partial<Model>
      -
      -

      Optional initialization properties.

      -
      -
    • -
    -

    Returns Model

    -
  • -
-
-
-
-

Properties

-
- -

- copiesArrayObjects - : boolean

-
    -
  • -
    -

    Gets or sets whether the default behavior for copyNodeData or GraphLinksModel.copyLinkData - when copying Arrays also copies array items that are Objects. - This only covers copying Objects that are items in Arrays that are copied when copiesArrays is true. - Copying an Object when this property is true also recursively copies any Arrays that are property values. - It also assumes that the object's constructor can be called with no arguments.

    -

    The default value is false. - This property does not affect any behavior when the value of copyNodeDataFunction - or GraphLinksModel.copyLinkDataFunction has been set to a function. - This property has no effect unless copiesArrays is true.

    -

    Caution: if you want a copied data object to share some references but not others, - you will need to provide your own copying function as copyNodeDataFunction rather than setting - this property and copiesArrays to true.

    -

    Warning: there should not be any cyclical references within the model data.

    -
    -
    see
    -

    copiesArrays, copyNodeDataFunction

    -
    -
    since
    -

    1.5

    -
    -
    -
    -
  • -
-
-
- -

- copiesArrays - : boolean

-
    -
  • -
    -

    Gets or sets whether the default behavior for copyNodeData or GraphLinksModel.copyLinkData - makes copies of property values that are Arrays. - This only copies Arrays that are top-level property values in data objects, not for Arrays that are in nested objects. - Copying Arrays will also copy any array items that are Objects when copiesArrayObjects is true.

    -

    The default value is false. - It is commonplace to set copiesArrayObjects to true when setting this property to true. - This property does not affect any behavior when the value of copyNodeDataFunction - or GraphLinksModel.copyLinkDataFunction has been set to a function.

    -

    Caution: if you want a copied data object to share some Arrays but not others, - you will need to provide your own copying function as copyNodeDataFunction rather than setting - this property to true.

    -

    Warning: there should not be any cyclical references within the model data.

    -
    -
    see
    -

    copiesArrayObjects, copyNodeDataFunction

    -
    -
    since
    -

    1.5

    -
    -
    -
    -
  • -
-
-
- -

- copiesKey - : boolean

-
    -
  • -
    -

    Gets or sets whether the default behavior for copyNodeData or GraphLinksModel.copyLinkData - when copying properties of a data object also copies the key property value. - Set this to false in order to force a unique key generation for data copied from another Diagram, such as a Palette.

    -

    The default value is true. - This property does not affect any behavior when the value of copyNodeDataFunction has been set to a function.

    -
    -
    see
    -

    copiesArrays, copyNodeDataFunction

    -
    -
    since
    -

    2.0

    -
    -
    -
    -
  • -
-
-
- -

- copyNodeDataFunction - : (data: ObjectData, model: Model) => ObjectData

-
    -
  • -
    -

    Gets or sets a function that makes a copy of a node data object.

    -

    You may need to set this property in order to ensure that a copied Node is bound - to data that does not share certain data structures between the original node data and the copied node data. - This property value may be null in order to cause copyNodeData to make a shallow copy of a JavaScript Object. - The default value is null.

    -

    The first argument to the function will be a node data object (potentially a Part's Panel.data). - The second argument to the function will be this Model itself.

    -

    It is common to implement a copying function when the node data has an Array of data - and that Array needs to be copied rather than shared. - Often the objects that are in the Array also need to be copied.

    -
    -
  • -
-
-
- -

- dataFormat - : string

-
    -
  • -
    -

    Gets or sets the name of the format of the diagram data. - The default value is the empty string. - The value must not be null. - Use different values to prevent parts from one model to be copy/pasted or drag-and-dropped into another diagram/model.

    -
    -
  • -
-
-
- -

- isReadOnly - : boolean

-
    -
  • -
    -

    Gets or sets whether this model may be modified, such as adding nodes. - By default this value is false. - Setting the nodeDataArray to something that is not a true Array of Objects - will cause this to be set to true.

    -

    Model methods and property setters do not heed this property. - It is up to code that uses a model to check this property when it might want to - prevent changes to the model.

    -
    -
  • -
-
-
- -

- makeUniqueKeyFunction - : (model: Model, data: ObjectData) => Key

-
    -
  • -
    -

    Gets or sets a function that returns a unique id number or string for a node data object. - This function is called by makeNodeDataKeyUnique - when a node data object is added to the model, either as part of a new - nodeDataArray or by a call to addNodeData, to make sure the value of - getKeyForNodeData is unique within the model.

    -

    The value may be null in order to cause makeNodeDataKeyUnique behave in the standard manner. - (The default value is null.) - You may want to supply a function here in order to make sure all of the automatically generated keys - are in a particular format. - Setting this property after setting nodeDataArray has no real effect until there is a call - to addNodeData.

    -

    If you want to ensure that this function is called when copying data that already has a key, - set copiesKey to false. - This is typically useful when copying a node from a Palette, where the key it has in the Palette's Model - happens to be unique within the target Diagram's Model. - Unless you set copiesKey to false, the original key value will be copied and retained - if it is already unique within the target model.

    -

    If a node data object is already in the model and you want to change its key value, - call setKeyForNodeData with a new and unique key.

    -
    -
  • -
-
-
- -

- modelData - : ObjectData

-
    -
  • -
    -

    Gets a JavaScript Object that can hold programmer-defined property values for the model as a whole, - rather than just for one node or one link.

    -

    By default this an object with no properties. - Any properties that you add to this object will be written out by toJson - and will be restored by Model.fromJson, if the following conditions are true:

    -
      -
    • the property is enumerable and its name does not start with an underscore ('_')
    • -
    • the property value is not undefined and is not a function
    • -
    • the model knows how to convert the property value to JSON format
    • -
    • property values that are Objects or Arrays form a tree structure -- no shared or cyclical references
    • -
    -

    Most object classes cannot be serialized into JSON without special knowledge and processing at both ends. - The toJson and Model.fromJson methods automatically do such processing for numbers that are NaN - and for objects that are of class Point, Size, Rect, Margin, Spot, - Brush (but not for brush patterns), and for Geometry.

    -

    At the current time one cannot have a Diagram as a binding target. - Calling setDataProperty will work to change a property value, but there are no target bindings in any Diagrams to be updated. - Because the binding mechanism is unavailable for this object, we recommend that when you want to save a model - that you explicitly set properties on this object just before calling toJson. - When loading a model, call Model.fromJson and explicitly get the properties that you want to set on a Diagram.

    -
    -
  • -
-
-
- -

- name - : string

-
    -
  • -
    -

    Gets or sets the name of this model. - The initial name is an empty string. - The value must not be null.

    -
    -
  • -
-
-
- -

- nodeCategoryProperty - : string | ((a: ObjectData, b?: string) => string)

-
    -
  • -
    -

    Gets or sets the name of the node data property that returns a string naming that data's category. - The value may also be a function taking two arguments, where the first argument will be a node data object. - If the second argument is not supplied, the function should return the category name; - if the second argument is supplied, the function should modify the node data object so that it has that new category name. - The default value is the string 'category', meaning that it expects the data to have a property named 'category' if it cares to name a category. - This is used by the diagram to distinguish between different kinds of nodes. - The name must not be null. - If the value is an empty string, - getCategoryForNodeData will return an empty string for all node data objects.

    -

    If you want to set this property you must do so before using the model, and especially before you assign Diagram.model. - Note that functions cannot be serialized into JSON-formatted text, so if you are using toJson and Model.fromJson, - and if you want this property to be a function, you will need to assign this property to your desired function - immediately after creating the model, including when it is created by Model.fromJson.

    -
    -
    see
    -

    getCategoryForNodeData, setCategoryForNodeData

    -
    -
    -
    -
  • -
-
-
- -

- nodeDataArray - : ObjectData[]

-
    -
  • -
    -

    Gets or sets the array of node data objects that correspond to Nodes, - Groups, or non-Link Parts in the Diagram. - The initial value is an empty Array.

    -

    For each Object in the Array, getKeyForNodeData should return a number or string - uniquely identifying the node data within the model. - If it returns undefined, this calls makeNodeDataKeyUnique, - to make sure the node data has a unique key. - These key values may be used by other objects to refer to that particular node data object. - If more than one node data object has the same key, - there may be some confusion about which object to reference.

    -

    If you want to use a custom data property for holding the unique key value on a node data object, - you should set nodeKeyProperty before you set this nodeDataArray property.

    -

    Adding or removing data from this Array will not notify this model or the diagram - that there are any new nodes or that any nodes have been deleted. - Instead you should call addNodeData or removeNodeData.

    -
    -
  • -
-
-
- -

- nodeKeyProperty - : string | ((a: ObjectData, b?: Key) => Key)

-
    -
  • -
    -

    Gets or sets the name of the data property that returns a unique id number or string for each node data object. - The value may also be a function taking two arguments, where the first argument will be a node data object. - If the second argument is not supplied, the function should return the unique key value; - if the second argument is supplied, the function should modify the node data object so that it has that new value as its unique key value. - The default value is the name 'key', meaning that it expects the data to have a property named 'key' if it has a key value. - The name must not be null or the empty string. - You must set this property before assigning the nodeDataArray.

    -

    If you want to set this property you must do so before using the model, and especially before you assign Diagram.model. - Note that functions cannot be serialized into JSON-formatted text, so if you are using toJson and Model.fromJson, - and if you want this property to be a function, you will need to assign this property to your desired function - immediately after creating the model, including when it is created by Model.fromJson.

    -
    -
    see
    -

    getKeyForNodeData

    -
    -
    -
    -
  • -
-
-
- -

- skipsUndoManager - : boolean

-
    -
  • -
    -

    Gets or sets whether ChangedEvents are not recorded by the UndoManager. - The initial and normal value is false. - WARNING: while this property is true do not perform any changes that cause any previous transactions - to become impossible to undo.

    -

    When this property is true, changing the Model or any data object does not call UndoManager.handleChanged. - Even when this property is true, - transactions (such as calls to startTransaction) and undo/redo (such as calls to CommandHandler.undo) - are still delegated to the undoManager.

    -

    You should set this to true only temporarily, and you should remember its previous value before setting this to true. - When finishing the period for which you want the UndoManager to be disabled, - do not blindly set this property to false. - You should set this back to the value it had before you set it to true. - For more permanent disabling of the UndoManager, set UndoManager.isEnabled to false.

    -

    This property is also set when setting Diagram.skipsUndoManager. - Setting this property does not raise a ChangedEvent.

    -
    -
  • -
-
-
- -

- undoManager - : UndoManager

-
    -
  • -
    -

    Gets or sets the UndoManager for this Model.

    -

    The default UndoManager has its UndoManager.isEnabled property set to false. - If you want users to undo and redo, you should set that property to true once you have initialized the Diagram or its Model.

    -

    This property setter does not raise a ChangedEvent.

    -
    -
  • -
-
-
-
-

Methods

-
- -

- addArrayItem -

-
    -
  • addArrayItem(arr: any[], val: any): void
  • -
-
    -
  • -
    -

    Add an item at the end of a data array that may be data bound by a Panel as its Panel.itemArray, - in a manner that can be undone/redone and that automatically updates any bindings.

    -

    This also calls raiseChangedEvent to notify all listeners about the ChangedEvent.Insert.

    -

    If you want to add a new node or part to the diagram, call addNodeData.

    -
    -
    see
    -

    insertArrayItem

    -
    -
    since
    -

    1.1

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      arr: any[]
      -
      -

      an Array that is the value of some Panel's Panel.itemArray.

      -
      -
    • -
    • -
      val: any
      -
      -

      the new value to be pushed onto the array.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- addChangedListener -

- - -
-
- -

- addNodeData -

- -
    -
  • -
    -

    When you want to add a node or group to the diagram, - call this method with a new data object. - This will add that data to the nodeDataArray and - notify all listeners that a new node data object has been inserted into the collection.

    -

    To remove a node from the diagram, you can remove its data object by calling removeNodeData.

    -

    To add or remove an object or value from an item array, call insertArrayItem or removeArrayItem.

    -
    -

    Parameters

    -
      -
    • -
      nodedata: ObjectData
      -
      -

      a JavaScript object represented by a node, group, or non-link.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- addNodeDataCollection -

- -
    -
  • -
    -

    Add to this model all of the node data held in an Array or in an Iterable of node data objects.

    -
    -
    since
    -

    1.3

    -
    -
    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- applyIncrementalJson -

-
    -
  • applyIncrementalJson(s: string | ObjectData): void
  • -
-
    -
  • -
    -

    Modify this model by applying the changes given in an "incremental" model change in JSON format - generated by toIncrementalJson. - The expected properties of the argument are described at toIncrementalJson. - Incremental changes must be applied in the same order that the changes occurred in the original model.

    -

    This requires the "incremental" property to be present and to be a number, as specified by toIncrementalJson. - All of the top-level properties in the JSON, such as nodeKeyProperty, must be the same as for this model. - Note that if the model is a GraphLinksModel, you will have to have set GraphLinksModel.linkKeyProperty - to the name of a property, the same both in the Diagram.model as well as in the data that you pass to this method.

    -

    This conducts a transaction.

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      s: string | ObjectData
      -
      -

      a String in JSON format containing modifications to be performed to the model, - or a JavaScript Object parsed from such a string

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- assignAllDataProperties -

- -
    -
  • -
    -

    This is similar to Object.assign, - but safely calls setDataProperty for each property other than a key property. - This does not delete any properties on the DATA object, - although properties may be set to undefined if they are set that way on the PROPS object.

    -
    -

    Parameters

    -
      -
    • -
      data: ObjectData
      -
      -

      a data object

      -
      -
    • -
    • -
      props: ObjectData
      -
      -

      an Object holding various properties whose values are to be assigned to the DATA object

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- clear -

-
    -
  • clear(): void
  • -
-
    -
  • -
    -

    Clear out all references to any model data. - This also clears out the UndoManager, so this operation is not undoable. - This method is called by Diagram.clear; it does not notify any Diagrams or other listeners. - This method does not unregister any Changed event listeners.

    -

    Instead of calling this method, you may prefer to set nodeDataArray to an empty JavaScript Array. - If this model is a GraphLinksModel, you would also want to set GraphLinksModel.linkDataArray to a separate empty JavaScript Array.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Virtual - cloneDeep -

-
    -
  • cloneDeep<T>(obj: T): T
  • -
-
    -
  • -
    -

    Deeply copy an object or array and return the new object. - This is typically called on a nodeDataArray or GraphLinksModel.linkDataArray or data objects within them.

    -

    By default, this method will make deep clones of arrays and JavaScript objects and maintain any shared or cyclic references. - It will properly copy any Date or RegExp object, and will call a copy function on any object where one exists. - It also handles certain GoJS classes: Point, Size, Rect, Margin, Spot, List, Set, and Map. - It will not handle instances of Diagram, Layer, GraphObject, Tool, CommandHandler, AnimationManager or subclasses or related classes.

    -

    This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method. - Only override this method when the default behavior doesn't suit the data. - When cloning objects, we recommend skipping the __gohashid property, which is used internally.

    -
    -
    since
    -

    2.1

    -
    -
    -
    -

    Type parameters

    -
      -
    • -

      T

      -
    • -
    -

    Parameters

    -
      -
    • -
      obj: T
      -
    • -
    -

    Returns T

    -
  • -
-
-
- -

- Protected Virtual - cloneProtected -

-
    -
  • cloneProtected(copy: Model): void
  • -
-
    -
  • -
    -

    Copies properties from this model to the given model, which must be of the same class. - This is called by copy. - This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- commit -

-
    -
  • commit(func: (m: Model) => void, tname?: string): void
  • -
-
    -
  • -
    -

    Starts a new transaction, calls the provided function, and commits the transaction. - Code is called within a try-finally loop. - If the function does not return normally, this rolls back the transaction rather than committing it. - Example usage:

    -
    model.commit(m => m.addNodeData({ counter: myCounter++ }), "Added Node");
    +

    Note that JSON and other textual data formats cannot faithfully store all JavaScript functions. +toJson and Model.fromJson do not try to save and load functional property values. +You should arrange that all such functions, including event handlers, are established by your app. +toJson and Model.fromJson also cannot handle circular references; any sharing of +references will be lost too. +They also skip properties that are not enumerable, those whose names start with an underscore, and those whose values are undefined.

    +

    Note that models also do not store the templates used by diagrams, +nor any transient or temporary parts such as Adornments, nor any tools, +nor any UndoManager state, nor any event listeners. +These objects and all other properties of diagrams must be established by your app.

    +

    You can add any number of properties to the modelData object, which is serialized and deserialized +into JSON just like any other model data for nodes or links. +However modelData is associated with the model as a whole and does not depend on the existence +of any node data or link data.

    +

    It is also easy to save the changes that were recorded in the most recent transaction. +Call toIncrementalJson to generate a JSON-format string that holds the current state of modified data +plus the keys of inserted or removed data. +That method requires as an argument a ChangedEvent that represents a transaction that completed or +an undo or a redo that just finished.

    +

    It is also possible to use such "incremental" JSON to modify an existing model. +Call applyIncrementalJson, giving it a string generated by toIncrementalJson, +to modify this model by making all of the changes recorded in the JSON text. +Note how this method is a regular instance method, whereas Model.fromJson is a static function.

    +

Index

Constructors

  • +

    You probably don't want to call this constructor, because this class +does not support links (relationships between nodes) or groups (nodes and links and subgraphs as nodes): +instead, create instances of a subclass such as GraphLinksModel or TreeModel.

    +

    Parameters

    • Optional nodedataarray: ObjectData[]
      +

      an optional Array containing JavaScript objects to be represented by Parts.

      +
    • Optional init: Partial<Model>
      +

      Optional initialization properties.

      +

    Returns Model

  • +

    You probably don't want to call this constructor, because this class +does not support links (relationships between nodes) or groups (nodes and links and subgraphs as nodes): +instead, create instances of a subclass such as GraphLinksModel or TreeModel.

    +

    Parameters

    • Optional init: Partial<Model>
      +

      Optional initialization properties.

      +

    Returns Model

Properties

  • +

    Gets or sets whether the default behavior for copyNodeData or GraphLinksModel.copyLinkData +when copying Arrays also copies array items that are Objects. +This only covers copying Objects that are items in Arrays that are copied when copiesArrays is true. +Copying an Object when this property is true also recursively copies any Arrays that are property values. +It also assumes that the object's constructor can be called with no arguments.

    +

    The default value is false. +This property does not affect any behavior when the value of copyNodeDataFunction +or GraphLinksModel.copyLinkDataFunction has been set to a function. +This property has no effect unless copiesArrays is true.

    +

    Caution: if you want a copied data object to share some references but not others, +you will need to provide your own copying function as copyNodeDataFunction rather than setting +this property and copiesArrays to true.

    +

    Warning: there should not be any cyclical references within the model data.

    +
    see

    copiesArrays, copyNodeDataFunction

    +
    since

    1.5

    +
  • +

    Gets or sets whether the default behavior for copyNodeData or GraphLinksModel.copyLinkData +makes copies of property values that are Arrays. +This only copies Arrays that are top-level property values in data objects, not for Arrays that are in nested objects. +Copying Arrays will also copy any array items that are Objects when copiesArrayObjects is true.

    +

    The default value is false. +It is commonplace to set copiesArrayObjects to true when setting this property to true. +This property does not affect any behavior when the value of copyNodeDataFunction +or GraphLinksModel.copyLinkDataFunction has been set to a function.

    +

    Caution: if you want a copied data object to share some Arrays but not others, +you will need to provide your own copying function as copyNodeDataFunction rather than setting +this property to true.

    +

    Warning: there should not be any cyclical references within the model data.

    +
    see

    copiesArrayObjects, copyNodeDataFunction

    +
    since

    1.5

    +
  • +

    Gets or sets whether the default behavior for copyNodeData or GraphLinksModel.copyLinkData +when copying properties of a data object also copies the key property value. +Set this to false in order to force a unique key generation for data copied from another Diagram, such as a Palette.

    +

    The default value is true. +This property does not affect any behavior when the value of copyNodeDataFunction has been set to a function.

    +
    see

    copiesArrays, copyNodeDataFunction

    +
    since

    2.0

    +
  • +

    Gets or sets a function that makes a copy of a node data object.

    +

    You may need to set this property in order to ensure that a copied Node is bound +to data that does not share certain data structures between the original node data and the copied node data. +This property value may be null in order to cause copyNodeData to make a shallow copy of a JavaScript Object. +The default value is null.

    +

    The first argument to the function will be a node data object (potentially a Part's Panel.data). +The second argument to the function will be this Model itself.

    +

    It is common to implement a copying function when the node data has an Array of data +and that Array needs to be copied rather than shared. +Often the objects that are in the Array also need to be copied.

    +
  • +

    Gets or sets the name of the format of the diagram data. +The default value is the empty string. +The value must not be null. +Use different values to prevent parts from one model to be copy/pasted or drag-and-dropped into another diagram/model.

    +
  • +

    Gets or sets whether this model may be modified, such as adding nodes. +By default this value is false. +Setting the nodeDataArray to something that is not a true Array of Objects +will cause this to be set to true.

    +

    Model methods and property setters do not heed this property. +It is up to code that uses a model to check this property when it might want to +prevent changes to the model.

    +
  • +

    Gets or sets a function that returns a unique id number or string for a node data object. +This function is called by makeNodeDataKeyUnique +when a node data object is added to the model, either as part of a new +nodeDataArray or by a call to addNodeData, to make sure the value of +getKeyForNodeData is unique within the model.

    +

    The value may be null in order to cause makeNodeDataKeyUnique behave in the standard manner. +(The default value is null.) +You may want to supply a function here in order to make sure all of the automatically generated keys +are in a particular format. +Setting this property after setting nodeDataArray has no real effect until there is a call +to addNodeData.

    +

    If you want to ensure that this function is called when copying data that already has a key, +set copiesKey to false. +This is typically useful when copying a node from a Palette, where the key it has in the Palette's Model +happens to be unique within the target Diagram's Model. +Unless you set copiesKey to false, the original key value will be copied and retained +if it is already unique within the target model.

    +

    If a node data object is already in the model and you want to change its key value, +call setKeyForNodeData with a new and unique key.

    +
  • +

    Gets a JavaScript Object that can hold programmer-defined property values for the model as a whole, +rather than just for one node or one link.

    +

    By default this an object with no properties. +Any properties that you add to this object will be written out by toJson +and will be restored by Model.fromJson, if the following conditions are true:

    +
      +
    • the property is enumerable and its name does not start with an underscore ('_')
    • +
    • the property value is not undefined and is not a function
    • +
    • the model knows how to convert the property value to JSON format
    • +
    • property values that are Objects or Arrays form a tree structure -- no shared or cyclical references
    • +
    +

    Most object classes cannot be serialized into JSON without special knowledge and processing at both ends. +The toJson and Model.fromJson methods automatically do such processing for numbers that are NaN +and for objects that are of class Point, Size, Rect, Margin, Spot, +Brush (but not for brush patterns), and for Geometry.

    +

    At the current time one cannot have a Diagram as a binding target. +Calling setDataProperty will work to change a property value, but there are no target bindings in any Diagrams to be updated. +Because the binding mechanism is unavailable for this object, we recommend that when you want to save a model +that you explicitly set properties on this object just before calling toJson. +When loading a model, call Model.fromJson and explicitly get the properties that you want to set on a Diagram.

    +
  • +

    Gets or sets the name of this model. +The initial name is an empty string. +The value must not be null.

    +
  • +

    Gets or sets the name of the node data property that returns a string naming that data's category. +The value may also be a function taking two arguments, where the first argument will be a node data object. +If the second argument is not supplied, the function should return the category name; +if the second argument is supplied, the function should modify the node data object so that it has that new category name. +The default value is the string 'category', meaning that it expects the data to have a property named 'category' if it cares to name a category. +This is used by the diagram to distinguish between different kinds of nodes. +The name must not be null. +If the value is an empty string, +getCategoryForNodeData will return an empty string for all node data objects.

    +

    If you want to set this property you must do so before using the model, and especially before you assign Diagram.model. +Note that functions cannot be serialized into JSON-formatted text, so if you are using toJson and Model.fromJson, +and if you want this property to be a function, you will need to assign this property to your desired function +immediately after creating the model, including when it is created by Model.fromJson.

    +
    see

    getCategoryForNodeData, setCategoryForNodeData

    +
  • +

    Gets or sets the array of node data objects that correspond to Nodes, +Groups, or non-Link Parts in the Diagram. +The initial value is an empty Array.

    +

    For each Object in the Array, getKeyForNodeData should return a number or string +uniquely identifying the node data within the model. +If it returns undefined, this calls makeNodeDataKeyUnique, +to make sure the node data has a unique key. +These key values may be used by other objects to refer to that particular node data object. +If more than one node data object has the same key, +there may be some confusion about which object to reference.

    +

    If you want to use a custom data property for holding the unique key value on a node data object, +you should set nodeKeyProperty before you set this nodeDataArray property.

    +

    Adding or removing data from this Array will not notify this model or the diagram +that there are any new nodes or that any nodes have been deleted. +Instead you should call addNodeData or removeNodeData.

    +
  • +

    Gets or sets the name of the data property that returns a unique id number or string for each node data object. +The value may also be a function taking two arguments, where the first argument will be a node data object. +If the second argument is not supplied, the function should return the unique key value; +if the second argument is supplied, the function should modify the node data object so that it has that new value as its unique key value. +The default value is the name 'key', meaning that it expects the data to have a property named 'key' if it has a key value. +The name must not be null or the empty string. +You must set this property before assigning the nodeDataArray.

    +

    If you want to set this property you must do so before using the model, and especially before you assign Diagram.model. +Note that functions cannot be serialized into JSON-formatted text, so if you are using toJson and Model.fromJson, +and if you want this property to be a function, you will need to assign this property to your desired function +immediately after creating the model, including when it is created by Model.fromJson.

    +
    see

    getKeyForNodeData

    +
  • +

    Gets or sets whether ChangedEvents are not recorded by the UndoManager. +The initial and normal value is false. +WARNING: while this property is true do not perform any changes that cause any previous transactions +to become impossible to undo.

    +

    When this property is true, changing the Model or any data object does not call UndoManager.handleChanged. +Even when this property is true, +transactions (such as calls to startTransaction) and undo/redo (such as calls to CommandHandler.undo) +are still delegated to the undoManager.

    +

    You should set this to true only temporarily, and you should remember its previous value before setting this to true. +When finishing the period for which you want the UndoManager to be disabled, +do not blindly set this property to false. +You should set this back to the value it had before you set it to true. +For more permanent disabling of the UndoManager, set UndoManager.isEnabled to false.

    +

    This property is also set when setting Diagram.skipsUndoManager. +Setting this property does not raise a ChangedEvent.

    +
  • +

    Gets or sets the UndoManager for this Model.

    +

    The default UndoManager has its UndoManager.isEnabled property set to false. +If you want users to undo and redo, you should set that property to true once you have initialized the Diagram or its Model.

    +

    This property setter does not raise a ChangedEvent.

    +

Methods

  • addArrayItem(arr: any[], val: any): void
  • +

    Add an item at the end of a data array that may be data bound by a Panel as its Panel.itemArray, +in a manner that can be undone/redone and that automatically updates any bindings.

    +

    This also calls raiseChangedEvent to notify all listeners about the ChangedEvent.Insert.

    +

    If you want to add a new node or part to the diagram, call addNodeData.

    +
    see

    insertArrayItem

    +
    since

    1.1

    +

    Parameters

    • arr: any[]
      +

      an Array that is the value of some Panel's Panel.itemArray.

      +
    • val: any
      +

      the new value to be pushed onto the array.

      +

    Returns void

  • +

    When you want to add a node or group to the diagram, +call this method with a new data object. +This will add that data to the nodeDataArray and +notify all listeners that a new node data object has been inserted into the collection.

    +

    To remove a node from the diagram, you can remove its data object by calling removeNodeData.

    +

    To add or remove an object or value from an item array, call insertArrayItem or removeArrayItem.

    +

    Parameters

    • nodedata: ObjectData
      +

      a JavaScript object represented by a node, group, or non-link.

      +

    Returns void

  • applyIncrementalJson(s: string | ObjectData): void
  • +

    Modify this model by applying the changes given in an "incremental" model change in JSON format +generated by toIncrementalJson. +The expected properties of the argument are described at toIncrementalJson. +Incremental changes must be applied in the same order that the changes occurred in the original model.

    +

    This requires the "incremental" property to be present and to be a number, as specified by toIncrementalJson. +All of the top-level properties in the JSON, such as nodeKeyProperty, must be the same as for this model. +Note that if the model is a GraphLinksModel, you will have to have set GraphLinksModel.linkKeyProperty +to the name of a property, the same both in the Diagram.model as well as in the data that you pass to this method.

    +

    This conducts a transaction.

    +
    since

    1.6

    +

    Parameters

    • s: string | ObjectData
      +

      a String in JSON format containing modifications to be performed to the model, + or a JavaScript Object parsed from such a string

      +

    Returns void

  • +

    This is similar to Object.assign, +but safely calls setDataProperty for each property other than a key property. +This does not delete any properties on the DATA object, +although properties may be set to undefined if they are set that way on the PROPS object.

    +

    Parameters

    • data: ObjectData
      +

      a data object

      +
    • props: ObjectData
      +

      an Object holding various properties whose values are to be assigned to the DATA object

      +

    Returns void

  • clear(): void
  • +

    Clear out all references to any model data. +This also clears out the UndoManager, so this operation is not undoable. +This method is called by Diagram.clear; it does not notify any Diagrams or other listeners. +This method does not unregister any Changed event listeners.

    +

    Instead of calling this method, you may prefer to set nodeDataArray to an empty JavaScript Array. +If this model is a GraphLinksModel, you would also want to set GraphLinksModel.linkDataArray to a separate empty JavaScript Array.

    +

    Returns void

  • cloneDeep<T>(obj: T): T
  • +

    Deeply copy an object or array and return the new object. +This is typically called on a nodeDataArray or GraphLinksModel.linkDataArray or data objects within them.

    +

    By default, this method will make deep clones of arrays and JavaScript objects and maintain any shared or cyclic references. +It will properly copy any Date or RegExp object, and will call a copy function on any object where one exists. +It also handles certain GoJS classes: Point, Size, Rect, Margin, Spot, List, Set, and Map. +It will not handle instances of Diagram, Layer, GraphObject, Tool, CommandHandler, AnimationManager or subclasses or related classes.

    +

    This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method. +Only override this method when the default behavior doesn't suit the data. +When cloning objects, we recommend skipping the __gohashid property, which is used internally.

    +
    since

    2.1

    +

    Type parameters

    • T

    Parameters

    • obj: T

    Returns T

  • cloneProtected(copy: Model): void
  • +

    Copies properties from this model to the given model, which must be of the same class. +This is called by copy. +This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

    +
    since

    1.6

    +

    Parameters

    Returns void

  • commit(func: (m: Model) => void, tname?: string): void
  • +

    Starts a new transaction, calls the provided function, and commits the transaction. +Code is called within a try-finally loop. +If the function does not return normally, this rolls back the transaction rather than committing it. +Example usage:

    +
    model.commit(m => m.addNodeData({ counter: myCounter++ }), "Added Node");
     
    -
    -
    since
    -

    1.8

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      func: (m: Model) => void
      -
      -

      the function to call as the transaction body

      -
      -
        -
      -
    • -
    • -
      Optional tname: string
      -
      -

      a descriptive name for the transaction, or null to temporarily set skipsUndoManager to true; - if no string transaction name is given, an empty string is used as the transaction name

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- commitTransaction -

-
    -
  • commitTransaction(tname?: string): boolean
  • -
- -
-
- -

- containsNodeData -

-
    -
  • containsNodeData(nodedata: ObjectData): boolean
  • -
-
    -
  • -
    -

    Decide if a given node data object is in this model, using reference equality.

    -

    If you do not have a reference to the particular data object that is in the nodeDataArray, - you may need to search for it by iterating through that Array, - or by finding the desired Node or simple Part in a Diagram and getting that node's Panel.data, - or most likely by calling findNodeDataForKey.

    -
    -

    Parameters

    -
      -
    • -
      nodedata: ObjectData
      -
      -

      a JavaScript object represented by a node, group, or non-link.

      -
      -
    • -
    -

    Returns boolean

    -

    true if it is a node data object in this model; false otherwise.

    -
  • -
-
-
- -

- Virtual - copy -

- - -
-
- -

- Virtual - copyNodeData -

- -
    -
  • -
    -

    Make a copy of a node data object. - This uses the value of copyNodeDataFunction to actually perform the copy, unless that property is null. - When it is null the default behavior is to just make a shallow copy of the JavaScript Object.

    -

    However when copiesArrays is true, this will make a copy of property values that are JavaScript Arrays. - This is useful when you do not want the Arrays to be shared between the node data objects. - Note that if you want to copy some property values that are Arrays but not other properties that are Arrays, - you cannot use copiesArrays but must implement your own copyNodeDataFunction.

    -

    In addition when copiesArrayObjects is true, if items in the Array being copied are JavaScript Objects, - those objects are copied, recursively. - This is useful when the items in copied Arrays are themselves objects that need to be copied. - Note that if you want to share references to some but not all of the objects in copied Arrays you cannot use - copiesArrayObjects but must implement your own copyNodeDataFunction.

    -

    This does not modify the model -- the returned data object is not added to this model. - This assumes that the data's constructor can be called with no arguments.

    -

    Models should not have any references to Diagrams or GraphObjects or Tools or Layouts or other objects - that form a Diagram.

    -

    Warning: there should not be any cyclical references within the model data, unless you - either do not turn on copiesArrays or copiesArrayObjects or unless you have - supplied your own copyNodeDataFunction that can handle cyclical references.

    -
    -
    see
    -

    addNodeData

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      nodedata: ObjectData
      -
      -

      a JavaScript object represented by a node, group, or non-link.

      -
      -
    • -
    -

    Returns ObjectData

    -
  • -
-
-
- -

- findNodeDataForKey -

- -
    -
  • -
    -

    Given a number or string, find the node data object in this model - that uses the given value as its unique key.

    -
    -
    see
    -

    containsNodeData, getKeyForNodeData

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      key: Key
      -
      -

      a string or a number.

      -
      -
    • -
    -

    Returns ObjectData

    -

    null if the key is not present in the model, - or if the key is null or undefined or not a string or number.

    -
  • -
-
-
- -

- Static - fromJson -

- -
    -
  • -
    -

    This static function parses a string in JSON format that was written by Model.toJson, - and then constructs, initializes, and returns a model with that information.

    -

    Note that properties with values that are functions are not written out by toJson, - so reading in such a model will require constructing such a model, initializing its functional property values, - and explicitly passing it in as the second argument.

    -

    In order to serialize instances of some classes and enumerated values and some other cases, - Model.toJson writes out special Objects that this Model.fromJson function substitutes - with the intended values. - Those special objects will have a property named "class" whose value will be one of the special substitution cases: - "NaN", "Date", "go.EnumValue", "go.Point", "go.Size", "go.Rect", "go.Margin", "go.Spot", "go.Brush", "go.Geometry".

    -

    As a special case when deserializing an object, if the property is named "points" and the - property value is an Array with an even number of numbers, it will substitute a List of Points.

    -

    Typical usage:

    -
    var modelAsText = ...;  // fetch the model in textual format from a database
    -myDiagram.model = go.Model.fromJson(modelAsText);
    +
    since

    1.8

    +

    Parameters

    • func: (m: Model) => void
      +

      the function to call as the transaction body

      +
    • Optional tname: string
      +

      a descriptive name for the transaction, or null to temporarily set skipsUndoManager to true; + if no string transaction name is given, an empty string is used as the transaction name

      +

    Returns void

  • commitTransaction(tname?: string): boolean
  • +

    Decide if a given node data object is in this model, using reference equality.

    +

    If you do not have a reference to the particular data object that is in the nodeDataArray, +you may need to search for it by iterating through that Array, +or by finding the desired Node or simple Part in a Diagram and getting that node's Panel.data, +or most likely by calling findNodeDataForKey.

    +

    Parameters

    • nodedata: ObjectData
      +

      a JavaScript object represented by a node, group, or non-link.

      +

    Returns boolean

    true if it is a node data object in this model; false otherwise.

    +
  • +

    Make a copy of a node data object. +This uses the value of copyNodeDataFunction to actually perform the copy, unless that property is null. +When it is null the default behavior is to just make a shallow copy of the JavaScript Object.

    +

    However when copiesArrays is true, this will make a copy of property values that are JavaScript Arrays. +This is useful when you do not want the Arrays to be shared between the node data objects. +Note that if you want to copy some property values that are Arrays but not other properties that are Arrays, +you cannot use copiesArrays but must implement your own copyNodeDataFunction.

    +

    In addition when copiesArrayObjects is true, if items in the Array being copied are JavaScript Objects, +those objects are copied, recursively. +This is useful when the items in copied Arrays are themselves objects that need to be copied. +Note that if you want to share references to some but not all of the objects in copied Arrays you cannot use +copiesArrayObjects but must implement your own copyNodeDataFunction.

    +

    This does not modify the model -- the returned data object is not added to this model. +This assumes that the data's constructor can be called with no arguments.

    +

    Models should not have any references to Diagrams or GraphObjects or Tools or Layouts or other objects +that form a Diagram.

    +

    Warning: there should not be any cyclical references within the model data, unless you +either do not turn on copiesArrays or copiesArrayObjects or unless you have +supplied your own copyNodeDataFunction that can handle cyclical references.

    +
    see

    addNodeData

    +

    Parameters

    • nodedata: ObjectData
      +

      a JavaScript object represented by a node, group, or non-link.

      +

    Returns ObjectData

  • +

    Given a number or string, find the node data object in this model +that uses the given value as its unique key.

    +
    see

    containsNodeData, getKeyForNodeData

    +

    Parameters

    • key: Key
      +

      a string or a number.

      +

    Returns ObjectData

    null if the key is not present in the model, +or if the key is null or undefined or not a string or number.

    +
  • getCategoryForNodeData(nodedata: ObjectData): string
  • +

    Find the category of a given node data, a string naming the node template +or group template or part template +that the Diagram should use to represent the node data.

    +
    see

    nodeCategoryProperty, setCategoryForNodeData

    +

    Parameters

    • nodedata: ObjectData
      +

      a JavaScript object represented by a node, group, or non-link.

      +

    Returns string

  • insertArrayItem(arr: any[], idx: number, val: any): void
  • +

    Add an item to a data array that may be data bound by a Panel as its Panel.itemArray, +given a new data value and the index at which to insert the new value, in a manner that can be undone/redone and that automatically updates any bindings.

    +

    This also calls raiseChangedEvent to notify all listeners about the ChangedEvent.Insert.

    +

    If you want to add a new node or part to the diagram, call addNodeData.

    +
    see

    removeArrayItem

    +

    Parameters

    • arr: any[]
      +

      an Array that is the value of some Panel's Panel.itemArray.

      +
    • idx: number
      +

      the zero-based array index where the new value will be inserted; use -1 to push the new value on the end of the array.

      +
    • val: any
      +

      the new value to be inserted into the array.

      +

    Returns void

  • +

    This method is called when a node data object is added to the model to make sure that +getKeyForNodeData returns a unique key value.

    +

    The key value should be unique within the set of data managed by this model: +nodeDataArray. +If the key is already in use, this will assign an unused number to the +nodeKeyProperty property on the data.

    +

    If you want to customize the way in which node data gets a unique key, +you can set the makeUniqueKeyFunction functional property.

    +

    If the node data object is already in the model and you want to change its key value, +call setKeyForNodeData and give it a new unique key value.

    +

    Parameters

    • nodedata: ObjectData
      +

      a JavaScript object represented by a node, group, or non-link.

      +

    Returns void

  • +

    Take an Array of node data objects and update nodeDataArray without replacing +the Array and without replacing any existing node data objects that are identified by key.

    +

    For node data objects that have the same key value, this makes calls to setDataProperty +to update the existing node data object. +For new keys, this calls cloneDeep to copy the data and then addNodeData to add a new node to the model. +For existing nodes that have keys that are not present in the given Array, +this calls removeNodeData to remove the existing node from the model.

    +

    This method is typically used when GoJS is being used within an application that is maintaining state +related to the diagram model. When state is updated, this method can be called to keep the GoJS model synchronized. +Any updates to the data should use new references since this method will use reference equality to check +if a node data object needs to be updated.

    +

    This method does not conduct a transaction.

    +
    since

    2.1

    +

    Parameters

    Returns void

  • raiseChangedEvent(change: EnumValue, propertyname: string | ((obj: ObjectData, val: any) => any), obj: ObjectData, oldval: any, newval: any, oldparam?: any, newparam?: any): void
  • +

    Call this method to notify that the model or its objects have changed. +This constructs a ChangedEvent and calls all Changed listeners.

    +

    Parameters

    • change: EnumValue
      +

      specifies the general nature of the change; typically the value is ChangedEvent.Property.

      +
    • propertyname: string | ((obj: ObjectData, val: any) => any)
      +

      names the property that was modified, or a function that takes an Object and returns the property value.

      +
    • obj: ObjectData
      +

      the object that was modified, typically a GraphObject, Diagram, or a Model.

      +
    • oldval: any
      +

      the previous or older value.

      +
    • newval: any
      +

      the next or newer value.

      +
    • Optional oldparam: any
      +

      an optional value that helps describe the older value.

      +
    • Optional newparam: any
      +

      an optional value that helps describe the newer value.

      +

    Returns void

  • raiseDataChanged(data: ObjectData, propertyname: string | ((obj: ObjectData, val: any) => any), oldval: any, newval: any, oldparam?: any, newparam?: any): void
  • +

    Call this method to notify about a data property having changed value. +This constructs a ChangedEvent and calls all Changed listeners.

    +

    You should call this method only if the property value actually changed. +This method is called by setDataProperty.

    +

    Parameters

    • data: ObjectData
      +

      the data object whose property changed value.

      +
    • propertyname: string | ((obj: ObjectData, val: any) => any)
      +

      the name of the property, or a function that takes an Object and returns the property value.

      +
    • oldval: any
      +

      the previous or old value for the property.

      +
    • newval: any
      +

      the next or new value for the property.

      +
    • Optional oldparam: any
      +

      an optional value additionally describing the old value.

      +
    • Optional newparam: any
      +

      an optional value additionally describing the new value.

      +

    Returns void

  • removeArrayItem(arr: any[], idx?: number): void
  • +

    Remove an item from a data array that may be data bound by a Panel as its Panel.itemArray, +given the index at which to remove a data value, in a manner that can be undone/redone and that automatically updates any bindings.

    +

    This also calls raiseChangedEvent to notify all listeners about the ChangedEvent.Remove.

    +

    If you want to remove a node from the diagram, call removeNodeData.

    +

    Note that there is no version of this method that takes an item value instead of an index into the array. +Because item arrays may hold any JavaScript value, including numbers and strings, there may be duplicate entries with that value in the array. +To avoid ambiguity, removing an item from an array requires an index.

    +
    see

    insertArrayItem

    +

    Parameters

    • arr: any[]
      +

      an Array that is the value of some Panel's Panel.itemArray.

      +
    • Optional idx: number
      +

      the zero-based array index of the data item to be removed from the array; + if not supplied it will remove the last item of the array.

      +

    Returns void

  • removeChangedListener(listener: (e: ChangedEvent) => void): void
  • +

    When you want to remove a node or group from the diagram, +call this method with an existing data object. +This will remove that data from the nodeDataArray and +notify all listeners that a node data object has been removed from the collection.

    +

    If you do not have a reference to the particular data object that is in the nodeDataArray, +you may need to search for it by iterating through that Array, +or by finding the desired Node or simple Part in a Diagram and getting that node's Panel.data, +or most likely by calling findNodeDataForKey.

    +

    Removing a node data from a model does not automatically remove +any connected link data from the model. +Removing a node data that represents a group does not automatically remove +any member node data or link data from the model.

    +

    To add a node to the diagram, you can add its data object by calling addNodeData.

    +

    To add or remove an object or value from an item array, call insertArrayItem or removeArrayItem.

    +

    Parameters

    • nodedata: ObjectData
      +

      a JavaScript object represented by a node, group, or non-link.

      +

    Returns void

  • +

    Remove from this model all of the node data held in an Array or in an Iterable of node data objects.

    +
    since

    1.3

    +

    Parameters

    Returns void

  • rollbackTransaction(): boolean
  • set(data: ObjectData, propname: string, val: any): void
  • +

    A synonym for setDataProperty

    +
    see

    setDataProperty

    +
    since

    1.8

    +

    Parameters

    • data: ObjectData
      +

      a JavaScript object typically the value of a Panel.data and represented by a Node, Link, Group, simple Part, + or item in a Panel.itemArray; or this model's modelData.

      +
    • propname: string
      +

      a string that is not null or the empty string.

      +
    • val: any
      +

      the new value for the property.

      +

    Returns void

  • setCategoryForNodeData(nodedata: ObjectData, cat: string): void
  • +

    Change the category of a given node data, a string naming the node template +or group template or part template +that the Diagram should use to represent the node data.

    +

    Changing the node template for a node data will cause the existing Node, Group, or Part +to be replaced with a new instance of the same class +created by copying the new node template and applying any data-bindings. +That means that the templates in the Diagram.nodeTemplateMap or Diagram.groupTemplateMap +must be instances of the same class -- one cannot convert a Node into a Group or vice-versa +by setting the category.

    +

    Binding sources should not be (or depend in a conversion function on) the category of the data +if you might be modifying the category, because then some bindings might be evaluated +before or after the category has been changed.

    +
    see

    nodeCategoryProperty, getCategoryForNodeData

    +

    Parameters

    • nodedata: ObjectData
      +

      a JavaScript object represented by a node, group, or non-link.

      +
    • cat: string
      +

      Must not be null.

      +

    Returns void

  • setDataProperty(data: ObjectData, propname: string, val: any): void
  • +

    Change the value of some property of a node data, a link data, an item data, or the Model.modelData, +given a string naming the property and the new value, +in a manner that can be undone/redone and that automatically updates any bindings.

    +

    This gets the old value of the property; if the value is the same as the new value, no side-effects occur. +This calls raiseDataChanged to notify about the change.

    +

    Note that it is insufficient to modify an item Array (for example by pushing a new item onto the Array) and +then calling setDataProperty(data, "items", data.items) because the value of +data.items is still the same reference. +Instead you will want to call insertArrayItem, addArrayItem, or removeArrayItem.

    +

    If you modify the property that is the nodeKeyProperty, this will call setKeyForNodeData.

    +

    If you modify the property that is the nodeCategoryProperty or the GraphLinksModel.linkCategoryProperty, +this will call setCategoryForNodeData or GraphLinksModel.setCategoryForLinkData. +But if the category might change, Binding sources should not be (or depend in a conversion function on) the category of the data, +because then some bindings might be evaluated before or after the category has been changed.

    +
    see

    set

    +

    Parameters

    • data: ObjectData
      +

      a JavaScript object typically the value of a Panel.data and represented by a Node, Link, Group, simple Part, + or item in a Panel.itemArray; or this model's modelData.

      +
    • propname: string
      +

      a string that is not null or the empty string.

      +
    • val: any
      +

      the new value for the property.

      +

    Returns void

  • +

    Change the unique key of a given node data that is already in this model. +The new key value must be unique -- i.e. not in use by another node data object. +You can call findNodeDataForKey to check if a proposed new key is already in use.

    +

    This operation will check all data objects in the model and replace all references +using the old key value with the new one.

    +

    If this is called on a node data object that is not (yet) in this model, +this unconditionally modifies the property to the new key value.

    +
    see

    nodeKeyProperty, getKeyForNodeData

    +
    since

    1.1

    +

    Parameters

    • nodedata: ObjectData
      +

      a JavaScript object represented by a node, group, or non-link.

      +
    • key: Key

    Returns void

  • startTransaction(tname?: string): boolean
  • +

    Produce an object representing the changes in the most recent Transaction. +The structure of the object follows the same format as the JSON output from toIncrementalJson.

    +

    Note that these incremental changes include the results of undo and redo operations.

    +

    For GraphLinksModels, this method requires that GraphLinksModel.linkKeyProperty is not an empty string.

    +

    Any node or link data objects contained in the "modified..." properties will be deep copies of the data in the model. +The objects will contain proper copies of certain GoJS classes, and some common built-in objects such as Dates and RegExps. +Other classes will just be copied as plain Javascript objects, so it is best to avoid using special classes in one's data.

    +

    This method is most commonly used when GoJS must communicate with some external data source +and maintain integrity between the two while avoiding serialization/deserialization.

    +
      myDiagram.addModelChangedListener(function(e) {
    if (e.isTransactionFinished) {
    var dataChanges = e.model.toIncrementalData(e);
    ... update React state/save to database ...
    }
    });
    -
    -

    Parameters

    -
      -
    • -
      s: string | ObjectData
      -
      -

      a String in JSON format containing all of the persistent properties of the model, or an Object already read from JSON text.

      -
      -
    • -
    • -
      Optional model: Model
      -
      -

      an optional model to be modified; if not supplied, it constructs and returns a new model whose name is specified by the "class" property.

      -
      -
    • -
    -

    Returns Model

    -

    the supplied or created model loaded with data from the given string.

    -
  • -
-
-
- -

- getCategoryForNodeData -

-
    -
  • getCategoryForNodeData(nodedata: ObjectData): string
  • -
-
    -
  • -
    -

    Find the category of a given node data, a string naming the node template - or group template or part template - that the Diagram should use to represent the node data.

    -
    -
    see
    -

    nodeCategoryProperty, setCategoryForNodeData

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      nodedata: ObjectData
      -
      -

      a JavaScript object represented by a node, group, or non-link.

      -
      -
    • -
    -

    Returns string

    -
  • -
-
-
- -

- getKeyForNodeData -

- -
    -
  • -
    -

    Given a node data object return its unique key: a number or a string. - This returns undefined if there is no key value.

    -

    It is possible to change the key for a node data object by calling setKeyForNodeData.

    -
    -
    see
    -

    nodeKeyProperty, setKeyForNodeData, findNodeDataForKey

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      nodedata: ObjectData
      -
      -

      a JavaScript object represented by a node, group, or non-link.

      -
      -
    • -
    -

    Returns Key

    -
  • -
-
-
- -

- insertArrayItem -

-
    -
  • insertArrayItem(arr: any[], idx: number, val: any): void
  • -
-
    -
  • -
    -

    Add an item to a data array that may be data bound by a Panel as its Panel.itemArray, - given a new data value and the index at which to insert the new value, in a manner that can be undone/redone and that automatically updates any bindings.

    -

    This also calls raiseChangedEvent to notify all listeners about the ChangedEvent.Insert.

    -

    If you want to add a new node or part to the diagram, call addNodeData.

    -
    -
    see
    -

    removeArrayItem

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      arr: any[]
      -
      -

      an Array that is the value of some Panel's Panel.itemArray.

      -
      -
    • -
    • -
      idx: number
      -
      -

      the zero-based array index where the new value will be inserted; use -1 to push the new value on the end of the array.

      -
      -
    • -
    • -
      val: any
      -
      -

      the new value to be inserted into the array.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- makeNodeDataKeyUnique -

-
    -
  • makeNodeDataKeyUnique(nodedata: ObjectData): void
  • -
-
    -
  • -
    -

    This method is called when a node data object is added to the model to make sure that - getKeyForNodeData returns a unique key value.

    -

    The key value should be unique within the set of data managed by this model: - nodeDataArray. - If the key is already in use, this will assign an unused number to the - nodeKeyProperty property on the data.

    -

    If you want to customize the way in which node data gets a unique key, - you can set the makeUniqueKeyFunction functional property.

    -

    If the node data object is already in the model and you want to change its key value, - call setKeyForNodeData and give it a new unique key value.

    -
    -

    Parameters

    -
      -
    • -
      nodedata: ObjectData
      -
      -

      a JavaScript object represented by a node, group, or non-link.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- mergeNodeDataArray -

- -
    -
  • -
    -

    Take an Array of node data objects and update nodeDataArray without replacing - the Array and without replacing any existing node data objects that are identified by key.

    -

    For node data objects that have the same key value, this makes calls to setDataProperty - to update the existing node data object. - For new keys, this calls cloneDeep to copy the data and then addNodeData to add a new node to the model. - For existing nodes that have keys that are not present in the given Array, - this calls removeNodeData to remove the existing node from the model.

    -

    This method is typically used when GoJS is being used within an application that is maintaining state - related to the diagram model. When state is updated, this method can be called to keep the GoJS model synchronized. - Any updates to the data should use new references since this method will use reference equality to check - if a node data object needs to be updated.

    -

    This method does not conduct a transaction.

    -
    -
    since
    -

    2.1

    -
    -
    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- raiseChangedEvent -

-
    -
  • raiseChangedEvent(change: EnumValue, propertyname: string | ((obj: ObjectData, val: any) => any), obj: ObjectData, oldval: any, newval: any, oldparam?: any, newparam?: any): void
  • -
-
    -
  • -
    -

    Call this method to notify that the model or its objects have changed. - This constructs a ChangedEvent and calls all Changed listeners.

    -
    -

    Parameters

    -
      -
    • -
      change: EnumValue
      -
      -

      specifies the general nature of the change; typically the value is ChangedEvent.Property.

      -
      -
    • -
    • -
      propertyname: string | ((obj: ObjectData, val: any) => any)
      -
      -

      names the property that was modified, or a function that takes an Object and returns the property value.

      -
      -
    • -
    • -
      obj: ObjectData
      -
      -

      the object that was modified, typically a GraphObject, Diagram, or a Model.

      -
      -
    • -
    • -
      oldval: any
      -
      -

      the previous or older value.

      -
      -
    • -
    • -
      newval: any
      -
      -

      the next or newer value.

      -
      -
    • -
    • -
      Optional oldparam: any
      -
      -

      an optional value that helps describe the older value.

      -
      -
    • -
    • -
      Optional newparam: any
      -
      -

      an optional value that helps describe the newer value.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- raiseDataChanged -

-
    -
  • raiseDataChanged(data: ObjectData, propertyname: string | ((obj: ObjectData, val: any) => any), oldval: any, newval: any, oldparam?: any, newparam?: any): void
  • -
-
    -
  • -
    -

    Call this method to notify about a data property having changed value. - This constructs a ChangedEvent and calls all Changed listeners.

    -

    You should call this method only if the property value actually changed. - This method is called by setDataProperty.

    -
    -

    Parameters

    -
      -
    • -
      data: ObjectData
      -
      -

      the data object whose property changed value.

      -
      -
    • -
    • -
      propertyname: string | ((obj: ObjectData, val: any) => any)
      -
      -

      the name of the property, or a function that takes an Object and returns the property value.

      -
      -
    • -
    • -
      oldval: any
      -
      -

      the previous or old value for the property.

      -
      -
    • -
    • -
      newval: any
      -
      -

      the next or new value for the property.

      -
      -
    • -
    • -
      Optional oldparam: any
      -
      -

      an optional value additionally describing the old value.

      -
      -
    • -
    • -
      Optional newparam: any
      -
      -

      an optional value additionally describing the new value.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- removeArrayItem -

-
    -
  • removeArrayItem(arr: any[], idx?: number): void
  • -
-
    -
  • -
    -

    Remove an item from a data array that may be data bound by a Panel as its Panel.itemArray, - given the index at which to remove a data value, in a manner that can be undone/redone and that automatically updates any bindings.

    -

    This also calls raiseChangedEvent to notify all listeners about the ChangedEvent.Remove.

    -

    If you want to remove a node from the diagram, call removeNodeData.

    -

    Note that there is no version of this method that takes an item value instead of an index into the array. - Because item arrays may hold any JavaScript value, including numbers and strings, there may be duplicate entries with that value in the array. - To avoid ambiguity, removing an item from an array requires an index.

    -
    -
    see
    -

    insertArrayItem

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      arr: any[]
      -
      -

      an Array that is the value of some Panel's Panel.itemArray.

      -
      -
    • -
    • -
      Optional idx: number
      -
      -

      the zero-based array index of the data item to be removed from the array; - if not supplied it will remove the last item of the array.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- removeChangedListener -

-
    -
  • removeChangedListener(listener: (e: ChangedEvent) => void): void
  • -
- -
-
- -

- removeNodeData -

- -
    -
  • -
    -

    When you want to remove a node or group from the diagram, - call this method with an existing data object. - This will remove that data from the nodeDataArray and - notify all listeners that a node data object has been removed from the collection.

    -

    If you do not have a reference to the particular data object that is in the nodeDataArray, - you may need to search for it by iterating through that Array, - or by finding the desired Node or simple Part in a Diagram and getting that node's Panel.data, - or most likely by calling findNodeDataForKey.

    -

    Removing a node data from a model does not automatically remove - any connected link data from the model. - Removing a node data that represents a group does not automatically remove - any member node data or link data from the model.

    -

    To add a node to the diagram, you can add its data object by calling addNodeData.

    -

    To add or remove an object or value from an item array, call insertArrayItem or removeArrayItem.

    -
    -

    Parameters

    -
      -
    • -
      nodedata: ObjectData
      -
      -

      a JavaScript object represented by a node, group, or non-link.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- removeNodeDataCollection -

- -
    -
  • -
    -

    Remove from this model all of the node data held in an Array or in an Iterable of node data objects.

    -
    -
    since
    -

    1.3

    -
    -
    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
- -

- rollbackTransaction -

-
    -
  • rollbackTransaction(): boolean
  • -
- -
-
- -

- set -

-
    -
  • set(data: ObjectData, propname: string, val: any): void
  • -
-
    -
  • -
    -

    A synonym for setDataProperty

    -
    -
    see
    -

    setDataProperty

    -
    -
    since
    -

    1.8

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      data: ObjectData
      -
      -

      a JavaScript object typically the value of a Panel.data and represented by a Node, Link, Group, simple Part, - or item in a Panel.itemArray; or this model's modelData.

      -
      -
    • -
    • -
      propname: string
      -
      -

      a string that is not null or the empty string.

      -
      -
    • -
    • -
      val: any
      -
      -

      the new value for the property.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- setCategoryForNodeData -

-
    -
  • setCategoryForNodeData(nodedata: ObjectData, cat: string): void
  • -
-
    -
  • -
    -

    Change the category of a given node data, a string naming the node template - or group template or part template - that the Diagram should use to represent the node data.

    -

    Changing the node template for a node data will cause the existing Node, Group, or Part - to be replaced with a new instance of the same class - created by copying the new node template and applying any data-bindings. - That means that the templates in the Diagram.nodeTemplateMap or Diagram.groupTemplateMap - must be instances of the same class -- one cannot convert a Node into a Group or vice-versa - by setting the category.

    -

    Binding sources should not be (or depend in a conversion function on) the category of the data - if you might be modifying the category, because then some bindings might be evaluated - before or after the category has been changed.

    -
    -
    see
    -

    nodeCategoryProperty, getCategoryForNodeData

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      nodedata: ObjectData
      -
      -

      a JavaScript object represented by a node, group, or non-link.

      -
      -
    • -
    • -
      cat: string
      -
      -

      Must not be null.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- Virtual - setDataProperty -

-
    -
  • setDataProperty(data: ObjectData, propname: string, val: any): void
  • -
-
    -
  • -
    -

    Change the value of some property of a node data, a link data, an item data, or the Model.modelData, - given a string naming the property and the new value, - in a manner that can be undone/redone and that automatically updates any bindings.

    -

    This gets the old value of the property; if the value is the same as the new value, no side-effects occur. - This calls raiseDataChanged to notify about the change.

    -

    Note that it is insufficient to modify an item Array (for example by pushing a new item onto the Array) and - then calling setDataProperty(data, "items", data.items) because the value of - data.items is still the same reference. - Instead you will want to call insertArrayItem, addArrayItem, or removeArrayItem.

    -

    If you modify the property that is the nodeKeyProperty, this will call setKeyForNodeData.

    -

    If you modify the property that is the nodeCategoryProperty or the GraphLinksModel.linkCategoryProperty, - this will call setCategoryForNodeData or GraphLinksModel.setCategoryForLinkData. - But if the category might change, Binding sources should not be (or depend in a conversion function on) the category of the data, - because then some bindings might be evaluated before or after the category has been changed.

    -
    -
    see
    -

    set

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      data: ObjectData
      -
      -

      a JavaScript object typically the value of a Panel.data and represented by a Node, Link, Group, simple Part, - or item in a Panel.itemArray; or this model's modelData.

      -
      -
    • -
    • -
      propname: string
      -
      -

      a string that is not null or the empty string.

      -
      -
    • -
    • -
      val: any
      -
      -

      the new value for the property.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- setKeyForNodeData -

- -
    -
  • -
    -

    Change the unique key of a given node data that is already in this model. - The new key value must be unique -- i.e. not in use by another node data object. - You can call findNodeDataForKey to check if a proposed new key is already in use.

    -

    This operation will check all data objects in the model and replace all references - using the old key value with the new one.

    -

    If this is called on a node data object that is not (yet) in this model, - this unconditionally modifies the property to the new key value.

    -
    -
    see
    -

    nodeKeyProperty, getKeyForNodeData

    -
    -
    since
    -

    1.1

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      nodedata: ObjectData
      -
      -

      a JavaScript object represented by a node, group, or non-link.

      -
      -
    • -
    • -
      key: Key
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- startTransaction -

-
    -
  • startTransaction(tname?: string): boolean
  • -
- -
-
- -

- toIncrementalData -

- -
    -
  • -
    -

    Produce an object representing the changes in the most recent Transaction. - The structure of the object follows the same format as the JSON output from toIncrementalJson.

    -

    Note that these incremental changes include the results of undo and redo operations.

    -

    For GraphLinksModels, this method requires that GraphLinksModel.linkKeyProperty is not an empty string.

    -

    Any node or link data objects contained in the "modified..." properties will be deep copies of the data in the model. - The objects will contain proper copies of certain GoJS classes, and some common built-in objects such as Dates and RegExps. - Other classes will just be copied as plain Javascript objects, so it is best to avoid using special classes in one's data.

    -

    This method is most commonly used when GoJS must communicate with some external data source - and maintain integrity between the two while avoiding serialization/deserialization.

    -
      myDiagram.addModelChangedListener(function(e) {
    -    if (e.isTransactionFinished) {
    -      var dataChanges = e.model.toIncrementalData(e);
    -      ... update React state/save to database ...
    -    }
    -  });
    +

    Caution: don't call JSON.stringify on the resulting object, because that will not properly handle any instances of +JavaScript classes that are referenced by the object's properties. +Instead call toIncrementalJson, which will produce a more compact textual serialization.

    +
    see

    toIncrementalJson

    +
    since

    2.1

    +

Parameters

Returns IncrementalData

returns either null if no changes occurred, or an object containing incremental model changes for the given Transaction

+
  • toIncrementalJson(e: ChangedEvent, classname?: string): string
  • +

    Produce a JSON-format string representing the changes in the most recent Transaction. +This writes out JSON for a model, but recording only changes in the given Transaction, +with the addition of the "incremental" property to mark it as different from a complete model. +Instead of the "nodeDataArray" property (and "linkDataArray" property for GraphLinksModels), +this will have "inserted...", "modified...", and "removed..." properties that are non-empty Arrays.

    +

    The "modifiedNodeData" Array holds JavaScript objects. +The "insertedNodeKeys" and "removedNodeKeys" Arrays hold keys (numbers or strings) of data, +not whole objects, that have been added and/or deleted. +The "modelData" property holds the Model.modelData object, if it was modified.

    +

    Note that it is entirely plausible for the same object be in or referenced by all three Arrays, +because a single Transaction can include adding a node, modifying it, and removing it.

    +

    The purpose of this method is to make it easier to send incremental changes to the server/database, +instead of sending the whole model. +Whereas it has always been easy to perform "batch" updates or "file saves":

    +
      myDiagram.addModelChangedListener(function(e) {
    if (e.isTransactionFinished) {
    var json = e.model.toJson();
    // save the whole model upon each transaction completion or undo/redo
    ... send to server/database ...
    }
    });
    -

    Caution: don't call JSON.stringify on the resulting object, because that will not properly handle any instances of - JavaScript classes that are referenced by the object's properties. - Instead call toIncrementalJson, which will produce a more compact textual serialization.

    -
    -
    see
    -

    toIncrementalJson

    -
    -
    since
    -

    2.1

    -
    -
    -
    -

    Parameters

    - -

    Returns IncrementalData

    -

    returns either null if no changes occurred, or an object containing incremental model changes for the given Transaction

    -
  • -
-
-
- -

- toIncrementalJson -

-
    -
  • toIncrementalJson(e: ChangedEvent, classname?: string): string
  • -
-
    -
  • -
    -

    Produce a JSON-format string representing the changes in the most recent Transaction. - This writes out JSON for a model, but recording only changes in the given Transaction, - with the addition of the "incremental" property to mark it as different from a complete model. - Instead of the "nodeDataArray" property (and "linkDataArray" property for GraphLinksModels), - this will have "inserted...", "modified...", and "removed..." properties that are non-empty Arrays.

    -

    The "modifiedNodeData" Array holds JavaScript objects. - The "insertedNodeKeys" and "removedNodeKeys" Arrays hold keys (numbers or strings) of data, - not whole objects, that have been added and/or deleted. - The "modelData" property holds the Model.modelData object, if it was modified.

    -

    Note that it is entirely plausible for the same object be in or referenced by all three Arrays, - because a single Transaction can include adding a node, modifying it, and removing it.

    -

    The purpose of this method is to make it easier to send incremental changes to the server/database, - instead of sending the whole model. - Whereas it has always been easy to perform "batch" updates or "file saves":

    -
      myDiagram.addModelChangedListener(function(e) {
    -    if (e.isTransactionFinished) {
    -      var json = e.model.toJson();
    -      // save the whole model upon each transaction completion or undo/redo
    -      ... send to server/database ...
    -    }
    -  });
    +

    You can now easily send "incremental" updates:

    +
      myDiagram.addModelChangedListener(function(e) {
    if (e.isTransactionFinished) {
    var json = e.model.toIncrementalJson(e);
    // record each Transaction as a JSON-format string
    ... send to server/database ...
    }
    });
    -

    You can now easily send "incremental" updates:

    -
      myDiagram.addModelChangedListener(function(e) {
    -    if (e.isTransactionFinished) {
    -      var json = e.model.toIncrementalJson(e);
    -      // record each Transaction as a JSON-format string
    -      ... send to server/database ...
    -    }
    -  });
    +

    Note that these incremental changes include the results of undo and redo operations. +Also, when you might call applyIncrementalJson, you will need to disable your Changed listener, +so that it does not send spurious changes to your database during the process of apply incremental changes from the database.

    +

    For GraphLinksModels, this method requires that GraphLinksModel.linkKeyProperty is not an empty string. +The incremental JSON for GraphLinksModels will include "modifiedLinkData", "insertedLinkKeys", and "removedLinkKeys" +properties that are non-empty Arrays.

    +

    The same restrictions on data property names and data property values applies to this method as it does to toJson.

    +
    since

    1.6

    +

Parameters

Returns string

  • toJson(classname?: string): string
  • +

    Generate a string representation of the persistent data in this model, in JSON format, +that can be read in later with a call to Model.fromJson.

    +

    Object properties that are not enumerable or whose names start with "_" are not written out.

    +

    Functions are not able to be written in JSON format, so any properties that have function values +will not be saved in the JSON string.

    +

    There must not be any circular references within the model data. +Any sharing of object references will be lost in the written JSON.

    +

    Most object classes cannot be serialized into JSON without special knowledge and processing at both ends. +The toJson and Model.fromJson methods automatically do such processing for numbers that are NaN +and for objects that are of class Point, Size, Rect, Margin, Spot, +Brush (but not for brush patterns), and for Geometry. +For instances of those classes, special objects are written out with a property named "class" whose value +will be one of the special cases that will be substituted by Model.fromJson: +"NaN", "Date", "go.EnumValue", "go.Point", "go.Size", "go.Rect", "go.Margin", "go.Spot", "go.Brush", "go.Geometry".

    +

    However, we recommend that you use Binding converters (static functions named "parse" and "stringify") +to represent Points, Sizes, Rects, Margins, Spots, and Geometries as string values in your data, rather than as Objects. +This makes the JSON text smaller and simpler and easier to read.

    +

    As a special case when serializing an object, if the property is named "points" and the +property value is a List of Points, it will write an Array of numbers.

    +

    Note that this is a method on the Model class. +It cannot render unmodeled Parts such as the background grid or any Parts that you have added directly to a Diagram.

    +

    Typical usage:

    +
    var modelAsText = myDiagram.model.toJson();
    // now save this text string by sending it to your database
    -

    Note that these incremental changes include the results of undo and redo operations. - Also, when you might call applyIncrementalJson, you will need to disable your Changed listener, - so that it does not send spurious changes to your database during the process of apply incremental changes from the database.

    -

    For GraphLinksModels, this method requires that GraphLinksModel.linkKeyProperty is not an empty string. - The incremental JSON for GraphLinksModels will include "modifiedLinkData", "insertedLinkKeys", and "removedLinkKeys" - properties that are non-empty Arrays.

    -

    The same restrictions on data property names and data property values applies to this method as it does to toJson.

    -
    -
    since
    -

    1.6

    -
    -
    -
    -

    Parameters

    - -

    Returns string

    -
  • -
-
-
- -

- toJson -

-
    -
  • toJson(classname?: string): string
  • -
-
    -
  • -
    -

    Generate a string representation of the persistent data in this model, in JSON format, - that can be read in later with a call to Model.fromJson.

    -

    Object properties that are not enumerable or whose names start with "_" are not written out.

    -

    Functions are not able to be written in JSON format, so any properties that have function values - will not be saved in the JSON string.

    -

    There must not be any circular references within the model data. - Any sharing of object references will be lost in the written JSON.

    -

    Most object classes cannot be serialized into JSON without special knowledge and processing at both ends. - The toJson and Model.fromJson methods automatically do such processing for numbers that are NaN - and for objects that are of class Point, Size, Rect, Margin, Spot, - Brush (but not for brush patterns), and for Geometry. - For instances of those classes, special objects are written out with a property named "class" whose value - will be one of the special cases that will be substituted by Model.fromJson: - "NaN", "Date", "go.EnumValue", "go.Point", "go.Size", "go.Rect", "go.Margin", "go.Spot", "go.Brush", "go.Geometry".

    -

    However, we recommend that you use Binding converters (static functions named "parse" and "stringify") - to represent Points, Sizes, Rects, Margins, Spots, and Geometries as string values in your data, rather than as Objects. - This makes the JSON text smaller and simpler and easier to read.

    -

    As a special case when serializing an object, if the property is named "points" and the - property value is a List of Points, it will write an Array of numbers.

    -

    Note that this is a method on the Model class. - It cannot render unmodeled Parts such as the background grid or any Parts that you have added directly to a Diagram.

    -

    Typical usage:

    -
    var modelAsText = myDiagram.model.toJson();
    -// now save this text string by sending it to your database
    +

Parameters

  • Optional classname: string
    +

    The optional name of the model class to use in the output; + for the standard models, this is their class name prefixed with "go.".

    +

Returns string

a String in JSON format containing all of the persistent properties of the model.

+
  • updateTargetBindings(data: ObjectData, srcpropname?: string): void
  • +

    Find a Part corresponding to the given data and +call its Panel.updateTargetBindings method, in each Diagram +that uses this Model.

    +

    Caution: setting a data property without calling setDataProperty +and then calling this updateTargetBindings method will update GraphObjects that are bound to the property, +but such data settings will not be recorded in the UndoManager and therefore will not be undone/redone, +causing an inconsistency between the GraphObjects and the part data.

    +

    Parameters

    • data: ObjectData
      +

      The data object in this model that was modified.

      +
    • Optional srcpropname: string
      +

      If not present or the empty string, + update all bindings on the target Part or item Panel + otherwise update only those bindings using this source property name.

      +

    Returns void

  • +

    This static function parses a string in JSON format that was written by Model.toJson, +and then constructs, initializes, and returns a model with that information.

    +

    Note that properties with values that are functions are not written out by toJson, +so reading in such a model will require constructing such a model, initializing its functional property values, +and explicitly passing it in as the second argument.

    +

    In order to serialize instances of some classes and enumerated values and some other cases, +Model.toJson writes out special Objects that this Model.fromJson function substitutes +with the intended values. +Those special objects will have a property named "class" whose value will be one of the special substitution cases: +"NaN", "Date", "go.EnumValue", "go.Point", "go.Size", "go.Rect", "go.Margin", "go.Spot", "go.Brush", "go.Geometry".

    +

    As a special case when deserializing an object, if the property is named "points" and the +property value is an Array with an even number of numbers, it will substitute a List of Points.

    +

    Typical usage:

    +
    var modelAsText = ...;  // fetch the model in textual format from a database
    myDiagram.model = go.Model.fromJson(modelAsText);
    -
    -

    Parameters

    -
      -
    • -
      Optional classname: string
      -
      -

      The optional name of the model class to use in the output; - for the standard models, this is their class name prefixed with "go.".

      -
      -
    • -
    -

    Returns string

    -

    a String in JSON format containing all of the persistent properties of the model.

    -
  • -
-
-
- -

- updateTargetBindings -

-
    -
  • updateTargetBindings(data: ObjectData, srcpropname?: string): void
  • -
-
    -
  • -
    -

    Find a Part corresponding to the given data and - call its Panel.updateTargetBindings method, in each Diagram - that uses this Model.

    -

    Caution: setting a data property without calling setDataProperty - and then calling this updateTargetBindings method will update GraphObjects that are bound to the property, - but such data settings will not be recorded in the UndoManager and therefore will not be undone/redone, - causing an inconsistency between the GraphObjects and the part data.

    -
    -

    Parameters

    -
      -
    • -
      data: ObjectData
      -
      -

      The data object in this model that was modified.

      -
      -
    • -
    • -
      Optional srcpropname: string
      -
      -

      If not present or the empty string, - update all bindings on the target Part or item Panel - otherwise update only those bindings using this source property name.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
- - - - - -
- -
-
- - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Node.html b/api/symbols/Node.html index 656792e5a..fe3c80d2f 100644 --- a/api/symbols/Node.html +++ b/api/symbols/Node.html @@ -1,1715 +1,526 @@ - - - - - - Node | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class Node

-
-
-
-
-
-
-
-
-
-

Hierarchy

- -
-
-
-

A Node is a Part that may connect to other nodes with Links, - or that may be a member of a Group.

-

Group inherits from Node, - enabling nodes to logically contain other nodes and links.

-

- For a more general discussion of how to define nodes, see Introduction to Nodes. -

Although you can create a Node and Diagram.add it to a Diagram, this does not update the Model. - It is more common to create a node by adding a node data object to the model - by calling Model.addNodeData. For example:

-
myDiagram.startTransaction("make new node");
-myDiagram.model.addNodeData({ key: "Omega" });
-myDiagram.commitTransaction("make new node");
+Node | GoJS API
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class Node

Hierarchy

+

A Node is a Part that may connect to other nodes with Links, +or that may be a member of a Group.

+

Group inherits from Node, +enabling nodes to logically contain other nodes and links.

+

+For a more general discussion of how to define nodes, see Introduction to Nodes. + +

Although you can create a Node and Diagram.add it to a Diagram, this does not update the Model. +It is more common to create a node by adding a node data object to the model +by calling Model.addNodeData. For example:

+
myDiagram.startTransaction("make new node");
myDiagram.model.addNodeData({ key: "Omega" });
myDiagram.commitTransaction("make new node");
-

This will cause a Node or simple Part to be created (copying the template found in Diagram.nodeTemplateMap), - added to the Diagram in some Layer (based on Part.layerName), and bound to the node data - (resulting in Panel.data referring to that node data object). - If you do not keep a reference to that JavaScript object, as the above code does not, - you can retrieve it later by calling Model.findNodeDataForKey.

-

It is very common to initialize a Diagram by setting Model.nodeDataArray to a JavaScript Array - of JavaScript objects holding the properties that you need in your model. - Nearly all of the samples do this kind of initialization.

-

You can delete a Node by either calling Diagram.remove or by calling Model.removeNodeData. - The latter obviously will modify the Model; the former does so if the Node was created from model data. - Commands such as CommandHandler.deleteSelection call these methods within a transaction.

-

You can find all of the Links that are connected with a Node by calling findLinksConnected. - Because links normally have a direction, you can find all of the links that have their Link.toNode - be a given Node by calling findLinksInto. - Similarly, you can call findLinksOutOf to find all of the links coming out from a node; - such links have their Link.fromNode be that node. - For tree-structured graphs, use findTreeChildrenLinks or findTreeParentLink.

-

If you are not so interested in the links but are interested in the nodes at the other end of the links - connecting with a node, there are other methods that you can call. - findNodesConnected returns all of the nodes that are at the other end of the links that - connect with a given node. - findNodesInto and findNodesOutOf return the subsets of those nodes considering - only those links that go into or come out of the given node. - For tree-structured graphs, use findTreeChildrenNodes or findTreeParentNode.

-

For example, to operate on the data of all of the destination nodes:

-
var it = somenode.findNodesOutOf();
-while (it.next()) {
-  var child = it.value;
-  if (child.data.text.indexOf("special") >= 0) { ... }
-}
+

This will cause a Node or simple Part to be created (copying the template found in Diagram.nodeTemplateMap), +added to the Diagram in some Layer (based on Part.layerName), and bound to the node data +(resulting in Panel.data referring to that node data object). +If you do not keep a reference to that JavaScript object, as the above code does not, +you can retrieve it later by calling Model.findNodeDataForKey.

+

It is very common to initialize a Diagram by setting Model.nodeDataArray to a JavaScript Array +of JavaScript objects holding the properties that you need in your model. +Nearly all of the samples do this kind of initialization.

+

You can delete a Node by either calling Diagram.remove or by calling Model.removeNodeData. +The latter obviously will modify the Model; the former does so if the Node was created from model data. +Commands such as CommandHandler.deleteSelection call these methods within a transaction.

+

You can find all of the Links that are connected with a Node by calling findLinksConnected. +Because links normally have a direction, you can find all of the links that have their Link.toNode +be a given Node by calling findLinksInto. +Similarly, you can call findLinksOutOf to find all of the links coming out from a node; +such links have their Link.fromNode be that node. +For tree-structured graphs, use findTreeChildrenLinks or findTreeParentLink.

+

If you are not so interested in the links but are interested in the nodes at the other end of the links +connecting with a node, there are other methods that you can call. +findNodesConnected returns all of the nodes that are at the other end of the links that +connect with a given node. +findNodesInto and findNodesOutOf return the subsets of those nodes considering +only those links that go into or come out of the given node. +For tree-structured graphs, use findTreeChildrenNodes or findTreeParentNode.

+

For example, to operate on the data of all of the destination nodes:

+
var it = somenode.findNodesOutOf();
while (it.next()) {
var child = it.value;
if (child.data.text.indexOf("special") >= 0) { ... }
}
-

You can link two nodes by creating a new Link, setting its Link.toNode and Link.fromNode - (in either order), and Diagram.adding it to the diagram. - But it is more common to add a link data object to the Diagram.model by calling GraphLinksModel.addLinkData. - Just creating and adding a Link will not update the model.

-

Thus to add a link when using a GraphLinksModel you should do something like:

-
myDiagram.startTransaction("make new link");
-myDiagram.model.addLinkData({ from: "Alpha", to: "Beta" });
-myDiagram.commitTransaction("make new link");
+

You can link two nodes by creating a new Link, setting its Link.toNode and Link.fromNode +(in either order), and Diagram.adding it to the diagram. +But it is more common to add a link data object to the Diagram.model by calling GraphLinksModel.addLinkData. +Just creating and adding a Link will not update the model.

+

Thus to add a link when using a GraphLinksModel you should do something like:

+
myDiagram.startTransaction("make new link");
myDiagram.model.addLinkData({ from: "Alpha", to: "Beta" });
myDiagram.commitTransaction("make new link");
-

Where you would substitute the keys of the actual nodes that you want to connect with a link. - If you are using a TreeModel, there are no link data objects, so you just need to call - TreeModel.setParentKeyForNodeData to specify the "parent" node's key for a "child" node data.

-

To find a Link given a link data object in the GraphLinksModel, - call Diagram.findLinkForData. When using a TreeModel, call either Diagram.findNodeForData - or Diagram.findNodeForKey to get a Node, and then call findTreeParentLink to get the Link, if any exists.

-

To find a link that connects two nodes, call findLinksTo or findLinksBetween. - With the former method, the direction matters; with the latter method it returns links in either direction.

-

As links connect with a node or are disconnected, you may want to update the appearance of the node. - You can set the linkConnected and linkDisconnected properties to be functions that are called. - These functions must not modify any link relationships -- the properties just exist to update the appearance of the node. - A typical usage would be to change the color or figure of a shape.

-

You can control whether the user may draw a new link or reconnect a link between a pair of Nodes - by affecting the result of LinkingBaseTool.isValidLink. - You can override that predicate on LinkingTool and RelinkingTool, - but it is easier to set the linkValidation or - LinkingBaseTool.linkValidation functional property.

-

- For a more general discussion of validation, see Introduction to Validation. -

Nodes also support the ability to provide logical and physical distinctions in the connection points - that links use at a node. These connection objects are called "ports". - By default the port object will be the whole Node. - However, you can set the GraphObject.portId property on any GraphObject in the visual tree of a node - to cause that element to be treated as a "port". - The "port id" is just a string that ought to be unique amongst all of the port elements in the node.

-

In the case of a node only having a single port, you should set the GraphObject.portId as an empty string. - When there is no such element declared as the default port, it uses the whole node. - You can use the port property to get the only port element.

-

When a node should have multiple ports, - i.e. multiple GraphObjects acting as separate connection points for links, - you should set each port's GraphObject.portId to a string value that is unique for the node. - When there may be multiple ports on a node, you can get a collection of elements representing ports - by using the ports property. - Use the findPort method to find a particular port element by name.

-

Note: the only kind of model that can save port information, i.e. portIds that are not an empty string, - for links is a GraphLinksModel whose GraphLinksModel.linkFromPortIdProperty and - GraphLinksModel.linkToPortIdProperty have been set to name properties on the link data objects.

-

- For a more general discussion of ports, see Introduction to Ports. -

All of the "findLinks..." and "findNodes..." methods mentioned above take an optional port id argument. - When no argument is passed, these methods consider all links connecting with the node. - When a port id argument is provided, these methods only consider links that connect with that port - in the given node. - Thus when navigating through the diagram, you can easily look at all of the nodes that links coming out of - a given node go to. Or you can just look at those nodes at the ends of links coming out of a particular port.

-

You can also control the default connecting behavior of Links at each port. - Because a port can be any GraphObject, they are all properties on GraphObject. - The properties are duplicated so that you can guide the "from" ends of links differently from the "to" ends of links. - The properties include:

- -

The "...Spot" and "...Length" properties control the position and routing of links at a port. - The "...Linkable..." and "...MaxLinks" properties control whether or not users can draw a new link - or reconnect an existing link from or to a port. - (The "...Spot" and "...Length" properties also exist on Link, to override for a particular - link the default values that come from a port element.)

-

- For a more general discussion of link points, see Introduction to Link Connection Points. -

When the graph is tree-structured, you can use several functions for traversing the tree:

- -

Determining whether a tree grows from the root via links that go out to the children or vice-versa - is controlled for the whole diagram by the Diagram.isTreePathToChildren property. - However an individual link will be ignored by the above functions if Link.isTreeLink is false.

-

The Node class also supports the notion of expanding and collapsing a subtree of nodes and links, - causing those nodes and links to be shown or hidden. - Principally this is a matter of setting Node.isTreeExpanded. - Of course if the diagram's graph is not tree-structured, these concepts and properties might not apply.

-

If you want to change the appearance of the node you can do so in a function that you assign to - the treeExpandedChanged property. - This function must not modify any link relationships or expand or collapse any subtrees -- the property just exists - to update the appearance of the node.

-

There is an option for link routing to try to avoid crossing over nodes: - Link.routing = Link.AvoidsNodes. - You can control whether such links should avoid or ignore a node by setting avoidable. - Set avoidableMargin to control the area beyond the GraphObject.actualBounds - where AvoidsNodes links should not go.

-

- For more discussion and examples, see Nodes, - Ports, and - Link Points. -

- For more about trees, see Trees, and - SubTrees. -

- To customize user-resizing behavior, please read - Introduction to the ResizingTool. - To customize user-rotating behavior, please read - Introduction to the RotatingTool. -

Only Nodes that are in Diagrams can have connections via Links. - Templates should not be connected with Links, be labels of Links, be members of Groups, or have any Adornments.

-
-
-
-

Index

-
- -
-
-
-

Constructors

-
- -

- constructor -

- -

Index

Inherited Members

Properties

Methods

Constructors

  • +

    Constructs an empty Node of the given type. Default type is Panel.Position. +The panel type must be one of the enumerated values defined on the Panel class, including: +Panel.Position, Panel.Vertical, Panel.Horizontal, Panel.Table, +Panel.Auto, Panel.Spot, or Panel.Viewbox. The string value such as "Auto" may also be used.

    +

    Usage example:

    +
    // Constructs a Node, sets properties on it,
    // adds a data binding to it,
    // and adds two GraphObjects to the Node:
    const n = new go.Node("Auto", {
    margin: 5,
    background: "red"
    })
    .bind("location", "loc")
    .add(new go.Shape("RoundedRectangle"))
    .add(new go.TextBlock("Some Text"))
    -
    -

    Parameters

    -
      -
    • -
      Optional type: string | PanelLayout
      -
      -

      Panel Type as either a string or PanelLayout. such as "Vertical", "Auto", or Panel.Vertical, Panel.Auto, are accepted. - If not supplied, the default Panel type is "Position".

      -
      -
    • -
    • -
      Optional init: Partial<Node>
      -
      -

      Optional initialization properties.

      -
      -
    • -
    -

    Returns Node

    -
  • -
  • -
    -

    Constructs an empty Panel. Default type is Panel.Position.

    -
    -

    Parameters

    -
      -
    • -
      Optional init: Partial<Node>
      -
      -

      Optional initialization properties.

      -
      -
    • -
    -

    Returns Node

    -
  • -
-
-
-
-

Properties

-
- -

- avoidable - : boolean

- -
-
- -

- avoidableMargin - : MarginLike

-
    -
  • -
    -

    Gets or sets the margin around this Node in which avoidable links will not be routed.

    -

    You may need to increase the fromEndSegmentLength and toEndSegmentLength in - order to prevent link routes from turning within the avoidable area around the Node.

    -

    Value must be of type Margin. - The default margin is Margin(2,2,2,2)

    -
    -
  • -
-
-
- -

- Read-only - isLinkLabel - : boolean

-
    -
  • -
    -

    This read-only property is true when this Node is a label node for a Link.

    -

    If this is true, then n.labeledLink will be a Link and n.labeledLink.isLabeledLink will be true.

    -
    -
    see
    -

    labeledLink

    -
    -
    -
    -
  • -
-
-
- -

- isTreeExpanded - : boolean

-
    -
  • -
    -

    Gets or sets whether the subtree graph starting at this node is expanded. - Changing this property's value will call collapseTree or expandTree, - and also will call the value of treeExpandedChanged if it is a function.

    -

    The initial value is true -- "tree-child" nodes, and the links to them, are shown.

    -

    There is an analogous property for expanded/collapsed Groups: Group.isSubGraphExpanded.

    -
    -
  • -
-
-
- -

- isTreeLeaf - : boolean

-
    -
  • -
    -

    Gets whether this node has no tree children.

    -

    The initial value is true, meaning that there are no links connected with child nodes - in the direction given by Diagram.isTreePathToChildren. - This value changes automatically as link connections are added to or removed from this node. - Links for which Link.isTreeLink is false are ignored.

    -
    -
  • -
-
-
- -

- labeledLink - : Link

-
    -
  • -
    -

    Gets or sets the Link for which this Node is acting as a smart label. - Most nodes do not act as link labels, so this property will be null.

    -

    A template should not be a label node for a link.

    -
    -
    see
    -

    isLinkLabel

    -
    -
    -
    -
  • -
-
-
- -

- linkConnected - : (thisNode: Node, newLink: Link, thisPort: GraphObject) => void

-
    -
  • -
    -

    Gets or sets the function that is called after a Link has been connected with this Node. - It is typically used to modify the appearance of the node. - The first argument will be this Node. - The second argument will be a Link that is now connected with this node. - The third argument will be a GraphObject port indicating which port the link was connected with.

    -

    If the value is a function, that function must not modify what this Node is connected with. - The Link has already been added -- trying to remove it or another link may produce undefined behavior. - However, the other end of the link may not yet have been connected with a node (and might never be), - so you cannot depend on looking at what the link connects with.

    -

    The default value is null -- no function is called.

    -
    -
  • -
-
-
- -

- linkDisconnected - : (thisNode: Node, oldLink: Link, thisPort: GraphObject) => void

-
    -
  • -
    -

    Gets or sets the function that is called after a Link has been disconnected from this Node. - It is typically used to modify the appearance of the node. - The first argument will be this Node. - The second argument will be a Link that had been connected with this node. - The third argument will be a GraphObject port indicating which port the link had been connected with.

    -

    If the value is a function, that function must not modify what this Node is connected with. - The Link has already been removed -- trying to add it or another link may produce undefined behavior. - The other end of the link may not yet have been disconnected from a node (and might never be), - so you cannot depend on looking at what the link connects with.

    -

    The default value is null -- no function is called.

    -
    -
  • -
-
-
- -

- linkValidation - : (fromNode: Node, fromPort: GraphObject, toNode: Node, toPort: GraphObject, link: Link) => boolean

-
    -
  • -
    -

    Gets or sets a predicate that determines whether or not a Link may be connected with this node. - If this is non-null, the predicate is called in addition to the predicate that is LinkingBaseTool.linkValidation - on the LinkingTool and RelinkingTool. - See LinkingBaseTool.isValidLink for more details.

    -

    The default predicate is null, which is equivalent to simply returning true. - The first argument will be the proposed "from" Node (may be null). - The second argument will be the proposed "from" GraphObject port (may be null). - The third argument will be the proposed "to" Node (may be null). - The fourth argument will be the proposed "to" GraphObject port (may be null). - The fifth argument may be null when asking about creating a new link, - or may be a Link when asking about reconnecting an existing link.

    -

    The function, if supplied, must not have any side-effects.

    -
    -
    since
    -

    1.3

    -
    -
    -
    -
  • -
-
-
- -

- Read-only - linksConnected - : Iterator<Link>

-
    -
  • -
    -

    This read-only property returns an iterator over all of the Links that are connected with this node. - This includes both links that are coming out of this node as well as links that are going into this node. - Setting Link.fromNode or Link.toNode to refer to this Node - will add that Link to this collection.

    -

    Use the findLinksConnected, findLinksOutOf, or findLinksInto methods - to get different subsets of the links, depending on direction or depending on connecting to a particular port.

    -

    A template should not have any links connected with it.

    -
    -
  • -
-
-
- -

- Read-only - port - : GraphObject

-
    -
  • -
    -

    This read-only property returns the primary GraphObject representing a port in this node. - If there is a GraphObject whose GraphObject.portId is the empty string, return it. - If there is no such element, just return this whole Node.

    -
    -
  • -
-
-
- -

- portSpreading - : EnumValue

- -
-
- -

- Read-only - ports - : Iterator<GraphObject>

-
    -
  • -
    -

    This read-only property returns an iterator over all of the GraphObjects in this node that act as ports.

    -
    -
  • -
-
-
- -

- treeExpandedChanged - : (thisNode: Node) => void

-
    -
  • -
    -

    Gets or sets the function that is called when isTreeExpanded has changed value. - The argument to that function will be this Node.

    -

    If the value is a function, that function must not expand or collapse any trees of nodes and links. - The Node has already been expanded or collapsed -- trying to change it again may produce undefined behavior.

    -

    The default value is null -- no function is called.

    -
    -
  • -
-
-
- -

- wasTreeExpanded - : boolean

-
    -
  • -
    -

    Gets or sets whether the subtree graph starting at this node - had been collapsed by a call to expandTree on the parent node. - The initial value is false.

    -
    -
    see
    -

    isTreeExpanded

    -
    -
    -
    -
  • -
-
-
-
-

Methods

-
- -

- collapseTree -

-
    -
  • collapseTree(level?: number): void
  • -
-
    -
  • -
    -

    Hide each child node and the connecting link, - and recursively collapse each child node. - This changes the value of Part.isVisible of the whole subtree and the parts owned by - those nodes and links. - However, this root node's visibility is unchanged.

    -

    Links are assumed to go from the parent node to the children nodes, - unless Diagram.isTreePathToChildren is false. - Links for which Link.isTreeLink is false are ignored.

    -

    This sets isTreeExpanded to false on this node and on all of the children nodes. - For those child nodes that were expanded when they were collapsed, - wasTreeExpanded is set to true.

    -

    You can also pass in a number of levels to hide nodes beyond a certain level starting at this node. - If you want to make sure that all nodes are expanded up to a particular level, call expandTree. - If you want to do both, call expandTree before calling collapseTree to - collapse nodes expanded due to the wasTreeExpanded flag.

    -

    This method does not perform a transaction or start any animation. - You may want to call the CommandHandler.collapseTree command, which does perform a transaction - and raise a DiagramEvent.

    -

    To collapse a Group's subgraph of Nodes and Links, use Group.collapseSubGraph.

    -
    -
    see
    -

    expandTree, findTreeParts

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      Optional level: number
      -
      -

      How many levels of the tree, starting at this node, to keep expanded if already expanded; - the default is 1, hiding all tree children of this node. Values less than 1 are treated as 1.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- expandTree -

-
    -
  • expandTree(level?: number): void
  • -
-
    -
  • -
    -

    Show each child node and the connecting link, - and perhaps recursively expand their child nodes. - This may change the value of Part.isVisible of the whole subtree and the parts owned by - those nodes and links. - However, this root node's visibility is unchanged.

    -

    This sets isTreeExpanded to true on this node and on all of the children nodes. - Links are assumed to go from the parent node to the children nodes, - unless Diagram.isTreePathToChildren is false. - Links for which Link.isTreeLink is false are ignored.

    -

    This will expand a tree child node only if its wasTreeExpanded property was true.

    -

    You can also pass in a number of levels in order to be sure that all nodes - starting at this node and up through that number of levels are visible. - If you want to make sure that there are no nodes expanded after a particular level, call collapseTree. - If you want to do both, call expandTree before calling collapseTree to - collapse nodes expanded due to the wasTreeExpanded flag.

    -

    This method does not perform a transaction or start any animation. - You may want to call the CommandHandler.expandTree command, which does perform a transaction - and raise a DiagramEvent.

    -

    To expand a Group's subgraph of Nodes and Links, use Group.expandSubGraph.

    -
    -
    see
    -

    collapseTree, findTreeParts

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      Optional level: number
      -
      -

      How many levels of the tree should be expanded; - the default is 2, showing all tree children of this node and potentially more. - Values less than 2 are treated as 2.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- findCommonTreeParent -

-
    -
  • findCommonTreeParent(other: Node): Node
  • -
-
    -
  • -
    -

    Find the Node that is the perhaps indirect tree parent of both this node and another one, - or this node if it is an ancestor of the other node, or vice-versa.

    -

    If you want to find the Group that contains two Parts, call Part.findCommonContainingGroup.

    -
    -
    see
    -

    findTreeRoot, findTreeParentChain

    -
    -
    since
    -

    1.5

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      other: Node
      -
    • -
    -

    Returns Node

    -

    may be null if in different trees, - or may be itself if the OTHER argument is THIS node, - or may be itself if the OTHER node is a descendant of THIS node, - or may be the OTHER node if THIS node is in the tree of the OTHER node.

    -
  • -
-
-
- -

- findExternalTreeLinksConnected -

- -
    -
  • -
    -

    Return a collection of Links that connect with this Node or any in its subtree, excluding any isTreeLink Links. - For trees this is the analog of Group.findExternalLinksConnected for Groups.

    -
    -
    since
    -

    2.2

    -
    -
    -
    -

    Returns Iterator<Link>

    -
  • -
-
-
- -

- findLinksBetween -

-
    -
  • findLinksBetween(othernode: Node, pid?: string, otherpid?: string): Iterator<Link>
  • -
-
    -
  • -
    -

    Returns an iterator over all of the Links that go from this node to another node or vice-versa, - perhaps limited to a given port id on this node and a port id on the other node.

    -

    If you want all of the links between two nodes in just one direction, use findLinksTo.

    -
    -
    since
    -

    1.2

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      othernode: Node
      -
    • -
    • -
      Optional pid: string
      -
      -

      A port identifier string; if null the link's portId is ignored and all links are included in the search.

      -
      -
    • -
    • -
      Optional otherpid: string
      -
      -

      A port identifier string; if null the link's portId is ignored and all links are included in the search.

      -
      -
    • -
    -

    Returns Iterator<Link>

    -
  • -
-
-
- -

- Virtual - findLinksConnected -

- -
    -
  • -
    -

    Returns an iterator over all of the Links that connect with this node in either direction, - perhaps limited to the given port id on this node.

    -
    -

    Parameters

    -
      -
    • -
      Optional pid: string
      -
      -

      A port identifier string; if null the link's portId is ignored and all links are included in the search.

      -
      -
    • -
    -

    Returns Iterator<Link>

    -
  • -
-
-
- -

- findLinksInto -

- -
    -
  • -
    -

    Returns an iterator over all of the Links that go into this node, - perhaps limited to the given port id on this node.

    -
    -

    Parameters

    -
      -
    • -
      Optional pid: string
      -
      -

      A port identifier string; if null the link's portId is ignored and all links are included in the search.

      -
      -
    • -
    -

    Returns Iterator<Link>

    -
  • -
-
-
- -

- findLinksOutOf -

- -
    -
  • -
    -

    Returns an iterator over all of the Links that come out of this node, - perhaps limited to the given port id on this node.

    -
    -

    Parameters

    -
      -
    • -
      Optional pid: string
      -
      -

      A port identifier string; if null the link's portId is ignored and all links are included in the search.

      -
      -
    • -
    -

    Returns Iterator<Link>

    -
  • -
-
-
- -

- findLinksTo -

-
    -
  • findLinksTo(othernode: Node, pid?: string, otherpid?: string): Iterator<Link>
  • -
-
    -
  • -
    -

    Returns an iterator over all of the Links that go from this node to another node, - perhaps limited to a given port id on this node and a port id on the other node.

    -

    If you want all of the links between two nodes in both directions, use findLinksBetween.

    -
    -
    since
    -

    1.2

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      othernode: Node
      -
    • -
    • -
      Optional pid: string
      -
      -

      A port identifier string; if null the link's portId is ignored and all links are included in the search.

      -
      -
    • -
    • -
      Optional otherpid: string
      -
      -

      A port identifier string; if null the link's portId is ignored and all links are included in the search.

      -
      -
    • -
    -

    Returns Iterator<Link>

    -
  • -
-
-
- -

- findNodesConnected -

- -
    -
  • -
    -

    Returns an iterator over the Nodes that are connected with this node - in either direction, perhaps limited to the given port id on this node.

    -

    The results may include this node itself if there is a reflexive link connecting this node with itself.

    -
    -

    Parameters

    -
      -
    • -
      Optional pid: string
      -
      -

      A port identifier string; if null the link's portId is ignored and all links are included in the search.

      -
      -
    • -
    -

    Returns Iterator<Node>

    -
  • -
-
-
- -

- findNodesInto -

- -
    -
  • -
    -

    Returns an iterator over the Nodes that are connected with this node - by links going into this node, perhaps limited to the given port id on this node.

    -
    -

    Parameters

    -
      -
    • -
      Optional pid: string
      -
      -

      A port identifier string; if null the link's portId is ignored and all links are included in the search.

      -
      -
    • -
    -

    Returns Iterator<Node>

    -
  • -
-
-
- -

- findNodesOutOf -

- -
    -
  • -
    -

    Returns an iterator over the Nodes that are connected with this node - by links coming out of this node, perhaps limited to the given port id on this node.

    -
    -

    Parameters

    -
      -
    • -
      Optional pid: string
      -
      -

      A port identifier string; if null the link's portId is ignored and all links are included in the search.

      -
      -
    • -
    -

    Returns Iterator<Node>

    -
  • -
-
-
- -

- findPort -

- -
    -
  • -
    -

    Find a GraphObject with a given GraphObject.portId. - If no such GraphObject is found, search for one with the empty string as its port identifier. - Finally, when failing to find a port with either the given name or the empty string, - this method returns this whole node itself.

    -
    -

    Parameters

    -
      -
    • -
      pid: string
      -
    • -
    -

    Returns GraphObject

    -
  • -
-
-
- -

- findTreeChildrenLinks -

- - -
-
- -

- findTreeChildrenNodes -

- - -
-
- -

- findTreeLevel -

-
    -
  • findTreeLevel(): number
  • -
- -
-
- -

- findTreeParentChain -

-
    -
  • findTreeParentChain(): Set<Part>
  • -
-
    -
  • -
    -

    Return a collection of Parts including this Node, - its tree parent link and node, and so on up the chain to the root node.

    -

    This calls findTreeParentLink and findTreeParentNode. - Links for which Link.isTreeLink is false are ignored.

    -

    This may result in undefined behavior if there are cycles of Links that are Link.isTreeLink.

    -

    The result will include this node and the "root" node and all nodes and links in between. - The root node is also accessible directly via findTreeRoot. - If any of the nodes are Groups, their member parts are not included.

    -
    -
    see
    -

    findTreeRoot, findTreeParts

    -
    -
    since
    -

    1.7

    -
    -
    -
    -

    Returns Set<Part>

    -

    A Set of Nodes and Links.

    -
  • -
-
-
- -

- findTreeParentLink -

-
    -
  • findTreeParentLink(): Link
  • -
- -
-
- -

- findTreeParentNode -

-
    -
  • findTreeParentNode(): Node
  • -
- -
-
- -

- findTreeParts -

-
    -
  • findTreeParts(level?: number): Set<Part>
  • -
-
    -
  • -
    -

    Return a collection of Parts including this Node, - all of the Links going to child Nodes, and all of their - tree child nodes and links. - Links for which Link.isTreeLink is false are ignored.

    -

    Whether child nodes are found for a parent node by following links out of the parent node or - by links coming into the parent node is determined by the value of Diagram.isTreePathToChildren.

    -

    The result will include this, the "root" node. - If any of the nodes are Groups, their member parts are not included.

    -

    If you want to find the collection of Parts that are contained by a Group, use Group.findSubGraphParts.

    -
    -
    see
    -

    findTreeChildrenNodes, findTreeChildrenLinks, findTreeParentChain

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      Optional level: number
      -
      -

      How many levels of the tree, starting at this node, to include; - the default is Infinity, including all tree children of this node. Values less than 1 are treated as 1.

      -
      -
    • -
    -

    Returns Set<Part>

    -

    A Set of Nodes and Links.

    -
  • -
-
-
- -

- findTreeRoot -

-
    -
  • findTreeRoot(): Node
  • -
- -
-
- -

- Virtual - findVisibleNode -

-
    -
  • findVisibleNode(): Node
  • -
-
    -
  • -
    -

    Starting with this node, walk up the chain of containingGroups to find a node that is visible. - This can be overridden to find a tree-parent/ancestor if the reason that this node - is not visible is because of a collapsed tree rather than a collapsed group.

    -
    -
    since
    -

    2.2

    -
    -
    -
    -

    Returns Node

    -
  • -
-
-
- -

- Virtual - getAvoidableRect -

-
    -
  • getAvoidableRect(result: Rect): Rect
  • -
- -
-
- -

- isInTreeOf -

-
    -
  • isInTreeOf(node: Node): boolean
  • -
-
    -
  • -
    -

    This predicate is true if this node is a child of the given Node, perhaps indirectly as a descendant.

    -

    If this node is a child of the given node according to Diagram.isTreePathToChildren, this returns true. - Otherwise this searches recursively the chain of tree parents of this node, - ignoring links for which Link.isTreeLink is false. - A node cannot be in its own subtree.

    -

    If you what to find out whether this Node is (perhaps indirectly) contained by a Group, use Part.isMemberOf.

    -
    -
    see
    -

    findTreeRoot, findTreeParentChain

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      node: Node
      -
      -

      the Node that might be a parent or ancestor of this node.

      -
      -
    • -
    -

    Returns boolean

    -

    true if the given node is an ancestor of this node, but false otherwise, including false if it is the same node.

    -
  • -
-
-
-
-

Constants

-
- -

- Static - SpreadingEvenly - : EnumValue

-
-

This default value for Node.portSpreading indicates that links connecting with a port - should be distributed evenly along the side(s) indicated by a Spot that is Spot.isSide.

-
-
-
- -

- Static - SpreadingNone - : EnumValue

-
-

This value for Node.portSpreading indicates that links connecting with a port - should all connect at a single point on the side(s) indicated by a Spot that is Spot.isSide.

-
-
-
- -

- Static - SpreadingPacked - : EnumValue

-
-

This value for Node.portSpreading indicates that links connecting with a port - should packed together based on the link's shape's width - on the side(s) indicated by a Spot that is Spot.isSide.

-
-
-
-
- -
-
-
- -
-
- - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/NodeLabelDraggingTool.html b/api/symbols/NodeLabelDraggingTool.html index be10d4972..432e7f297 100644 --- a/api/symbols/NodeLabelDraggingTool.html +++ b/api/symbols/NodeLabelDraggingTool.html @@ -1,452 +1,67 @@ - - - - - - NodeLabelDraggingTool | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class NodeLabelDraggingTool

-
-
-
-
-
-
-
-
-
-

- This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

-
-
-

Hierarchy

-
    -
  • - Tool -
      -
    • - NodeLabelDraggingTool -
    • -
    -
  • -
-
-
-
-

The NodeLabelDraggingTool class lets the user move a label on a Node.

-

This tool only works when the Node has a label (any GraphObject) marked with - { _isNodeLabel: true } that is positioned in a Spot Panel. - It works by modifying that label's GraphObject.alignment property to have an - offset from the center of the panel.

-

If you want to experiment with this extension, try the Node Label Dragging sample.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- -
    -
  • -
    -

    Constructs a NodeLabelDraggingTool and sets the name for the tool.

    -
    -

    Returns NodeLabelDraggingTool

    -
  • -
-
-
-
-

Properties

-
- -

- label - : GraphObject

-
-

The label being dragged.

-
-
-
-
-

Methods

-
- -

- Override - canStart -

-
    -
  • canStart(): boolean
  • -
-
    -
  • -
    -

    This tool can only start if the mouse has moved enough so that it is not a click, - and if the mouse down point is on a GraphObject "label" in a Spot Panel, - as determined by findLabel().

    -
    -

    Returns boolean

    -
  • -
-
-
- -

- Override - doActivate -

-
    -
  • doActivate(): void
  • -
-
    -
  • -
    -

    Start a transaction, call findLabel and remember it as the "label" property, - and remember the original value for the label's GraphObject.alignment property.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doCancel -

-
    -
  • doCancel(): void
  • -
-
    -
  • -
    -

    Restore the label's original value for GraphObject.alignment.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doDeactivate -

-
    -
  • doDeactivate(): void
  • -
-
    -
  • -
    -

    Stop any ongoing transaction.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doMouseMove -

-
    -
  • doMouseMove(): void
  • -
-
    -
  • -
    -

    During the drag, call updateAlignment in order to set the GraphObject.alignment of the label.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doMouseUp -

-
    -
  • doMouseUp(): void
  • -
-
    -
  • -
    -

    At the end of the drag, update the alignment of the label and finish the tool, - completing a transaction.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doStop -

-
    -
  • doStop(): void
  • -
-
    -
  • -
    -

    Clear any reference to a label element.

    -
    -

    Returns void

    -
  • -
-
-
- -

- findLabel -

- -
    -
  • -
    -

    From the GraphObject at the mouse point, search up the visual tree until we get to - an object that has the "_isNodeLabel" property set to true, that is in a Spot Panel, - and that is not the first element of that Panel (i.e. not the main element of the panel).

    -
    -

    Returns GraphObject

    -

    This returns null if no such label is at the mouse down point.

    -
  • -
-
-
- -

- updateAlignment -

-
    -
  • updateAlignment(): void
  • -
-
    -
  • -
    -

    Save the label's GraphObject.alignment as an absolute offset from the center of the Spot Panel - that the label is in.

    -
    -

    Returns void

    -
  • -
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class NodeLabelDraggingTool Extension

This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

Hierarchy

  • Tool
    • NodeLabelDraggingTool
+

The NodeLabelDraggingTool class lets the user move a label on a Node.

+

This tool only works when the Node has a label (any GraphObject) marked with +{ _isNodeLabel: true } that is positioned in a Spot Panel. +It works by modifying that label's GraphObject.alignment property to have an +offset from the center of the panel.

+

If you want to experiment with this extension, try the Node Label Dragging sample.

+

Index

Inherited Members

Constructors

Properties

+

The label being dragged.

+

Methods

  • canStart(): boolean
  • +

    This tool can only start if the mouse has moved enough so that it is not a click, +and if the mouse down point is on a GraphObject "label" in a Spot Panel, +as determined by findLabel().

    +

    Returns boolean

  • doActivate(): void
  • +

    Start a transaction, call findLabel and remember it as the "label" property, +and remember the original value for the label's GraphObject.alignment property.

    +

    Returns void

  • doCancel(): void
  • +

    Restore the label's original value for GraphObject.alignment.

    +

    Returns void

  • doDeactivate(): void
  • +

    Stop any ongoing transaction.

    +

    Returns void

  • doMouseMove(): void
  • +

    During the drag, call updateAlignment in order to set the GraphObject.alignment of the label.

    +

    Returns void

  • doMouseUp(): void
  • +

    At the end of the drag, update the alignment of the label and finish the tool, +completing a transaction.

    +

    Returns void

  • doStop(): void
  • +

    Clear any reference to a label element.

    +

    Returns void

  • +

    From the GraphObject at the mouse point, search up the visual tree until we get to +an object that has the "_isNodeLabel" property set to true, that is in a Spot Panel, +and that is not the first element of that Panel (i.e. not the main element of the panel).

    +

    Returns GraphObject

    This returns null if no such label is at the mouse down point.

    +
  • updateAlignment(): void
  • +

    Save the label's GraphObject.alignment as an absolute offset from the center of the Spot Panel +that the label is in.

    +

    Returns void

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/NonRealtimeDraggingTool.html b/api/symbols/NonRealtimeDraggingTool.html index f33af180b..12ad0b5ff 100644 --- a/api/symbols/NonRealtimeDraggingTool.html +++ b/api/symbols/NonRealtimeDraggingTool.html @@ -1,399 +1,57 @@ - - - - - - NonRealtimeDraggingTool | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class NonRealtimeDraggingTool

-
-
-
-
-
-
-
-
-
-

- This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

-
-
-

Hierarchy

- -
-
-
-

The NonRealtimeDraggingTool class lets the user drag an image instead of actually moving any selected nodes, - until the mouse-up event.

-

If you want to experiment with this extension, try the Non Realtime Dragging sample.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- - -
-
-
-

Properties

-
- -

- duration - : number

-
    -
  • -
    -

    Gets or sets how long the movement animation should be to move the actual parts upon a mouse-up. - The default value is zero -- there is no animation of the movement.

    -
    -
  • -
-
-
-
-

Methods

-
- -

- Override - computeEffectiveCollection -

- -
    -
  • -
    -

    Call the base method, and then make an image of the returned collection, - show it using a Picture, and hold the Picture in a temporary Part, as _imagePart.

    -
    -

    Parameters

    - -

    Returns Map<Part, DraggingInfo>

    -
  • -
-
-
- -

- Override - doActivate -

-
    -
  • doActivate(): void
  • -
-
    -
  • -
    -

    When activated, replace the draggedParts with the ghost dragged parts, which - consists of just one Part, the image, added to the Diagram at the current mouse point.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doDeactivate -

-
    -
  • doDeactivate(): void
  • -
-
    -
  • -
    -

    When deactivated, make sure any image is removed from the Diagram and all references are cleared out.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doKeyDown -

-
    -
  • doKeyDown(): void
  • -
-
    -
  • -
    -

    If the user changes to "copying" mode by holding down the Control key, - return to the regular behavior and remove the image.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doKeyUp -

-
    -
  • doKeyUp(): void
  • -
-
    -
  • -
    -

    If the user changes back to "moving" mode, - show the image again and go back to dragging the ghost dragged parts.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - doMouseUp -

-
    -
  • doMouseUp(): void
  • -
-
    -
  • -
    -

    Do the normal mouse-up behavior, but only after restoring draggedParts.

    -
    -

    Returns void

    -
  • -
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class NonRealtimeDraggingTool Extension

This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

Hierarchy

+

The NonRealtimeDraggingTool class lets the user drag an image instead of actually moving any selected nodes, +until the mouse-up event.

+

If you want to experiment with this extension, try the Non Realtime Dragging sample.

+

Index

Inherited Members

Constructors

Properties

  • +

    Gets or sets how long the movement animation should be to move the actual parts upon a mouse-up. +The default value is zero -- there is no animation of the movement.

    +

Methods

  • +

    Call the base method, and then make an image of the returned collection, +show it using a Picture, and hold the Picture in a temporary Part, as _imagePart.

    +

    Parameters

    Returns Map<Part, DraggingInfo>

  • doActivate(): void
  • +

    When activated, replace the draggedParts with the ghost dragged parts, which +consists of just one Part, the image, added to the Diagram at the current mouse point.

    +

    Returns void

  • doDeactivate(): void
  • +

    When deactivated, make sure any image is removed from the Diagram and all references are cleared out.

    +

    Returns void

  • doKeyDown(): void
  • +

    If the user changes to "copying" mode by holding down the Control key, +return to the regular behavior and remove the image.

    +

    Returns void

  • doKeyUp(): void
  • +

    If the user changes back to "moving" mode, +show the image again and go back to dragging the ghost dragged parts.

    +

    Returns void

  • doMouseUp(): void
  • +

    Do the normal mouse-up behavior, but only after restoring draggedParts.

    +

    Returns void

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/ObjectData.html b/api/symbols/ObjectData.html index 32097dc94..f56bf4772 100644 --- a/api/symbols/ObjectData.html +++ b/api/symbols/ObjectData.html @@ -1,172 +1,34 @@ - - - - - - ObjectData | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Interface ObjectData

-
-
-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - ObjectData -
  • -
-
-
-
-

The ObjectData type is the same as { [index: string]: any; }. - This is to ease writing someDataObject.anyPropertyName, - when dealing with arbitrary JavaScript Objects used as model data.

-
-
-
-

Indexable

-
[index: string]: any
-
-

The ObjectData type is the same as { [index: string]: any; }. - This is to ease writing someDataObject.anyPropertyName, - when dealing with arbitrary JavaScript Objects used as model data.

-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Interface ObjectData

Hierarchy

  • ObjectData
+

The ObjectData type is the same as { [index: string]: any; }. +This is to ease writing someDataObject.anyPropertyName, +when dealing with arbitrary JavaScript Objects used as model data.

+

Indexable

[index: string]: any

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/OrthogonalLinkReshapingTool.html b/api/symbols/OrthogonalLinkReshapingTool.html index 0142b9095..a00444a28 100644 --- a/api/symbols/OrthogonalLinkReshapingTool.html +++ b/api/symbols/OrthogonalLinkReshapingTool.html @@ -1,345 +1,47 @@ - - - - - - OrthogonalLinkReshapingTool | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class OrthogonalLinkReshapingTool

-
-
-
-
-
-
-
-
-
-

- This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

-
-
-

Hierarchy

- -
-
-
-

The OrthogonalLinkReshapingTool class lets a user drag a tool handle along the link segment, which will move the whole segment.

-

If you want to experiment with this extension, try the Orthogonal Link Reshaping sample.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- - -
-
-
-

Methods

-
- -

- Override - doDeactivate -

-
    -
  • doDeactivate(): void
  • -
-
    -
  • -
    -

    This stops the current reshaping operation and updates any link handles.

    -
    -

    Returns void

    -
  • -
-
-
- -

- isApprox -

-
    -
  • isApprox(x: number, y: number): boolean
  • -
-
    -
  • -
    -

    Compare two numbers to ensure they are almost equal. - Used in this class for comparing coordinates of Points.

    -
    -

    Parameters

    -
      -
    • -
      x: number
      -
    • -
    • -
      y: number
      -
    • -
    -

    Returns boolean

    -
  • -
-
-
- -

- makeSegmentDragHandle -

-
    -
  • makeSegmentDragHandle(link: Link, adornment: Adornment, index: number): void
  • -
-
    -
  • -
    -

    Create the segment dragging handles. - There are two parts: one invisible handle that spans the segment, and a visible handle at the middle of the segment. - These are inserted at the front of the adornment such that the normal handles have priority.

    -
    -

    Parameters

    -
      -
    • -
      link: Link
      -
    • -
    • -
      adornment: Adornment
      -
    • -
    • -
      index: number
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- Override - reshape -

-
    -
  • reshape(newpt: Point): void
  • -
-
    -
  • -
    -

    Change the route of the adornedLink by moving the segment corresponding to the current - handle to be at the given Point.

    -
    -

    Parameters

    - -

    Returns void

    -
  • -
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class OrthogonalLinkReshapingTool Extension

This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

Hierarchy

+

The OrthogonalLinkReshapingTool class lets a user drag a tool handle along the link segment, which will move the whole segment.

+

If you want to experiment with this extension, try the Orthogonal Link Reshaping sample.

+

Index

Inherited Members

Constructors

Methods

  • doDeactivate(): void
  • +

    This stops the current reshaping operation and updates any link handles.

    +

    Returns void

  • isApprox(x: number, y: number): boolean
  • +

    Compare two numbers to ensure they are almost equal. +Used in this class for comparing coordinates of Points.

    +

    Parameters

    • x: number
    • y: number

    Returns boolean

  • makeSegmentDragHandle(link: Link, adornment: Adornment, index: number): void
  • +

    Create the segment dragging handles. +There are two parts: one invisible handle that spans the segment, and a visible handle at the middle of the segment. +These are inserted at the front of the adornment such that the normal handles have priority.

    +

    Parameters

    Returns void

  • reshape(newpt: Point): void
  • +

    Change the route of the adornedLink by moving the segment corresponding to the current +handle to be at the given Point.

    +

    Parameters

    Returns void

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Overview.html b/api/symbols/Overview.html index a74ebff42..e6bbc59ca 100644 --- a/api/symbols/Overview.html +++ b/api/symbols/Overview.html @@ -1,372 +1,81 @@ - - - - - - Overview | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class Overview

-
-
-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - Diagram -
      -
    • - Overview -
    • -
    -
  • -
-
-
-
-

An Overview is a Diagram that displays all of a different diagram, - with a rectangular box showing the viewport displayed by that other diagram.

-

- For more discussion, see Introduction to Overviews. - See samples that make use of Overviews in the samples index. -

All you need to do is set Overview.observed. - For example:

-
  var myDiagram = new go.Diagram("myDiagramDIV");
-  . . . other initialization . . .
-
-  // create and initialize the Overview:
-  new go.Overview("myOverviewDIV").observed = myDiagram;
+Overview | GoJS API
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class Overview

Hierarchy

+

An Overview is a Diagram that displays all of a different diagram, +with a rectangular box showing the viewport displayed by that other diagram.

+

+For more discussion, see Introduction to Overviews. +See samples that make use of Overviews in the samples index.

All you need to do is set Overview.observed. +For example:

+
  var myDiagram = new go.Diagram("myDiagramDIV");
. . . other initialization . . .

// create and initialize the Overview:
new go.Overview("myOverviewDIV").observed = myDiagram;
-

The Overview draws what the observed Diagram is displaying, - so setting or modifying any diagram templates or template Maps has no effect.

-

Animations are not shown in an Overview.

-

At the current time methods such as Diagram.makeImage, - Diagram.makeImageData and Diagram.makeSvg do not work on Overviews.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- -
    -
  • -

    Parameters

    -
      -
    • -
      Optional div: string | Element
      -
      -

      A reference to a DIV HTML element or its ID as a string. - If no DIV is supplied, an Overview will be created in memory. The Overviews's Diagram.div property - can then be set later on.

      -
      -
    • -
    • -
      Optional init: Partial<Overview>
      -
      -

      Optional initialization properties.

      -
      -
    • -
    -

    Returns Overview

    -
  • -
  • -

    Parameters

    -
      -
    • -
      Optional init: Partial<Overview>
      -
      -

      Optional initialization properties.

      -
      -
    • -
    -

    Returns Overview

    -
  • -
-
-
-
-

Properties

-
- -

- box - : Part

-
    -
  • -
    -

    Gets or sets the rectangular Part that represents the - viewport of the observed Diagram. - By default the part contains only a magenta Shape. - The box's Part.selectionObject is what is resized by the Overview to the apparent size of the observed diagram's viewport.

    -
    -
  • -
-
-
- -

- drawsGrid - : boolean

-
    -
  • -
    -

    Gets or sets whether this overview draws the Diagram.grid of the observed Diagram, - if it is visible. The default value is true.

    -

    This property is only considered when drawsTemporaryLayers is true. - Setting this to false may help improve drawing performance.

    -

    Setting this property does not notify about any changed event.

    -
    -
    since
    -

    2.2

    -
    -
    -
    -
  • -
-
-
- -

- drawsTemporaryLayers - : boolean

-
    -
  • -
    -

    Gets or sets whether this overview draws the temporary layers of the observed Diagram. - The default value is true. - Setting this property to false may improve drawing performance, - especially if the Diagram.grid is visible.

    -

    Setting this property does not notify about any changed event.

    -
    -
    since
    -

    1.2

    -
    -
    -
    -
  • -
-
-
- -

- observed - : Diagram

-
    -
  • -
    -

    Gets or sets the Diagram for which this Overview is - displaying a model and showing its viewport into that model.

    -

    The value must be null or another Diagram, but may not be an Overview.

    -
    -
  • -
-
-
- -

- updateDelay - : number

-
    -
  • -
    -

    Gets or sets how long it waits before updating, in milliseconds. - The default value is zero. - Any new value must be a non-negative number.

    -

    Setting this property does not notify about any changed event.

    -
    -
    since
    -

    2.2

    -
    -
    -
    -
  • -
-
-
-
- -
-
-
- -
-
- - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/OverviewResizingTool.html b/api/symbols/OverviewResizingTool.html index 475da7260..19e5e6460 100644 --- a/api/symbols/OverviewResizingTool.html +++ b/api/symbols/OverviewResizingTool.html @@ -1,259 +1,39 @@ - - - - - - OverviewResizingTool | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class OverviewResizingTool

-
-
-
-
-
-
-
-
-
-

- This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

-
-
-

Hierarchy

- -
-
-
-

The OverviewResizingTool class lets the user resize the box within an overview.

-

If you want to experiment with this extension, try the Overview Resizing sample.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- -
    -
  • -
    -

    Constructs an OverviewResizingTool and sets the name for the tool.

    -
    -

    Returns OverviewResizingTool

    -
  • -
-
-
-
-

Methods

-
- -

- Override - resize -

-
    -
  • resize(newr: Rect): void
  • -
-
    -
  • -
    -

    Overrides ResizingTool.resize to resize the overview box via setting the observed diagram's scale.

    -
    -

    Parameters

    -
      -
    • -
      newr: Rect
      -
      -

      the intended new rectangular bounds the overview box.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class OverviewResizingTool Extension

This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

Hierarchy

+

The OverviewResizingTool class lets the user resize the box within an overview.

+

If you want to experiment with this extension, try the Overview Resizing sample.

+

Index

Constructors

Methods

Inherited Members

Constructors

Methods

  • resize(newr: Rect): void
  • +

    Overrides ResizingTool.resize to resize the overview box via setting the observed diagram's scale.

    +

    Parameters

    • newr: Rect
      +

      the intended new rectangular bounds the overview box.

      +

    Returns void

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/PackedLayout.html b/api/symbols/PackedLayout.html index 29c40835e..a459be7ae 100644 --- a/api/symbols/PackedLayout.html +++ b/api/symbols/PackedLayout.html @@ -1,806 +1,199 @@ - - - - - - PackedLayout | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class PackedLayout

-
-
-
-
-
-
-
-
-
-

- This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

-
-
-

Hierarchy

-
    -
  • - Layout -
      -
    • - PackedLayout -
    • -
    -
  • -
-
-
-
-

Custom layout which attempts to pack nodes as close together as possible - without overlap. Each node is assumed to be either rectangular or - circular (dictated by the hasCircularNodes property). This layout - supports packing nodes into either a rectangle or an ellipse, with the - shape determined by the packShape property and the aspect ratio determined - by either the aspectRatio property or the specified width and height - (depending on the packMode).

-

Nodes with 0 width or height cannot be packed, so they are treated by this - layout as having a width or height of 0.1 instead.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Properties

- -
-
-

Methods

- -
-
-

Constants

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- -
    -
  • -
    -

    Create a minimal layout that only positions Nodes that do not have a location.

    -
    -

    Parameters

    -
      -
    • -
      Optional init: Partial<Layout>
      -
      -

      Optional initialization properties.

      -
      -
    • -
    -

    Returns PackedLayout

    -
  • -
-
-
-
-

Properties

-
- -

- Read-only - actualBounds - : Rect

-
    -
  • -
    -

    This read-only property returns the actual rectangular bounds occupied by the packed nodes. - This property does not take into account any kind of spacing around the packed nodes.

    -

    Note that this property will only return a valid value after a layout has been performed. Before - then, its behavior is undefined.

    -
    -
  • -
-
-
- -

- Read-only - actualSpacing - : number

- -
-
- -

- arrangesToOrigin - : boolean

-
    -
  • -
    -

    Gets or sets whether or not to use the Layout.arrangementOrigin - property when placing nodes.

    -

    The default value is true.

    -
    -
  • -
-
-
- -

- aspectRatio - : number

-
    -
  • -
    -

    Gets or sets the aspect ratio for the shape that nodes will be packed into. - The provided aspect ratio should be a nonzero postive number.

    -

    Note that this only applies if the packMode is - PackedLayout.AspectOnly. Otherwise, the size - will determine the aspect ratio of the packed shape.

    -

    The default value is 1.

    -
    -
  • -
-
-
- -

- comparer - : (a: Node, b: Node) => number

-
    -
  • -
    -

    Gets or sets the comparison function used for sorting nodes.

    -

    By default, the comparison function is set according to the values of sortMode - and sortOrder.

    -

    Whether this comparison function is used is determined by the value of sortMode. - Any value except PackedLayout.None will result in the comparison function being used.

    -
      $(PackedLayout,
    -    {
    -      sortMode: PackedLayout.Area,
    -      comparer: function(na, nb) {
    -        var na = na.data;
    -        var nb = nb.data;
    -        if (da.someProperty < db.someProperty) return -1;
    -        if (da.someProperty > db.someProperty) return 1;
    -        return 0;
    -      }
    -    }
    -  )
    +PackedLayout | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class PackedLayout Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    Custom layout which attempts to pack nodes as close together as possible +without overlap. Each node is assumed to be either rectangular or +circular (dictated by the hasCircularNodes property). This layout +supports packing nodes into either a rectangle or an ellipse, with the +shape determined by the packShape property and the aspect ratio determined +by either the aspectRatio property or the specified width and height +(depending on the packMode).

    +

    Nodes with 0 width or height cannot be packed, so they are treated by this +layout as having a width or height of 0.1 instead.

    +

    Index

    Inherited Members

    Constructors

    • +

      Create a minimal layout that only positions Nodes that do not have a location.

      +

      Parameters

      • Optional init: Partial<Layout>
        +

        Optional initialization properties.

        +

      Returns PackedLayout

    Properties

    • +

      This read-only property returns the actual rectangular bounds occupied by the packed nodes. +This property does not take into account any kind of spacing around the packed nodes.

      +

      Note that this property will only return a valid value after a layout has been performed. Before +then, its behavior is undefined.

      +
    • +

      Gets or sets whether or not to use the Layout.arrangementOrigin +property when placing nodes.

      +

      The default value is true.

      +
    • +

      Gets or sets the aspect ratio for the shape that nodes will be packed into. +The provided aspect ratio should be a nonzero postive number.

      +

      Note that this only applies if the packMode is +PackedLayout.AspectOnly. Otherwise, the size +will determine the aspect ratio of the packed shape.

      +

      The default value is 1.

      +
    • +

      Gets or sets the comparison function used for sorting nodes.

      +

      By default, the comparison function is set according to the values of sortMode +and sortOrder.

      +

      Whether this comparison function is used is determined by the value of sortMode. +Any value except PackedLayout.None will result in the comparison function being used.

      +
        $(PackedLayout,
      {
      sortMode: PackedLayout.Area,
      comparer: function(na, nb) {
      var na = na.data;
      var nb = nb.data;
      if (da.someProperty < db.someProperty) return -1;
      if (da.someProperty > db.someProperty) return 1;
      return 0;
      }
      }
      )
      -
      -
    • -
    -
    -
    - -

    - Read-only - enclosingCircle - : Rect

    -
      -
    • -
      -

      This read-only property returns the smallest enclosing circle around the packed nodes. It makes - use of the hasCircularNodes property to determine whether or not to make - enclosing circle calculations for rectangles or for circles. This property does not take into - account any kind of spacing around the packed nodes. The enclosing circle calculation is - performed the first time this property is retrieved, and then cached to prevent slow accesses - in the future.

      -

      Note that this property will only return a valid value after a layout has been performed. Before - then, its behavior is undefined.

      -

      This property is included as it may be useful for some data visualizations.

      -
      -
    • -
    -
    -
    - -

    - hasCircularNodes - : boolean

    -
      -
    • -
      -

      Gets or sets whether or not to assume that nodes are circular. This changes - the packing algorithm to one that is much more efficient for circular nodes.

      -

      As this algorithm expects circles, it is assumed that if this property is set - to true that the given nodes will all have the same height and width. All - calculations are done using the width of the given nodes, so unexpected results - may occur if the height differs from the width.

      -

      The default value is false.

      -
      -
    • -
    -
    -
    - -

    - packMode - : number

    - -
    -
    - -

    - packShape - : number

    -
      -
    • -
      -

      Gets or sets the shape that nodes will be packed into. Valid values are - PackedLayout.Elliptical, PackedLayout.Rectangular, and - PackedLayout.Spiral.

      -

      In PackedLayout.Spiral mode, nodes are not packed into a particular - shape, but rather packed consecutively one after another in a spiral fashion. - The aspectRatio property is ignored in this mode, and - the size property (if provided) is expected to be square. - If it is not square, the largest dimension given will be used. This mode - currently only works with circular nodes, so setting it cause the assume that - layout to assume that hasCircularNodes is true.

      -

      Note that this property sets only the shape, not the aspect ratio. The aspect - ratio of this shape is determined by either aspectRatio - or size, depending on the packMode.

      -

      When the packMode is PackedLayout.Fit or - PackedLayout.ExpandToFit and this property is set to true, the - layout will attempt to make the diameter of the enclosing circle of the - layout approximately equal to the greater dimension of the given - size property.

      -

      The default value is PackedLayout.Elliptical.

      -
      -
    • -
    -
    -
    - -

    - size - : Size

    -
      -
    • -
      -

      Gets or sets the size for the shape that nodes will be packed into. - To fill the viewport, set a size with a width and height of NaN. Size - values of 0 are considered for layout purposes to instead be 1.

      -

      If the width and height are set to NaN (to fill the viewport), but this - layout has no diagram associated with it, the default value of size will - be used instead.

      -

      Note that this only applies if the packMode is - PackedLayout.Fit or PackedLayout.ExpandToFit.

      -

      The default value is 500x500.

      -
      -
    • -
    -
    -
    - -

    - sortMode - : number

    -
      -
    • -
      -

      Gets or sets the method by which nodes will be sorted before being packed. To change - the order, see sortOrder.

      -

      The default value is PackedLayout.None, in which nodes will not be sorted at all.

      -
      -
    • -
    -
    -
    - -

    - sortOrder - : number

    -
      -
    • -
      -

      Gets or sets the order that nodes will be sorted in before being packed. To change - the sort method, see sortMode.

      -

      The default value is PackedLayout.Descending

      -
      -
    • -
    -
    -
    - -

    - spacing - : number

    -
      -
    • -
      -

      Gets or sets the spacing between nodes. This value can be set to any - real number (a negative spacing will compress nodes together, and a - positive spacing will leave space between them).

      -

      Note that the spacing value is only respected in the PackedLayout.Fit - packMode if it does not cause the layout to grow outside - of the specified bounds. In the PackedLayout.ExpandToFit - packMode, this property does not do anything.

      -

      The default value is 0.

      -
      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - Static Readonly - Spiral - : 2

    -
    -

    Causes nodes to be packed into a spiral shape; this value is used - for packShape.

    -

    The aspectRatio property is ignored in this mode, the - size is expected to be square, and hasCircularNodes - will be assumed 'true'. Please see packShape for more details.

    -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override Virtual - commitLayout -

    -
      -
    • commitLayout(): void
    • -
    -
      -
    • -
      -

      This method is called at the end of doLayout, but - before the layout transaction is committed. It can be overriden and - used to customize layout behavior. By default, the method does nothing.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doLayout -

    - - -
    -
    -
    -

    Constants

    -
    - -

    - Static Readonly - Area - : 22

    -
    -

    Nodes will be sorted by their area; this value is used for sortMode.

    -
    -
    -
    - -

    - Static Readonly - Ascending - : 31

    -
    -

    Nodes will be sorted in ascending order; this value is used for sortOrder.

    -

    Does nothing if sortMode is set to PackedLayout.None.

    -
    -
    -
    - -

    - Static Readonly - AspectOnly - : 10

    -
    -

    Nodes will be packed using the aspectRatio property, with - no size considerations; this value is used for packMode.

    -

    The spacing property will be respected in this mode.

    -
    -
    -
    - -

    - Static Readonly - Descending - : 30

    -
    -

    Nodes will be sorted in descending order; this value is used for sortOrder.

    -

    Does nothing if sortMode is set to PackedLayout.None.

    -
    -
    -
    - -

    - Static Readonly - Elliptical - : 0

    -
    -

    This value for packShape causes nodes to be packed - into an ellipse.

    -

    The aspect ratio of this ellipse is determined by either - aspectRatio or size.

    -
    -
    -
    - -

    - Static Readonly - ExpandToFit - : 12

    -
    -

    Nodes will be either compressed or spaced evenly to fit the given - size; this value is used for packMode.

    -

    The spacing property will not be respected in this mode, and - will not do anything if set.

    -
    -
    -
    - -

    - Static Readonly - Fit - : 11

    -
    -

    Nodes will be compressed if necessary (using negative spacing) to fit the given - size. However, if the size is bigger - than the packed shape (with 0 spacing), it will not expand to fit it. This value - is used for packMode.

    -

    The spacing property will be respected in this mode, but only - if it does not cause the layout to grow larger than the size.

    -
    -
    -
    - -

    - Static Readonly - MaxSide - : 21

    -
    -

    Nodes will be sorted by their maximum side length before packing; this value is - used for sortMode.

    -
    -
    -
    - -

    - Static Readonly - None - : 20

    -
    -

    Nodes will not be sorted before packing; this value is used for sortMode.

    -
    -
    -
    - -

    - Static Readonly - Rectangular - : 1

    -
    -

    Causes nodes to be packed into a rectangle; this value is used for - packShape.

    -

    The aspect ratio of this rectangle is determined by either - aspectRatio or size.

    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Palette.html b/api/symbols/Palette.html index 872bc5dc9..398b9ea57 100644 --- a/api/symbols/Palette.html +++ b/api/symbols/Palette.html @@ -1,257 +1,59 @@ - - - - - - Palette | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class Palette

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - Diagram -
        -
      • - Palette -
      • -
      -
    • -
    -
    -
    -
    -

    Palette extends the Diagram class to allow objects to be dragged and placed onto other Diagrams. - Its Diagram.layout is a GridLayout. - The Palette is Diagram.isReadOnly but to support drag-and-drop its Diagram.allowDragOut is true.

    -

    - For more discussion, see Introduction to Palettes. - See samples that make use of Palettes in the samples index. -

    You can control the order of Parts in the palette in several manners:

    -
      -
    • If you want to keep the order given by myPalette.model.nodeDataArray, - just set myPalette.layout.sorting = go.GridLayout.Forward (GridLayout.sorting).
    • -
    • If you want to sort based on some text string associated with each Part, just bind Part.text.
    • -
    • If you want to sort more generally, set myPalette.layout.comparer (GridLayout.comparer).
    • -
    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -

    Properties

    • +

      For Panels which are elements of Spot Panels: Gets or sets the name +of this Panel's element that should be used as the alignment object instead of this Panel.

      +

      This allows Spot Panels to align objects that are nested in the element tree of its own elements.

      +
      since

      1.7

      +
    • +

      For Table Panels: This read-only property returns the number of columns. +This value is only valid after the Panel has been measured.

      +
    • +

      Gets or sets the optional model data to which this panel is data-bound. +The data must be a JavaScript Object if this is a Part. +The data can be any JavaScript value if this is a Panel created for +an item in an Array that was data-bound by the itemArray property. +The default value is null.

      +

      Setting it to a new value automatically calls updateTargetBindings +in order to assign new values to all of the data-bound GraphObject properties.

      +

      Once you set this property you cannot add, remove, or modify any data bindings +on any of the GraphObjects in the visual tree of this Panel, including on +this panel itself.

      +

      You should not modify this property on a Part that is created automatically +to represent model data, nor on a Panel that is created automatically for a data item +in the containing Panel's Panel.itemArray. +Call Model.removeNodeData and Model.addNodeData if you want to replace +this Part with another one, or call Model.removeArrayItem and Model.insertArrayItem +if you want to replace this Panel with another one.

      +

      Although you might not be able to replace this data value if this Part was created +automatically by the Diagram, you can still modify that data object's properties. +Call the appropriate Model method for changing properties that affect the structure of the diagram. +Call Model.setDataProperty for changing other properties that may be the sources +of Bindings on GraphObject properties that are in the visual tree of this panel/part.

      +
    • +

      Gets or sets the default alignment spot of this Panel, used as +the alignment for an element when its GraphObject.alignment value is Spot.Default. +The default value is Spot.Default, which is interpreted by the Panel in whatever manner seems reasonable, +depending on the Panel type.

      +
    • +

      This read-only property returns an iterator over the collection of the GraphObjects that this panel manages.

      +

      You can change the collection by calling add, insertAt, remove, or removeAt.

      +

      You can also get direct access to individual elements by calling elt.

      +
    • +

      For Graduated Panels: Gets or sets the maximum value represented. +Must be greater than graduatedMin. The default is 100.

      +
      since

      1.7

      +
    • +

      For Graduated Panels: Gets or sets the minimum value represented. +Must be less than graduatedMax. The default is 0.

      +
      since

      1.7

      +
    • +

      For Graduated Panels: This read-only property returns the range of values represented by the Panel.

      +

      For example, a graduatedMin of 25 and graduatedMax of 75 would return 50.

      +
      since

      1.7

      +
    • +

      For Graduated Panels: Gets or sets the base value which is marked with a tick. +The default is 0.

      +
      since

      1.7

      +
    • +

      For Graduated Panels: Gets or sets the difference between two consecutive values marked by ticks. +Must be positive. The default is 10.

      +
      since

      1.7

      +
    • +

      For Grid Panels: Gets or sets the distance between lines. +The units are in local coordinates. +The default is 10x10. Any new width or height must be a positive real number.

      +
    • +

      For Grid Panels: Gets or sets an origin point for the grid cells. +The units are in local coordinates. +The default is (0,0). Any new value must use real numbers.

      +
    • +

      For Spot Panels: Gets or sets whether this Panel's main element clips instead of fills. +The main element will not paint its stroke, if it has any. +This assumes that the main element is a Shape.

      +

      Since 2.2: For Groups: Gets or sets whether this Group's Placeholder clips its member nodes. +For compatibility, if the Group is a Spot Panel, it will not clip its members.

      +

      When this property is true, the Spot panel will size itself to be the intersection of the main element bounds and +all other elements' bounds, rather than the union of these bounds.

      +
      since

      1.7

      +
    • +

      For Horizontal and Vertical Panels: gets or sets whether this Panel arranges its contents from the +typical side (left and top, respectively), or the opposite side (right and bottom, respectively).

      +

      The default value is false.

      +
      since

      1.7

      +
    • +

      Gets or sets a JavaScript Array of values or objects, each of which will be represented +by a Panel as elements in this Panel. +Replacing this array results all of this panel's child objects being replaced with +a copy of the Panel found in itemTemplateMap for each particular +item in the Array.

      +

      Because the software does not receive any notifications when an Array is modified, +any insertions or removals or replacements of data in the Array will not be noticed +unless you call Model.insertArrayItem or Model.removeArrayItem. +You may also reset this property to its current value (the modified Array) or +call updateTargetBindings, if there is a Binding whose target is this property.

      +

      When binding this property, it is commonplace to set Model.copiesArrays and +Model.copiesArrayObjects properties to true, so that when a node is copied, +the item Array and its contents are copied, not shared. +Or more generally, to customize the model's copying processes, you can supply a custom +Model.copyNodeDataFunction and perhaps a GraphLinksModel.copyLinkDataFunction.

      +

      Any JavaScript Object that is in this Array must only appear once in the array +and must not appear in any other Panel.itemArrays. +Use findItemPanelForData to find the data-bound Panel created for an Object in this panel's item Array.

      +

      Non-Object values in an item Array may appear multiple times. +An item Array may be shared by multiple Panels.

      +

      Item Arrays should not be used with Grid Panels or Graduated Panels as they may not have nested Panels.

      +
    • +

      Gets or sets the name of the item data property that returns a string describing that data's category, +or a function that takes an item data object and returns that string; +the default value is the name 'category'. +This is used to distinguish between different +kinds of items in the itemArray.

      +

      The name must not be null. +If the value is an empty string, the category is assumed to be an empty string, +the default category name, for all item data objects. +You must not change this property when the itemArray already has a value.

      +
    • +

      Gets the index of this Panel's data if it was created to represent an item in its containing Panel's Panel.itemArray. +The default value is NaN.

      +

      This is only set internally by code such as rebuildItemElements or Model.insertArrayItem +when building or shifting Panel representing items +in the Panel whose Panel.itemArray was set or bound to an Array of value.

      +

      This property can be used in data bindings within the item template to produce values +that depend on its position in the item Array. +For example:

      +
       $(go.Panel, // the item Panel
      . . .,
      new go.Binding("itemArray", "someProperty"),
      {
      itemTemplate:
      $(go.Panel,
      // set Panel.background to a color based on the Panel.itemIndex
      new go.Binding("background", "itemIndex",
      // using this conversion function
      function(i) { return (i%2 === 0) ? "lightgreen" : "lightyellow"; })
      // bound to this Panel itself, not to the Panel.data item
      .ofObject(),
      $(go.TextBlock, // a trivial item template, just showing some text
      new go.Binding("text")) // sets TextBlock.text = data.text
      )
      }
      )
      -

      The main element of a Spot or Auto or Link Panel, or the first TableRow or TableColumn element of a Table Panel - whose isPanelMain property is true, will not have this property set to a number, - because it will not have been created by rebuildItemElements.

      -
      -
      since
      -

      1.4

      -
      -
      -
      -
    • -
    -
    -
    - -

    - itemTemplate - : Panel

    -
      -
    • -
      -

      Gets or sets the default Panel template used as the archetype - for item data that are in itemArray.

      -

      Setting this property just modifies the itemTemplateMap - by replacing the entry named with the empty string. - Any new value must be a Panel but not a Part. - By default this property is null.

      -

      GraphObject.copy when copying a panel will share the itemTemplateMap - between the original panel and the copied panel.

      -
      -
    • -
    -
    -
    - -

    - itemTemplateMap - : Map<string, Panel>

    -
      -
    • -
      -

      Gets or sets a Map mapping template names to Panels. - One of these Panels is copied for each item data that is in the itemArray. - Replacing this map will automatically rebuild all of the elements in this Panel.

      -

      By default this property is null. - All values in the Map must be Panels but not Parts.

      -

      If you modify this Map, by replacing a Panel or by adding or - removing a map entry, you need to explicitly call rebuildItemElements afterwards.

      -

      GraphObject.copy when copying a panel will share the itemTemplateMap - between the original panel and the copied panel.

      -
      -
    • -
    -
    -
    - -

    - leftIndex - : number

    -
      -
    • -
      -

      For Table Panels: Gets or sets the first column that this Panel displays. - The default value is 0.

      -
      -
      see
      -

      topIndex

      -
      -
      -
      -
    • -
    -
    -
    - -

    - padding - : MarginLike

    -
      -
    • -
      -

      Gets or sets the space between this Panel's border and its content. - Unlike GraphObject.margin, padding expands the area inside of the Panel's border. - If this Panel's size is unconstrained, this will increase the size of the panel. - If this Panel's size is constrained, this will decrease the total area - for the Panel elements to arrange themselves.

      -

      Unlike margin, increases in size due to padding are visually covered by the GraphObject.background.

      -

      Padding cannot contain negative numbers. - The default value is a Margin of zero.

      -
      -
      see
      -

      GraphObject.margin

      -
      -
      -
      -
    • -
    -
    -
    - -

    - Read-only - rowCount - : number

    -
      -
    • -
      -

      For Table Panels: This read-only property returns the number of rows. - This value is only valid after the Panel has been measured.

      -
      -
    • -
    -
    -
    - -

    - rowSizing - : EnumValue

    - -
    -
    - -

    - topIndex - : number

    -
      -
    • -
      -

      For Table Panels: Gets or sets the first row that this Panel displays. - The default value is 0.

      -
      -
      see
      -

      leftIndex

      -
      -
      -
      -
    • -
    -
    -
    - -

    - type - : PanelLayout

    - -
    -
    - -

    - viewboxStretch - : EnumValue

    - -
    -
    -
    -

    Methods

    -
    - -

    - add -

    - -
      -
    • -
      -

      Adds a number of GraphObjects to the end of this Panel's list of elements, visually in front of all of the other elements.

      -

      If the element to be added is already in this Panel's list of elements, - the object is moved to the end of the list. - You cannot add a GraphObject to a Panel if that GraphObject is already in a different Panel.

      -
      -

      Parameters

      -
        -
      • -
        Rest ...elements: GraphObject[]
        -
        -

        Any number of GraphObjects.

        -
        -
      • -
      -

      Returns Panel

      -

      this Panel

      -
    • -
    -
    -
    - -

    - Override - copy -

    - -
      -
    • -
      -

      Creates a deep copy of this Panel and returns it.

      -
      -

      Returns Panel

      -
    • -
    -
    -
    - -

    - copyTemplate -

    -
      -
    • copyTemplate(freeze?: boolean): Panel
    • -
    -
      -
    • -
      -

      Make a deep copy of this Panel and allow it to be used as a template. - This makes copies of Bindings, unlike the regular copy() method. - Pass true as the argument in order to freeze the Bindings, - allowing it to operate efficiently as a template. - A false value (which is the default) allows further additions/modifications - of the bindings in the copied Panel.

      -
      -
      since
      -

      2.2

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        Optional freeze: boolean
        -
        -

        whether to freeze the Bindings in the copy; default is false

        -
        -
      • -
      -

      Returns Panel

      -
    • -
    -
    -
    - -

    - Static - definePanelLayout -

    -
      -
    • definePanelLayout(layoutName: string, layout: PanelLayout): void
    • -
    -
      -
    • -
      -

      Register a PanelLayout. This is called when making new Panel types. - See the PanelLayout sample for an example.

      -
      -
      since
      -

      2.0

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        layoutName: string
        -
        -

        Panel name

        -
        -
      • -
      • -
        layout: PanelLayout
        -
        -

        instance of the PanelLayout

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - elt -

    - -
      -
    • -
      -

      Returns the GraphObject in this Panel's list of elements at the specified index.

      -
      -

      Parameters

      -
        -
      • -
        idx: number
        -
      • -
      -

      Returns GraphObject

      -
    • -
    -
    -
    - -

    - findColumnForLocalX -

    -
      -
    • findColumnForLocalX(x: number): number
    • -
    -
      -
    • -
      -

      For Table Panels: Returns the cell at a given x-coordinate in local coordinates. - Call GraphObject.getLocalPoint to convert a Point in document coordinates into - a Point in local coordinates.

      -
      -
      see
      -

      findRowForLocalY

      -
      -
      since
      -

      1.2

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        x: number
        -
      • -
      -

      Returns number

      -

      a zero-based integer

      -
    • -
    -
    -
    - -

    - findItemPanelForData -

    - -
      -
    • -
      -

      Return the Panel that was made for a particular data object in this panel's itemArray. - If this returns a Panel, its data property will be the argument data object, - and its containing GraphObject.panel will be this panel.

      -
      -
      since
      -

      1.6

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        data: ObjectData
        -
        -

        must be an Object, not a string or a number or a boolean or a function

        -
        -
      • -
      -

      Returns Panel

      -

      or null if not found

      -
    • -
    -
    -
    - -

    - findMainElement -

    - -
      -
    • -
      -

      Return an immediate child element whose GraphObject.isPanelMain is true, - or else just return the first child element.

      -
      -
      since
      -

      1.5

      -
      -
      -
      -

      Returns GraphObject

      -

      this may return null if there are no child elements

      -
    • -
    -
    -
    - -

    - findObject -

    - -
      -
    • -
      -

      Search the visual tree starting at this Panel for a GraphObject - whose GraphObject.name is the given name.

      -

      This does not recurse into the elements inside a Panel that holds elements for an itemArray.

      -
      -

      Parameters

      -
        -
      • -
        name: string
        -
        -

        The name to search for, using a case-sensitive string comparison.

        -
        -
      • -
      -

      Returns GraphObject

      -

      If no such named object can be found, this returns null.

      -
    • -
    -
    -
    - -

    - findRowForLocalY -

    -
      -
    • findRowForLocalY(y: number): number
    • -
    -
      -
    • -
      -

      For Table Panels: Returns the row at a given y-coordinate in local coordinates. - Call GraphObject.getLocalPoint to convert a Point in document coordinates into - a Point in local coordinates.

      -
      -
      see
      -

      findColumnForLocalX

      -
      -
      since
      -

      1.2

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        y: number
        -
      • -
      -

      Returns number

      -

      a zero-based integer

      -
    • -
    -
    -
    - -

    - Virtual - getColumnDefinition -

    - -
      -
    • -
      -

      For Table Panels: Gets the RowColumnDefinition for a particular column. - If you ask for the definition of a column at or beyond the columnCount, - it will automatically create one and return it.

      -

      If this Panel is not a Table Panel, this method returns null.

      -
      -

      Parameters

      -
        -
      • -
        idx: number
        -
        -

        the non-negative zero-based integer column index.

        -
        -
      • -
      -

      Returns RowColumnDefinition

      -
    • -
    -
    -
    - -

    - Virtual - getRowDefinition -

    - -
      -
    • -
      -

      For Table Panels: Gets the RowColumnDefinition for a particular row. - If you ask for the definition of a row at or beyond the rowCount, - it will automatically create one and return it.

      -

      If this Panel is not a Table Panel, this method returns null.

      -
      -

      Parameters

      -
        -
      • -
        idx: number
        -
        -

        the non-negative zero-based integer row index.

        -
        -
      • -
      -

      Returns RowColumnDefinition

      -
    • -
    -
    -
    - -

    - graduatedPointForValue -

    -
      -
    • graduatedPointForValue(val: number, result?: Point): Point
    • -
    -
      -
    • -
      -

      For Graduated Panels: Returns the point that corresponds with a value, in the panel's coordinates.

      -

      If the value provided is not within the graduatedMin and graduatedMax, - it will be constrained to within those values.

      -

      If this Panel is not a Graduated Panel, this method returns Point(NaN, NaN).

      -
      -
      see
      -

      graduatedValueForPoint

      -
      -
      since
      -

      1.7

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        val: number
        -
        -

        a value between graduatedMin and graduatedMax

        -
        -
      • -
      • -
        Optional result: Point
        -
        -

        an optional Point that is modified and returned

        -
        -
      • -
      -

      Returns Point

      -
    • -
    -
    -
    - -

    - graduatedValueForPoint -

    -
      -
    • graduatedValueForPoint(pt: Point): number
    • -
    -
      -
    • -
      -

      For Graduated Panels: Returns the value that corresponds with the given Point. - The Point must be in the panel's coordinates. - The value returned will be in the Graduated Panel's range.

      -

      If this Panel is not a Graduated Panel, this method returns NaN.

      -
      -
      see
      -

      graduatedPointForValue

      -
      -
      since
      -

      1.7

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        pt: Point
        -
        -

        a Point in the Graduated Panel's coordinates

        -
        -
      • -
      -

      Returns number

      -
    • -
    -
    -
    - -

    - insertAt -

    -
      -
    • insertAt(index: number, element: GraphObject): void
    • -
    -
      -
    • -
      -

      Adds a GraphObject to the Panel's list of elements at the specified index.

      -

      If the element to be added is already in this Panel's list of elements, - the object is moved to the specified index. - You cannot add a GraphObject to a Panel that if that GraphObject is already in a different Panel.

      -
      -

      Parameters

      -
        -
      • -
        index: number
        -
      • -
      • -
        element: GraphObject
        -
        -

        A GraphObject.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - rebuildItemElements -

    -
      -
    • rebuildItemElements(): void
    • -
    -
      -
    • -
      -

      Create and add new GraphObjects corresponding to and bound to the data in the itemArray, - after removing all existing elements from this Panel. - This method is automatically called when replacing the itemArray value, - or when changing the value of itemTemplate or itemTemplateMap.

      -

      This uses itemCategoryProperty to determine the category for an item data. - That string is used to look up a template in itemTemplateMap. - The resulting template (which is also a Panel) is copied, added to this panel, - and its itemIndex is set to its index in that Array. - That new child Panel is then data-bound to that Array item by setting its data.

      -

      If itemArray is null, this method just removes all elements from this panel. - Actually, if this Panel type is "Spot", "Auto", or "Link", the very first element - is always kept by this method. - Also, if this Panel type is "Table", and if the first element is a "TableRow" or "TableColumn" Panel - whose isPanelMain property is set to true, that first element will be kept too. - That is useful for defining literal TableRow headers in Table panels, when the header information - is not kept as the first item in the itemArray.

      -

      It is wasteful to call this method after making some model data changes. - It is better to call Model.setDataProperty, Model.addArrayItem, - Model.insertArrayItem, or Model.removeArrayItem, or other model methods. - Not only do those methods update efficiently, they also preserve unbound state and support undo/redo.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - remove -

    - -
      -
    • -
      -

      Removes a GraphObject from this Panel's list of elements.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - removeAt -

    -
      -
    • removeAt(idx: number): void
    • -
    -
      -
    • -
      -

      Removes an GraphObject from this Panel's list of elements at the specified index.

      -
      -

      Parameters

      -
        -
      • -
        idx: number
        -
        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - removeColumnDefinition -

    -
      -
    • removeColumnDefinition(idx: number): void
    • -
    -
      -
    • -
      -

      For Table Panels: Removes the RowColumnDefinition for a particular row.

      -

      If this Panel is not a Table Panel, this method does nothing.

      -
      -

      Parameters

      -
        -
      • -
        idx: number
        -
        -

        the non-negative zero-based integer row index.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - removeRowDefinition -

    -
      -
    • removeRowDefinition(idx: number): void
    • -
    -
      -
    • -
      -

      For Table Panels: Removes the RowColumnDefinition for a particular row.

      -

      If this Panel is not a Table Panel, this method does nothing.

      -
      -

      Parameters

      -
        -
      • -
        idx: number
        -
        -

        the non-negative zero-based integer row index.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - updateTargetBindings -

    -
      -
    • updateTargetBindings(srcprop?: string): void
    • -
    -
      -
    • -
      -

      Re-evaluate all data bindings on this panel, - in order to assign new property values to the GraphObjects in this visual tree - based on this object's data property values.

      -

      It is better to call Model.setDataProperty to modify data properties, - because that will both record changes for undo/redo and will update all bindings - that may depend on that property.

      -

      This method does nothing if data is null.

      -
      -
      see
      -

      Model.updateTargetBindings

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        Optional srcprop: string
        -
        -

        An optional source data property name: - when provided, only evaluates those Bindings that use that particular property; - when not provided or when it is the empty string, all bindings are evaluated.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    -

    Constants

    -
    - -

    - Static - Auto - : PanelLayout

    -
      -
    • -
      -

      This value for type resizes the main element to fit around the other elements; - the main element is the first GraphObject with GraphObject.isPanelMain set to true, - or else the first GraphObject if none have that property set to true.

      -
      -
    • -
    -
    -
    - -

    - Static - Graduated - : PanelLayout

    -
      -
    • -
      -

      This value for type is used to draw regular tick marks and labels along some shape. - The main element is the first GraphObject with GraphObject.isPanelMain set to true, - or else the first GraphObject if none have that property set to true.

      -
      -
      since
      -

      1.7

      -
      -
      -
      -
    • -
    -
    -
    - -

    - Static - Grid - : PanelLayout

    -
      -
    • -
      -

      This value for type is used to draw regular patterns of lines.

      -
      -
    • -
    -
    -
    - -

    - Static Override - Horizontal - : PanelLayout

    -
      -
    • -
      -

      This value for type lays out the elements horizontally with - their GraphObject.alignment property dictating their alignment on the Y-axis.

      -
      -
    • -
    -
    -
    - -

    - Static - Link - : PanelLayout

    -
      -
    • -
      -

      This value for type is used for Links and adornments that act as Links.

      -
      -
    • -
    -
    -
    - -

    - Static - Position - : PanelLayout

    - -
    -
    - -

    - Static - Spot - : PanelLayout

    - -
    -
    - -

    - Static - Table - : PanelLayout

    - -
    -
    - -

    - Static - TableColumn - : PanelLayout

    -
      -
    • -
      -

      Organizational Panel type that is only valid inside of a Table panel; - This Panel ignores its angle and scale, and does not have a meaningful size on its own, - it is only an organizational container for other elements of a Panel.

      -
      -
      since
      -

      1.1

      -
      -
      -
      -
    • -
    -
    -
    - -

    - Static - TableRow - : PanelLayout

    -
      -
    • -
      -

      Organizational Panel type that is only valid inside of a Table panel; - This Panel ignores its angle and scale, and does not have a meaningful size on its own, - it is only an organizational container for other elements of a Panel.

      -
      -
      since
      -

      1.1

      -
      -
      -
      -
    • -
    -
    -
    - -

    - Static Override - Vertical - : PanelLayout

    -
      -
    • -
      -

      This value for type lays out the elements vertically with - their GraphObject.alignment property dictating their alignment on the X-axis.

      -
      -
    • -
    -
    -
    - -

    - Static - Viewbox - : PanelLayout

    -
      -
    • -
      -

      This value for type rescales a single GraphObject to fit inside the panel - depending on the panel's Panel.viewboxStretch property.

      -
      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/PanelLayout.html b/api/symbols/PanelLayout.html index 0f08dd187..c12e7d861 100644 --- a/api/symbols/PanelLayout.html +++ b/api/symbols/PanelLayout.html @@ -1,574 +1,163 @@ - - - - - - PanelLayout | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class PanelLayout

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    This is the abstract base class for all Panel Layouts, which inform the possible Panel types. - It is possible to create your own Panel type by creating a subclass of PanelLayout, - though this is not common and not recommended for beginners.

    -

    By default, GoJS has 12 Panel types, each corresponding to a PanelLayout subclass:

    -
      -
    • 'Position', PanelLayoutPosition
    • -
    • 'Horizontal', PanelLayoutHorizontal
    • -
    • 'Vertical', PanelLayoutVertical
    • -
    • 'Spot', PanelLayoutSpot
    • -
    • 'Auto', PanelLayoutAuto
    • -
    • 'Table', PanelLayoutTable
    • -
    • 'Viewbox', PanelLayoutViewbox
    • -
    • 'TableRow', PanelLayoutTableRow
    • -
    • 'TableColumn', PanelLayoutTableColumn
    • -
    • 'Link', PanelLayoutLink
    • -
    • 'Grid', PanelLayoutGrid
    • -
    • 'Graduated', PanelLayoutGraduated
    • -
    -

    These are included by default in builds of go.js and go-debug.js. - When building from source, you can optionally exclude all of them except Position, - Vertical, Auto, Link, and Grid. - This is demonstrated in minimalSource and maximalSource, in the /projects folder.

    -

    Registering a new PanelLayout is done by calling the static function, Panel.definePanelLayout:

    -
    Panel.definePanelLayout('Table', new PanelLayoutCustom());
    +PanelLayout | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class PanelLayout Abstract

    Hierarchy

    +

    This is the abstract base class for all Panel Layouts, which inform the possible Panel types. +It is possible to create your own Panel type by creating a subclass of PanelLayout, +though this is not common and not recommended for beginners.

    +

    By default, GoJS has 12 Panel types, each corresponding to a PanelLayout subclass:

    +
      +
    • 'Position', PanelLayoutPosition
    • +
    • 'Horizontal', PanelLayoutHorizontal
    • +
    • 'Vertical', PanelLayoutVertical
    • +
    • 'Spot', PanelLayoutSpot
    • +
    • 'Auto', PanelLayoutAuto
    • +
    • 'Table', PanelLayoutTable
    • +
    • 'Viewbox', PanelLayoutViewbox
    • +
    • 'TableRow', PanelLayoutTableRow
    • +
    • 'TableColumn', PanelLayoutTableColumn
    • +
    • 'Link', PanelLayoutLink
    • +
    • 'Grid', PanelLayoutGrid
    • +
    • 'Graduated', PanelLayoutGraduated
    • +
    +

    These are included by default in builds of go.js and go-debug.js. +When building from source, you can optionally exclude all of them except Position, +Vertical, Auto, Link, and Grid. +This is demonstrated in minimalSource and maximalSource, in the /projects folder.

    +

    Registering a new PanelLayout is done by calling the static function, Panel.definePanelLayout:

    +
    Panel.definePanelLayout('Table', new PanelLayoutCustom());
     
    -

    Each PanelLayout must define a measure and arrange method. - The measure method must call measureElement with each element of the Panel, - which sets each element's GraphObject.measuredBounds. These bounds can be used to determine object layout. - The arrange method must call arrangeElement with each element of the Panel to position the objects relative to the Panel. - Remember that each Panel defines its own coordinate system, which is used for sizing and positioning of the panel's elements.

    -

    There is an example PanelLayout in the PanelLayout sample. - There is a Flow PanelLayout extension at PanelLayoutFlow, demonstrated at - Flow PanelLayout sample.

    -
    -
    since
    -

    2.0

    -
    -
    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      This class is abstract. Define your own subclass if you want to implement a custom panel layout.

      -
      -

      Returns PanelLayout

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - name - : string

    -
      -
    • -
      -

      Gets or sets the name of this instance of a particular panel layout.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Virtual - arrange -

    - -
      -
    • -
      -

      After measuring, a Panel must arrange each element, giving the elements a position and size in the Panel's coordinate system. - This must call arrangeElement with each Panel element, which will set that element's GraphObject.actualBounds.

      -

      For arranging some elements, it is useful to know the total unioned area of every element, which is given as the union argument. - This Rect can be used to right-align or center-align, etc, elements within an area.

      -

      For example, PanelLayoutHorizontal arranges each element sequentially, starting with an x value of 0, - and increasing it by each previous element's GraphObject.measuredBounds width. - The horizontal Panel arranges each element with a y value determined by the union argument's height - considering the GraphObject.alignment of the element, and the GraphObject's own measuredBounds.height.

      -
      -

      Parameters

      -
        -
      • -
        panel: Panel
        -
        -

        Panel which called this layout

        -
        -
      • -
      • -
        elements: GraphObject[]
        -
        -

        Array of Panel elements

        -
        -
      • -
      • -
        union: Rect
        -
        -

        rectangle, if properly constructed in measure, that contains the expected union bounds of every element in the Panel.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Protected - arrangeElement -

    -
      -
    • arrangeElement(obj: GraphObject, x: number, y: number, width: number, height: number, clipRect?: Rect): void
    • -
    -
      -
    • -
      -

      Arranges the GraphObject onto its parent Panel. - The passed-in numbers typically account for GraphObject.margin and other offsets. - The x and y coordinates are where GraphObjects will be placed within the Panel's own coordinates - (from the Panel's top-left corner). The width and height are the size it will take up within the Panel's coordinates.

      -

      This sets the GraphObject.actualBounds of the obj.

      -
      -

      Parameters

      -
        -
      • -
        obj: GraphObject
        -
        -

        GraphObject to be arranged.

        -
        -
      • -
      • -
        x: number
        -
        -

        The final x value of actualBounds that the Panel computes for the GraphObject.

        -
        -
      • -
      • -
        y: number
        -
        -

        The final y value of actualBounds that the Panel computes for the GraphObject.

        -
        -
      • -
      • -
        width: number
        -
        -

        The final width value of actualBounds that the Panel computes for the GraphObject.

        -
        -
      • -
      • -
        height: number
        -
        -

        The final height value of actualBounds that the Panel computes for the GraphObject.

        -
        -
      • -
      • -
        Optional clipRect: Rect
        -
        -

        an optional area to constrain this actualBounds to when picking and drawing. - By default, this is only used with Table Panel elements, which are clipped to their cell sizes.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - measure -

    -
      -
    • measure(panel: Panel, width: number, height: number, elements: GraphObject[], union: Rect, minw: number, minh: number): void
    • -
    -
      -
    • -
      -

      Given the available size, measure the Panel and - determine its expected drawing size.

      -

      This must call measureElement with each Panel element, which will set the - GraphObject.measuredBounds of those elements. Depending on how the Panel intends to lay out its elements, - the programmer must construction the union by setting union.width and union.height of the supplied argument. - For example PanelLayoutHorizontal measures its elements and sums their widths to set its union.width, - and takes the maximum of their heights to set its union.height.

      -

      This union must reflect the measured size of the Panel. After measure is called, the Panel class will modify this union Rect, - constraining its size by the Panel's GraphObject.desiredSize, GraphObject.minSize, and GraphObject.maxSize, - before passing it to arrange.

      -
      -

      Parameters

      -
        -
      • -
        panel: Panel
        -
        -

        Panel which called this layout

        -
        -
      • -
      • -
        width: number
        -
        -

        expected width of the Panel, informed by any containing Panel and by the Panel's own - GraphObject.desiredSize, GraphObject.minSize, and GraphObject.maxSize. - Often Infinity.

        -
        -
      • -
      • -
        height: number
        -
        -

        expected height of the Panel.

        -
        -
      • -
      • -
        elements: GraphObject[]
        -
        -

        Array of Panel elements

        -
        -
      • -
      • -
        union: Rect
        -
        -

        rectangle to be modified to contain the expected union bounds of every element in the Panel, - to be potentially used in arrange.

        -
        -
      • -
      • -
        minw: number
        -
        -

        expected minimum width of the Panel, informed by any containing Panel. Often zero.

        -
        -
      • -
      • -
        minh: number
        -
        -

        expected minimum height of the Panel.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Protected - measureElement -

    -
      -
    • measureElement(obj: GraphObject, width: number, height: number, minw: number, minh: number): void
    • -
    -
      -
    • -
      -

      Given the available size, measure one element of the Panel and - determine its expected drawing size. This sets the GraphObject.measuredBounds of the object, - which can then be used to determine the arrangement of objects in the PanelLayout.

      -
      -

      Parameters

      -
        -
      • -
        obj: GraphObject
        -
        -

        Panel which called this layout

        -
        -
      • -
      • -
        width: number
        -
        -

        expected width of the GraphObject

        -
        -
      • -
      • -
        height: number
        -
        -

        expected height of the GraphObject

        -
        -
      • -
      • -
        minw: number
        -
        -

        minimum width of the GraphObject

        -
        -
      • -
      • -
        minh: number
        -
        -

        minimum height of the GraphObject

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - remeasureObject -

    - -
      -
    • -
      -

      Uncommon: Force a given GraphObject to remeasure in the near future. - If a PanelLayout is not just measuring elements, but must also modify some of its elements, - this must be called on those elements before modifications are made. - This prevents the elements from potentially remeasuring - the entire visual tree, which would cause an infinite loop.

      -

      Normally, panels do not modify the dimensions of their elements. In other words, a Panel - would not normally set a property like GraphObject.desiredSize or TextBlock.text - or Shape.geometry on any of its elements. Some custom panels may wish to do this, - especially if the programmer knows it will not affect the size of any containing Panel.

      -

      Calling this method before changing a property preempts the remeasuring of any containing Panels, - ensuring only the GraphObject and its own child elements will be remeasured.

      -

      This is used in PanelLayout "Viewbox" on its one element. - It modifies that element's GraphObject.scale and is certain that will not - affect Panels up the visual tree.

      -
      -
      since
      -

      2.2

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        obj: GraphObject
        -
        -

        GraphObject to be invalidated.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/PanelLayoutFlow.html b/api/symbols/PanelLayoutFlow.html index 6cdbf09b9..32e75f92b 100644 --- a/api/symbols/PanelLayoutFlow.html +++ b/api/symbols/PanelLayoutFlow.html @@ -1,126 +1,7 @@ - - - - - - PanelLayoutFlow | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class PanelLayoutFlow

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    A custom PanelLayout that arranges panel elements in rows or columns. - A typical use might be:

    -
    +PanelLayoutFlow | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class PanelLayoutFlow Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    A custom PanelLayout that arranges panel elements in rows or columns. +A typical use might be:

    +
     $(go.Node,
       ...
       $(go.Panel, "Flow",
    @@ -129,8 +10,8 @@ 

    Hierarchy

    ... )
    -

    A customized use might be:

    -
    +

    A customized use might be:

    +
     $(go.Node,
       ...
       $(go.Panel,
    @@ -139,238 +20,76 @@ 

    Hierarchy

    ) ... ) -
    -

    The direction property determines whether the elements are arranged in rows (if 0 or 180) - or in columns (if 90 or 270).

    -

    Use the spacing property to control how much space there is between elements in a row or column - as well as between rows or columns.

    -

    This layout respects the GraphObject.visible, GraphObject.stretch, - and GraphObject.alignment properties on each element, along with the Panel's - Panel.defaultStretch, Panel.defaultAlignment, and Panel.padding properties.

    -

    If you want to experiment with this extension, try the Flow PanelLayout sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Constructs a PanelLayoutFlow that lays out elements in rows - with no space between the elements or between the rows.

      -
      -

      Returns PanelLayoutFlow

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - direction - : number

    -
      -
    • -
      -

      Gets or sets the initial direction in which elements are laid out. - The value must be 0 or 180, which results in rows, or 90 or 270, which results in columns.

      -

      The default value is 0, resulting in rows that go rightward. - A value of 90 results in columns that go downward.

      -

      Setting this property does not notify about any changed event, - nor does a change in value automatically cause the panel layout to be performed again.

      -
      -
    • -
    -
    -
    - -

    - spacing - : Size

    -
      -
    • -
      -

      Gets or sets the space between adjacent elements in the panel and the space between adjacent rows or columns.

      -

      The default value is (0, 0). The size is in the panel's coordinate system.

      -

      Setting this property does not notify about any changed event, - nor does a change in value automatically cause the panel layout to be performed again.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override - arrange -

    - -
      -
    • -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - measure -

    -
      -
    • measure(panel: Panel, width: number, height: number, elements: GraphObject[], union: Rect, minw: number, minh: number): void
    • -
    -
      -
    • -

      Parameters

      -
        -
      • -
        panel: Panel
        -
      • -
      • -
        width: number
        -
      • -
      • -
        height: number
        -
      • -
      • -
        elements: GraphObject[]
        -
      • -
      • -
        union: Rect
        -
      • -
      • -
        minw: number
        -
      • -
      • -
        minh: number
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/PanningTool.html b/api/symbols/PanningTool.html index ae27549b7..7a5a46efe 100644 --- a/api/symbols/PanningTool.html +++ b/api/symbols/PanningTool.html @@ -1,411 +1,70 @@ - - - - - - PanningTool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class PanningTool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - Tool -
        -
      • - PanningTool -
      • -
      -
    • -
    -
    -
    -
    -

    The PanningTool supports manual panning, where the user can shift the - Diagram.position by dragging the mouse.

    -

    This tool is a standard mouse-move tool, the ToolManager.panningTool. - Although the ToolManager.dragSelectingTool takes precedence over this tool, - the DragSelectingTool only starts if there is a delay after a mouse-down event. - If it does not start, then this PanningTool gets a chance to start.

    -

    This tool does not utilize any Adornments or tool handles. - This tool does not modify the model or conduct any transaction.

    -

    If you want to programmatically "pan" the diagram, you can just set Diagram.position - or call methods such as Diagram.scroll, Diagram.scrollToRect, or Diagram.centerRect.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - bubbles - : boolean

    -
      -
    • -
      -

      Gets or sets whether panning actions will allow - events to bubble instead of panning in the diagram.

      -

      Set this to true to allow mobile devices to scroll the page with panning gestures on the diagram. - Otherwise, the panning events will be captured and used to pan inside of the diagram.

      -

      The default value is false.

      -
      -
    • -
    -
    -
    - -

    - Read-only - originalPosition - : Point

    -
      -
    • -
      -

      This read-only property returns the Point that was the original value of Diagram.position when the panning operation started.

      -
      -
      since
      -

      1.1

      -
      -
      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override Virtual - canStart -

    -
      -
    • canStart(): boolean
    • -
    -
      -
    • -
      -

      This tool can run when the diagram allows scrolling and - the mouse has been dragged with the left button far enough away - from the mouse-down point to avoid being a click.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Override - doActivate -

    -
      -
    • doActivate(): void
    • -
    -
      -
    • -
      -

      Capture the mouse, change the diagram cursor to "move", and remember the Diagram.position.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doCancel -

    -
      -
    • doCancel(): void
    • -
    -
      -
    • -
      -

      Restore the Diagram.position to what it was when this tool activated.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doDeactivate -

    -
      -
    • doDeactivate(): void
    • -
    -
      -
    • -
      -

      Release the mouse and restore the default diagram cursor.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseMove -

    -
      -
    • doMouseMove(): void
    • -
    -
      -
    • -
      -

      Modify the Diagram.position according to how much the mouse has moved.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseUp -

    -
      -
    • doMouseUp(): void
    • -
    -
      -
    • -
      -

      Modify the Diagram.position according to how much the mouse has moved.

      -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class PanningTool

    Hierarchy

    +

    The PanningTool supports manual panning, where the user can shift the +Diagram.position by dragging the mouse.

    +

    This tool is a standard mouse-move tool, the ToolManager.panningTool. +Although the ToolManager.dragSelectingTool takes precedence over this tool, +the DragSelectingTool only starts if there is a delay after a mouse-down event. +If it does not start, then this PanningTool gets a chance to start.

    +

    This tool does not utilize any Adornments or tool handles. +This tool does not modify the model or conduct any transaction.

    +

    If you want to programmatically "pan" the diagram, you can just set Diagram.position +or call methods such as Diagram.scroll, Diagram.scrollToRect, or Diagram.centerRect.

    +

    Index

    Inherited Members

    Constructors

    Properties

    • +

      Gets or sets whether panning actions will allow +events to bubble instead of panning in the diagram.

      +

      Set this to true to allow mobile devices to scroll the page with panning gestures on the diagram. +Otherwise, the panning events will be captured and used to pan inside of the diagram.

      +

      The default value is false.

      +
    • +

      This read-only property returns the Point that was the original value of Diagram.position when the panning operation started.

      +
      since

      1.1

      +

    Methods

    • canStart(): boolean
    • +

      This tool can run when the diagram allows scrolling and +the mouse has been dragged with the left button far enough away +from the mouse-down point to avoid being a click.

      +

      This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns boolean

    • doActivate(): void
    • +

      Capture the mouse, change the diagram cursor to "move", and remember the Diagram.position.

      +

      Returns void

    • doCancel(): void
    • +

      Restore the Diagram.position to what it was when this tool activated.

      +

      Returns void

    • doDeactivate(): void
    • +

      Release the mouse and restore the default diagram cursor.

      +

      Returns void

    • doMouseMove(): void
    • +

      Modify the Diagram.position according to how much the mouse has moved.

      +

      Returns void

    • doMouseUp(): void
    • +

      Modify the Diagram.position according to how much the mouse has moved.

      +

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/ParallelLayout.html b/api/symbols/ParallelLayout.html index ff8a70a0a..80bdc3300 100644 --- a/api/symbols/ParallelLayout.html +++ b/api/symbols/ParallelLayout.html @@ -1,428 +1,71 @@ - - - - - - ParallelLayout | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class ParallelLayout

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    A custom TreeLayout that can be used for laying out stylized flowcharts. - Each layout requires a single "Split" node and a single "Merge" node. - The "Split" node should be the root of a tree-like structure if one excludes links to the "Merge" node. - This will position the "Merge" node to line up with the "Split" node.

    -

    You can set all of the TreeLayout properties that you like, - except that for simplicity this code just works for angle === 0 or angle === 90.

    -

    If you want to experiment with this extension, try the Parallel Layout sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - mergeNode - : Node

    -
      -
    • -
      -

      This read-only property returns the node that the tree will converge at.

      -
      -
    • -
    -
    -
    - -

    - splitNode - : Node

    -
      -
    • -
      -

      This read-only property returns the node that the tree will extend from.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - findSplitMerge -

    - -
      -
    • -
      -

      Find a Split vertex and a Merge vertex for this layout. - This signals an error if there is not exactly one vertex/Node that isSplit - and exactly one vertex/Node that isMerge. - This can be overridden; any override must set splitNode and mergeNode.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - isConditional -

    -
      -
    • isConditional(node: Node): boolean
    • -
    -
      -
    • -
      -

      Overridable predicate for deciding if a Node is a conditional or "If" type of Split Node - expecting to have two links coming out of the sides.

      -
      -

      Parameters

      -
        -
      • -
        node: Node
        -
      • -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - isMerge -

    -
      -
    • isMerge(node: Node): boolean
    • -
    -
      -
    • -
      -

      Overridable predicate for deciding if a Node is a Merge node. - By default this checks the node's Part.category to see if it is - "Merge", "End", "EndFor", "EndWhile", "EndIf", or "EndSwitch".

      -
      -

      Parameters

      -
        -
      • -
        node: Node
        -
      • -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - isSplit -

    -
      -
    • isSplit(node: Node): boolean
    • -
    -
      -
    • -
      -

      Overridable predicate for deciding if a Node is a Split node. - By default this checks the node's Part.category to see if it is - "Split", "Start", "For", "While", "If", or "Switch".

      -
      -

      Parameters

      -
        -
      • -
        node: Node
        -
      • -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - isSwitch -

    -
      -
    • isSwitch(node: Node): boolean
    • -
    -
      -
    • -
      -

      Overridable predicate for deciding if a Node is a "Switch" type of Split Node - expecting to have three links coming out of the bottom/right side.

      -
      -

      Parameters

      -
        -
      • -
        node: Node
        -
      • -
      -

      Returns boolean

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class ParallelLayout Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    A custom TreeLayout that can be used for laying out stylized flowcharts. +Each layout requires a single "Split" node and a single "Merge" node. +The "Split" node should be the root of a tree-like structure if one excludes links to the "Merge" node. +This will position the "Merge" node to line up with the "Split" node.

    +

    You can set all of the TreeLayout properties that you like, +except that for simplicity this code just works for angle === 0 or angle === 90.

    +

    If you want to experiment with this extension, try the Parallel Layout sample.

    +

    Index

    Inherited Members

    Properties

    Methods

    Constructors

    Properties

    • +

      This read-only property returns the node that the tree will converge at.

      +
    • +

      This read-only property returns the node that the tree will extend from.

      +

    Methods

    • +

      Find a Split vertex and a Merge vertex for this layout. +This signals an error if there is not exactly one vertex/Node that isSplit +and exactly one vertex/Node that isMerge. +This can be overridden; any override must set splitNode and mergeNode.

      +

      Parameters

      Returns void

    • isConditional(node: Node): boolean
    • +

      Overridable predicate for deciding if a Node is a conditional or "If" type of Split Node +expecting to have two links coming out of the sides.

      +

      Parameters

      Returns boolean

    • isMerge(node: Node): boolean
    • +

      Overridable predicate for deciding if a Node is a Merge node. +By default this checks the node's Part.category to see if it is +"Merge", "End", "EndFor", "EndWhile", "EndIf", or "EndSwitch".

      +

      Parameters

      Returns boolean

    • isSplit(node: Node): boolean
    • +

      Overridable predicate for deciding if a Node is a Split node. +By default this checks the node's Part.category to see if it is +"Split", "Start", "For", "While", "If", or "Switch".

      +

      Parameters

      Returns boolean

    • isSwitch(node: Node): boolean
    • +

      Overridable predicate for deciding if a Node is a "Switch" type of Split Node +expecting to have three links coming out of the bottom/right side.

      +

      Parameters

      Returns boolean

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/ParallelRouteLink.html b/api/symbols/ParallelRouteLink.html index 8f60c4704..509ec3856 100644 --- a/api/symbols/ParallelRouteLink.html +++ b/api/symbols/ParallelRouteLink.html @@ -1,283 +1,46 @@ - - - - - - ParallelRouteLink | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class ParallelRouteLink

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    This custom Link class customizes its route to go parallel to other links connecting the same ports, - if the link is not orthogonal and is not Bezier curved.

    -

    If you want to experiment with this extension, try the Parallel Route Links sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -

    Index

    Inherited Members

    Properties

    Methods

    Constructors

    • +

      Constructs an empty Part of the given type. Default type is Panel.Position. +The panel type must be one of the enumerated values defined on the Panel class, including: +Panel.Position, Panel.Vertical, Panel.Horizontal, Panel.Table, +Panel.Auto, Panel.Spot, or Panel.Viewbox. The string value such as "Auto" may also be used.

      +

      Usage example:

      +
      // Constructs a Part, sets properties on it,
      // adds a data binding to it,
      // and adds two GraphObjects to the Part:
      const p = new go.Part("Auto", {
      margin: 5,
      background: "red"
      })
      .bind("location", "loc")
      .add(new go.Shape("RoundedRectangle"))
      .add(new go.TextBlock("Some Text"))
      -
      -

      Parameters

      -
        -
      • -
        Optional type: string | PanelLayout
        -
        -

        Panel Type as either a string or PanelLayout. such as "Vertical", "Auto", or Panel.Vertical, Panel.Auto, are accepted. - If not supplied, the default Panel type is "Position".

        -
        -
      • -
      • -
        Optional init: Partial<Part>
        -
        -

        Optional initialization properties.

        -
        -
      • -
      -

      Returns Part

      -
    • -
    • -
      -

      Constructs an empty Panel. Default type is Panel.Position.

      -
      -

      Parameters

      -
        -
      • -
        Optional init: Partial<Part>
        -
        -

        Optional initialization properties.

        -
        -
      • -
      -

      Returns Part

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - Read-only - adornments - : Iterator<Adornment>

    -
      -
    • -
      -

      This read-only property returns an iterator over all of the Adornments associated with this part. - After each call to the iterator's next() method that returns true, - the iterator's key will be the category and the iterator's value will - be an Adornment.

      -

      Templates should not have any adornments.

      -
      -
    • -
    -
    -
    - -

    - category - : string

    -
      -
    • -
      -

      Gets or sets the category of this part, - typically used to distinguish different kinds of nodes or links.

      -

      The initial value is an empty string, which is the default category. - Any new value must be a string. - This should not be set in templates.

      -

      When building Parts for node data or link data in a model, - the Diagram will call Model.getCategoryForNodeData or - GraphLinksModel.getCategoryForLinkData to get the category string for the data object. - The diagram uses this value to look up a template in Diagram.nodeTemplateMap, - Diagram.linkTemplateMap or Diagram.groupTemplateMap. - That template is copied to create the actual Part that is added to the diagram. - The diagram will set this property to remember the category it used.

      -

      Note that the class of the new Part must be the same as the class of the original Part. - For example, a Node cannot be replaced by a simple Part or vice-versa. - Nor can a Link be replaced by a subclass of Link or vice-versa.

      -

      To change the category for a Part created for model data, call Model.setCategoryForNodeData or - GraphLinksModel.setCategoryForLinkData.

      -

      This property is also used to distinguish Adornments on a Part. - In this scenario you create the Adornment, often indirectly by specifying a template, - and set this property explicitly. - For example, ResizingTool.updateAdornments creates a resizing Adornment from the - Part.resizeAdornmentTemplate and sets its category to be "Resizing". - Changing the category of an existing Adornment will update any adorned part's association.

      -
      -
    • -
    -
    -
    - -

    - containingGroup - : Group

    -
      -
    • -
      -

      Gets or sets the Group of which this Part or Node is a member. - This will be null if this is a top-level part.

      -

      You cannot set this property on a Link; it is set for you automatically - based on the group memberships of the connected nodes. - You cannot set this property on an Adornment at all.

      -

      A template should not be a member of any group.

      -
      -
      see
      -

      Group.memberParts, findTopLevelPart, isTopLevel

      -
      -
      -
      -
    • -
    -
    -
    - -

    - containingGroupChanged - : (thisPart: Part, oldGroup: Group, newGroup: Group) => void

    -
      -
    • -
      -

      Gets or sets the function that is called after this Part has changed which Group it belongs to, if any. - It is typically used to modify the appearance of the part. - The first argument will be this Part. - The second argument will be the old Group, or null if it had been a top-level part. - The third argument will be the new Group, or null if it is now a top-level part.

      -

      If the value is a function, that function must not modify the part's containing Group. - The containing Group has already been changed -- trying to change it again may produce undefined behavior.

      -

      The initial value is null -- no function is called.

      -
      -
    • -
    -
    -
    - -

    - copyable - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may copy this part. - The initial value is true.

      -
      -
      see
      -

      canCopy

      -
      -
      -
      -
    • -
    -
    -
    - -

    - deletable - : boolean

    -
      -
    • -
      -

      Gets or sets whether the user may delete this part. - The initial value is true.

      -
      -
      see
      -

      canDelete

      -
      -
      -
      -
    • -
    -
    -
    - -

    - Override - Read-only - diagram - : Diagram

    -
      -
    • -
      -

      This read-only property returns the Diagram that this Part is in.

      -

      This will be null if it is not in a Layer.

      -
      -
    • -
    -
    -
    - -

    - dragComputation - : (thisPart: Part, newLoc: Point, snappedLoc: Point) => Point

    -
      -
    • -
      -

      Gets or sets the function used to determine the location that this Part can be dragged to. - The first argument is a reference to the Part being dragged, the second argument is a Point describing - the proposed location, and the third argument is a snapped location, if one was determined during dragging. - It should return a Point that is the proposed new location.

      -

      By default this function is null and the DraggingTool uses the snapped location, - if one was determined and if DraggingTool.isGridSnapEnabled is true, - or the proposed location (the second argument) if not snapping to a grid.

      -

      In either case the DraggingTool will limit the proposed new location by minLocation and maxLocation.

      -

      The function, if supplied, must not have any side-effects.

      -

      An example that limits moving a Node to the current viewport:

      -
        function stayInViewport(part, pt, gridpt) {
      -    var diagram = part.diagram;
      -    if (diagram === null) return pt;
      -    // compute the area inside the viewport
      -    var v = diagram.viewportBounds.copy();
      -    v.subtractMargin(diagram.padding);
      -    // get the bounds of the part being dragged
      -    var bnd = part.actualBounds;
      -    var loc = part.location;
      -    // now limit the location appropriately
      -    var l = v.x + (loc.x - bnd.x);
      -    var r = v.right - (bnd.right - loc.x);
      -    var t = v.y + (loc.y - bnd.y);
      -    var b = v.bottom - (bnd.bottom - loc.y);
      -    if (l <= gridpt.x && gridpt.x <= r && t <= gridpt.y && gridpt.y <= b) return gridpt;
      -    var p = gridpt.copy();
      -    if (diagram.toolManager.draggingTool.isGridSnapEnabled) {
      -      // find a location that is inside V but also keeps the part's bounds within V
      -      var cw = diagram.grid.gridCellSize.width;
      -      if (cw > 0) {
      -        while (p.x > r) p.x -= cw;
      -        while (p.x < l) p.x += cw;
      -      }
      -      var ch = diagram.grid.gridCellSize.height;
      -      if (ch > 0) {
      -        while (p.y > b) p.y -= ch;
      -        while (p.y < t) p.y += ch;
      -      }
      -      return p;
      -    } else {
      -      p.x = Math.max(l, Math.min(p.x, r));
      -      p.y = Math.max(t, Math.min(p.y, b));
      -      return p;
      -    }
      -  }
      +

    Parameters

    • Optional type: string | PanelLayout
      +

      Panel Type as either a string or PanelLayout. such as "Vertical", "Auto", or Panel.Vertical, Panel.Auto, are accepted. +If not supplied, the default Panel type is "Position".

      +
    • Optional init: Partial<Part>
      +

      Optional initialization properties.

      +

    Returns Part

  • +

    Constructs an empty Panel. Default type is Panel.Position.

    +

    Parameters

    • Optional init: Partial<Part>
      +

      Optional initialization properties.

      +

    Returns Part

Properties

  • +

    This read-only property returns an iterator over all of the Adornments associated with this part. +After each call to the iterator's next() method that returns true, +the iterator's key will be the category and the iterator's value will +be an Adornment.

    +

    Templates should not have any adornments.

    +
  • +

    Gets or sets the category of this part, +typically used to distinguish different kinds of nodes or links.

    +

    The initial value is an empty string, which is the default category. +Any new value must be a string. +This should not be set in templates.

    +

    When building Parts for node data or link data in a model, +the Diagram will call Model.getCategoryForNodeData or +GraphLinksModel.getCategoryForLinkData to get the category string for the data object. +The diagram uses this value to look up a template in Diagram.nodeTemplateMap, +Diagram.linkTemplateMap or Diagram.groupTemplateMap. +That template is copied to create the actual Part that is added to the diagram. +The diagram will set this property to remember the category it used.

    +

    Note that the class of the new Part must be the same as the class of the original Part. +For example, a Node cannot be replaced by a simple Part or vice-versa. +Nor can a Link be replaced by a subclass of Link or vice-versa.

    +

    To change the category for a Part created for model data, call Model.setCategoryForNodeData or +GraphLinksModel.setCategoryForLinkData.

    +

    This property is also used to distinguish Adornments on a Part. +In this scenario you create the Adornment, often indirectly by specifying a template, +and set this property explicitly. +For example, ResizingTool.updateAdornments creates a resizing Adornment from the +Part.resizeAdornmentTemplate and sets its category to be "Resizing". +Changing the category of an existing Adornment will update any adorned part's association.

    +
  • +

    Gets or sets the Group of which this Part or Node is a member. +This will be null if this is a top-level part.

    +

    You cannot set this property on a Link; it is set for you automatically +based on the group memberships of the connected nodes. +You cannot set this property on an Adornment at all.

    +

    A template should not be a member of any group.

    +
    see

    Group.memberParts, findTopLevelPart, isTopLevel

    +
  • +

    Gets or sets the function that is called after this Part has changed which Group it belongs to, if any. +It is typically used to modify the appearance of the part. +The first argument will be this Part. +The second argument will be the old Group, or null if it had been a top-level part. +The third argument will be the new Group, or null if it is now a top-level part.

    +

    If the value is a function, that function must not modify the part's containing Group. +The containing Group has already been changed -- trying to change it again may produce undefined behavior.

    +

    The initial value is null -- no function is called.

    +
  • +

    Gets or sets whether the user may copy this part. +The initial value is true.

    +
    see

    canCopy

    +
  • +

    Gets or sets whether the user may delete this part. +The initial value is true.

    +
    see

    canDelete

    +
  • +

    This read-only property returns the Diagram that this Part is in.

    +

    This will be null if it is not in a Layer.

    +
  • +

    Gets or sets the function used to determine the location that this Part can be dragged to. +The first argument is a reference to the Part being dragged, the second argument is a Point describing +the proposed location, and the third argument is a snapped location, if one was determined during dragging. +It should return a Point that is the proposed new location.

    +

    By default this function is null and the DraggingTool uses the snapped location, +if one was determined and if DraggingTool.isGridSnapEnabled is true, +or the proposed location (the second argument) if not snapping to a grid.

    +

    In either case the DraggingTool will limit the proposed new location by minLocation and maxLocation.

    +

    The function, if supplied, must not have any side-effects.

    +

    An example that limits moving a Node to the current viewport:

    +
      function stayInViewport(part, pt, gridpt) {
    var diagram = part.diagram;
    if (diagram === null) return pt;
    // compute the area inside the viewport
    var v = diagram.viewportBounds.copy();
    v.subtractMargin(diagram.padding);
    // get the bounds of the part being dragged
    var bnd = part.actualBounds;
    var loc = part.location;
    // now limit the location appropriately
    var l = v.x + (loc.x - bnd.x);
    var r = v.right - (bnd.right - loc.x);
    var t = v.y + (loc.y - bnd.y);
    var b = v.bottom - (bnd.bottom - loc.y);
    if (l <= gridpt.x && gridpt.x <= r && t <= gridpt.y && gridpt.y <= b) return gridpt;
    var p = gridpt.copy();
    if (diagram.toolManager.draggingTool.isGridSnapEnabled) {
    // find a location that is inside V but also keeps the part's bounds within V
    var cw = diagram.grid.gridCellSize.width;
    if (cw > 0) {
    while (p.x > r) p.x -= cw;
    while (p.x < l) p.x += cw;
    }
    var ch = diagram.grid.gridCellSize.height;
    if (ch > 0) {
    while (p.y > b) p.y -= ch;
    while (p.y < t) p.y += ch;
    }
    return p;
    } else {
    p.x = Math.max(l, Math.min(p.x, r));
    p.y = Math.max(t, Math.min(p.y, b));
    return p;
    }
    }
    -

    Note that for this functionality you will also probably want to set Diagram.autoScrollRegion to be a zero margin.

    -
      myDiagram.nodeTemplate =
    -    new go.Node(. . .,
    -      { dragComputation: stayInViewport },
    -      . . .
    -    )
    +

    Note that for this functionality you will also probably want to set Diagram.autoScrollRegion to be a zero margin.

    +
      myDiagram.nodeTemplate =
    new go.Node(. . .,
    { dragComputation: stayInViewport },
    . . .
    )
    -
    -
    see
    -

    maxLocation, minLocation

    -
    -
    -
    -
  • -
-
-
- -

- groupable - : boolean

- -
-
- -

- highlightedChanged - : (thisPart: Part) => void

-
    -
  • -
    -

    Gets or sets the function to execute when this isHighlighted changes. - It is typically used to modify the appearance of the part. - This function must not highlight or unhighlight any parts.

    -

    If this property value is a function, it is called with one argument, - this Part that whose isHighlighted value changed. - By default this property is null.

    -
    -
    see
    -

    isHighlighted

    -
    -
    since
    -

    1.7

    -
    -
    -
    -
  • -
-
-
- -

- isAnimated - : boolean

-
    -
  • -
    -

    Gets or sets whether this part may be animated. - The initial value is true.

    -
    -
    since
    -

    1.4

    -
    -
    -
    -
  • -
-
-
- -

- isHighlighted - : boolean

-
    -
  • -
    -

    Gets or sets whether this Part is highlighted. - The initial value is false.

    -

    Highlighted parts may be shown with a different appearance by changing the brush or visibility of one or - more of the GraphObjects within the part. - One way of doing that is by using binding. - Consider part of the definition of a Node template:

    -
    new go.Shape({
    -    // ... shape properties
    -  })
    -  // Shape.fill is bound to Node.data.color
    -  .bind("fill", "color")
    -  // Shape.stroke is red when Node.isHighlighted is true, black otherwise
    -  .bind(new go.Binding("stroke", "isHighlighted",
    -                 function(h) { return h ? "red" : "black"; }).ofObject())
    +
    see

    maxLocation, minLocation

    +
  • +

    Gets or sets the function to execute when this isHighlighted changes. +It is typically used to modify the appearance of the part. +This function must not highlight or unhighlight any parts.

    +

    If this property value is a function, it is called with one argument, +this Part that whose isHighlighted value changed. +By default this property is null.

    +
    see

    isHighlighted

    +
    since

    1.7

    +
  • +

    Gets or sets whether this part may be animated. +The initial value is true.

    +
    since

    1.4

    +
  • +

    Gets or sets whether this Part is highlighted. +The initial value is false.

    +

    Highlighted parts may be shown with a different appearance by changing the brush or visibility of one or +more of the GraphObjects within the part. +One way of doing that is by using binding. +Consider part of the definition of a Node template:

    +
    new go.Shape({
    // ... shape properties
    })
    // Shape.fill is bound to Node.data.color
    .bind("fill", "color")
    // Shape.stroke is red when Node.isHighlighted is true, black otherwise
    .bind(new go.Binding("stroke", "isHighlighted",
    function(h) { return h ? "red" : "black"; }).ofObject())
    -
    -
    see
    -

    highlightedChanged, Diagram.highlighteds, Diagram.highlight, Diagram.highlightCollection, Diagram.clearHighlighteds

    -
    -
    since
    -

    1.4

    -
    -
    -
    -
  • -
-
-
- -

- isInDocumentBounds - : boolean

-
    -
  • -
    -

    Gets or sets whether this Part is part of the document bounds.

    -

    The initial value is true. - A value of false causes Diagram.computeBounds to ignore this part. - If the value is false, it is possible that user will not be able to scroll far enough to see this part, - if the part's GraphObject.actualBounds are outside of the Diagram.documentBounds.

    -
    -
  • -
-
-
- -

- isLayoutPositioned - : boolean

-
    -
  • -
    -

    Gets or sets whether a Layout positions this Node or routes this Link. - This property affects the value of canLayout.

    -

    The initial value is true, meaning that this part is laid out by the layout responsible for this Part. - If this part is a member of a Group, it is the Group.layout, - otherwise it is the Diagram.layout.

    -

    A value of false means that this part is not affected by and does not affect any automatic layout, - so the layoutConditions property is ignored. - You will need to make sure that it has a real location or GraphObject.position value, - or else the Part might not be visible anywhere in the diagram.

    -

    Another way of controlling when layouts are invalidated is by setting - Part.layoutConditions or Layout.isInitial or Layout.isOngoing.

    -
    -
  • -
-
-
- -

- isSelected - : boolean

- -
-
- -

- isShadowed - : boolean

-
    -
  • -
    -

    Gets or sets whether this part will draw shadows. - The initial value is false.

    -

    By default, setting this property to true will attempt to draw shadows only - on the GraphObjects in this Part that appear to act as background objects, and - not on GraphObjects that appear to be in front of other GraphObjects in the Part.

    -

    To finely control shadows, you may need to set GraphObject.shadowVisible on - elements of this Part, so that they explicitly do or do not get shadowed accordingly.

    -

    The color of the shadow is determined by shadowColor. - The opacity of the shadow color is multiplied by the opacity of the shadowed object's brush. - So, for example, if you have a Panel with a GraphObject.background - that is "transparent", the shadow that is drawn for the panel will also be transparent.

    -

    The direction of the shadow that is cast is controlled by shadowOffset, - and is independent of the Diagram.scale. - The sharpness of the shadow is controlled by shadowBlur.

    -
    -
    see
    -

    shadowOffset, shadowColor, shadowBlur, GraphObject.shadowVisible

    -
    -
    -
    -
  • -
-
-
- -

- Read-only - isTopLevel - : boolean

- -
-
- -

- Read-only - key - : Key

-
    -
  • -
    -

    This read-only property returns the Part's Model data key if it is in a Diagram and is backed by Model data. - Otherwise this returns undefined.

    -
    -
    since
    -

    1.8

    -
    -
    see
    -

    Model.getKeyForNodeData

    -
    -
    -
    -
  • -
-
-
- -

- Override - Read-only - layer - : Layer

-
    -
  • -
    -

    This read-only property returns the Layer that this Part is in. - The value is the Layer that is named with the value of layerName. - If you want to change what Layer this Part is in, change the value of layerName to refer to a different Layer.

    -

    This will be null if it has not yet been added to a Diagram, - or if it has already been removed from a Diagram.

    -
    -
    see
    -

    layerName

    -
    -
    -
    -
  • -
-
-
- -

- layerChanged - : (thisPart: Part, oldLayer: Layer, newLayer: Layer) => void

-
    -
  • -
    -

    Gets or sets the function to execute when this part changes layers. - It is typically used to modify the appearance of the part. - This function must not change the layer of this part by setting layerName.

    -

    If this property value is a function, it is called with three arguments, - this Part, the old Layer (may be null), and the new Layer (may be null). - By default this property is null -- no function is called.

    -
    -
    see
    -

    layerName

    -
    -
    -
    -
  • -
-
-
- -

- layerName - : string

-
    -
  • -
    -

    Gets or sets the layer name for this part. - The initial value is an empty string, which is the name of the default layer. - The value of this property determines the value of layer.

    -

    If this part is not yet in a Diagram, - this value is used by Diagram.add - to determine which Layer this part should go in. - If no layer can be found with this name, it uses the default layer.

    -

    Changing the value of this property while it is already in a layer - causes it to change layers if needed.

    -
    -
    see
    -

    layerChanged

    -
    -
    -
    -
  • -
-
-
- -

- layoutConditions - : number

- -
-
- -

- location - : Point

- -
-
- -

- Read-only - locationObject - : GraphObject

-
    -
  • -
    -

    This read-only property returns the GraphObject that determines the location of this Part. - The value will be in the visual tree of this Part and is usually named with - the value of locationObjectName.

    -
    -
  • -
-
-
- -

- locationObjectName - : string

-
    -
  • -
    -

    Gets or sets the name of the GraphObject that provides the location of this Part. - This name determines the value of locationObject. - The actual location also depends on the locationSpot.

    -

    The initial value is an empty string, meaning the whole Part itself determines the location. - If you want to use a particular GraphObject in the visual tree of this Part, - set this property to be the GraphObject.name of the element that you want to be the locationObject.

    -
    -
    see
    -

    location, locationSpot

    -
    -
    -
    -
  • -
-
-
- -

- locationSpot - : Spot

-
    -
  • -
    -

    Gets or sets the location Spot of this Node, the spot on the locationObject - that is used in positioning this part in the diagram.

    -

    Value must be of the type Spot. - The initial value is Spot.TopLeft. - The value must be a specific spot -- i.e. one for which Spot.isSpot is true.

    -

    It is commonplace to set this property to Spot.Center, so that the location - has a value corresponding to the point at the center of this Part's locationObject element. - But the GraphObject.position of a Part is always at the top-left corner - point of the GraphObject.actualBounds.

    -
    -
    see
    -

    location, locationObjectName

    -
    -
    -
    -
  • -
-
-
- -

- maxLocation - : Point

-
    -
  • -
    -

    Gets or sets the maximum location of this Part to which the user may drag using the DraggingTool.

    -

    Value must be of type Point. - The initial value is (Infinity, Infinity), which imposes no position constraint. - A X value of NaN causes Diagram.computeMove to use the part's current location's X value as the maximum, - and similarly for NaN as the Y value.

    -
    -
    see
    -

    location, minLocation, dragComputation, movable

    -
    -
    -
    -
  • -
-
-
- -

- minLocation - : Point

-
    -
  • -
    -

    Gets or sets the minimum location of this Part to which the user may drag using the DraggingTool.

    -

    Value must be of type Point. - The initial value is (-Infinity, -Infinity), which imposes no position constraint. - A X value of NaN causes Diagram.computeMove to use the part's current location's X value as the minimum, - and similarly for NaN as the Y value.

    -
    -
    see
    -

    location, maxLocation, dragComputation, movable

    -
    -
    -
    -
  • -
-
-
- -

- movable - : boolean

- -
-
- -

- reshapable - : boolean

-
    -
  • -
    -

    Gets or sets whether the user may reshape this part. - The initial value is false.

    -
    -
    see
    -

    canReshape, LinkReshapingTool

    -
    -
    -
    -
  • -
-
-
- -

- resizable - : boolean

- -
-
- -

- resizeAdornmentTemplate - : Adornment

- -
-
- -

- resizeCellSize - : Size

- -
-
- -

- Read-only - resizeObject - : GraphObject

- -
-
- -

- resizeObjectName - : string

-
    -
  • -
    -

    Gets or sets the name of the GraphObject that should get a resize handle - when this part is selected. - The value of this property affects the value of resizeObject. - The initial value is an empty string, meaning the whole Part itself gets any resize handle.

    -
    -
    see
    -

    resizable, resizeObject, ResizingTool

    -
    -
    -
    -
  • -
-
-
- -

- rotatable - : boolean

- -
-
- -

- rotateAdornmentTemplate - : Adornment

- -
-
- -

- Read-only - rotateObject - : GraphObject

- -
-
- -

- rotateObjectName - : string

-
    -
  • -
    -

    Gets or sets the name of the GraphObject that should get a rotate handle - when this part is selected. - The value of this property affects the value of rotateObject. - The initial value is an empty string, meaning the whole Part itself gets any rotate handle.

    -
    -
    see
    -

    rotatable, rotateObject, RotatingTool

    -
    -
    -
    -
  • -
-
-
- -

- rotationSpot - : Spot

-
    -
  • -
    -

    Gets or sets the spot on the rotateObject - that is used in rotating this part with the RotatingTool.

    -

    Value must be of the type Spot. - The value must be a specific spot -- i.e. one for which Spot.isSpot is true, or else Spot.Default.

    -

    If the value is Spot.Default, the RotatingTool uses - the locationSpot if the rotateObject is equal to the locationObject, otherwise - it uses Spot.Center.

    -

    The initial value is Spot.Default.

    -
    -
    see
    -

    rotateObjectName

    -
    -
    since
    -

    2.0

    -
    -
    -
    -
  • -
-
-
- -

- selectable - : boolean

- -
-
- -

- selectionAdorned - : boolean

- -
-
- -

- selectionAdornmentTemplate - : Adornment

- -
-
- -

- selectionChanged - : (thisPart: Part) => void

-
    -
  • -
    -

    Gets or sets the function to execute when this part is selected or deselected. - It is typically used to modify the appearance of the part. - This function must not select or deselect any parts.

    -

    If this property value is a function, it is called with one argument, - this Part that was selected or that became unselected. - When it is called, the value of Diagram.skipsUndoManager is temporarily set to true. - By default this property is null.

    -

    This function is called with Diagram.skipsUndoManager temporarily set to true, - so that any changes to GraphObjects are not recorded in the UndoManager. - You do not need to start and commit any transaction in this function.

    -
    -
    see
    -

    isSelected, selectionAdorned, selectionAdornmentTemplate

    -
    -
    -
    -
  • -
-
-
- -

- Read-only - selectionObject - : GraphObject

- -
-
- -

- selectionObjectName - : string

- -
-
- -

- shadowBlur - : number

-
    -
  • -
    -

    Gets or sets the numerical value that describes the shadow's blur. Number must be non-negative and non-infinity. - A value of 0 would mean the shadow does not blur and larger numbers represent increasingly more blur. - The total blur area is independent of the Part's area and can become quite large as this number is increased.

    -

    This value is not affected by scale. Default value is 4.

    -
    -
    see
    -

    isShadowed, shadowOffset, shadowColor

    -
    -
    -
    -
  • -
-
-
- -

- shadowColor - : string

-
    -
  • -
    -

    Gets or sets the CSS string that describes a shadow color. Default is 'gray'. - Brushes cannot be used for this property -- only strings.

    -

    The opacity of the shadow color is multiplied by the opacity of the shadowed object's brush. - So, for example, if you have a Panel with a GraphObject.background - that is "transparent", the shadow that is drawn for the panel will also be transparent.

    -
    -
    see
    -

    isShadowed, shadowOffset, shadowBlur

    -
    -
    -
    -
  • -
-
-
- -

- shadowOffset - : Point

- -
-
- -

- text - : string

-
    -
  • -
    -

    Gets or sets a text string that is associated with this part.

    -

    The initial value is an empty string. - This value is often used for sorting.

    -
    -
  • -
-
-
- -

- textEditable - : boolean

- -
-
- -

- zOrder - : number

-
    -
  • -
    -

    Gets or sets the Z-ordering position of this Part within its Layer.

    -

    Within the same layer, nodes with larger zOrder values are placed in front of nodes with smaller zOrder values. - When the value is NaN the ordering is not specified. - The default value is NaN.

    -

    When a Group has a zOrder value of NaN, it is automatically placed behind its member nodes and links - that also have no zOrder. - Such automatic ordering is not guaranteed if any nodes including the groups have a numeric zOrder. - If you do want to specify the zOrder of nodes, you should also specify the zOrder of their containing groups - unless those groups are in different layers.

    -
    -
    since
    -

    1.6

    -
    -
    -
    -
  • -
-
- -
-

Methods

-
- -

- addAdornment -

-
    -
  • addAdornment(category: string, ad: Adornment): void
  • -
-
    -
  • -
    -

    Associate an Adornment with this Part, perhaps replacing any existing adornment of the same category. - Don't forget to set Adornment.adornedObject before calling this method. - This adds the Adornment to the Layer named by layerName, normally "Adornment".

    -

    Adornments are also data bound to the same data that this Part has, if any. - If the Adornment was already associated with a Part, it is unassociated with that old Part.

    -

    This method should not be called on templates.

    -
    -

    Parameters

    -
      -
    • -
      category: string
      -
      -

      a string identifying the kind or role of the given adornment for this Part.

      -
      -
    • -
    • -
      ad: Adornment
      -
      -

      the new Adornment.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- Virtual - canCopy -

-
    -
  • canCopy(): boolean
  • -
- -
-
- -

- Virtual - canDelete -

-
    -
  • canDelete(): boolean
  • -
- -
-
- -

- Virtual - canEdit -

-
    -
  • canEdit(): boolean
  • -
- -
-
- -

- Virtual - canGroup -

-
    -
  • canGroup(): boolean
  • -
- -
-
- -

- Virtual - canLayout -

-
    -
  • canLayout(): boolean
  • -
-
    -
  • -
    -

    This predicate is called by Layout implementations to decide whether this Part - should be positioned and might affect the positioning of other Parts.

    -

    This is false if isLayoutPositioned is false, if isVisible returns false, - or if the part is in a temporary Layer.

    -

    This does not check Diagram.isReadOnly or Model.isReadOnly, - but commands and tools should check those properties.

    -
    -

    Returns boolean

    -
  • -
-
-
- -

- Virtual - canMove -

-
    -
  • canMove(): boolean
  • -
- -
-
- -

- Virtual - canReshape -

-
    -
  • canReshape(): boolean
  • -
- -
-
- -

- Virtual - canResize -

-
    -
  • canResize(): boolean
  • -
- -
-
- -

- Virtual - canRotate -

-
    -
  • canRotate(): boolean
  • -
- -
-
- -

- Virtual - canSelect -

-
    -
  • canSelect(): boolean
  • -
- -
-
- -

- clearAdornments -

-
    -
  • clearAdornments(): void
  • -
-
    -
  • -
    -

    Remove all adornments associated with this part.

    -
    -

    Returns void

    -
  • -
-
-
- -

- ensureBounds -

-
    -
  • ensureBounds(): void
  • -
-
    -
  • -
    -

    Measures if needed to make sure the GraphObject.measuredBounds and GraphObject.naturalBounds are all real numbers, - primarily to get the actual width and height. - GraphObject.actualBounds will get a real width and height, but the x and y values may continue to be NaN - if they were that way beforehand.

    -

    This is sometimes necessary to call when defining custom layouts or implementing virtualization, - so that it can work with the actual size of the nodes.

    -

    For efficiency, do not call this method unnecessarily.

    -
    -
    since
    -

    1.6

    -
    -
    see
    -

    Diagram.ensureBounds

    -
    -
    -
    -

    Returns void

    -
  • -
-
-
- -

- findAdornment -

-
    -
  • findAdornment(category: string): Adornment
  • -
-
    -
  • -
    -

    Find an Adornment of a given category associated with this Part.

    -

    Templates should not have any adornments.

    -
    -

    Parameters

    -
      -
    • -
      category: string
      -
    • -
    -

    Returns Adornment

    -

    Returns null if no such Adornment was found.

    -
  • -
-
-
- -

- findCommonContainingGroup -

-
    -
  • findCommonContainingGroup(other: Part): Group
  • -
-
    -
  • -
    -

    Find the Group that perhaps indirectly contains both this part and another one. - If this is a Group and it contains the OTHER Part, return this. - If the OTHER Part is a Group and it contains this Part, return that OTHER Part.

    -

    This returns null if the two parts are unrelated in the hierarchy of part membership. - If non-null, the result is a Group.

    -

    If you want to find the Node that is the tree parent of two Nodes, - call Node.findCommonTreeParent.

    -
    -

    Parameters

    -
      -
    • -
      other: Part
      -
    • -
    -

    Returns Group

    -

    may be null

    -
  • -
-
-
- -

- findSubGraphLevel -

-
    -
  • findSubGraphLevel(): number
  • -
-
    -
  • -
    -

    Return how deep this part is in the hierarchy of nested Groups. - For parts that have no containingGroup this returns zero.

    -

    If you want to know how deep a Node is in a tree structure, call Node.findTreeLevel.

    -
    -
    since
    -

    1.5

    -
    -
    -
    -

    Returns number

    -
  • -
-
-
- -

- findTopLevelPart -

-
    -
  • findTopLevelPart(): Part
  • -
-
    -
  • -
    -

    Gets the top-level Part for this part, which is itself when isTopLevel is true. - If this Part is a member of a Group, this returns the top-level Part for that Group. - If this is a Node that is a label node for a labeled Link, this returns the top-level Part for that Link.

    -

    If this is a Node and you are searching for the root of the tree that this node is in, use Node.findTreeRoot.

    -
    -
    since
    -

    1.1

    -
    -
    -
    -

    Returns Part

    -

    This will not return null.

    -
  • -
-
-
- -

- Override - getDocumentBounds -

-
    -
  • getDocumentBounds(result?: Rect): Rect
  • -
-
    -
  • -
    -

    Returns the Rect in document coordinates for this object's bounds. - If this GraphObject is a Part, the rect will be identical to its actualBounds.

    -
    -
    see
    -

    getDocumentPoint

    -
    -
    since
    -

    2.0

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      Optional result: Rect
      -
      -

      an optional Rect that is modified and returned.

      -
      -
    • -
    -

    Returns Rect

    -

    in document coordinates.

    -
  • -
-
-
- -

- invalidateLayout -

-
    -
  • invalidateLayout(condition?: number): void
  • -
-
    -
  • -
    -

    Invalidate the Layout that is responsible for positioning this Part. - If this part is in a Group, invalidate its Group.layout, if it has one. - Otherwise invalidate the Diagram.layout.

    -

    But note that if isLayoutPositioned is false, or if it is in a temporary Layer, - or if it is not in a diagram or group, no layout is invalidated.

    -
    -

    Parameters

    -
      -
    • -
      Optional condition: number
      -
      -

      the reason that the layout should be invalidated; - if this argument is not supplied, any value of layoutConditions other than Part.LayoutNone - will allow the layout to be invalidated.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- isMemberOf -

-
    -
  • isMemberOf(part: Part): boolean
  • -
-
    -
  • -
    -

    This predicate is true if this part is a member of the given Part, perhaps indirectly.

    -

    If the given part is a Group and this part is a member of the given group, this returns true. - If this part is a Node and it is a label node for a link that is a member of the given group, this returns true. - Otherwise this searches recursively any Part.containingGroup of the given part.

    -

    A part cannot be contained by itself. - A template should not be a member of any group.

    -

    If this is a Node and you want to find whether it is in a subtree whose root is a given Node, use Node.isInTreeOf.

    -
    -

    Parameters

    -
      -
    • -
      part: Part
      -
    • -
    -

    Returns boolean

    -
  • -
-
-
- -

- Virtual - isVisible -

-
    -
  • isVisible(): boolean
  • -
-
  • +

    Gets or sets whether this Part is part of the document bounds.

    +

    The initial value is true. +A value of false causes Diagram.computeBounds to ignore this part. +If the value is false, it is possible that user will not be able to scroll far enough to see this part, +if the part's GraphObject.actualBounds are outside of the Diagram.documentBounds.

    +
  • +

    Gets or sets whether a Layout positions this Node or routes this Link. +This property affects the value of canLayout.

    +

    The initial value is true, meaning that this part is laid out by the layout responsible for this Part. +If this part is a member of a Group, it is the Group.layout, +otherwise it is the Diagram.layout.

    +

    A value of false means that this part is not affected by and does not affect any automatic layout, +so the layoutConditions property is ignored. +You will need to make sure that it has a real location or GraphObject.position value, +or else the Part might not be visible anywhere in the diagram.

    +

    Another way of controlling when layouts are invalidated is by setting +Part.layoutConditions or Layout.isInitial or Layout.isOngoing.

    +
  • +

    Gets or sets whether this part will draw shadows. +The initial value is false.

    +

    By default, setting this property to true will attempt to draw shadows only +on the GraphObjects in this Part that appear to act as background objects, and +not on GraphObjects that appear to be in front of other GraphObjects in the Part.

    +

    To finely control shadows, you may need to set GraphObject.shadowVisible on +elements of this Part, so that they explicitly do or do not get shadowed accordingly.

    +

    The color of the shadow is determined by shadowColor. +The opacity of the shadow color is multiplied by the opacity of the shadowed object's brush. +So, for example, if you have a Panel with a GraphObject.background +that is "transparent", the shadow that is drawn for the panel will also be transparent.

    +

    The direction of the shadow that is cast is controlled by shadowOffset, +and is independent of the Diagram.scale. +The sharpness of the shadow is controlled by shadowBlur.

    +
    see

    shadowOffset, shadowColor, shadowBlur, GraphObject.shadowVisible

    +
  • +

    This read-only property returns the Part's Model data key if it is in a Diagram and is backed by Model data. +Otherwise this returns undefined.

    +
    since

    1.8

    +
    see

    Model.getKeyForNodeData

    +
  • +

    This read-only property returns the Layer that this Part is in. +The value is the Layer that is named with the value of layerName. +If you want to change what Layer this Part is in, change the value of layerName to refer to a different Layer.

    +

    This will be null if it has not yet been added to a Diagram, +or if it has already been removed from a Diagram.

    +
    see

    layerName

    +
  • +

    Gets or sets the function to execute when this part changes layers. +It is typically used to modify the appearance of the part. +This function must not change the layer of this part by setting layerName.

    +

    If this property value is a function, it is called with three arguments, +this Part, the old Layer (may be null), and the new Layer (may be null). +By default this property is null -- no function is called.

    +
    see

    layerName

    +
  • +

    Gets or sets the layer name for this part. +The initial value is an empty string, which is the name of the default layer. +The value of this property determines the value of layer.

    +

    If this part is not yet in a Diagram, +this value is used by Diagram.add +to determine which Layer this part should go in. +If no layer can be found with this name, it uses the default layer.

    +

    Changing the value of this property while it is already in a layer +causes it to change layers if needed.

    +
    see

    layerChanged

    +
  • +

    This read-only property returns the GraphObject that determines the location of this Part. +The value will be in the visual tree of this Part and is usually named with +the value of locationObjectName.

    +
  • +

    Gets or sets the name of the GraphObject that provides the location of this Part. +This name determines the value of locationObject. +The actual location also depends on the locationSpot.

    +

    The initial value is an empty string, meaning the whole Part itself determines the location. +If you want to use a particular GraphObject in the visual tree of this Part, +set this property to be the GraphObject.name of the element that you want to be the locationObject.

    +
    see

    location, locationSpot

    +
  • +

    Gets or sets the maximum location of this Part to which the user may drag using the DraggingTool.

    +

    Value must be of type Point. +The initial value is (Infinity, Infinity), which imposes no position constraint. +A X value of NaN causes Diagram.computeMove to use the part's current location's X value as the maximum, +and similarly for NaN as the Y value.

    +
    see

    location, minLocation, dragComputation, movable

    +
  • +

    Gets or sets the minimum location of this Part to which the user may drag using the DraggingTool.

    +

    Value must be of type Point. +The initial value is (-Infinity, -Infinity), which imposes no position constraint. +A X value of NaN causes Diagram.computeMove to use the part's current location's X value as the minimum, +and similarly for NaN as the Y value.

    +
    see

    location, maxLocation, dragComputation, movable

    +
  • +

    Gets or sets the name of the GraphObject that should get a resize handle +when this part is selected. +The value of this property affects the value of resizeObject. +The initial value is an empty string, meaning the whole Part itself gets any resize handle.

    +
    see

    resizable, resizeObject, ResizingTool

    +
  • +

    Gets or sets the name of the GraphObject that should get a rotate handle +when this part is selected. +The value of this property affects the value of rotateObject. +The initial value is an empty string, meaning the whole Part itself gets any rotate handle.

    +
    see

    rotatable, rotateObject, RotatingTool

    +
  • +

    Gets or sets the function to execute when this part is selected or deselected. +It is typically used to modify the appearance of the part. +This function must not select or deselect any parts.

    +

    If this property value is a function, it is called with one argument, +this Part that was selected or that became unselected. +When it is called, the value of Diagram.skipsUndoManager is temporarily set to true. +By default this property is null.

    +

    This function is called with Diagram.skipsUndoManager temporarily set to true, +so that any changes to GraphObjects are not recorded in the UndoManager. +You do not need to start and commit any transaction in this function.

    +
    see

    isSelected, selectionAdorned, selectionAdornmentTemplate

    +
  • +

    Gets or sets the numerical value that describes the shadow's blur. Number must be non-negative and non-infinity. +A value of 0 would mean the shadow does not blur and larger numbers represent increasingly more blur. +The total blur area is independent of the Part's area and can become quite large as this number is increased.

    +

    This value is not affected by scale. Default value is 4.

    +
    see

    isShadowed, shadowOffset, shadowColor

    +
  • +

    Gets or sets the CSS string that describes a shadow color. Default is 'gray'. +Brushes cannot be used for this property -- only strings.

    +

    The opacity of the shadow color is multiplied by the opacity of the shadowed object's brush. +So, for example, if you have a Panel with a GraphObject.background +that is "transparent", the shadow that is drawn for the panel will also be transparent.

    +
    see

    isShadowed, shadowOffset, shadowBlur

    +
  • +

    Gets or sets a text string that is associated with this part.

    +

    The initial value is an empty string. +This value is often used for sorting.

    +
  • +

    Gets or sets the Z-ordering position of this Part within its Layer.

    +

    Within the same layer, nodes with larger zOrder values are placed in front of nodes with smaller zOrder values. +When the value is NaN the ordering is not specified. +The default value is NaN.

    +

    When a Group has a zOrder value of NaN, it is automatically placed behind its member nodes and links +that also have no zOrder. +Such automatic ordering is not guaranteed if any nodes including the groups have a numeric zOrder. +If you do want to specify the zOrder of nodes, you should also specify the zOrder of their containing groups +unless those groups are in different layers.

    +
    since

    1.6

    +

Methods

  • addAdornment(category: string, ad: Adornment): void
  • +

    Associate an Adornment with this Part, perhaps replacing any existing adornment of the same category. +Don't forget to set Adornment.adornedObject before calling this method. +This adds the Adornment to the Layer named by layerName, normally "Adornment".

    +

    Adornments are also data bound to the same data that this Part has, if any. +If the Adornment was already associated with a Part, it is unassociated with that old Part.

    +

    This method should not be called on templates.

    +

    Parameters

    • category: string
      +

      a string identifying the kind or role of the given adornment for this Part.

      +
    • ad: Adornment
      +

      the new Adornment.

      +

    Returns void

  • canCopy(): boolean
  • canDelete(): boolean
  • canEdit(): boolean
  • canGroup(): boolean
  • canLayout(): boolean
  • +

    This predicate is called by Layout implementations to decide whether this Part +should be positioned and might affect the positioning of other Parts.

    +

    This is false if isLayoutPositioned is false, if isVisible returns false, +or if the part is in a temporary Layer.

    +

    This does not check Diagram.isReadOnly or Model.isReadOnly, +but commands and tools should check those properties.

    +

    Returns boolean

  • canMove(): boolean
  • canReshape(): boolean
  • canResize(): boolean
  • canRotate(): boolean
  • canSelect(): boolean
  • clearAdornments(): void
  • +

    Remove all adornments associated with this part.

    +

    Returns void

  • ensureBounds(): void
  • +

    Measures if needed to make sure the GraphObject.measuredBounds and GraphObject.naturalBounds are all real numbers, +primarily to get the actual width and height. +GraphObject.actualBounds will get a real width and height, but the x and y values may continue to be NaN +if they were that way beforehand.

    +

    This is sometimes necessary to call when defining custom layouts or implementing virtualization, +so that it can work with the actual size of the nodes.

    +

    For efficiency, do not call this method unnecessarily.

    +
    since

    1.6

    +
    see

    Diagram.ensureBounds

    +

    Returns void

  • +

    Find an Adornment of a given category associated with this Part.

    +

    Templates should not have any adornments.

    +

    Parameters

    • category: string

    Returns Adornment

    Returns null if no such Adornment was found.

    +
  • findCommonContainingGroup(other: Part): Group
  • +

    Find the Group that perhaps indirectly contains both this part and another one. +If this is a Group and it contains the OTHER Part, return this. +If the OTHER Part is a Group and it contains this Part, return that OTHER Part.

    +

    This returns null if the two parts are unrelated in the hierarchy of part membership. +If non-null, the result is a Group.

    +

    If you want to find the Node that is the tree parent of two Nodes, +call Node.findCommonTreeParent.

    +

    Parameters

    Returns Group

    may be null

    +
  • findSubGraphLevel(): number
  • +

    Return how deep this part is in the hierarchy of nested Groups. +For parts that have no containingGroup this returns zero.

    +

    If you want to know how deep a Node is in a tree structure, call Node.findTreeLevel.

    +
    since

    1.5

    +

    Returns number

  • findTopLevelPart(): Part
  • +

    Gets the top-level Part for this part, which is itself when isTopLevel is true. +If this Part is a member of a Group, this returns the top-level Part for that Group. +If this is a Node that is a label node for a labeled Link, this returns the top-level Part for that Link.

    +

    If this is a Node and you are searching for the root of the tree that this node is in, use Node.findTreeRoot.

    +
    since

    1.1

    +

    Returns Part

    This will not return null.

    +
  • +

    Returns the Rect in document coordinates for this object's bounds. +If this GraphObject is a Part, the rect will be identical to its actualBounds.

    +
    see

    getDocumentPoint

    +
    since

    2.0

    +

    Parameters

    • Optional result: Rect
      +

      an optional Rect that is modified and returned.

      +

    Returns Rect

    in document coordinates.

    +
  • invalidateLayout(condition?: number): void
  • +

    Invalidate the Layout that is responsible for positioning this Part. +If this part is in a Group, invalidate its Group.layout, if it has one. +Otherwise invalidate the Diagram.layout.

    +

    But note that if isLayoutPositioned is false, or if it is in a temporary Layer, +or if it is not in a diagram or group, no layout is invalidated.

    +

    Parameters

    • Optional condition: number
      +

      the reason that the layout should be invalidated; +if this argument is not supplied, any value of layoutConditions other than Part.LayoutNone +will allow the layout to be invalidated.

      +

    Returns void

  • isMemberOf(part: Part): boolean
  • +

    This predicate is true if this part is a member of the given Part, perhaps indirectly.

    +

    If the given part is a Group and this part is a member of the given group, this returns true. +If this part is a Node and it is a label node for a link that is a member of the given group, this returns true. +Otherwise this searches recursively any Part.containingGroup of the given part.

    +

    A part cannot be contained by itself. +A template should not be a member of any group.

    +

    If this is a Node and you want to find whether it is in a subtree whose root is a given Node, use Node.isInTreeOf.

    +

    Parameters

    Returns boolean

  • isVisible(): boolean
  • +

    This predicate is true if this Part can be seen. +Parts that can be seen can be manipulated by the user, can take space in the document, or can take part in a layout, +among many possibilities. +Note that the value of this predicate can often be false even while GraphObject.visible is true.

    +

    A Part is not seen if it is not GraphObject.visible or if it is in a Layer that is not Layer.visible.

    +

    If a Part is a member of a Group and the Group is not Group.isSubGraphExpanded, the part is not seen. +(The containing Group might still be visible.)

    +

    If a Node is a "tree child" of a Node that is not Node.isTreeExpanded, the node is not seen. +(The parent Node might still be visible.)

    +

    If a Link is connected to or from a Node that is not isVisible() +and is not a member of a Group that isVisible(), the link is not seen.

    +

    If a Node is a "link label" of a Link and that Link is not isVisible(), the node is not seen.

    +

    This is different from GraphObject.isVisibleObject, +which ignores whether the Layer is visible and just checks GraphObject.visible +up the chain of containing Panels.

    +

    If you want to know whether a Part is in the Diagram's viewport, try:

    +
      diagram.viewportBounds.containsRect(part.actualBounds);
     
    -

    or:

    -
      diagram.viewportBounds.intersectsRect(part.actualBounds);
    +

    or:

    +
      diagram.viewportBounds.intersectsRect(part.actualBounds);
     
    -
    -

    Returns boolean

    -

    true if GraphObject.visible is true and if Layer.visible is true.

    -
  • -
-
-
- -

- Virtual - move -

-
    -
  • move(newpos: Point, useLocation?: boolean): void
  • -
-
    -
  • -
    -

    Move this part and any parts that are owned by this part to a new position.

    -

    If this part is a Group, it also moves all of its members, recursively. - If this part is a Link, it also moves all of its label nodes.

    -

    This method does not perform a transaction or start any animation.

    -
    -

    Parameters

    -
      -
    • -
      newpos: Point
      -
      -

      a new Point in document coordinates.

      -
      -
    • -
    • -
      Optional useLocation: boolean
      -
      -

      true if you want to set the location instead of the position. False by default.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- moveTo -

-
    -
  • moveTo(newx: number, newy: number, useLocation?: boolean): void
  • -
-
    -
  • -
    -

    Move this part and any parts that are owned by this part to a new position. - This just calls move without the caller having to allocate a new Point.

    -
    -
    since
    -

    1.4

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      newx: number
      -
      -

      a new X value in document coordinates.

      -
      -
    • -
    • -
      newy: number
      -
      -

      a new Y value in document coordinates.

      -
      -
    • -
    • -
      Optional useLocation: boolean
      -
      -

      true if you want to set the location instead of the position. False by default.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- removeAdornment -

-
    -
  • removeAdornment(category: string): void
  • -
-
    -
  • -
    -

    Remove any Adornment of the given category that may be associated with this Part.

    -
    -

    Parameters

    -
      -
    • -
      category: string
      -
      -

      a string identifying the kind or role of the given adornment for this Part.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
- -

- Virtual - updateAdornments -

-
    -
  • updateAdornments(): void
  • -
-
    -
  • -
    -

    This is responsible for creating any selection Adornment (if this Part isSelected) and - any tool adornments for this part.

    -
    -

    Returns void

    -
  • -
-
-
- -

- Virtual - updateRelationshipsFromData -

-
    -
  • updateRelationshipsFromData(): void
  • -
-
    -
  • -
    -

    Update all of the references to nodes in case they had been modified in the model without - properly notifying the model by calling GraphLinksModel.setGroupKeyForNodeData or - GraphLinksModel.setToKeyForLinkData or other similar methods. - This method does not conduct a transaction, so you need to start and commit one yourself.

    -

    This only updates the relationships between nodes, to have them reflect what is now declared in the model data. - For example, in a GraphLinksModel if code has changed the value of the "to" property of a link data, - calling this method on the corresponding Link would cause the link to connect with - the Node whose data has the new key.

    -

    To update GraphObject properties that are data bound, call updateTargetBindings.

    -
    -
    see
    -

    updateTargetBindings

    -
    -
    since
    -

    1.5

    -
    -
    -
    -

    Returns void

    -
  • -
-
-
- -

- Override - updateTargetBindings -

-
    -
  • updateTargetBindings(srcprop?: string): void
  • -
-
    -
  • -
    -

    Re-evaluate all data bindings in this Part, - in order to assign new property values to the GraphObjects in this visual tree - based on this this object's data property values. - This method does nothing if data is null.

    -

    It is better to call Model.setDataProperty to modify data properties, - because that will both record changes for undo/redo and will update all bindings - that make depend on that property.

    -

    To update relationships between nodes, call updateRelationshipsFromData.

    -
    -
    see
    -

    updateRelationshipsFromData

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      Optional srcprop: string
      -
      -

      An optional source data property name: - when provided, only evaluates those Bindings that use that particular property; - when not provided or when it is the empty string, all bindings are evaluated.

      -
      -
    • -
    -

    Returns void

    -
  • -
-
-
-
-

Constants

-
- -

- Static - LayoutAdded - : number

-
-

This flag may be combined with other "Layout" flags as the value of the Part.layoutConditions property to indicate that - when a Part is added to a Diagram or Group, it invalidates the Layout responsible for the Part.

-
-
-
- -

- Static - LayoutGroupLayout - : number

-
-

This flag may be combined with other "Layout" flags as the value of the Part.layoutConditions property to indicate that - when a Group has been laid out, it invalidates the Layout responsible for that Group; - this flag is ignored for Parts that are not Groups.

-
-
-
- -

- Static - LayoutHidden - : number

-
-

This flag may be combined with other "Layout" flags as the value of the Part.layoutConditions property to indicate that - when a Part's GraphObject.visible becomes false, it invalidates the Layout responsible for the Part.

-
-
-
- -

- Static - LayoutNodeReplaced - : number

-
-

This flag may be combined with other "Layout" flags as the value of the Part.layoutConditions property to indicate that - when a Node or simple Part's category changes, it invalidates the Layout responsible for the Part; - this flag is ignored for Parts that are Links.

-
-
-
- -

- Static - LayoutNodeSized - : number

-
-

This flag may be combined with other "Layout" flags as the value of the Part.layoutConditions property to indicate that - when a Node or simple Part's GraphObject.actualBounds changes size, it invalidates the Layout responsible for the Part; - this flag is ignored for Parts that are Links.

-
-
-
- -

- Static - LayoutNone - : number

-
-

This value may be used as the value of the Part.layoutConditions property to indicate that - no operation on this Part causes invalidation of the Layout responsible for this Part.

-
-
-
- -

- Static - LayoutRemoved - : number

-
-

This flag may be combined with other "Layout" flags as the value of the Part.layoutConditions property to indicate that - when a Part is removed from a Diagram or Group, it invalidates the Layout responsible for the Part.

-
-
-
- -

- Static - LayoutShown - : number

-
-

This flag may be combined with other "Layout" flags as the value of the Part.layoutConditions property to indicate that - when a Part's GraphObject.visible becomes true, it invalidates the Layout responsible for the Part.

-
-
-
- -

- Static - LayoutStandard - : number

-
-

This is the default value for the Part.layoutConditions property, basically a combination of all of the conditions: - the Layout responsible for the Part is invalidated when the Part is added or removed or replaced - from the Diagram or Group, or when it changes visibility or size, or when a Group's layout has been performed.

-
-
-
-
- -
- -
- -
-
- - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/PathFigure.html b/api/symbols/PathFigure.html index 8d66a304b..ea1cbc46a 100644 --- a/api/symbols/PathFigure.html +++ b/api/symbols/PathFigure.html @@ -1,399 +1,74 @@ - - - - - - PathFigure | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class PathFigure

-
-
-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - PathFigure -
  • -
-
-
-
-

A PathFigure represents a section of a Geometry. - It is a single connected series of - two-dimensional geometric PathSegments.

-

The Geometry.figures property is a list of PathFigures.

-

PathFigures are drawn with the Shape.stroke and other stroke properties. - Filled PathFigures are painted with the Shape.fill.

-

A PathFigure must not be modified once its containing Geometry - has been assigned to a Shape.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

-
    -
  • new PathFigure(sx?: number, sy?: number, filled?: boolean, shadowed?: boolean): PathFigure
  • -
-
    -
  • -
    -

    Constructs an empty figure. - The optional arguments specify the starting point of the figure. - You'll want to add a new instance of a PathFigure to the - Geometry.figures list of a Geometry.

    -
    -

    Parameters

    -
      -
    • -
      Optional sx: number
      -
      -

      optional: the X coordinate of the start point (default is zero).

      -
      -
    • -
    • -
      Optional sy: number
      -
      -

      optional: the Y coordinate of the start point (default is zero).

      -
      -
    • -
    • -
      Optional filled: boolean
      -
      -

      optional: whether the figure is filled (default is true).

      -
      -
    • -
    • -
      Optional shadowed: boolean
      -
      -

      optional: whether the figure may be drawn with a shadow (default is true).

      -
      -
    • -
    -

    Returns PathFigure

    -
  • -
-
-
-
-

Properties

-
- -

- isFilled - : boolean

-
    -
  • -
    -

    Gets or sets whether this PathFigure is drawn filled. - The default value is true.

    -
    -
  • -
-
-
- -

- isShadowed - : boolean

-
    -
  • -
    -

    Gets or sets whether this PathFigure will render a shadow if one is defined. - This is used for turning off shadows on specific subpaths. - The default value is true.

    -
    -
  • -
-
-
- -

- segments - : List<PathSegment>

-
    -
  • -
    -

    Gets or sets the List of PathSegments that define this PathFigure.

    -
    -
  • -
-
-
- -

- startX - : number

-
    -
  • -
    -

    Gets or sets the starting point X coordinate of the PathFigure. - The default value is zero.

    -
    -
  • -
-
-
- -

- startY - : number

-
    -
  • -
    -

    Gets or sets the starting point Y coordinate of the PathFigure. - The default value is zero.

    -
    -
  • -
-
-
-
-

Methods

-
- -

- add -

- -
    -
  • -
    -

    Add a PathSegment to the segments list.

    -
    -
    since
    -

    1.5

    -
    -
    -
    -

    Parameters

    -
      -
    • -
      segment: PathSegment
      -
      -

      a newly allocated unshared PathSegment that will become owned by this PathFigure

      -
      -
    • -
    -

    Returns PathFigure

    -
  • -
-
-
- -

- Virtual - copy -

- -
    -
  • -
    -

    Create a copy of this PathFigure, with the same values and segments.

    -
    -

    Returns PathFigure

    -
  • -
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class PathFigure

Hierarchy

  • PathFigure
+

A PathFigure represents a section of a Geometry. +It is a single connected series of +two-dimensional geometric PathSegments.

+

The Geometry.figures property is a list of PathFigures.

+

PathFigures are drawn with the Shape.stroke and other stroke properties. +Filled PathFigures are painted with the Shape.fill.

+

A PathFigure must not be modified once its containing Geometry +has been assigned to a Shape.

+

Index

Constructors

  • new PathFigure(sx?: number, sy?: number, filled?: boolean, shadowed?: boolean): PathFigure
  • +

    Constructs an empty figure. +The optional arguments specify the starting point of the figure. +You'll want to add a new instance of a PathFigure to the +Geometry.figures list of a Geometry.

    +

    Parameters

    • Optional sx: number
      +

      optional: the X coordinate of the start point (default is zero).

      +
    • Optional sy: number
      +

      optional: the Y coordinate of the start point (default is zero).

      +
    • Optional filled: boolean
      +

      optional: whether the figure is filled (default is true).

      +
    • Optional shadowed: boolean
      +

      optional: whether the figure may be drawn with a shadow (default is true).

      +

    Returns PathFigure

Properties

  • +

    Gets or sets whether this PathFigure is drawn filled. +The default value is true.

    +
  • +

    Gets or sets whether this PathFigure will render a shadow if one is defined. +This is used for turning off shadows on specific subpaths. +The default value is true.

    +
  • +

    Gets or sets the starting point X coordinate of the PathFigure. +The default value is zero.

    +
  • +

    Gets or sets the starting point Y coordinate of the PathFigure. +The default value is zero.

    +

Methods

  • +

    Create a copy of this PathFigure, with the same values and segments.

    +

    Returns PathFigure

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/PathSegment.html b/api/symbols/PathSegment.html index fb4b2902f..2a2c0e8af 100644 --- a/api/symbols/PathSegment.html +++ b/api/symbols/PathSegment.html @@ -1,786 +1,192 @@ - - - - - - PathSegment | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class PathSegment

-
-
-
-
-
-
-
-
-
-

Hierarchy

-
    -
  • - PathSegment -
  • -
-
-
-
-

A PathSegment represents a straight line or curved segment of a path between - two or more points that are part of a PathFigure. - The very first point is given by the PathFigure.startX and PathFigure.startY properties. - After the first segment the beginning point of the next segment is the same as the end point of the previous segment. - For most types of PathSegments the end point of the segment is given by endX and endY.

-

A PathSegment must not be modified once its containing PathFigure's - Geometry has been assigned to a Shape.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-

Constants

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

-
    -
  • new PathSegment(type?: EnumValue, ex?: number, ey?: number, x1?: number, y1?: number, x2?: number, y2?: number | boolean, clockwise?: boolean): PathSegment
  • -
-
    -
  • -
    -

    Constructs a segment that goes nowhere unless you specify some Points.

    -

    The very first point of a path is specified in the containing PathFigure by - its PathFigure.startX and PathFigure.startY properties.

    -

    The segment type must be one of the following values: - PathSegment.Line, PathSegment.Bezier, - PathSegment.QuadraticBezier, PathSegment.Arc, PathSegment.SvgArc. - You will want to add a new instance of a PathSegment to the - PathFigure.segments list of a PathFigure.

    -
    -

    Parameters

    -
      -
    • -
      Optional type: EnumValue
      -
      -

      if not supplied, the default PathSegment type is PathSegment.Line. - But if the type is supplied, one must also provide the endpoint X and Y values, - either as arguments in this constructor or by setting the endX and endY properties. - If the type is QuadraticBezier, the X1 and Y1 control point values must both be supplied. - If the type is Bezier, X1, Y1, X2, and Y2 control point values must all be supplied.

      -

      If the type is Line it needs the following arguments:

      -

      (go.PathSegment.Line, ex, ey)

      -
        -
      • ex, ey describe the end point
      • -
      -

      If the type is QuadraticBezier it needs the following arguments:

      -

      (go.PathSegment.QuadraticBezier, ex, ey, x1, y1)

      -
        -
      • ex, ey describe the end point
      • -
      • x1, y1 describe the only control point
      • -
      -

      If the type is Bezier it needs the following arguments:

      -

      (go.PathSegment.Bezier, ex, ey, x1, y1, x2, y2)

      -
        -
      • ex, ey describe the end point
      • -
      • x1, y1 describe the first control point
      • -
      • x2, y2 describe the second control point
      • -
      -

      If the type is Arc it needs the following arguments:

      -

      (go.PathSegment.Arc, startAngle, sweepAngle, centerX, centerY, radiusX, radiusY)

      -
        -
      • startAngle describes the start angle, in degrees
      • -
      • sweepAngle describes the sweep angle, in degrees
      • -
      • centerX, centerY describe the center point
      • -
      • radiusX, radiusY describe the radiusX and radiusY
      • -
      -

      If the type is SvgArc it needs the following arguments:

      -

      (go.PathSegment.SvgArc, ex, ey, radiusX, radiusY, xAxisRotation, largeArcFlag, clockwiseFlag)

      -

      They are in the same order as arcs in SVG path strings, except the endpoint x and y values come first, not last.

      -
        -
      • ex, ey describe the endpoint
      • -
      • radiusX, radiusY describe the radius
      • -
      • xAxisRotation describes the xAxisRotation (number in degrees)
      • -
      • largeArcFlag describes the isLargeArc (true or false)
      • -
      • clockwiseFlag describes the isClockwiseArc (true or false).
      • -
      -

      If the type is Move it needs the following arguments:

      -

      (go.PathSegment.Move, ex, ey)

      -
        -
      • ex, ey describe the next starting point
      • -
      -
      -
    • -
    • -
      Optional ex: number
      -
      -

      optional: the X coordinate of the end point, or the startAngle of an Arc.

      -
      -
    • -
    • -
      Optional ey: number
      -
      -

      optional: the Y coordinate of the end point, or the sweepAngle of an Arc.

      -
      -
    • -
    • -
      Optional x1: number
      -
      -

      optional: the X coordinate of the first bezier control point, or the centerX of an Arc, or the radiusX of an SvgArc.

      -
      -
    • -
    • -
      Optional y1: number
      -
      -

      optional: the Y coordinate of the first bezier control point, or the centerY of an Arc, or the radiusY of an SvgArc.

      -
      -
    • -
    • -
      Optional x2: number
      -
      -

      optional: the X coordinate of the second cubic bezier control point, or the radiusX of an Arc, or the xAxisRotation of an SvgArc.

      -
      -
    • -
    • -
      Optional y2: number | boolean
      -
      -

      optional: the Y coordinate of the second cubic bezier control point, or the radiusY of an Arc, or whether this is the larger arc of an SvgArc.

      -
      -
    • -
    • -
      Optional clockwise: boolean
      -
      -

      optional: whether an SvgArc goes clockwise or counterclockwise.

      -
      -
    • -
    -

    Returns PathSegment

    -
  • -
-
-
-
-

Properties

-
- -

- centerX - : number

-
    -
  • -
    -

    Gets or sets the center X value of the Arc for a PathSegment of type Arc.

    -
    -
  • -
-
-
- -

- centerY - : number

-
    -
  • -
    -

    Gets or sets the center Y value of the Arc for a PathSegment of type Arc.

    -
    -
  • -
-
-
- -

- endX - : number

-
    -
  • -
    -

    Gets or sets the X coordinate of the end point for all types of PathSegment except Arc. - The default value is zero.

    -
    -
  • -
-
-
- -

- endY - : number

-
    -
  • -
    -

    Gets or sets the Y coordinate of the end point for all types of PathSegment except Arc. - The default value is zero.

    -
    -
  • -
-
-
- -

- isClockwiseArc - : boolean

-
    -
  • -
    -

    Gets or sets the clockwise-flag for a PathSegment of type SvgArc. - SVG Arcs specify a radius and an endpoint, and are always a portion of an ellipse. - The parameters allow for two potential ellipses and four potential arcs. - A clockwise-flag set to true will use one of the two possible positive-angle arcs, - and false will use one of the two negative-angle arcs. Which arc is chosen (small or large) - depends on the value of isLargeArc. - For more information see the visual examples in the - SVG Arc specification (w3.org)

    -
    -
  • -
-
-
- -

- isClosed - : boolean

-
    -
  • -
    -

    Gets or sets whether the path is closed after this PathSegment. - Default value is false.

    -
    -
  • -
-
-
- -

- isLargeArc - : boolean

-
    -
  • -
    -

    Gets or sets the large-arc-flag for a PathSegment of type SvgArc. - SVG Arcs specify a radius and an endpoint, and are always a portion of an ellipse. - The parameters allow for two potential ellipses and four potential arcs. - A large-arc-flag set to true will choose the larger of the two arc sweeps. - Which way the arc sweeps (positive angle or negative angle) depends on the value of isClockwiseArc - For more information see the visual examples in the - SVG Arc specification (w3.org)

    -
    -
  • -
-
-
- -

- point1X - : number

-
    -
  • -
    -

    Gets or sets the X value of the first control point for a PathSegment - of type Bezier or QuadraticBezier.

    -
    -
  • -
-
-
- -

- point1Y - : number

-
    -
  • -
    -

    Gets or sets the Y value of the first control point for a PathSegment - of type Bezier or QuadraticBezier.

    -
    -
  • -
-
-
- -

- point2X - : number

-
    -
  • -
    -

    Gets or sets the X value of the second control point for a PathSegment - of type cubic Bezier.

    -
    -
  • -
-
-
- -

- point2Y - : number

-
    -
  • -
    -

    Gets or sets the Y value of the second control point for a PathSegment - of type cubic Bezier.

    -
    -
  • -
-
-
- -

- radiusX - : number

-
    -
  • -
    -

    Gets or sets the X value of the radius for a PathSegment of type Arc or SvgArc. - Value must be a positive number.

    -
    -
  • -
-
-
- -

- radiusY - : number

-
    -
  • -
    -

    Gets or sets the Y value of the radius for a PathSegment of type Arc or SvgArc. - Value must be a positive number.

    -
    -
  • -
-
-
- -

- startAngle - : number

-
    -
  • -
    -

    Gets or sets the starting angle for a PathSegment of type Arc. - Value must within the range: (0 <= value < 360).

    -
    -
  • -
-
-
- -

- sweepAngle - : number

-
    -
  • -
    -

    Gets or sets the length of angle in degrees, or amount of arc to "sweep" for a PathSegment of type Arc. - Must be between -360 and 360, inclusive.

    -
    -
  • -
-
-
- -

- type - : EnumValue

- -
-
- -

- xAxisRotation - : number

-
    -
  • -
    -

    Gets or sets the X-axis rotation for a PathSegment of type SvgArc. - X-axis rotation is used to rotate the ellipse that the arc is created from, - and must be between 0 and 360 degrees. - Default is 0.

    -
    -
  • -
-
-
-
-

Methods

-
- -

- close -

- -
    -
  • -
    -

    Closes the path after this PathSegment

    -
    -

    Returns PathSegment

    -

    returns this PathSegment.

    -
  • -
-
-
- -

- Virtual - copy -

- -
    -
  • -
    -

    Create a copy of this PathSegment, of the same type and with the same point values.

    -
    -

    Returns PathSegment

    -
  • -
-
-
-
-

Constants

-
- -

- Static - Arc - : EnumValue

-
-

For drawing an arc segment, a value for PathSegment.type.

-
-
-
- -

- Static - Bezier - : EnumValue

-
-

For drawing a cubic bezier segment, a value for PathSegment.type.

-
-
-
- -

- Static - Line - : EnumValue

-
-

For drawing a straight line segment, a value for PathSegment.type.

-
-
-
- -

- Static - Move - : EnumValue

-
-

For beginning a new subpath, a value for PathSegment.type.

-
-
-
- -

- Static - QuadraticBezier - : EnumValue

-
-

For drawing a quadratic bezier segment, a value for PathSegment.type.

-
-
-
- -

- Static - SvgArc - : EnumValue

-
-

For drawing an SVG arc segment, a value for PathSegment.type.

-

See: SVG Arc specification (w3.org)

-
-
since
-

1.1

-
-
-
-
-
-
- -
-
-
- -
-
- - -
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class PathSegment

Hierarchy

  • PathSegment
+

A PathSegment represents a straight line or curved segment of a path between +two or more points that are part of a PathFigure. +The very first point is given by the PathFigure.startX and PathFigure.startY properties. +After the first segment the beginning point of the next segment is the same as the end point of the previous segment. +For most types of PathSegments the end point of the segment is given by endX and endY.

+

A PathSegment must not be modified once its containing PathFigure's +Geometry has been assigned to a Shape.

+

Index

Constructors

  • new PathSegment(type?: EnumValue, ex?: number, ey?: number, x1?: number, y1?: number, x2?: number, y2?: number | boolean, clockwise?: boolean): PathSegment
  • +

    Constructs a segment that goes nowhere unless you specify some Points.

    +

    The very first point of a path is specified in the containing PathFigure by +its PathFigure.startX and PathFigure.startY properties.

    +

    The segment type must be one of the following values: +PathSegment.Line, PathSegment.Bezier, +PathSegment.QuadraticBezier, PathSegment.Arc, PathSegment.SvgArc. +You will want to add a new instance of a PathSegment to the +PathFigure.segments list of a PathFigure.

    +

    Parameters

    • Optional type: EnumValue
      +

      if not supplied, the default PathSegment type is PathSegment.Line. + But if the type is supplied, one must also provide the endpoint X and Y values, + either as arguments in this constructor or by setting the endX and endY properties. + If the type is QuadraticBezier, the X1 and Y1 control point values must both be supplied. + If the type is Bezier, X1, Y1, X2, and Y2 control point values must all be supplied.

      +

      If the type is Line it needs the following arguments:

      +

      (go.PathSegment.Line, ex, ey)

      +
        +
      • ex, ey describe the end point
      • +
      +

      If the type is QuadraticBezier it needs the following arguments:

      +

      (go.PathSegment.QuadraticBezier, ex, ey, x1, y1)

      +
        +
      • ex, ey describe the end point
      • +
      • x1, y1 describe the only control point
      • +
      +

      If the type is Bezier it needs the following arguments:

      +

      (go.PathSegment.Bezier, ex, ey, x1, y1, x2, y2)

      +
        +
      • ex, ey describe the end point
      • +
      • x1, y1 describe the first control point
      • +
      • x2, y2 describe the second control point
      • +
      +

      If the type is Arc it needs the following arguments:

      +

      (go.PathSegment.Arc, startAngle, sweepAngle, centerX, centerY, radiusX, radiusY)

      +
        +
      • startAngle describes the start angle, in degrees
      • +
      • sweepAngle describes the sweep angle, in degrees
      • +
      • centerX, centerY describe the center point
      • +
      • radiusX, radiusY describe the radiusX and radiusY
      • +
      +

      If the type is SvgArc it needs the following arguments:

      +

      (go.PathSegment.SvgArc, ex, ey, radiusX, radiusY, xAxisRotation, largeArcFlag, clockwiseFlag)

      +

      They are in the same order as arcs in SVG path strings, except the endpoint x and y values come first, not last.

      +
        +
      • ex, ey describe the endpoint
      • +
      • radiusX, radiusY describe the radius
      • +
      • xAxisRotation describes the xAxisRotation (number in degrees)
      • +
      • largeArcFlag describes the isLargeArc (true or false)
      • +
      • clockwiseFlag describes the isClockwiseArc (true or false).
      • +
      +

      If the type is Move it needs the following arguments:

      +

      (go.PathSegment.Move, ex, ey)

      +
        +
      • ex, ey describe the next starting point
      • +
      +
    • Optional ex: number
      +

      optional: the X coordinate of the end point, or the startAngle of an Arc.

      +
    • Optional ey: number
      +

      optional: the Y coordinate of the end point, or the sweepAngle of an Arc.

      +
    • Optional x1: number
      +

      optional: the X coordinate of the first bezier control point, or the centerX of an Arc, or the radiusX of an SvgArc.

      +
    • Optional y1: number
      +

      optional: the Y coordinate of the first bezier control point, or the centerY of an Arc, or the radiusY of an SvgArc.

      +
    • Optional x2: number
      +

      optional: the X coordinate of the second cubic bezier control point, or the radiusX of an Arc, or the xAxisRotation of an SvgArc.

      +
    • Optional y2: number | boolean
      +

      optional: the Y coordinate of the second cubic bezier control point, or the radiusY of an Arc, or whether this is the larger arc of an SvgArc.

      +
    • Optional clockwise: boolean
      +

      optional: whether an SvgArc goes clockwise or counterclockwise.

      +

    Returns PathSegment

Properties

  • +

    Gets or sets the center X value of the Arc for a PathSegment of type Arc.

    +
  • +

    Gets or sets the center Y value of the Arc for a PathSegment of type Arc.

    +
  • +

    Gets or sets the X coordinate of the end point for all types of PathSegment except Arc. +The default value is zero.

    +
  • +

    Gets or sets the Y coordinate of the end point for all types of PathSegment except Arc. +The default value is zero.

    +
  • +

    Gets or sets the clockwise-flag for a PathSegment of type SvgArc. +SVG Arcs specify a radius and an endpoint, and are always a portion of an ellipse. +The parameters allow for two potential ellipses and four potential arcs. +A clockwise-flag set to true will use one of the two possible positive-angle arcs, +and false will use one of the two negative-angle arcs. Which arc is chosen (small or large) +depends on the value of isLargeArc. +For more information see the visual examples in the +SVG Arc specification (w3.org)

    +
  • +

    Gets or sets whether the path is closed after this PathSegment. +Default value is false.

    +
  • +

    Gets or sets the large-arc-flag for a PathSegment of type SvgArc. +SVG Arcs specify a radius and an endpoint, and are always a portion of an ellipse. +The parameters allow for two potential ellipses and four potential arcs. +A large-arc-flag set to true will choose the larger of the two arc sweeps. +Which way the arc sweeps (positive angle or negative angle) depends on the value of isClockwiseArc +For more information see the visual examples in the +SVG Arc specification (w3.org)

    +
  • +

    Gets or sets the X value of the first control point for a PathSegment +of type Bezier or QuadraticBezier.

    +
  • +

    Gets or sets the Y value of the first control point for a PathSegment +of type Bezier or QuadraticBezier.

    +
  • +

    Gets or sets the X value of the second control point for a PathSegment +of type cubic Bezier.

    +
  • +

    Gets or sets the Y value of the second control point for a PathSegment +of type cubic Bezier.

    +
  • +

    Gets or sets the X value of the radius for a PathSegment of type Arc or SvgArc. +Value must be a positive number.

    +
  • +

    Gets or sets the Y value of the radius for a PathSegment of type Arc or SvgArc. +Value must be a positive number.

    +
  • +

    Gets or sets the starting angle for a PathSegment of type Arc. +Value must within the range: (0 <= value < 360).

    +
  • +

    Gets or sets the length of angle in degrees, or amount of arc to "sweep" for a PathSegment of type Arc. +Must be between -360 and 360, inclusive.

    +
  • +

    Gets or sets the X-axis rotation for a PathSegment of type SvgArc. +X-axis rotation is used to rotate the ellipse that the arc is created from, +and must be between 0 and 360 degrees. +Default is 0.

    +

Methods

  • +

    Closes the path after this PathSegment

    +

    Returns PathSegment

    returns this PathSegment.

    +
  • +

    Create a copy of this PathSegment, of the same type and with the same point values.

    +

    Returns PathSegment

Constants

+

For drawing an arc segment, a value for PathSegment.type.

+
+

For drawing a cubic bezier segment, a value for PathSegment.type.

+
+

For drawing a straight line segment, a value for PathSegment.type.

+
+

For beginning a new subpath, a value for PathSegment.type.

+
+

For drawing a quadratic bezier segment, a value for PathSegment.type.

+
+

For drawing an SVG arc segment, a value for PathSegment.type.

+
since

1.1

+

Settings

Theme

+ - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Picture.html b/api/symbols/Picture.html index b14a473d0..e388d1ce1 100644 --- a/api/symbols/Picture.html +++ b/api/symbols/Picture.html @@ -1,621 +1,172 @@ - - - - - - Picture | GoJS API - - - - - - - -
- -
-
-
-
- -
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
-
-
- Menu -
-
-
-
-
-
- -
-

Class Picture

-
-
-
-
-
-
-
-
-
-

Hierarchy

- -
-
-
-

A Picture is a GraphObject that shows an image, video-frame, or Canvas element.

-

You can specify what to show by either setting the source URL property - to a URL string or the element property to an HTMLImageElement, - HTMLCanvasElement, or HTMLVideoElement.

-

If a source URL is set, the Picture will automatically create a corresponding - HTMLImageElement and retain a reference to it in memory. If multiple Pictures specify - the same source URL then they will all refer to the same HTMLImageElement.

-

Some created Pictures:

-
var $ = go.GraphObject.make;  // for conciseness in defining GraphObjects
-
-// A picture with the source set to "example.png". It will show a gray area until the image is loaded:
-$(go.Picture, { source: "example.png", background: "gray", width: 50, height: 50 })
-// Alternatively:
-$(go.Picture, "example.png", { background: "gray", width: 50, height: 50 })
+Picture | GoJS API
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class Picture

Hierarchy

+

A Picture is a GraphObject that shows an image, video-frame, or Canvas element.

+

You can specify what to show by either setting the source URL property +to a URL string or the element property to an HTMLImageElement, +HTMLCanvasElement, or HTMLVideoElement.

+

If a source URL is set, the Picture will automatically create a corresponding +HTMLImageElement and retain a reference to it in memory. If multiple Pictures specify +the same source URL then they will all refer to the same HTMLImageElement.

+

Some created Pictures:

+
var $ = go.GraphObject.make;  // for conciseness in defining GraphObjects

// A picture with the source set to "example.png". It will show a gray area until the image is loaded:
$(go.Picture, { source: "example.png", background: "gray", width: 50, height: 50 })
// Alternatively:
$(go.Picture, "example.png", { background: "gray", width: 50, height: 50 })
-

If an element is not completely loaded during Diagram initialization, a redraw may occur, - and if an image's size is not known before loading, the containing Part of this Picture - may be resized, causing side effects such as layouts. - This can be avoided by knowing the size of the image beforehand, - and setting the Picture's GraphObject.desiredSize.

-

With some images (notably sprite sheets) only a portion of the image is expected to be drawn. - The sourceRect property allows the programmer to specify a rectangular area of - the source image that the Picture should display.

-

The imageStretch property allows an image to be resized inside of its bounding box. - This property does not change the size of the Picture element, it only resizes or re-scales - the image to fit (or not) in its bounds.

-

- For examples of sizing and imageStretch, - see the Introduction page on Pictures. -

The errorFunction property allows one to set a function to call when a source fails to load. - This is useful in instances where images cannot be guaranteed to work, such as with - user specified input. The error function can set the source to a known good value, - but care should be taken to avoid error infinite loops when doing so.

-
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

- constructor -

- -
    -
  • -
    -

    The constructor creates a Picture that shows nothing until the - source or element is specified. It is also common to specify the - GraphObject.desiredSize to make sure that the picture's size is known - before the image is loaded asynchronously, so that layouts do not need to be recomputed.

    -

    Common usage:

    -
    new go.Picture("example_image_url.png", {
    -  width: 100,
    -  height: 50
    -})
    +

    If an element is not completely loaded during Diagram initialization, a redraw may occur, +and if an image's size is not known before loading, the containing Part of this Picture +may be resized, causing side effects such as layouts. +This can be avoided by knowing the size of the image beforehand, +and setting the Picture's GraphObject.desiredSize.

    +

    With some images (notably sprite sheets) only a portion of the image is expected to be drawn. +The sourceRect property allows the programmer to specify a rectangular area of +the source image that the Picture should display.

    +

    The imageStretch property allows an image to be resized inside of its bounding box. +This property does not change the size of the Picture element, it only resizes or re-scales +the image to fit (or not) in its bounds.

    +

    +For examples of sizing and imageStretch, +see the Introduction page on Pictures. + +

    The errorFunction property allows one to set a function to call when a source fails to load. +This is useful in instances where images cannot be guaranteed to work, such as with +user specified input. The error function can set the source to a known good value, +but care should be taken to avoid error infinite loops when doing so.

    +

Index

Inherited Members

Properties

Methods

Constructors

  • +

    The constructor creates a Picture that shows nothing until the +source or element is specified. It is also common to specify the +GraphObject.desiredSize to make sure that the picture's size is known +before the image is loaded asynchronously, so that layouts do not need to be recomputed.

    +

    Common usage:

    +
    new go.Picture("example_image_url.png", {
    width: 100,
    height: 50
    })
    -

    Or:

    -
    // specify a different source for each node in the node data
    -new go.Picture({
    -  width: 100,
    -  height: 50
    -}).bind("source")
    +

    Or:

    +
    // specify a different source for each node in the node data
    new go.Picture({
    width: 100,
    height: 50
    }).bind("source")
    -
    -

    Parameters

    -
      -
    • -
      Optional source: string
      -
      -

      Optionally set the Pictures's source.

      -
      -
    • -
    • -
      Optional init: Partial<Picture>
      -
      -

      Optional properties to initialize.

      -
      -
    • -
    -

    Returns Picture

    -
  • -
  • -
    -

    The constructor creates a Picture that shows nothing until the - source or element is specified. It is also common to specify the - GraphObject.desiredSize to make sure that the picture's size is known - before the image is loaded asynchronously, so that layouts do not need to be recomputed.

    -
    -

    Parameters

    -
      -
    • -
      Optional init: Partial<Picture>
      -
      -

      Optional properties to initialize.

      -
      -
    • -
    -

    Returns Picture

    -
  • -
-
-
-
-

Properties

-
- -

- element - : HTMLCanvasElement | HTMLImageElement | HTMLVideoElement

-
    -
  • -
    -

    Gets or sets the Picture's HTML element that provides some kind of visual image.

    -

    The default value is null. - This can be a HTMLImageElement, HTMLVideoElement, or HTMLCanvasElement. - If an image, this element must have its source (src) attribute defined. - Setting this does not set the Picture.source attribute and that attribute may be unknowable.

    -

    If this property is set to an HTMLImageElement, and that element is not yet loaded before it is used, the Diagrams using that Element - will not redraw on their own. You must call Diagram.redraw() when the image is finished loading if you wish for the Diagram to redraw immediately.

    -
    -
  • -
-
-
- -

- errorFunction - : (a: Picture, b: Event) => void

-
    -
  • -
    -

    Gets or sets the function to call if an image set by source fails to load. - The arguments to this function are this Picture and the HTMLImageElement's "error" Event.

    -

    This is called once per Picture, for every Picture that is using the same source that failed to load. - This will never be called if the source is never set, and is not called with Pictures that use element instead.

    -

    The default value is null, meaning that no specific action occurs when there is an error loading an image.

    -
    -
    see
    -

    successFunction

    -
    -
    -
    -
  • -
-
-
- -

- flip - : EnumValue

- -
-
- -

- imageAlignment - : Spot

-
    -
  • -
    -

    Gets or sets the Spot to align the source image to, when the source image - is smaller than the Picture. This is only relevant when - the imageStretch property value is not go.GraphObject.Fill.

    -

    This does not affect Picture coordinates or bounds, it only affects what is drawn within the given area. - The default value is Spot.Center.

    -
    -
    see
    -

    imageStretch

    -
    -
    since
    -

    1.7

    -
    -
    -
    -
  • -
-
-
- -

- imageStretch - : EnumValue

- -
-
- -

- Override - Read-only - naturalBounds - : Rect

-
    -
  • -
    -

    This read-only property returns the natural size of this picture as determined by its source's width and height. - The value is initially NaN x NaN until the picture has been measured. - It will use the element's naturalWidth and naturalHeight if available.

    -
    -
  • -
-
-
- -

- source - : string

-
    -
  • -
    -

    Gets or sets the Picture's source URL, which can be any valid image (png, jpg, gif, etc) URL.

    -

    The default value is the empty string, which specifies no image source. - Setting this attribute creates an HTMLImageElement and sets the Picture.element - attribute to that element. When the element loads, this Picture may remeasure if no GraphObject.desiredSize was set, - and Diagrams using the picture will redraw.

    -

    To avoid remeasuring and rearranging Parts as images load asynchronously, - be sure to set the GraphObject.desiredSize - (or GraphObject.width and GraphObject.height) to fixed values.

    -

    Setting the source of multiple Pictures to the same URL will cause only one HTMLImageElement - to be created and shared. Setting the source to the empty string will set Picture.element to null. - It is commonplace to either specify a constant URL or to data bind this property to some data property, - perhaps using a conversion function in order to produce a proper URL.

    -

    For cross-browser support of SVG sources additional care is needed. - See the final section of the Introduction page on Pictures.

    -
    -
  • -
-
-
- -

- sourceCrossOrigin - : (a: Picture) => string

-
    -
  • -
    -

    Gets or sets a function that returns a value for image.crossOrigin.

    -

    The default value is null, which will not set a value for image.crossOrigin. - Set this property to a function that returns "anonymous" or "use-credentials" - if you want images to complete a cross-origin request. - Example:

    -
       $(go.Picture,
    -     { width: 64, height: 64 },
    -     { sourceCrossOrigin: function(pict) { return "use-credentials"; } },
    -     new go.Binding("source", "path"))
    +

Parameters

  • Optional source: string
    +

    Optionally set the Pictures's source.

    +
  • Optional init: Partial<Picture>
    +

    Optional properties to initialize.

    +

Returns Picture

  • +

    The constructor creates a Picture that shows nothing until the +source or element is specified. It is also common to specify the +GraphObject.desiredSize to make sure that the picture's size is known +before the image is loaded asynchronously, so that layouts do not need to be recomputed.

    +

    Parameters

    • Optional init: Partial<Picture>
      +

      Optional properties to initialize.

      +

    Returns Picture

  • Properties

    • +

      Gets or sets the Picture's HTML element that provides some kind of visual image.

      +

      The default value is null. +This can be a HTMLImageElement, HTMLVideoElement, or HTMLCanvasElement. +If an image, this element must have its source (src) attribute defined. +Setting this does not set the Picture.source attribute and that attribute may be unknowable.

      +

      If this property is set to an HTMLImageElement, and that element is not yet loaded before it is used, the Diagrams using that Element +will not redraw on their own. You must call Diagram.redraw() when the image is finished loading if you wish for the Diagram to redraw immediately.

      +
    • +

      Gets or sets the function to call if an image set by source fails to load. +The arguments to this function are this Picture and the HTMLImageElement's "error" Event.

      +

      This is called once per Picture, for every Picture that is using the same source that failed to load. +This will never be called if the source is never set, and is not called with Pictures that use element instead.

      +

      The default value is null, meaning that no specific action occurs when there is an error loading an image.

      +
      see

      successFunction

      +
    • +

      Gets or sets the Spot to align the source image to, when the source image +is smaller than the Picture. This is only relevant when +the imageStretch property value is not go.GraphObject.Fill.

      +

      This does not affect Picture coordinates or bounds, it only affects what is drawn within the given area. +The default value is Spot.Center.

      +
      see

      imageStretch

      +
      since

      1.7

      +
    • +

      This read-only property returns the natural size of this picture as determined by its source's width and height. +The value is initially NaN x NaN until the picture has been measured. +It will use the element's naturalWidth and naturalHeight if available.

      +
    • +

      Gets or sets the Picture's source URL, which can be any valid image (png, jpg, gif, etc) URL.

      +

      The default value is the empty string, which specifies no image source. +Setting this attribute creates an HTMLImageElement and sets the Picture.element +attribute to that element. When the element loads, this Picture may remeasure if no GraphObject.desiredSize was set, +and Diagrams using the picture will redraw.

      +

      To avoid remeasuring and rearranging Parts as images load asynchronously, +be sure to set the GraphObject.desiredSize +(or GraphObject.width and GraphObject.height) to fixed values.

      +

      Setting the source of multiple Pictures to the same URL will cause only one HTMLImageElement +to be created and shared. Setting the source to the empty string will set Picture.element to null. +It is commonplace to either specify a constant URL or to data bind this property to some data property, +perhaps using a conversion function in order to produce a proper URL.

      +

      For cross-browser support of SVG sources additional care is needed. +See the final section of the Introduction page on Pictures.

      +
    • +

      Gets or sets a function that returns a value for image.crossOrigin.

      +

      The default value is null, which will not set a value for image.crossOrigin. +Set this property to a function that returns "anonymous" or "use-credentials" +if you want images to complete a cross-origin request. +Example:

      +
         $(go.Picture,
      { width: 64, height: 64 },
      { sourceCrossOrigin: function(pict) { return "use-credentials"; } },
      new go.Binding("source", "path"))
      -
      -
      since
      -

      1.5

      -
      -
      -
      -
    • -
    -
    -
    - -

    - sourceRect - : Rect

    -
      -
    • -
      -

      Gets or sets the rectangular area of the source image that this picture should display. - This is only common with sprite maps and image tables.

      -

      The value must be of type Rect. - The default value is Rect(NaN, NaN, NaN, NaN), which means the whole source image should be used.

      -
      -
    • -
    -
    -
    - -

    - successFunction - : (a: Picture, b: Event) => void

    -
      -
    • -
      -

      Gets or sets the function to call when an image set by source loads successfully. - The arguments to this function are this Picture and the HTMLImageElement's "load" Event.

      -

      This is called once per Picture, for every Picture that is using the same source that loaded successfully. - This will never be called if the source is never set, and is not called with Pictures that use element instead. - It is even called for a Picture source that has already loaded, so that creating copies of a Picture with this property set will - call it once for each newly created Picture.

      -

      The default value is null, meaning that no specific action occurs when an image finishes loading.

      -
      -
      see
      -

      errorFunction

      -
      -
      since
      -

      1.7

      -
      -
      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - redraw -

    -
      -
    • redraw(): void
    • -
    -
      -
    • -
      -

      Redraws a Picture, which can be useful if the backing element is an HTML Canvas or HTML Video that has changed. - This will not attempt to reload any image. If you need to do that, call reloadSource.

      -

      This does not need to be called within a transaction, and will not re-measure anything.

      -
      -
      since
      -

      2.1

      -
      -
      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - reloadSource -

    -
      -
    • reloadSource(): void
    • -
    -
      -
    • -
      -

      Attempts to reload a Picture.source image. This can be useful if the content on a server has changed, or was missing before. - If a new image is loaded, this Picture may remeasure and/or redraw.

      -

      This should normally be called within a transaction.

      -
      -
      since
      -

      2.1

      -
      -
      -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    - -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Placeholder.html b/api/symbols/Placeholder.html index 6984e82ce..aafa98d03 100644 --- a/api/symbols/Placeholder.html +++ b/api/symbols/Placeholder.html @@ -1,246 +1,46 @@ - - - - - - Placeholder | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class Placeholder

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    If a Placeholder is in the visual tree of a Group, it represents the area of all of the member Parts of that Group. - If a Placeholder is in the visual tree of an Adornment, it represents the area of the Adornment.adornedObject. - Unlike other GraphObjects, the Placeholder measures itself based on these criteria, and not on its own desiredSize or scale. - It will set its own natural bounds and scale, and in the case of Groups will set the Group's location.

    -

    It can only be used in the visual tree of a Group node or an Adornment. - There can be at most one Placeholder in a Group or an Adornment.

    -

    See the documentation for Group and Adornment for descriptions of the Placeholder roles in each.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      This normally does not need any initialization, - except for maybe setting padding.

      -
      -

      Parameters

      -
        -
      • -
        Optional init: Partial<Placeholder>
        -
        -

        Optional initialization properties.

        -
        -
      • -
      -

      Returns Placeholder

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - padding - : MarginLike

    - -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class Placeholder

    Hierarchy

    +

    If a Placeholder is in the visual tree of a Group, it represents the area of all of the member Parts of that Group. +If a Placeholder is in the visual tree of an Adornment, it represents the area of the Adornment.adornedObject. +Unlike other GraphObjects, the Placeholder measures itself based on these criteria, and not on its own desiredSize or scale. +It will set its own natural bounds and scale, and in the case of Groups will set the Group's location.

    +

    It can only be used in the visual tree of a Group node or an Adornment. +There can be at most one Placeholder in a Group or an Adornment.

    +

    See the documentation for Group and Adornment for descriptions of the Placeholder roles in each.

    +

    Index

    Constructors

    Properties

    Inherited Members

    Properties

    Methods

    Constructors

    • +

      This normally does not need any initialization, +except for maybe setting padding.

      +

      Parameters

      • Optional init: Partial<Placeholder>
        +

        Optional initialization properties.

        +

      Returns Placeholder

    Properties

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Point.html b/api/symbols/Point.html index ec224adf2..8bafab491 100644 --- a/api/symbols/Point.html +++ b/api/symbols/Point.html @@ -1,1419 +1,225 @@ - - - - - - Point | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class Point

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - Point -
    • -
    -
    -
    -
    -

    A Point represents an x- and y-coordinate pair in two-dimensional space.

    -

    Use the static functions Point.parse and Point.stringify to convert to and from - a standard string representation that is independent of the current locale.

    -

    When an instance of this class is the value of a property of a GraphObject class or Diagram - or CommandHandler or a Tool class, you should treat the object - as if it were frozen or read-only -- you cannot modify its properties. - This allows the property to return a value without allocating a new instance. - If you need to do your own calculations with the value, call copy to make - a new instance with the same values that you can modify.

    -

    Many methods modify the object's properties and then return a reference to "this" object. - The only instance method to allocate a new object is the copy method. - The static Point.parse method also allocates a new object.

    -

    The "Debug" implementation of this class is significantly slower than the "Release" implementation, - mostly due to additional error checking.

    -

    You cannot inherit from this class.

    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    -
      -
    • new Point(x?: number, y?: number): Point
    • -
    -
      -
    • -
      -

      The default constructor produces the Point(0,0). - This constructor may take either zero arguments or two arguments.

      -
      -

      Parameters

      -
        -
      • -
        Optional x: number
        -
        -

        The x value.

        -
        -
      • -
      • -
        Optional y: number
        -
        -

        The y value.

        -
        -
      • -
      -

      Returns Point

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - x - : number

    -
      -
    • -
      -

      Gets or sets the x value of the Point.

      -
      -
    • -
    -
    -
    - -

    - y - : number

    -
      -
    • -
      -

      Gets or sets the y value of the Point.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - add -

    - -
      -
    • -
      -

      Modify this point so that is the sum of the current Point and the - x and y co-ordinates of the given Point.

      -
      -
      see
      -

      offset, subtract

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        p: Point
        -
        -

        The Point to add to this Point.

        -
        -
      • -
      -

      Returns Point

      -

      this.

      -
    • -
    -
    -
    - -

    - Static - compareWithLineSegment -

    -
      -
    • compareWithLineSegment(a1x: number, a1y: number, a2x: number, a2y: number, px: number, py: number): number
    • -
    -
      -
    • -
      -
      -
      since
      -

      2.2

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        a1x: number
        -
      • -
      • -
        a1y: number
        -
      • -
      • -
        a2x: number
        -
      • -
      • -
        a2y: number
        -
      • -
      • -
        px: number
        -
      • -
      • -
        py: number
        -
      • -
      -

      Returns number

      -

      <0 if on the left side, or >0 if on the right side, or zero if exactly on the finite line segment

      -
    • -
    -
    -
    - -

    - compareWithLineSegmentPoint -

    -
      -
    • compareWithLineSegmentPoint(p: Point, q: Point): number
    • -
    -
      -
    • -
      -
      -
      since
      -

      2.2

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        p: Point
        -
        -

        one end of the finite line segment

        -
        -
      • -
      • -
        q: Point
        -
        -

        the other end of the finite line segment

        -
        -
      • -
      -

      Returns number

      -

      <0 if on the left side, or >0 if on the right side, or zero if exactly on the finite line segment

      -
    • -
    -
    -
    - -

    - Virtual - copy -

    - -
      -
    • -
      -

      Create a copy of this Point, with the same values.

      -
      -

      Returns Point

      -
    • -
    -
    -
    - -

    - direction -

    -
      -
    • direction(px: number, py: number): number
    • -
    -
      -
    • -
      -

      Compute the angle from this Point to a given (px,py) point. - However, if the point is the same as this Point, the direction is zero.

      -
      -
      see
      -

      directionPoint

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        px: number
        -
      • -
      • -
        py: number
        -
      • -
      -

      Returns number

      -

      the angle, in degrees, of the line from this Point to the given point.

      -
    • -
    -
    -
    - -

    - Static - direction -

    -
      -
    • direction(px: number, py: number, qx: number, qy: number): number
    • -
    -
      -
    • -
      -

      This static function returns the angle in degrees of the line from point P to point Q.

      -
      -

      Parameters

      -
        -
      • -
        px: number
        -
      • -
      • -
        py: number
        -
      • -
      • -
        qx: number
        -
      • -
      • -
        qy: number
        -
      • -
      -

      Returns number

      -
    • -
    -
    -
    - -

    - directionPoint -

    -
      -
    • directionPoint(p: Point): number
    • -
    -
      -
    • -
      -

      Compute the angle from this Point to a given Point. - However, if the given Point is the same as this Point, the direction is zero.

      -
      -
      see
      -

      direction

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        p: Point
        -
        -

        the other Point to which to measure the relative angle.

        -
        -
      • -
      -

      Returns number

      -

      the angle, in degrees, of the line from this Point to the given point.

      -
    • -
    -
    -
    - -

    - Static - distanceLineSegmentSquared -

    -
      -
    • distanceLineSegmentSquared(px: number, py: number, ax: number, ay: number, bx: number, by: number): number
    • -
    -
      -
    • -
      -

      This static function returns the square of the distance from the point P - to the finite line segment from point A to point B.

      -
      -

      Parameters

      -
        -
      • -
        px: number
        -
      • -
      • -
        py: number
        -
      • -
      • -
        ax: number
        -
      • -
      • -
        ay: number
        -
      • -
      • -
        bx: number
        -
      • -
      • -
        by: number
        -
      • -
      -

      Returns number

      -

      the euclidean distance.

      -
    • -
    -
    -
    - -

    - distanceSquared -

    -
      -
    • distanceSquared(px: number, py: number): number
    • -
    -
      -
    • -
      -

      Returns the square of the distance from this point to a given point (px, py).

      -
      -
      see
      -

      distanceSquaredPoint

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        px: number
        -
      • -
      • -
        py: number
        -
      • -
      -

      Returns number

      -

      the square of the euclidean distance.

      -
    • -
    -
    -
    - -

    - Static - distanceSquared -

    -
      -
    • distanceSquared(px: number, py: number, qx: number, qy: number): number
    • -
    -
      -
    • -
      -

      This static function returns the square of the distance from the point P to the point Q.

      -
      -

      Parameters

      -
        -
      • -
        px: number
        -
      • -
      • -
        py: number
        -
      • -
      • -
        qx: number
        -
      • -
      • -
        qy: number
        -
      • -
      -

      Returns number

      -
    • -
    -
    -
    - -

    - distanceSquaredPoint -

    -
      -
    • distanceSquaredPoint(p: Point): number
    • -
    -
      -
    • -
      -

      Returns the square of the distance from this Point to a given Point.

      -
      -
      see
      -

      distanceSquared

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        p: Point
        -
        -

        the other Point to measure to.

        -
        -
      • -
      -

      Returns number

      -

      the square of the euclidean distance.

      -
    • -
    -
    -
    - -

    - equalTo -

    -
      -
    • equalTo(x: number, y: number): boolean
    • -
    -
      -
    • -
      -

      Indicates whether the given point (x, y) is equal to this Point.

      -
      -
      see
      -

      equals

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        x: number
        -
      • -
      • -
        y: number
        -
      • -
      -

      Returns boolean

      -

      True if the two Points have identical X and Y values, - false otherwise.

      -
    • -
    -
    -
    - -

    - equals -

    -
      -
    • equals(p: Point): boolean
    • -
    -
      -
    • -
      -

      Indicates whether the given Point is equal to this Point.

      -
      -
      see
      -

      equalTo

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        p: Point
        -
        -

        The Point to compare to the current Point.

        -
        -
      • -
      -

      Returns boolean

      -

      True if the two Points have identical X and Y values, - false otherwise.

      -
    • -
    -
    -
    - -

    - Static - intersectingLineSegments -

    -
      -
    • intersectingLineSegments(a1x: number, a1y: number, a2x: number, a2y: number, b1x: number, b1y: number, b2x: number, b2y: number): boolean
    • -
    -
      -
    • -
      -
      -
      since
      -

      2.2

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        a1x: number
        -
      • -
      • -
        a1y: number
        -
      • -
      • -
        a2x: number
        -
      • -
      • -
        a2y: number
        -
      • -
      • -
        b1x: number
        -
      • -
      • -
        b1y: number
        -
      • -
      • -
        b2x: number
        -
      • -
      • -
        b2y: number
        -
      • -
      -

      Returns boolean

      -

      True if the two given finite line segments intersect with each other, false otherwise.

      -
    • -
    -
    -
    - -

    - isReal -

    -
      -
    • isReal(): boolean
    • -
    -
      -
    • -
      -

      True if this Point has X and Y values that are real numbers and not infinity.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - normalize -

    - -
      -
    • -
      -

      Modify this Point so that its X and Y values have been normalized to a unit length. - However, if this Point is the origin (zero, zero), its length remains zero.

      -
      -

      Returns Point

      -

      this.

      -
    • -
    -
    -
    - -

    - offset -

    -
      -
    • offset(dx: number, dy: number): Point
    • -
    -
      -
    • -
      -

      Modify this point by shifting its values with the given DX and DY offsets.

      -
      -
      see
      -

      add, subtract

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        dx: number
        -
      • -
      • -
        dy: number
        -
      • -
      -

      Returns Point

      -

      this.

      -
    • -
    -
    -
    - -

    - Static - parse -

    -
      -
    • parse(str: string): Point
    • -
    -
      -
    • -
      -

      This static function can be used to read in a Point from a string that was produced by Point.stringify.

      -

      go.Point.parse("1 2") produces the Point new go.Point(1, 2).

      -
      -

      Parameters

      -
        -
      • -
        str: string
        -
      • -
      -

      Returns Point

      -
    • -
    -
    -
    - -

    - projectOntoLineSegment -

    -
      -
    • projectOntoLineSegment(px: number, py: number, qx: number, qy: number): Point
    • -
    -
      -
    • -
      -

      Modify this point to be the closest point to this point that is on a finite line segment.

      -
      -
      since
      -

      1.3

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        px: number
        -
        -

        one end of the finite line segment

        -
        -
      • -
      • -
        py: number
        -
        -

        one end of the finite line segment

        -
        -
      • -
      • -
        qx: number
        -
        -

        the other end of the finite line segment

        -
        -
      • -
      • -
        qy: number
        -
        -

        the other end of the finite line segment

        -
        -
      • -
      -

      Returns Point

      -

      this modified Point

      -
    • -
    -
    -
    - -

    - projectOntoLineSegmentPoint -

    - -
      -
    • -
      -

      Modify this point to be the closest point to this point that is on a finite line segment.

      -
      -
      since
      -

      1.3

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        p: Point
        -
        -

        one end of the finite line segment

        -
        -
      • -
      • -
        q: Point
        -
        -

        the other end of the finite line segment

        -
        -
      • -
      -

      Returns Point

      -

      this modified Point

      -
    • -
    -
    -
    - -

    - rotate -

    -
      -
    • rotate(angle: number): Point
    • -
    -
      -
    • -
      -

      Modify this Point so that has been rotated about the origin by the given angle.

      -
      -

      Parameters

      -
        -
      • -
        angle: number
        -
        -

        an angle in degrees.

        -
        -
      • -
      -

      Returns Point

      -

      this.

      -
    • -
    -
    -
    - -

    - scale -

    -
      -
    • scale(sx: number, sy: number): Point
    • -
    -
      -
    • -
      -

      Modify this Point so that its X and Y values have been scaled by given factors along the X and Y axes.

      -
      -

      Parameters

      -
        -
      • -
        sx: number
        -
      • -
      • -
        sy: number
        -
      • -
      -

      Returns Point

      -

      this.

      -
    • -
    -
    -
    - -

    - set -

    - -
      -
    • -
      -

      Modify this Point so that its X and Y values are the same as the given Point.

      -
      -

      Parameters

      -
        -
      • -
        p: Point
        -
        -

        the given Point.

        -
        -
      • -
      -

      Returns Point

      -

      this.

      -
    • -
    -
    -
    - -

    - setRectSpot -

    - -
      -
    • -
      -

      Modify this Point so that its X and Y values correspond to a particular Spot - in a given Rect.

      -

      The result is meaningless if Spot.isNoSpot is true for the given Spot.

      -
      -
      see
      -

      setSpot

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        r: Rect
        -
        -

        the Rect for which we are finding the point.

        -
        -
      • -
      • -
        spot: Spot
        -
        -

        the Spot; Spot.isSpot must be true for this Spot.

        -
        -
      • -
      -

      Returns Point

      -

      this.

      -
    • -
    -
    -
    - -

    - setSpot -

    -
      -
    • setSpot(x: number, y: number, w: number, h: number, spot: Spot): Point
    • -
    -
      -
    • -
      -

      Modify this Point so that its X and Y values correspond to a particular Spot - in a given rectangle.

      -

      The result is meaningless if Spot.isNoSpot is true for the given Spot.

      -
      -
      see
      -

      setRectSpot

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        x: number
        -
        -

        The X coordinate of the Rect for which we are finding the point.

        -
        -
      • -
      • -
        y: number
        -
        -

        The Y coordinate of the Rect for which we are finding the point.

        -
        -
      • -
      • -
        w: number
        -
        -

        The Width of the Rect for which we are finding the point.

        -
        -
      • -
      • -
        h: number
        -
        -

        The Height of the Rect for which we are finding the point.

        -
        -
      • -
      • -
        spot: Spot
        -
        -

        the Spot; Spot.isSpot must be true for this Spot.

        -
        -
      • -
      -

      Returns Point

      -

      this the point of the spot in the rectangle.

      -
    • -
    -
    -
    - -

    - setTo -

    -
      -
    • setTo(x: number, y: number): Point
    • -
    -
      -
    • -
      -

      Modify this Point with new X and Y values.

      -
      -

      Parameters

      -
        -
      • -
        x: number
        -
      • -
      • -
        y: number
        -
      • -
      -

      Returns Point

      -

      this.

      -
    • -
    -
    -
    - -

    - snapToGrid -

    -
      -
    • snapToGrid(originx: number, originy: number, cellwidth: number, cellheight: number): Point
    • -
    -
      -
    • -
      -

      Modify this point to be at the nearest point on an infinite grid, - given the grid's origin and size of each grid cell.

      -
      -
      since
      -

      1.3

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        originx: number
        -
        -

        the top-left point of one of the grid cells

        -
        -
      • -
      • -
        originy: number
        -
        -

        the top-left point of one of the grid cells

        -
        -
      • -
      • -
        cellwidth: number
        -
        -

        the size of each grid cell -- must be a real number larger than zero

        -
        -
      • -
      • -
        cellheight: number
        -
        -

        the size of each grid cell -- must be a real number larger than zero

        -
        -
      • -
      -

      Returns Point

      -

      this modified Point

      -
    • -
    -
    -
    - -

    - snapToGridPoint -

    - -
      -
    • -
      -

      Modify this point to be at the nearest point on an infinite grid, - given the grid's origin and size of each grid cell.

      -
      -
      since
      -

      1.3

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        origin: Point
        -
        -

        the top-left point of one of the grid cells

        -
        -
      • -
      • -
        cellsize: Size
        -
        -

        the size of each grid cell

        -
        -
      • -
      -

      Returns Point

      -

      this modified Point

      -
    • -
    -
    -
    - -

    - Static - stringify -

    -
      -
    • stringify(val: Point): string
    • -
    -
      -
    • -
      -

      This static function can be used to write out a Point as a string that can be read by Point.parse.

      -

      go.Point.stringify(new go.Point(1, 2)) produces the string "1 2".

      -
      -

      Parameters

      - -

      Returns string

      -
    • -
    -
    -
    - -

    - subtract -

    - -
      -
    • -
      -

      Modify this point so that is the difference of this Point and the - x and y co-ordinates of the given Point.

      -
      -
      see
      -

      offset, add

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        p: Point
        -
        -

        The Point to subtract from the current Point.

        -
        -
      • -
      -

      Returns Point

      -

      this.

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class Point

    Hierarchy

    • Point
    +

    A Point represents an x- and y-coordinate pair in two-dimensional space.

    +

    Use the static functions Point.parse and Point.stringify to convert to and from +a standard string representation that is independent of the current locale.

    +

    When an instance of this class is the value of a property of a GraphObject class or Diagram +or CommandHandler or a Tool class, you should treat the object +as if it were frozen or read-only -- you cannot modify its properties. +This allows the property to return a value without allocating a new instance. +If you need to do your own calculations with the value, call copy to make +a new instance with the same values that you can modify.

    +

    Many methods modify the object's properties and then return a reference to "this" object. +The only instance method to allocate a new object is the copy method. +The static Point.parse method also allocates a new object.

    +

    The "Debug" implementation of this class is significantly slower than the "Release" implementation, +mostly due to additional error checking.

    +

    You cannot inherit from this class.

    +

    Index

    Constructors

    • new Point(x?: number, y?: number): Point
    • +

      The default constructor produces the Point(0,0). +This constructor may take either zero arguments or two arguments.

      +

      Parameters

      • Optional x: number
        +

        The x value.

        +
      • Optional y: number
        +

        The y value.

        +

      Returns Point

    Properties

    • +

      Gets or sets the x value of the Point.

      +
    • +

      Gets or sets the y value of the Point.

      +

    Methods

    • +

      Modify this point so that is the sum of the current Point and the +x and y co-ordinates of the given Point.

      +
      see

      offset, subtract

      +

      Parameters

      • p: Point
        +

        The Point to add to this Point.

        +

      Returns Point

      this.

      +
    • compareWithLineSegmentPoint(p: Point, q: Point): number
    • since

      2.2

      +

      Parameters

      • p: Point
        +

        one end of the finite line segment

        +
      • q: Point
        +

        the other end of the finite line segment

        +

      Returns number

      <0 if on the left side, or >0 if on the right side, or zero if exactly on the finite line segment

      +
    • +

      Create a copy of this Point, with the same values.

      +

      Returns Point

    • direction(px: number, py: number): number
    • +

      Compute the angle from this Point to a given (px,py) point. +However, if the point is the same as this Point, the direction is zero.

      +
      see

      directionPoint

      +

      Parameters

      • px: number
      • py: number

      Returns number

      the angle, in degrees, of the line from this Point to the given point.

      +
    • directionPoint(p: Point): number
    • +

      Compute the angle from this Point to a given Point. +However, if the given Point is the same as this Point, the direction is zero.

      +
      see

      direction

      +

      Parameters

      • p: Point
        +

        the other Point to which to measure the relative angle.

        +

      Returns number

      the angle, in degrees, of the line from this Point to the given point.

      +
    • distanceSquared(px: number, py: number): number
    • +

      Returns the square of the distance from this point to a given point (px, py).

      +
      see

      distanceSquaredPoint

      +

      Parameters

      • px: number
      • py: number

      Returns number

      the square of the euclidean distance.

      +
    • distanceSquaredPoint(p: Point): number
    • +

      Returns the square of the distance from this Point to a given Point.

      +
      see

      distanceSquared

      +

      Parameters

      • p: Point
        +

        the other Point to measure to.

        +

      Returns number

      the square of the euclidean distance.

      +
    • equalTo(x: number, y: number): boolean
    • +

      Indicates whether the given point (x, y) is equal to this Point.

      +
      see

      equals

      +

      Parameters

      • x: number
      • y: number

      Returns boolean

      True if the two Points have identical X and Y values, +false otherwise.

      +
    • equals(p: Point): boolean
    • +

      Indicates whether the given Point is equal to this Point.

      +
      see

      equalTo

      +

      Parameters

      • p: Point
        +

        The Point to compare to the current Point.

        +

      Returns boolean

      True if the two Points have identical X and Y values, +false otherwise.

      +
    • isReal(): boolean
    • +

      True if this Point has X and Y values that are real numbers and not infinity.

      +

      Returns boolean

    • +

      Modify this Point so that its X and Y values have been normalized to a unit length. +However, if this Point is the origin (zero, zero), its length remains zero.

      +

      Returns Point

      this.

      +
    • offset(dx: number, dy: number): Point
    • +

      Modify this point by shifting its values with the given DX and DY offsets.

      +
      see

      add, subtract

      +

      Parameters

      • dx: number
      • dy: number

      Returns Point

      this.

      +
    • projectOntoLineSegment(px: number, py: number, qx: number, qy: number): Point
    • +

      Modify this point to be the closest point to this point that is on a finite line segment.

      +
      since

      1.3

      +

      Parameters

      • px: number
        +

        one end of the finite line segment

        +
      • py: number
        +

        one end of the finite line segment

        +
      • qx: number
        +

        the other end of the finite line segment

        +
      • qy: number
        +

        the other end of the finite line segment

        +

      Returns Point

      this modified Point

      +
    • +

      Modify this point to be the closest point to this point that is on a finite line segment.

      +
      since

      1.3

      +

      Parameters

      • p: Point
        +

        one end of the finite line segment

        +
      • q: Point
        +

        the other end of the finite line segment

        +

      Returns Point

      this modified Point

      +
    • rotate(angle: number): Point
    • +

      Modify this Point so that has been rotated about the origin by the given angle.

      +

      Parameters

      • angle: number
        +

        an angle in degrees.

        +

      Returns Point

      this.

      +
    • scale(sx: number, sy: number): Point
    • +

      Modify this Point so that its X and Y values have been scaled by given factors along the X and Y axes.

      +

      Parameters

      • sx: number
      • sy: number

      Returns Point

      this.

      +
    • +

      Modify this Point so that its X and Y values are the same as the given Point.

      +

      Parameters

      • p: Point
        +

        the given Point.

        +

      Returns Point

      this.

      +
    • +

      Modify this Point so that its X and Y values correspond to a particular Spot +in a given Rect.

      +

      The result is meaningless if Spot.isNoSpot is true for the given Spot.

      +
      see

      setSpot

      +

      Parameters

      • r: Rect
        +

        the Rect for which we are finding the point.

        +
      • spot: Spot
        +

        the Spot; Spot.isSpot must be true for this Spot.

        +

      Returns Point

      this.

      +
    • setSpot(x: number, y: number, w: number, h: number, spot: Spot): Point
    • +

      Modify this Point so that its X and Y values correspond to a particular Spot +in a given rectangle.

      +

      The result is meaningless if Spot.isNoSpot is true for the given Spot.

      +
      see

      setRectSpot

      +

      Parameters

      • x: number
        +

        The X coordinate of the Rect for which we are finding the point.

        +
      • y: number
        +

        The Y coordinate of the Rect for which we are finding the point.

        +
      • w: number
        +

        The Width of the Rect for which we are finding the point.

        +
      • h: number
        +

        The Height of the Rect for which we are finding the point.

        +
      • spot: Spot
        +

        the Spot; Spot.isSpot must be true for this Spot.

        +

      Returns Point

      this the point of the spot in the rectangle.

      +
    • setTo(x: number, y: number): Point
    • +

      Modify this Point with new X and Y values.

      +

      Parameters

      • x: number
      • y: number

      Returns Point

      this.

      +
    • snapToGrid(originx: number, originy: number, cellwidth: number, cellheight: number): Point
    • +

      Modify this point to be at the nearest point on an infinite grid, +given the grid's origin and size of each grid cell.

      +
      since

      1.3

      +

      Parameters

      • originx: number
        +

        the top-left point of one of the grid cells

        +
      • originy: number
        +

        the top-left point of one of the grid cells

        +
      • cellwidth: number
        +

        the size of each grid cell -- must be a real number larger than zero

        +
      • cellheight: number
        +

        the size of each grid cell -- must be a real number larger than zero

        +

      Returns Point

      this modified Point

      +
    • +

      Modify this point to be at the nearest point on an infinite grid, +given the grid's origin and size of each grid cell.

      +
      since

      1.3

      +

      Parameters

      • origin: Point
        +

        the top-left point of one of the grid cells

        +
      • cellsize: Size
        +

        the size of each grid cell

        +

      Returns Point

      this modified Point

      +
    • +

      Modify this point so that is the difference of this Point and the +x and y co-ordinates of the given Point.

      +
      see

      offset, add

      +

      Parameters

      • p: Point
        +

        The Point to subtract from the current Point.

        +

      Returns Point

      this.

      +
    • compareWithLineSegment(a1x: number, a1y: number, a2x: number, a2y: number, px: number, py: number): number
    • since

      2.2

      +

      Parameters

      • a1x: number
      • a1y: number
      • a2x: number
      • a2y: number
      • px: number
      • py: number

      Returns number

      <0 if on the left side, or >0 if on the right side, or zero if exactly on the finite line segment

      +
    • direction(px: number, py: number, qx: number, qy: number): number
    • +

      This static function returns the angle in degrees of the line from point P to point Q.

      +

      Parameters

      • px: number
      • py: number
      • qx: number
      • qy: number

      Returns number

    • distanceLineSegmentSquared(px: number, py: number, ax: number, ay: number, bx: number, by: number): number
    • +

      This static function returns the square of the distance from the point P +to the finite line segment from point A to point B.

      +

      Parameters

      • px: number
      • py: number
      • ax: number
      • ay: number
      • bx: number
      • by: number

      Returns number

      the euclidean distance.

      +
    • distanceSquared(px: number, py: number, qx: number, qy: number): number
    • +

      This static function returns the square of the distance from the point P to the point Q.

      +

      Parameters

      • px: number
      • py: number
      • qx: number
      • qy: number

      Returns number

    • intersectingLineSegments(a1x: number, a1y: number, a2x: number, a2y: number, b1x: number, b1y: number, b2x: number, b2y: number): boolean
    • since

      2.2

      +

      Parameters

      • a1x: number
      • a1y: number
      • a2x: number
      • a2y: number
      • b1x: number
      • b1y: number
      • b2x: number
      • b2y: number

      Returns boolean

      True if the two given finite line segments intersect with each other, false otherwise.

      +
    • parse(str: string): Point
    • +

      This static function can be used to read in a Point from a string that was produced by Point.stringify.

      +

      go.Point.parse("1 2") produces the Point new go.Point(1, 2).

      +

      Parameters

      • str: string

      Returns Point

    • stringify(val: Point): string
    • +

      This static function can be used to write out a Point as a string that can be read by Point.parse.

      +

      go.Point.stringify(new go.Point(1, 2)) produces the string "1 2".

      +

      Parameters

      Returns string

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/PolygonDrawingTool.html b/api/symbols/PolygonDrawingTool.html index 83f4673dd..51a71fe64 100644 --- a/api/symbols/PolygonDrawingTool.html +++ b/api/symbols/PolygonDrawingTool.html @@ -1,571 +1,87 @@ - - - - - - PolygonDrawingTool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class PolygonDrawingTool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    -
      -
    • - Tool -
        -
      • - PolygonDrawingTool -
      • -
      -
    • -
    -
    -
    -
    -

    The PolygonDrawingTool class lets the user draw a new polygon or polyline shape by clicking where the corners should go. - Right click or type ENTER to finish the operation.

    -

    Set isPolygon to false if you want this tool to draw open unfilled polyline shapes. - Set archetypePartData to customize the node data object that is added to the model. - Data-bind to those properties in your node template to customize the appearance and behavior of the part.

    -

    This tool uses a temporary Shape, temporaryShape, held by a Part in the "Tool" layer, - to show interactively what the user is drawing.

    -

    If you want to experiment with this extension, try the Polygon Drawing sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Constructs an PolygonDrawingTool and sets the name for the tool.

      -
      -

      Returns PolygonDrawingTool

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - archetypePartData - : ObjectData

    -
      -
    • -
      -

      Gets or sets the node data object that is copied and added to the model - when the drawing operation completes.

      -
      -
    • -
    -
    -
    - -

    - hasArcs - : boolean

    -
      -
    • -
      -

      Gets or sets whether this tool draws shapes with quadratic bezier curves for each segment, or just straight lines.

      -

      The default value is false -- only use straight lines.

      -
      -
    • -
    -
    -
    - -

    - isGridSnapEnabled - : boolean

    -
      -
    • -
      -

      Gets or sets whether this tool only places the shape's corners on the Diagram's visible grid. - The default value is false

      -
      -
    • -
    -
    -
    - -

    - isOrthoOnly - : boolean

    -
      -
    • -
      -

      Gets or sets whether this tool draws shapes with only orthogonal segments, or segments in any direction. - The default value is false -- draw segments in any direction. This does not restrict the closing segment, which may not be orthogonal.

      -
      -
    • -
    -
    -
    - -

    - isPolygon - : boolean

    -
      -
    • -
      -

      Gets or sets whether this tools draws a filled polygon or an unfilled open polyline.

      -

      The default value is true.

      -
      -
    • -
    -
    -
    - -

    - temporaryShape - : Shape

    -
      -
    • -
      -

      Gets or sets the Shape that is used to hold the line as it is being drawn.

      -

      The default value is a simple Shape drawing an unfilled open thin black line.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override - canStart -

    -
      -
    • canStart(): boolean
    • -
    -
      -
    • -
      -

      Don't start this tool in a mode-less fashion when the user's mouse-down is on an existing Part. - When this tool is a mouse-down tool, it requires using the left mouse button in the background of a modifiable Diagram. - Modal uses of this tool will not call this canStart predicate.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Override - doActivate -

    -
      -
    • doActivate(): void
    • -
    -
      -
    • -
      -

      Start a transaction, capture the mouse, use a "crosshair" cursor, - and start accumulating points in the geometry of the temporaryShape.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doKeyDown -

    -
      -
    • doKeyDown(): void
    • -
    -
      -
    • -
      -

      Typing the "ENTER" key accepts the current geometry (excluding the current mouse point) - and creates a new part in the model by calling finishShape.

      -

      Typing the "Z" key causes the previous point to be discarded.

      -

      Typing the "ESCAPE" key causes the temporary Shape and its geometry to be discarded and this tool to be stopped.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseDown -

    -
      -
    • doMouseDown(): void
    • -
    -
      -
    • -
      -

      Add another point to the geometry of the temporaryShape.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseMove -

    -
      -
    • doMouseMove(): void
    • -
    -
      -
    • -
      -

      Move the last point of the temporaryShape's geometry to follow the mouse point.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseUp -

    -
      -
    • doMouseUp(): void
    • -
    -
      -
    • -
      -

      Do not stop this tool, but continue to accumulate Points via mouse-down events.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doStart -

    -
      -
    • doStart(): void
    • -
    -
      -
    • -
      -

      Start a transaction, capture the mouse, use a "crosshair" cursor, - and start accumulating points in the geometry of the temporaryShape.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doStop -

    -
      -
    • doStop(): void
    • -
    -
      -
    • -
      -

      Stop the transaction and clean up.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - finishShape -

    -
      -
    • finishShape(): void
    • -
    -
      -
    • -
      -

      Add a new node data JavaScript object to the model and initialize the Part's - position and its Shape's geometry by copying the temporaryShape's Shape.geometry.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - undo -

    -
      -
    • undo(): void
    • -
    -
      -
    • -
      -

      Undo: remove the last point and continue the drawing of new points.

      -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class PolygonDrawingTool Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    • Tool
      • PolygonDrawingTool
    +

    The PolygonDrawingTool class lets the user draw a new polygon or polyline shape by clicking where the corners should go. +Right click or type ENTER to finish the operation.

    +

    Set isPolygon to false if you want this tool to draw open unfilled polyline shapes. +Set archetypePartData to customize the node data object that is added to the model. +Data-bind to those properties in your node template to customize the appearance and behavior of the part.

    +

    This tool uses a temporary Shape, temporaryShape, held by a Part in the "Tool" layer, +to show interactively what the user is drawing.

    +

    If you want to experiment with this extension, try the Polygon Drawing sample.

    +

    Index

    Inherited Members

    Constructors

    • +

      Constructs an PolygonDrawingTool and sets the name for the tool.

      +

      Returns PolygonDrawingTool

    Properties

    • +

      Gets or sets the node data object that is copied and added to the model +when the drawing operation completes.

      +
    • +

      Gets or sets whether this tool draws shapes with quadratic bezier curves for each segment, or just straight lines.

      +

      The default value is false -- only use straight lines.

      +
    • +

      Gets or sets whether this tool only places the shape's corners on the Diagram's visible grid. +The default value is false

      +
    • +

      Gets or sets whether this tool draws shapes with only orthogonal segments, or segments in any direction. +The default value is false -- draw segments in any direction. This does not restrict the closing segment, which may not be orthogonal.

      +
    • +

      Gets or sets whether this tools draws a filled polygon or an unfilled open polyline.

      +

      The default value is true.

      +
    • +

      Gets or sets the Shape that is used to hold the line as it is being drawn.

      +

      The default value is a simple Shape drawing an unfilled open thin black line.

      +

    Methods

    • canStart(): boolean
    • +

      Don't start this tool in a mode-less fashion when the user's mouse-down is on an existing Part. +When this tool is a mouse-down tool, it requires using the left mouse button in the background of a modifiable Diagram. +Modal uses of this tool will not call this canStart predicate.

      +

      Returns boolean

    • doActivate(): void
    • +

      Start a transaction, capture the mouse, use a "crosshair" cursor, +and start accumulating points in the geometry of the temporaryShape.

      +

      Returns void

    • doKeyDown(): void
    • +

      Typing the "ENTER" key accepts the current geometry (excluding the current mouse point) +and creates a new part in the model by calling finishShape.

      +

      Typing the "Z" key causes the previous point to be discarded.

      +

      Typing the "ESCAPE" key causes the temporary Shape and its geometry to be discarded and this tool to be stopped.

      +

      Returns void

    • doMouseDown(): void
    • +

      Add another point to the geometry of the temporaryShape.

      +

      Returns void

    • doMouseMove(): void
    • +

      Move the last point of the temporaryShape's geometry to follow the mouse point.

      +

      Returns void

    • doMouseUp(): void
    • +

      Do not stop this tool, but continue to accumulate Points via mouse-down events.

      +

      Returns void

    • doStart(): void
    • +

      Start a transaction, capture the mouse, use a "crosshair" cursor, +and start accumulating points in the geometry of the temporaryShape.

      +

      Returns void

    • doStop(): void
    • +

      Stop the transaction and clean up.

      +

      Returns void

    • finishShape(): void
    • +

      Add a new node data JavaScript object to the model and initialize the Part's +position and its Shape's geometry by copying the temporaryShape's Shape.geometry.

      +

      Returns void

    • undo(): void
    • +

      Undo: remove the last point and continue the drawing of new points.

      +

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/PolylineLinkingTool.html b/api/symbols/PolylineLinkingTool.html index ae4e3a4c8..635bbc32d 100644 --- a/api/symbols/PolylineLinkingTool.html +++ b/api/symbols/PolylineLinkingTool.html @@ -1,391 +1,58 @@ - - - - - - PolylineLinkingTool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class PolylineLinkingTool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    The PolylineLinkingTool class the user to draw a new Link by clicking where the route should go, - until clicking on a valid target port.

    -

    This tool supports routing both orthogonal and straight links. - You can customize the LinkingBaseTool.temporaryLink as needed to affect the - appearance and behavior of the temporary link that is shown during the linking operation. - You can customize the LinkingTool.archetypeLinkData to specify property values - that can be data-bound by your link template for the Links that are actually created.

    -

    If you want to experiment with this extension, try the Polyline Linking sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Methods

    -
    - -

    - Override - doActivate -

    -
      -
    • doActivate(): void
    • -
    -
      -
    • -
      -

      Use a "crosshair" cursor.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doKeyDown -

    -
      -
    • doKeyDown(): void
    • -
    -
      -
    • -
      -

      This supports the "Z" command during this tool's operation to remove the last added point of the route. - Type ESCAPE to completely cancel the operation of the tool.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseDown -

    -
      -
    • doMouseDown(): void
    • -
    -
      -
    • -
      -

      Add a point to the route that the temporary Link is accumulating.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseMove -

    -
      -
    • doMouseMove(): void
    • -
    -
      -
    • -
      -

      Have the temporary link reach to the last mouse point.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseUp -

    -
      -
    • doMouseUp(): void
    • -
    -
      -
    • -
      -

      If this event happens on a valid target port (as determined by LinkingBaseTool.findTargetPort), - we complete the link drawing operation. insertLink is overridden to transfer the accumulated - route drawn by user clicks to the new Link that was created.

      -

      If this event happens elsewhere in the diagram, this tool is not stopped: the drawing of the route continues.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - insertLink -

    - -
      -
    • -
      -

      This method overrides the standard link creation method by additionally - replacing the default link route with the custom one laid out by the user.

      -
      -

      Parameters

      - -

      Returns Link

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class PolylineLinkingTool Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    The PolylineLinkingTool class the user to draw a new Link by clicking where the route should go, +until clicking on a valid target port.

    +

    This tool supports routing both orthogonal and straight links. +You can customize the LinkingBaseTool.temporaryLink as needed to affect the +appearance and behavior of the temporary link that is shown during the linking operation. +You can customize the LinkingTool.archetypeLinkData to specify property values +that can be data-bound by your link template for the Links that are actually created.

    +

    If you want to experiment with this extension, try the Polyline Linking sample.

    +

    Index

    Inherited Members

    Constructors

    Methods

    • doActivate(): void
    • +

      Use a "crosshair" cursor.

      +

      Returns void

    • doKeyDown(): void
    • +

      This supports the "Z" command during this tool's operation to remove the last added point of the route. +Type ESCAPE to completely cancel the operation of the tool.

      +

      Returns void

    • doMouseDown(): void
    • +

      Add a point to the route that the temporary Link is accumulating.

      +

      Returns void

    • doMouseMove(): void
    • +

      Have the temporary link reach to the last mouse point.

      +

      Returns void

    • doMouseUp(): void
    • +

      If this event happens on a valid target port (as determined by LinkingBaseTool.findTargetPort), +we complete the link drawing operation. insertLink is overridden to transfer the accumulated +route drawn by user clicks to the new Link that was created.

      +

      If this event happens elsewhere in the diagram, this tool is not stopped: the drawing of the route continues.

      +

      Returns void

    • +

      This method overrides the standard link creation method by additionally +replacing the default link route with the custom one laid out by the user.

      +

      Parameters

      Returns Link

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/PortShiftingTool.html b/api/symbols/PortShiftingTool.html index daed1c5db..2bb14603d 100644 --- a/api/symbols/PortShiftingTool.html +++ b/api/symbols/PortShiftingTool.html @@ -1,455 +1,70 @@ - - - - - - PortShiftingTool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class PortShiftingTool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    -
      -
    • - Tool -
        -
      • - PortShiftingTool -
      • -
      -
    • -
    -
    -
    -
    -

    The PortShiftingTool class lets a user move a port on a Node.

    -

    This tool only works when the Node has a port (any GraphObject) marked with - a non-null and non-empty portId that is positioned in a Spot Panel, - and the user holds down the Shift key. - It works by modifying that port's GraphObject.alignment property.

    -

    If you want to experiment with this extension, try the Port Shifting sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Constructs a PortShiftingTool and sets the name for the tool.

      -
      -

      Returns PortShiftingTool

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - port - : GraphObject

    -
    -

    The port being shifted.

    -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override - canStart -

    -
      -
    • canStart(): boolean
    • -
    -
      -
    • -
      -

      This tool can only start if the mouse has moved enough so that it is not a click, - and if the mouse down point is on a GraphObject "port" in a Spot Panel, - as determined by findPort.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Override - doActivate -

    -
      -
    • doActivate(): void
    • -
    -
      -
    • -
      -

      Start a transaction, call findPort and remember it as the "port" property, - and remember the original value for the port's GraphObject.alignment property.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doCancel -

    -
      -
    • doCancel(): void
    • -
    -
      -
    • -
      -

      Restore the port's original value for GraphObject.alignment.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doDeactivate -

    -
      -
    • doDeactivate(): void
    • -
    -
      -
    • -
      -

      Stop any ongoing transaction.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseMove -

    -
      -
    • doMouseMove(): void
    • -
    - -
    -
    - -

    - Override - doMouseUp -

    -
      -
    • doMouseUp(): void
    • -
    -
      -
    • -
      -

      At the end of the drag, update the alignment of the port and finish the tool, - completing a transaction.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doStop -

    -
      -
    • doStop(): void
    • -
    -
      -
    • -
      -

      Clear any reference to a port element.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - findPort -

    - -
      -
    • -
      -

      From the GraphObject at the mouse point, search up the visual tree until we get to - an object that has the GraphObject.portId property set to a non-empty string, that is in a Spot Panel, - and that is not the main element of the panel (typically the first element).

      -
      -

      Returns GraphObject

      -

      This returns null if no such port is at the mouse down point.

      -
    • -
    -
    -
    - -

    - updateAlignment -

    -
      -
    • updateAlignment(): void
    • -
    -
      -
    • -
      -

      Save the port's GraphObject.alignment as a fractional Spot in the Spot Panel - that the port is in. Thus if the main element changes size, the relative positions - of the ports will be maintained. But that does assume that the port must remain - inside the main element -- it cannot wander away from the node. - This does not modify the port's GraphObject.alignmentFocus property.

      -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class PortShiftingTool Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    • Tool
      • PortShiftingTool
    +

    The PortShiftingTool class lets a user move a port on a Node.

    +

    This tool only works when the Node has a port (any GraphObject) marked with +a non-null and non-empty portId that is positioned in a Spot Panel, +and the user holds down the Shift key. +It works by modifying that port's GraphObject.alignment property.

    +

    If you want to experiment with this extension, try the Port Shifting sample.

    +

    Index

    Inherited Members

    Constructors

    • +

      Constructs a PortShiftingTool and sets the name for the tool.

      +

      Returns PortShiftingTool

    Properties

    +

    The port being shifted.

    +

    Methods

    • canStart(): boolean
    • +

      This tool can only start if the mouse has moved enough so that it is not a click, +and if the mouse down point is on a GraphObject "port" in a Spot Panel, +as determined by findPort.

      +

      Returns boolean

    • doActivate(): void
    • +

      Start a transaction, call findPort and remember it as the "port" property, +and remember the original value for the port's GraphObject.alignment property.

      +

      Returns void

    • doCancel(): void
    • +

      Restore the port's original value for GraphObject.alignment.

      +

      Returns void

    • doDeactivate(): void
    • +

      Stop any ongoing transaction.

      +

      Returns void

    • doMouseMove(): void
    • doMouseUp(): void
    • +

      At the end of the drag, update the alignment of the port and finish the tool, +completing a transaction.

      +

      Returns void

    • doStop(): void
    • +

      Clear any reference to a port element.

      +

      Returns void

    • +

      From the GraphObject at the mouse point, search up the visual tree until we get to +an object that has the GraphObject.portId property set to a non-empty string, that is in a Spot Panel, +and that is not the main element of the panel (typically the first element).

      +

      Returns GraphObject

      This returns null if no such port is at the mouse down point.

      +
    • updateAlignment(): void
    • +

      Save the port's GraphObject.alignment as a fractional Spot in the Spot Panel +that the port is in. Thus if the main element changes size, the relative positions +of the ports will be maintained. But that does assume that the port must remain +inside the main element -- it cannot wander away from the node. +This does not modify the port's GraphObject.alignmentFocus property.

      +

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Quadtree.html b/api/symbols/Quadtree.html index 3a89231e2..fa4642f76 100644 --- a/api/symbols/Quadtree.html +++ b/api/symbols/Quadtree.html @@ -1,892 +1,171 @@ - - - - - - Quadtree | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class Quadtree<T>

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    -
      -
    • - Quadtree -
    • -
    -
    -
    -
    -

    Implementation of the quadtree data structure using the Rect class. - Each Quadtree has defined bounds found at bounds, an array - of member rectangles, and an array of child nodes - (Quadtrees themselves). If the Quadtree has no - children, the nodes array will have four nulls. To construct a Quadtree, you - can call its constructor with no arguments. Then, to insert a rectangle, call - add. This tree supports adding points (rectangles with 0 - width and height), segments (rectangles with either 0 width or 0 height), and - rectangles with nonzero widths and heights.

    -

    Quadtrees can be used to calculate intersections extremely quickly between a - given rectangle and all of the rectangles in the quadtree. Use of this data - structure prevents having to do precise intersection calculations for every - rectangle in the tree. To calculate all of the rectangular intersections for - a given rectangle, use intersecting.

    -

    Other common operations are detailed below.

    -
    -
    -
    -

    Type parameters

    -
      -
    • -

      T

      -
    • -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    -
      -
    • new Quadtree<T>(nodeCapacity?: number, maxLevel?: number, bounds?: Rect): Quadtree<T>
    • -
    -
      -
    • -
      -

      In most cases, simply calling this constructor with no arguments will produce the desired behaviour.

      -
      -

      Type parameters

      -
        -
      • -

        T

        -
      • -
      -

      Parameters

      -
        -
      • -
        Optional nodeCapacity: number
        -
        -

        The node capacity of this quadtree. This is the number of objects a node can contain before it splits. Defaults to 1.

        -
        -
      • -
      • -
        Optional maxLevel: number
        -
        -

        The maximum depth the Quadtree will allow before it will no longer split. Defaults to Infinity (no maximum depth).

        -
        -
      • -
      • -
        Optional bounds: Rect
        -
        -

        The bounding box surrounding the entire Quadtree. If the bounds are unset or a node is inserted outside of the bounds, the tree will automatically grow.

        -
        -
      • -
      -

      Returns Quadtree<T>

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - Read-only - bounds - : Rect

    -
      -
    • -
      -

      Gets the boundaries of the node. All nodes should be square.

      -
      -
    • -
    -
    -
    - -

    - Read-only - maxLevels - : number

    -
      -
    • -
      -

      Gets the maximum depth the Quadtree will allow before it will no longer split..

      -
      -
    • -
    -
    -
    - -

    - Read-only - nodeCapacity - : number

    -
      -
    • -
      -

      Gets the node capacity of this quadtree. This is the number of objects a node can contain before it splits.

      -
      -
    • -
    -
    -
    - -

    - Read-only - root - : QuadNode<T>

    -
      -
    • -
      -

      Gets the root node of the tree

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - add -

    -
      -
    • add(obj: T | QuadObj<T>, x?: number | Point | Rect, y?: number | Point | Size, w?: number, h?: number): void
    • -
    -
      -
    • -
      -

      Insert the object into the quadtree. If the node - exceeds the capacity, it will split and add all - objects to their corresponding nodes. If the object is - outside the bounds of the tree's root node, the tree - will grow to accomodate it. Possibly restructures the - tree if a more efficient configuration can be found with - the new dimensions. Bounds can be given either as a - single Rect or as any combination of arguments - which is valid for the Rect constructor.

      -
      -

      Parameters

      -
        -
      • -
        obj: T | QuadObj<T>
        -
        -

        the object to insert

        -
        -
      • -
      • -
        Optional x: number | Point | Rect
        -
        -

        The Rect bounds of the object, or top-left Point, or x value.

        -
        -
      • -
      • -
        Optional y: number | Point | Size
        -
        -

        Bottom-right Point or Size or y value.

        -
        -
      • -
      • -
        Optional w: number
        -
        -

        Width to be used if x,y are specified; - must be non-negative.

        -
        -
      • -
      • -
        Optional h: number
        -
        -

        Height to be used if x,y are specified;

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - clear -

    -
      -
    • clear(): void
    • -
    -
      -
    • -
      -

      Clears the Quadtree, removing all objects and children nodes. Keeps the current bounds of the root node.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - containing -

    - -
      -
    • -
      -

      Return all objects that fully contain the given Rect or Point.

      -
      -

      Parameters

      -
        -
      • -
        rect: Point | Rect
        -
        -

        the Rect or Point to check containing for. If a point is given, a Rect with size (0, 0) is created for containment calculations.

        -
        -
      • -
      -

      Returns T[]

      -

      array containing all containing objects

      -
    • -
    -
    -
    - -

    - distanceSquared -

    -
      -
    • distanceSquared(obj1: T, obj2: T): number
    • -
    -
      -
    • -
      -

      Returns the square of the distance from the centers of the given objects

      -
      -

      Parameters

      -
        -
      • -
        obj1: T
        -
      • -
      • -
        obj2: T
        -
      • -
      -

      Returns number

      -

      square of the distance between the centers of obj1 and obj2

      -
    • -
    -
    -
    - -

    - find -

    -
      -
    • find(obj: T): QuadNode<T>
    • -
    -
      -
    • -
      -

      Return the node that contains the given object.

      -
      -

      Parameters

      -
        -
      • -
        obj: T
        -
        -

        the object to find

        -
        -
      • -
      -

      Returns QuadNode<T>

      -

      the node containing the given object, null if the object is not found

      -
    • -
    -
    -
    - -

    - findBounds -

    - -
      -
    • -
      -

      Checks if any of the objects in the tree have the given boundaries

      -
      -

      Parameters

      -
        -
      • -
        bounds: Rect
        -
        -

        the rectangle to check for

        -
        -
      • -
      -

      Returns Rect

      -

      the actual bounds object stored in the tree

      -
    • -
    -
    -
    - -

    - findExtremeObjects -

    -
      -
    • findExtremeObjects(): [T, T, T, T]
    • -
    -
      -
    • -
      -

      Finds the most furthest object in each direction stored in the tree. - Bounds are tested using the center x and y coordinate.

      -
      -

      Returns [T, T, T, T]

      -

      maximum and minimum objects in the tree, in the format [min x, max x, min y, max y].

      -
    • -
    -
    -
    - -

    - forEach -

    -
      -
    • forEach(callback: (obj: T) => void): void
    • -
    -
      -
    • -
      -

      Visits every object stored in the tree (depth first)

      -
      -

      Parameters

      -
        -
      • -
        callback: (obj: T) => void
        -
        -

        the callback to execute on each object.

        -
        -
          -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - has -

    -
      -
    • has(obj: T): boolean
    • -
    -
      -
    • -
      -

      Convenience method, calls find and returns a boolean - indicating whether or not the tree contains the given object

      -
      -

      Parameters

      -
        -
      • -
        obj: T
        -
        -

        the object to check for

        -
        -
      • -
      -

      Returns boolean

      -

      whether or not the given object is present in the tree

      -
    • -
    -
    -
    - -

    - intersecting -

    - -
      -
    • -
      -

      Return all objects that intersect (wholly or partially) with - the given Rect or Point. Touching edges and - objects overlapping by 1e-7 or less (to account for floating - point error) are both not considered intersections.

      -
      -

      Parameters

      -
        -
      • -
        rect: Point | Rect
        -
        -

        the Rect or Point to check intersections for. If a point is given, a Rect with size (0, 0) is created for intersection calculations.

        -
        -
      • -
      -

      Returns T[]

      -

      array containing all intersecting objects

      -
    • -
    -
    -
    - -

    - move -

    -
      -
    • move(obj: T, x: number | Point, y?: number): boolean
    • -
    -
      -
    • -
      -

      Can be called as either (obj, x, y) or (obj, point). Translate - the given object to given x and y coordinates or to a given Point.

      -
      -

      Parameters

      -
        -
      • -
        obj: T
        -
        -

        the object to move

        -
        -
      • -
      • -
        x: number | Point
        -
        -

        the x coordinate or Point to move the object to

        -
        -
      • -
      • -
        Optional y: number
        -
        -

        the y coordinate to move the object to

        -
        -
      • -
      -

      Returns boolean

      -

      whether or not the move was successful. False if the object was not in the tree.

      -
    • -
    -
    -
    - -

    - remove -

    -
      -
    • remove(obj: T): boolean
    • -
    -
      -
    • -
      -

      Remove the given object from the tree, restructuring to - get rid of empty nodes that are unneeded.

      -
      -

      Parameters

      -
        -
      • -
        obj: T
        -
        -

        the object to remove

        -
        -
      • -
      -

      Returns boolean

      -

      whether or not the deletion was successful. False when the object is not in the tree.

      -
    • -
    -
    -
    - -

    - resize -

    -
      -
    • resize(obj: T, width: number | Size, height?: number): boolean
    • -
    -
      -
    • -
      -

      Can be called as either (obj, width, height) or (obj, size). Resize - the given object to given width and height or to a given Size.

      -
      -

      Parameters

      -
        -
      • -
        obj: T
        -
        -

        the object to resize

        -
        -
      • -
      • -
        width: number | Size
        -
        -

        the width or Size to resize the object to

        -
        -
      • -
      • -
        Optional height: number
        -
        -

        the height to resize the object to

        -
        -
      • -
      -

      Returns boolean

      -

      whether or not the resize was successful. False if the object was not in the tree.

      -
    • -
    -
    -
    - -

    - setTo -

    -
      -
    • setTo(obj: T, x: number | Rect, y?: number, width?: number, height?: number): boolean
    • -
    -
      -
    • -
      -

      Updates the given object to have the bounds given, provided as either a - Rect or x, y, width, and height.

      -
      -

      Parameters

      -
        -
      • -
        obj: T
        -
        -

        the object to change the bounds of

        -
        -
      • -
      • -
        x: number | Rect
        -
        -

        the x-coordinate or Rect to set the object to

        -
        -
      • -
      • -
        Optional y: number
        -
        -

        the y-coordinate to set the object to, unnecessary if a Rect was given

        -
        -
      • -
      • -
        Optional width: number
        -
        -

        the width to set the object to, unnecessary if a Rect was given

        -
        -
      • -
      • -
        Optional height: number
        -
        -

        the height to set the object to, unnecessary if a Rect was given

        -
        -
      • -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - walk -

    -
      -
    • walk(callback: (n: QuadNode<T>) => void, node?: QuadNode<T>, root?: boolean): void
    • -
    -
      -
    • -
      -

      Recursively traverses the tree (depth first) and executes the - given callback on each node.

      -
      -

      Parameters

      -
        -
      • -
        callback: (n: QuadNode<T>) => void
        -
        -

        the callback to execute on each node. Takes the form of (n: Quadtree) => void

        -
        -
          -
        -
      • -
      • -
        node: QuadNode<T> = ...
        -
      • -
      • -
        root: boolean = true
        -
        -

        whether or not to execute the callback on the root node as well. Defaults to true

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class Quadtree<T> Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    • Quadtree
    +

    Implementation of the quadtree data structure using the Rect class. +Each Quadtree has defined bounds found at bounds, an array +of member rectangles, and an array of child nodes +(Quadtrees themselves). If the Quadtree has no +children, the nodes array will have four nulls. To construct a Quadtree, you +can call its constructor with no arguments. Then, to insert a rectangle, call +add. This tree supports adding points (rectangles with 0 +width and height), segments (rectangles with either 0 width or 0 height), and +rectangles with nonzero widths and heights.

    +

    Quadtrees can be used to calculate intersections extremely quickly between a +given rectangle and all of the rectangles in the quadtree. Use of this data +structure prevents having to do precise intersection calculations for every +rectangle in the tree. To calculate all of the rectangular intersections for +a given rectangle, use intersecting.

    +

    Other common operations are detailed below.

    +

    Type parameters

    • T

    Index

    Constructors

    • new Quadtree<T>(nodeCapacity?: number, maxLevel?: number, bounds?: Rect): Quadtree<T>
    • +

      In most cases, simply calling this constructor with no arguments will produce the desired behaviour.

      +

      Type parameters

      • T

      Parameters

      • Optional nodeCapacity: number
        +

        The node capacity of this quadtree. This is the number of objects a node can contain before it splits. Defaults to 1.

        +
      • Optional maxLevel: number
        +

        The maximum depth the Quadtree will allow before it will no longer split. Defaults to Infinity (no maximum depth).

        +
      • Optional bounds: Rect
        +

        The bounding box surrounding the entire Quadtree. If the bounds are unset or a node is inserted outside of the bounds, the tree will automatically grow.

        +

      Returns Quadtree<T>

    Properties

    • +

      Gets the boundaries of the node. All nodes should be square.

      +
    • +

      Gets the maximum depth the Quadtree will allow before it will no longer split..

      +
    • +

      Gets the node capacity of this quadtree. This is the number of objects a node can contain before it splits.

      +
    • +

      Gets the root node of the tree

      +

    Methods

    • add(obj: T | QuadObj<T>, x?: number | Point | Rect, y?: number | Point | Size, w?: number, h?: number): void
    • +

      Insert the object into the quadtree. If the node +exceeds the capacity, it will split and add all +objects to their corresponding nodes. If the object is +outside the bounds of the tree's root node, the tree +will grow to accomodate it. Possibly restructures the +tree if a more efficient configuration can be found with +the new dimensions. Bounds can be given either as a +single Rect or as any combination of arguments +which is valid for the Rect constructor.

      +

      Parameters

      • obj: T | QuadObj<T>
        +

        the object to insert

        +
      • Optional x: number | Point | Rect
        +

        The Rect bounds of the object, or top-left Point, or x value.

        +
      • Optional y: number | Point | Size
        +

        Bottom-right Point or Size or y value.

        +
      • Optional w: number
        +

        Width to be used if x,y are specified; +must be non-negative.

        +
      • Optional h: number
        +

        Height to be used if x,y are specified;

        +

      Returns void

    • clear(): void
    • +

      Clears the Quadtree, removing all objects and children nodes. Keeps the current bounds of the root node.

      +

      Returns void

    • +

      Return all objects that fully contain the given Rect or Point.

      +

      Parameters

      • rect: Point | Rect
        +

        the Rect or Point to check containing for. If a point is given, a Rect with size (0, 0) is created for containment calculations.

        +

      Returns T[]

      array containing all containing objects

      +
    • distanceSquared(obj1: T, obj2: T): number
    • +

      Returns the square of the distance from the centers of the given objects

      +

      Parameters

      • obj1: T
      • obj2: T

      Returns number

      square of the distance between the centers of obj1 and obj2

      +
    • find(obj: T): QuadNode<T>
    • +

      Return the node that contains the given object.

      +

      Parameters

      • obj: T
        +

        the object to find

        +

      Returns QuadNode<T>

      the node containing the given object, null if the object is not found

      +
    • +

      Checks if any of the objects in the tree have the given boundaries

      +

      Parameters

      • bounds: Rect
        +

        the rectangle to check for

        +

      Returns Rect

      the actual bounds object stored in the tree

      +
    • findExtremeObjects(): [T, T, T, T]
    • +

      Finds the most furthest object in each direction stored in the tree. +Bounds are tested using the center x and y coordinate.

      +

      Returns [T, T, T, T]

      maximum and minimum objects in the tree, in the format [min x, max x, min y, max y].

      +
    • forEach(callback: (obj: T) => void): void
    • +

      Visits every object stored in the tree (depth first)

      +

      Parameters

      • callback: (obj: T) => void
        +

        the callback to execute on each object.

        +
          • (obj: T): void
          • Parameters

            • obj: T

            Returns void

      Returns void

    • has(obj: T): boolean
    • +

      Convenience method, calls find and returns a boolean +indicating whether or not the tree contains the given object

      +

      Parameters

      • obj: T
        +

        the object to check for

        +

      Returns boolean

      whether or not the given object is present in the tree

      +
    • +

      Return all objects that intersect (wholly or partially) with +the given Rect or Point. Touching edges and +objects overlapping by 1e-7 or less (to account for floating +point error) are both not considered intersections.

      +

      Parameters

      • rect: Point | Rect
        +

        the Rect or Point to check intersections for. If a point is given, a Rect with size (0, 0) is created for intersection calculations.

        +

      Returns T[]

      array containing all intersecting objects

      +
    • move(obj: T, x: number | Point, y?: number): boolean
    • +

      Can be called as either (obj, x, y) or (obj, point). Translate +the given object to given x and y coordinates or to a given Point.

      +

      Parameters

      • obj: T
        +

        the object to move

        +
      • x: number | Point
        +

        the x coordinate or Point to move the object to

        +
      • Optional y: number
        +

        the y coordinate to move the object to

        +

      Returns boolean

      whether or not the move was successful. False if the object was not in the tree.

      +
    • remove(obj: T): boolean
    • +

      Remove the given object from the tree, restructuring to +get rid of empty nodes that are unneeded.

      +

      Parameters

      • obj: T
        +

        the object to remove

        +

      Returns boolean

      whether or not the deletion was successful. False when the object is not in the tree.

      +
    • resize(obj: T, width: number | Size, height?: number): boolean
    • +

      Can be called as either (obj, width, height) or (obj, size). Resize +the given object to given width and height or to a given Size.

      +

      Parameters

      • obj: T
        +

        the object to resize

        +
      • width: number | Size
        +

        the width or Size to resize the object to

        +
      • Optional height: number
        +

        the height to resize the object to

        +

      Returns boolean

      whether or not the resize was successful. False if the object was not in the tree.

      +
    • setTo(obj: T, x: number | Rect, y?: number, width?: number, height?: number): boolean
    • +

      Updates the given object to have the bounds given, provided as either a +Rect or x, y, width, and height.

      +

      Parameters

      • obj: T
        +

        the object to change the bounds of

        +
      • x: number | Rect
        +

        the x-coordinate or Rect to set the object to

        +
      • Optional y: number
        +

        the y-coordinate to set the object to, unnecessary if a Rect was given

        +
      • Optional width: number
        +

        the width to set the object to, unnecessary if a Rect was given

        +
      • Optional height: number
        +

        the height to set the object to, unnecessary if a Rect was given

        +

      Returns boolean

    • walk(callback: (n: QuadNode<T>) => void, node?: QuadNode<T>, root?: boolean): void
    • +

      Recursively traverses the tree (depth first) and executes the +given callback on each node.

      +

      Parameters

      • callback: (n: QuadNode<T>) => void
        +

        the callback to execute on each node. Takes the form of (n: Quadtree) => void

        +
          • (n: QuadNode<T>): void
          • Parameters

            • n: QuadNode<T>

            Returns void

      • node: QuadNode<T> = ...
      • root: boolean = true
        +

        whether or not to execute the callback on the root node as well. Defaults to true

        +

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/RadialLayout.html b/api/symbols/RadialLayout.html index ff5092c06..5198496fb 100644 --- a/api/symbols/RadialLayout.html +++ b/api/symbols/RadialLayout.html @@ -1,551 +1,72 @@ - - - - - - RadialLayout | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class RadialLayout

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    -
      -
    • - Layout -
        -
      • - RadialLayout -
      • -
      -
    • -
    -
    -
    -
    -

    Given a root Node, this arranges connected nodes in concentric rings, - layered by the minimum link distance from the root.

    -

    If you want to experiment with this extension, try the Radial Layout sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Create a minimal layout that only positions Nodes that do not have a location.

      -
      -

      Parameters

      -
        -
      • -
        Optional init: Partial<Layout>
        -
        -

        Optional initialization properties.

        -
        -
      • -
      -

      Returns RadialLayout

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - layerThickness - : number

    -
      -
    • -
      -

      Gets or sets the thickness of each ring representing a layer.

      -

      The default value is 100.

      -
      -
    • -
    -
    -
    - -

    - maxLayers - : number

    -
      -
    • -
      -

      Gets or sets the maximum number of layers to be shown, in addition to the root node at layer zero.

      -

      The default value is Infinity.

      -
      -
    • -
    -
    -
    - -

    - root - : Node

    -
      -
    • -
      -

      Gets or sets the Node that acts as the root or central node of the radial layout.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override - cloneProtected -

    - -
      -
    • -
      -

      Copies properties to a cloned Layout.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - commitLayers -

    -
      -
    • commitLayers(): void
    • -
    -
      -
    • -
      -

      Override this method in order to create background circles indicating the layers of the radial layout. - By default this method does nothing.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - commitLayout -

    -
      -
    • commitLayout(): void
    • -
    -
      -
    • -
      -

      This override positions each Node and also calls rotateNode.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - computeBreadth -

    -
      -
    • computeBreadth(v: RadialVertex): number
    • -
    -
      -
    • -
      -

      Compute the proportion of arc that the given vertex should take relative to its siblings.

      -

      The default behavior is to give each child arc according to the sum of the maximum breadths of each of its children. - This assumes that all nodes have the same breadth -- i.e. that they will occupy the same sweep of arc. - It does not take the Node.actualBounds into account, nor the angle at which the node will be location relative to the origin, - nor the distance the node will be from the root node.

      -

      In order to give each child of a vertex the same fraction of arc, override this method: - computeBreadth(v) { return 1; }

      -

      In order to give each child of a vertex a fraction of arc proportional to how many children the child has: - computeBreadth(v) { return Math.max(1, v.children.length); }

      - -
      - - -

      Parameters

      -
        -
      • -
        v: RadialVertex
        - - -
      • -
      - -

      Returns number

      - - -
    • -
    - - -
    -
    - -

    - Override - - createNetwork -

    - - - -
      -
    • -
      -

      Use a LayoutNetwork that always creates RadialVertexes.

      - -
      - - - -

      Returns LayoutNetwork

      - - -
    • -
    - - -
    -
    - -

    - Override - - doLayout -

    - - - -
      -
    • -
      -

      Find distances between root and vertexes, and then lay out radially.

      - -
      - - -

      Parameters

      - - -

      Returns void

      - - -
    • -
    - - -
    -
    - -

    - Virtual - - rotateNode -

    - -
      -
    • rotateNode(node: Node, angle: number, sweep: number, radius: number): void
    • -
    - -
    • commitLayout(): void
    • +

      This override positions each Node and also calls rotateNode.

      +

      Returns void

    • computeBreadth(v: RadialVertex): number
    • +

      Compute the proportion of arc that the given vertex should take relative to its siblings.

      +

      The default behavior is to give each child arc according to the sum of the maximum breadths of each of its children. +This assumes that all nodes have the same breadth -- i.e. that they will occupy the same sweep of arc. +It does not take the Node.actualBounds into account, nor the angle at which the node will be location relative to the origin, +nor the distance the node will be from the root node.

      +

      In order to give each child of a vertex the same fraction of arc, override this method: +computeBreadth(v) { return 1; }

      +

      In order to give each child of a vertex a fraction of arc proportional to how many children the child has: +computeBreadth(v) { return Math.max(1, v.children.length); }

      +

      Parameters

      • v: RadialVertex

      Returns number

    • +

      Use a LayoutNetwork that always creates RadialVertexes.

      +

      Returns LayoutNetwork

    • rotateNode(node: Node, angle: number, sweep: number, radius: number): void
    • +

      Override this method in order to modify each node as it is laid out. +By default this method does nothing.

      +

      Parameters

      • node: Node
      • angle: number
      • sweep: number
      • radius: number

      Returns void

    Settings

    Theme

    + \ No newline at end of file diff --git a/api/symbols/RealtimeDragSelectingTool.html b/api/symbols/RealtimeDragSelectingTool.html index 23523405b..ecde1ec16 100644 --- a/api/symbols/RealtimeDragSelectingTool.html +++ b/api/symbols/RealtimeDragSelectingTool.html @@ -1,394 +1,54 @@ - - - - - - RealtimeDragSelectingTool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class RealtimeDragSelectingTool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    The RealtimeDragSelectingTool class lets the user select and deselect Parts within the DragSelectingTool.box - during a drag, not just at the end of the drag.

    -

    If you want to experiment with this extension, try the Realtime Drag Selecting sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Methods

    -
    - -

    - Override - doActivate -

    -
      -
    • doActivate(): void
    • -
    -
      -
    • -
      -

      Remember the original collection of selected Parts.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doCancel -

    -
      -
    • doCancel(): void
    • -
    -
      -
    • -
      -

      Restore the selection which may have been modified during a drag.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doDeactivate -

    -
      -
    • doDeactivate(): void
    • -
    -
      -
    • -
      -

      Release any references to selected Parts.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doKeyDown -

    -
      -
    • doKeyDown(): void
    • -
    -
      -
    • -
      -

      Select Parts within the bounds of the drag-select box.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doKeyUp -

    -
      -
    • doKeyUp(): void
    • -
    -
      -
    • -
      -

      Select Parts within the bounds of the drag-select box.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseMove -

    -
      -
    • doMouseMove(): void
    • -
    -
      -
    • -
      -

      Select Parts within the bounds of the drag-select box.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - selectInRect -

    -
      -
    • selectInRect(r: Rect): void
    • -
    -
      -
    • -
      -

      For a given rectangle, select Parts that are within that rectangle.

      -
      -

      Parameters

      -
        -
      • -
        r: Rect
        -
        -

        rectangular bounds in document coordinates.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class RealtimeDragSelectingTool Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    The RealtimeDragSelectingTool class lets the user select and deselect Parts within the DragSelectingTool.box +during a drag, not just at the end of the drag.

    +

    If you want to experiment with this extension, try the Realtime Drag Selecting sample.

    +

    Index

    Inherited Members

    Constructors

    Methods

    • doActivate(): void
    • +

      Remember the original collection of selected Parts.

      +

      Returns void

    • doCancel(): void
    • +

      Restore the selection which may have been modified during a drag.

      +

      Returns void

    • doDeactivate(): void
    • +

      Release any references to selected Parts.

      +

      Returns void

    • doKeyDown(): void
    • +

      Select Parts within the bounds of the drag-select box.

      +

      Returns void

    • doKeyUp(): void
    • +

      Select Parts within the bounds of the drag-select box.

      +

      Returns void

    • doMouseMove(): void
    • +

      Select Parts within the bounds of the drag-select box.

      +

      Returns void

    • selectInRect(r: Rect): void
    • +

      For a given rectangle, select Parts that are within that rectangle.

      +

      Parameters

      • r: Rect
        +

        rectangular bounds in document coordinates.

        +

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Rect.html b/api/symbols/Rect.html index b89258da2..14ace33e3 100644 --- a/api/symbols/Rect.html +++ b/api/symbols/Rect.html @@ -1,1713 +1,318 @@ - - - - - - Rect | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class Rect

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - Rect -
    • -
    -
    -
    -
    -

    A Rect describes a rectangular two-dimensional area as a top-left point (x and y values) - and a size (width and height values).

    -

    Use the static functions Rect.parse and Rect.stringify to convert to and from - a standard string representation that is independent of the current locale.

    -

    When an instance of this class is the value of a property of a GraphObject class or Diagram - or CommandHandler or a Tool class, you should treat the object - as if it were frozen or read-only -- you cannot modify its properties. - This allows the property to return a value without allocating a new instance. - If you need to do your own calculations with the value, call copy to make - a new instance with the same values that you can modify.

    -

    Many methods modify the object's properties and then return a reference to "this" object. - The only instance method to allocate a new object is the copy method. - The static Rect.parse method also allocates a new object. - The center, position, and size properties all allocate and return a new object.

    -

    The "Debug" implementation of this class is significantly slower than the "Release" implementation, - mostly due to additional error checking.

    -

    You cannot inherit from this class.

    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    -
      -
    • new Rect(x?: number | Point, y?: number | Point | Size, w?: number, h?: number): Rect
    • -
    -
      -
    • -
      -

      There are four constructors: (), (Point, Point), (Point, Size), - and four numbers for (x, y, width, height). - The default constructor (no argument) results in a Rect(0,0,0,0).

      -
      -

      Parameters

      -
        -
      • -
        Optional x: number | Point
        -
        -

        Top-left Point, or x value.

        -
        -
      • -
      • -
        Optional y: number | Point | Size
        -
        -

        Bottom-right Point or Size or y value.

        -
        -
      • -
      • -
        Optional w: number
        -
        -

        Width to be used if x,y are specified; - must be non-negative.

        -
        -
      • -
      • -
        Optional h: number
        -
        -

        Height to be used if x,y are specified; - must be non-negative.

        -
        -
      • -
      -

      Returns Rect

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - bottom - : number

    -
      -
    • -
      -

      Gets or sets the y-axis value of the bottom of the Rect. - This is equal to the sum of the y value and the height.

      -
      -
    • -
    -
    -
    - -

    - center - : Point

    -
      -
    • -
      -

      Gets or sets the Point at the center of this Rect. - Setting this property just shifts the X and Y values.

      -
      -
    • -
    -
    -
    - -

    - centerX - : number

    -
      -
    • -
      -

      Gets or sets the horizontal center X coordinate of the Rect.

      -
      -
    • -
    -
    -
    - -

    - centerY - : number

    -
      -
    • -
      -

      Gets or sets the vertical center Y coordinate of the Rect.

      -
      -
    • -
    -
    -
    - -

    - height - : number

    -
      -
    • -
      -

      Gets or sets the height of the Rect. - The value must not be negative.

      -
      -
    • -
    -
    -
    - -

    - left - : number

    -
      -
    • -
      -

      Gets or sets the leftmost value of the Rect. - This is the same as the X value.

      -
      -
    • -
    -
    -
    - -

    - position - : Point

    -
      -
    • -
      -

      Gets or sets the x- and y-axis position of the Rect as a Point.

      -
      -
    • -
    -
    -
    - -

    - right - : number

    -
      -
    • -
      -

      Gets or sets the x-axis value of the right of the Rect. - This is equal to the sum of the x value and the width.

      -
      -
    • -
    -
    -
    - -

    - size - : Size

    -
      -
    • -
      -

      Gets or sets the width and height of the Rect as a Size.

      -
      -
    • -
    -
    -
    - -

    - top - : number

    -
      -
    • -
      -

      Gets or sets the topmost value of the Rect. - This is the same as the Y value.

      -
      -
    • -
    -
    -
    - -

    - width - : number

    -
      -
    • -
      -

      Gets or sets the width of the Rect. - The value must not be negative.

      -
      -
    • -
    -
    -
    - -

    - x - : number

    -
      -
    • -
      -

      Gets or sets the top-left x coordinate of the Rect.

      -
      -
    • -
    -
    -
    - -

    - y - : number

    -
      -
    • -
      -

      Gets or sets the top-left y coordinate of the Rect.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - addMargin -

    - -
      -
    • -
      -

      Modify this Rect by adding the given Margin to each side of the Rect.

      -
      -
      see
      -

      subtractMargin, grow, inflate

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        m: Margin
        -
        -

        The Margin to add to the Rect.

        -
        -
      • -
      -

      Returns Rect

      -

      this bigger Rect.

      -
    • -
    -
    -
    - -

    - contains -

    -
      -
    • contains(x: number, y: number, w?: number, h?: number): boolean
    • -
    -
      -
    • -
      -

      Indicates whether this Rect contains the given Point/Rect.

      -
      -
      see
      -

      containsRect, containsPoint

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        x: number
        -
        -

        The X coordinate of the Point or Rect to include in the new bounds.

        -
        -
      • -
      • -
        y: number
        -
        -

        The Y coordinate of the Point or Rect to include in the new bounds.

        -
        -
      • -
      • -
        Optional w: number
        -
        -

        The Width of the Rect to include in the new bounds, defaults to zero.

        -
        -
      • -
      • -
        Optional h: number
        -
        -

        The Height of the Rect to include in the new bounds, defaults to zero.

        -
        -
      • -
      -

      Returns boolean

      -

      True if the Point/Rect is contained within this Rect, - false otherwise.

      -
    • -
    -
    -
    - -

    - Static - contains -

    -
      -
    • contains(rx: number, ry: number, rw: number, rh: number, x: number, y: number, w?: number, h?: number): boolean
    • -
    -
      -
    • -
      -

      This static function indicates whether a Rect contains the given Point/Rect.

      -
      -

      Parameters

      -
        -
      • -
        rx: number
        -
        -

        The X coordinate of a Rect.

        -
        -
      • -
      • -
        ry: number
        -
        -

        The Y coordinate of a Rect.

        -
        -
      • -
      • -
        rw: number
        -
        -

        The Width of a Rect.

        -
        -
      • -
      • -
        rh: number
        -
        -

        The Height of a Rect.

        -
        -
      • -
      • -
        x: number
        -
        -

        The X coordinate of the Point or Rect that might be in the bounds (RX, RY, RW, RH).

        -
        -
      • -
      • -
        y: number
        -
        -

        The Y coordinate of the Point or Rect that might be in the bounds (RX, RY, RW, RH).

        -
        -
      • -
      • -
        Optional w: number
        -
        -

        The Width of the Rect to include in the new bounds, defaults to zero.

        -
        -
      • -
      • -
        Optional h: number
        -
        -

        The Height of the Rect to include in the new bounds, defaults to zero.

        -
        -
      • -
      -

      Returns boolean

      -

      True if the Point/Rect is contained within this Rect, - false otherwise.

      -
    • -
    -
    -
    - -

    - containsPoint -

    -
      -
    • containsPoint(p: Point): boolean
    • -
    -
      -
    • -
      -

      Indicates whether this Rect contains the given Point.

      -
      -
      see
      -

      containsRect, contains

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        p: Point
        -
        -

        The Point to check.

        -
        -
      • -
      -

      Returns boolean

      -

      True if the Point is contained within this Rect, - false otherwise.

      -
    • -
    -
    -
    - -

    - containsRect -

    -
      -
    • containsRect(r: Rect): boolean
    • -
    -
      -
    • -
      -

      Indicates whether this Rect contains the given Rect.

      -
      -
      see
      -

      containsPoint, contains

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        r: Rect
        -
        -

        The Rect to check.

        -
        -
      • -
      -

      Returns boolean

      -

      True if the Rect is contained within this Rect, - false otherwise.

      -
    • -
    -
    -
    - -

    - Virtual - copy -

    - -
      -
    • -
      -

      Create a copy of this Rect, with the same values.

      -
      -

      Returns Rect

      -
    • -
    -
    -
    - -

    - equalTo -

    -
      -
    • equalTo(x: number, y: number, w: number, h: number): boolean
    • -
    -
      -
    • -
      -

      Indicates whether the given Rect is equal to the current Rect.

      -
      -
      see
      -

      equals

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        x: number
        -
      • -
      • -
        y: number
        -
      • -
      • -
        w: number
        -
        -

        the width.

        -
        -
      • -
      • -
        h: number
        -
        -

        the height.

        -
        -
      • -
      -

      Returns boolean

      -

      True if the Rects are equivalent in x, y, width, and height.

      -
    • -
    -
    -
    - -

    - equals -

    -
      -
    • equals(r: Rect): boolean
    • -
    -
      -
    • -
      -

      Indicates whether the given Rect is equal to the current Rect.

      -
      -
      see
      -

      equalTo

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        r: Rect
        -
        -

        The rectangle to compare to the current rectangle.

        -
        -
      • -
      -

      Returns boolean

      -

      True if the Rects are equivalent in x, y, width, - and height.

      -
    • -
    -
    -
    - -

    - grow -

    -
      -
    • grow(t: number, r: number, b: number, l: number): Rect
    • -
    -
      -
    • -
      -

      Modifies this Rect by adding some distance to each side of the Rect.

      -
      -
      see
      -

      inflate, addMargin, subtractMargin

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        t: number
        -
        -

        the amount to move the top side upwards; may be negative.

        -
        -
      • -
      • -
        r: number
        -
        -

        the amount to move the right side rightwards; may be negative.

        -
        -
      • -
      • -
        b: number
        -
        -

        the amount to move the bottom side downwards; may be negative.

        -
        -
      • -
      • -
        l: number
        -
        -

        the amount to move the left side leftwards; may be negative.

        -
        -
      • -
      -

      Returns Rect

      -

      this modified Rect.

      -
    • -
    -
    -
    - -

    - inflate -

    -
      -
    • inflate(w: number, h: number): Rect
    • -
    -
      -
    • -
      -

      Modify this Rect so that its width and height are changed on all four sides, - equally on the left and right sides, and equally on the top and bottom sides. - When the arguments are negative, this operation deflates this Rect, but not beyond zero.

      -
      -
      see
      -

      grow, addMargin, subtractMargin

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        w: number
        -
        -

        The additional width on each side, left and right; may be negative.

        -
        -
      • -
      • -
        h: number
        -
        -

        The additional height on each side, top and bottom; may be negative.

        -
        -
      • -
      -

      Returns Rect

      -

      this.

      -
    • -
    -
    -
    - -

    - intersect -

    -
      -
    • intersect(x: number, y: number, w: number, h: number): Rect
    • -
    -
      -
    • -
      -

      Modify this Rect so that it is the intersection of this Rect and the rectangle - defined by x, y, w, h.

      -
      -
      see
      -

      intersectRect, intersects

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        x: number
        -
      • -
      • -
        y: number
        -
      • -
      • -
        w: number
        -
      • -
      • -
        h: number
        -
      • -
      -

      Returns Rect

      -

      this.

      -
    • -
    -
    -
    - -

    - intersectRect -

    - -
      -
    • -
      -

      Modify this Rect so that it is the intersection of this Rect and the given Rect.

      -
      -
      see
      -

      intersect, intersects

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        r: Rect
        -
        -

        Rect to intersect with.

        -
        -
      • -
      -

      Returns Rect

      -

      this.

      -
    • -
    -
    -
    - -

    - intersects -

    -
      -
    • intersects(x: number, y: number, w: number, h: number): boolean
    • -
    -
      -
    • -
      -

      Determine if this Rect partly or wholly overlaps the rectangle - defined by x, y, w, h.

      -
      -
      see
      -

      intersectsRect, intersect

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        x: number
        -
      • -
      • -
        y: number
        -
      • -
      • -
        w: number
        -
      • -
      • -
        h: number
        -
      • -
      -

      Returns boolean

      -

      true if there is any overlap.

      -
    • -
    -
    -
    - -

    - Static - intersects -

    -
      -
    • intersects(rx: number, ry: number, rw: number, rh: number, x: number, y: number, w: number, h: number): boolean
    • -
    -
      -
    • -
      -

      This static function indicates whether a Rect partly or wholly overlaps the given Rect.

      -
      -

      Parameters

      -
        -
      • -
        rx: number
        -
        -

        The X coordinate of a Rect.

        -
        -
      • -
      • -
        ry: number
        -
        -

        The Y coordinate of a Rect.

        -
        -
      • -
      • -
        rw: number
        -
        -

        The Width of a Rect.

        -
        -
      • -
      • -
        rh: number
        -
        -

        The Height of a Rect.

        -
        -
      • -
      • -
        x: number
        -
        -

        The X coordinate of the Point or Rect that might overlap the bounds (RX, RY, RW, RH).

        -
        -
      • -
      • -
        y: number
        -
        -

        The Y coordinate of the Point or Rect that might overlap the bounds (RX, RY, RW, RH).

        -
        -
      • -
      • -
        w: number
        -
      • -
      • -
        h: number
        -
      • -
      -

      Returns boolean

      -

      true if there is any overlap.

      -
    • -
    -
    -
    - -

    - Static - intersectsLineSegment -

    -
      -
    • intersectsLineSegment(x: number, y: number, w: number, h: number, p1x: number, p1y: number, p2x: number, p2y: number): boolean
    • -
    -
      -
    • -
      -
      -
      since
      -

      2.2

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        x: number
        -
        -

        The X coordinate of the rectangle to check for intersection with the line segment.

        -
        -
      • -
      • -
        y: number
        -
        -

        The Y coordinate of the rectangle to check for intersection with the line segment.

        -
        -
      • -
      • -
        w: number
        -
        -

        The Width of the rectangle to check for intersection with the line segment.

        -
        -
      • -
      • -
        h: number
        -
        -

        The Height of the rectangle to check for intersection with the line segment.

        -
        -
      • -
      • -
        p1x: number
        -
        -

        The X coordinate of one end of the line segment.

        -
        -
      • -
      • -
        p1y: number
        -
        -

        The Y coordinate of one end of the line segment.

        -
        -
      • -
      • -
        p2x: number
        -
        -

        The X coordinate of other end of the line segment.

        -
        -
      • -
      • -
        p2y: number
        -
        -

        The Y coordinate of other end of the line segment.

        -
        -
      • -
      -

      Returns boolean

      -

      True if the given finite line segment intersects with the given rectangular area, false otherwise.

      -
    • -
    -
    -
    - -

    - intersectsRect -

    -
      -
    • intersectsRect(r: Rect): boolean
    • -
    -
      -
    • -
      -

      Determine if a given Rect is partly or wholly inside of this Rect.

      -
      -
      see
      -

      intersects, intersectRect

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        r: Rect
        -
        -

        Rect to test intersection with.

        -
        -
      • -
      -

      Returns boolean

      -

      true if there is an intersection.

      -
    • -
    -
    -
    - -

    - isEmpty -

    -
      -
    • isEmpty(): boolean
    • -
    -
      -
    • -
      -

      True if this Rect has a Width and Height of zero.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - isReal -

    -
      -
    • isReal(): boolean
    • -
    -
      -
    • -
      -

      True if this Rect has X, Y, Width, and Height values that are real numbers and not infinity.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - offset -

    -
      -
    • offset(dx: number, dy: number): Rect
    • -
    -
      -
    • -
      -

      Modify this Rect by shifting its values with the given DX and DY offsets.

      -
      -

      Parameters

      -
        -
      • -
        dx: number
        -
      • -
      • -
        dy: number
        -
      • -
      -

      Returns Rect

      -

      this.

      -
    • -
    -
    -
    - -

    - Static - parse -

    -
      -
    • parse(str: string): Rect
    • -
    -
      -
    • -
      -

      This static function can be used to read in a Rect from a string that was produced by Rect.stringify.

      -

      go.Rect.parse("1 2 3 4") produces the Rect new go.Rect(1, 2, 3, 4).

      -
      -

      Parameters

      -
        -
      • -
        str: string
        -
      • -
      -

      Returns Rect

      -
    • -
    -
    -
    - -

    - set -

    - -
      -
    • -
      -

      Modify this Rect so that its X, Y, Width, and Height values are the same as the given Rect.

      -
      -

      Parameters

      -
        -
      • -
        r: Rect
        -
        -

        the given Rect.

        -
        -
      • -
      -

      Returns Rect

      -

      this.

      -
    • -
    -
    -
    - -

    - setPoint -

    - -
      -
    • -
      -

      Modify this Rect so that its X and Y values are the same as the given Point.

      -
      -

      Parameters

      -
        -
      • -
        p: Point
        -
        -

        the given Point.

        -
        -
      • -
      -

      Returns Rect

      -

      this.

      -
    • -
    -
    -
    - -

    - setSize -

    - -
      -
    • -
      -

      Modify this Rect so that its Width and Height values are the same as the given Size.

      -
      -

      Parameters

      -
        -
      • -
        s: Size
        -
        -

        the given Size.

        -
        -
      • -
      -

      Returns Rect

      -

      this.

      -
    • -
    -
    -
    - -

    - setSpot -

    -
      -
    • setSpot(x: number, y: number, spot: Spot): Rect
    • -
    -
      -
    • -
      -

      Modify this Rect so that a given Spot is at a given (x,y) point using this Rect's size. - Return this rectangle for which the spot is at that point, without modifying the size.

      -

      The result is meaningless if Spot.isNoSpot is true.

      -
      -

      Parameters

      -
        -
      • -
        x: number
        -
        -

        the point where the spot should be.

        -
        -
      • -
      • -
        y: number
        -
        -

        the point where the spot should be.

        -
        -
      • -
      • -
        spot: Spot
        -
        -

        a Spot; Spot.isSpot must be true.

        -
        -
      • -
      -

      Returns Rect

      -

      this.

      -
    • -
    -
    -
    - -

    - setTo -

    -
      -
    • setTo(x: number, y: number, w: number, h: number): Rect
    • -
    -
      -
    • -
      -

      Modify this Rect with new X, Y, Width, and Height values.

      -
      -

      Parameters

      -
        -
      • -
        x: number
        -
      • -
      • -
        y: number
        -
      • -
      • -
        w: number
        -
        -

        the width.

        -
        -
      • -
      • -
        h: number
        -
        -

        the height.

        -
        -
      • -
      -

      Returns Rect

      -

      this.

      -
    • -
    -
    -
    - -

    - Static - stringify -

    -
      -
    • stringify(val: Rect): string
    • -
    -
      -
    • -
      -

      This static function can be used to write out a Rect as a string that can be read by Rect.parse.

      -

      go.Rect.stringify(new go.Rect(1, 2, 3, 4)) produces the string "1 2 3 4".

      -
      -

      Parameters

      - -

      Returns string

      -
    • -
    -
    -
    - -

    - subtractMargin -

    - -
      -
    • -
      -

      Modify this Rect by subtracting the given Margin from each side of the Rect.

      -
      -
      see
      -

      addMargin, grow, inflate

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        m: Margin
        -
        -

        The Margin to subtract from the Rect.

        -
        -
      • -
      -

      Returns Rect

      -

      this smaller Rect.

      -
    • -
    -
    -
    - -

    - union -

    -
      -
    • union(x: number, y: number, w?: number, h?: number): Rect
    • -
    -
      -
    • -
      -

      Modify this Rect to be exactly big enough to contain both the original Rect and the given rectangular area.

      -
      -
      see
      -

      unionRect, unionPoint

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        x: number
        -
        -

        The X coordinate of the Point or Rect to include in the new bounds.

        -
        -
      • -
      • -
        y: number
        -
        -

        The Y coordinate of the Point or Rect to include in the new bounds.

        -
        -
      • -
      • -
        Optional w: number
        -
        -

        The Width of the Rect to include in the new bounds, defaults to zero.

        -
        -
      • -
      • -
        Optional h: number
        -
        -

        The Height of the Rect to include in the new bounds, defaults to zero.

        -
        -
      • -
      -

      Returns Rect

      -

      this.

      -
    • -
    -
    -
    - -

    - unionPoint -

    - -
      -
    • -
      -

      Modify this Rect to be exactly big enough to contain both the original Rect and the given Point.

      -
      -
      see
      -

      unionRect, union

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        p: Point
        -
        -

        The Point to include in the new bounds.

        -
        -
      • -
      -

      Returns Rect

      -

      this.

      -
    • -
    -
    -
    - -

    - unionRect -

    - -
      -
    • -
      -

      Modify this Rect to be exactly big enough to contain this Rect and the given Rect.

      -
      -
      see
      -

      unionPoint, union

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        r: Rect
        -
        -

        The Rect to include in the new bounds.

        -
        -
      • -
      -

      Returns Rect

      -

      this.

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class Rect

    Hierarchy

    • Rect
    +

    A Rect describes a rectangular two-dimensional area as a top-left point (x and y values) +and a size (width and height values).

    +

    Use the static functions Rect.parse and Rect.stringify to convert to and from +a standard string representation that is independent of the current locale.

    +

    When an instance of this class is the value of a property of a GraphObject class or Diagram +or CommandHandler or a Tool class, you should treat the object +as if it were frozen or read-only -- you cannot modify its properties. +This allows the property to return a value without allocating a new instance. +If you need to do your own calculations with the value, call copy to make +a new instance with the same values that you can modify.

    +

    Many methods modify the object's properties and then return a reference to "this" object. +The only instance method to allocate a new object is the copy method. +The static Rect.parse method also allocates a new object. +The center, position, and size properties all allocate and return a new object.

    +

    The "Debug" implementation of this class is significantly slower than the "Release" implementation, +mostly due to additional error checking.

    +

    You cannot inherit from this class.

    +

    Index

    Constructors

    • +

      There are four constructors: (), (Point, Point), (Point, Size), +and four numbers for (x, y, width, height). +The default constructor (no argument) results in a Rect(0,0,0,0).

      +

      Parameters

      • Optional x: number | Point
        +

        Top-left Point, or x value.

        +
      • Optional y: number | Point | Size
        +

        Bottom-right Point or Size or y value.

        +
      • Optional w: number
        +

        Width to be used if x,y are specified; +must be non-negative.

        +
      • Optional h: number
        +

        Height to be used if x,y are specified; +must be non-negative.

        +

      Returns Rect

    Properties

    • +

      Gets or sets the y-axis value of the bottom of the Rect. +This is equal to the sum of the y value and the height.

      +
    • +

      Gets or sets the Point at the center of this Rect. +Setting this property just shifts the X and Y values.

      +
    • +

      Gets or sets the horizontal center X coordinate of the Rect.

      +
    • +

      Gets or sets the vertical center Y coordinate of the Rect.

      +
    • +

      Gets or sets the height of the Rect. +The value must not be negative.

      +
    • +

      Gets or sets the leftmost value of the Rect. +This is the same as the X value.

      +
    • +

      Gets or sets the x- and y-axis position of the Rect as a Point.

      +
    • +

      Gets or sets the x-axis value of the right of the Rect. +This is equal to the sum of the x value and the width.

      +
    • +

      Gets or sets the width and height of the Rect as a Size.

      +
    • +

      Gets or sets the topmost value of the Rect. +This is the same as the Y value.

      +
    • +

      Gets or sets the width of the Rect. +The value must not be negative.

      +
    • +

      Gets or sets the top-left x coordinate of the Rect.

      +
    • +

      Gets or sets the top-left y coordinate of the Rect.

      +

    Methods

    • +

      Modify this Rect by adding the given Margin to each side of the Rect.

      +
      see

      subtractMargin, grow, inflate

      +

      Parameters

      • m: Margin
        +

        The Margin to add to the Rect.

        +

      Returns Rect

      this bigger Rect.

      +
    • contains(x: number, y: number, w?: number, h?: number): boolean
    • +

      Indicates whether this Rect contains the given Point/Rect.

      +
      see

      containsRect, containsPoint

      +

      Parameters

      • x: number
        +

        The X coordinate of the Point or Rect to include in the new bounds.

        +
      • y: number
        +

        The Y coordinate of the Point or Rect to include in the new bounds.

        +
      • Optional w: number
        +

        The Width of the Rect to include in the new bounds, defaults to zero.

        +
      • Optional h: number
        +

        The Height of the Rect to include in the new bounds, defaults to zero.

        +

      Returns boolean

      True if the Point/Rect is contained within this Rect, +false otherwise.

      +
    • containsPoint(p: Point): boolean
    • +

      Indicates whether this Rect contains the given Point.

      +
      see

      containsRect, contains

      +

      Parameters

      • p: Point
        +

        The Point to check.

        +

      Returns boolean

      True if the Point is contained within this Rect, +false otherwise.

      +
    • containsRect(r: Rect): boolean
    • +

      Indicates whether this Rect contains the given Rect.

      +
      see

      containsPoint, contains

      +

      Parameters

      • r: Rect
        +

        The Rect to check.

        +

      Returns boolean

      True if the Rect is contained within this Rect, +false otherwise.

      +
    • +

      Create a copy of this Rect, with the same values.

      +

      Returns Rect

    • equalTo(x: number, y: number, w: number, h: number): boolean
    • +

      Indicates whether the given Rect is equal to the current Rect.

      +
      see

      equals

      +

      Parameters

      • x: number
      • y: number
      • w: number
        +

        the width.

        +
      • h: number
        +

        the height.

        +

      Returns boolean

      True if the Rects are equivalent in x, y, width, and height.

      +
    • equals(r: Rect): boolean
    • +

      Indicates whether the given Rect is equal to the current Rect.

      +
      see

      equalTo

      +

      Parameters

      • r: Rect
        +

        The rectangle to compare to the current rectangle.

        +

      Returns boolean

      True if the Rects are equivalent in x, y, width, +and height.

      +
    • grow(t: number, r: number, b: number, l: number): Rect
    • +

      Modifies this Rect by adding some distance to each side of the Rect.

      +
      see

      inflate, addMargin, subtractMargin

      +

      Parameters

      • t: number
        +

        the amount to move the top side upwards; may be negative.

        +
      • r: number
        +

        the amount to move the right side rightwards; may be negative.

        +
      • b: number
        +

        the amount to move the bottom side downwards; may be negative.

        +
      • l: number
        +

        the amount to move the left side leftwards; may be negative.

        +

      Returns Rect

      this modified Rect.

      +
    • inflate(w: number, h: number): Rect
    • +

      Modify this Rect so that its width and height are changed on all four sides, +equally on the left and right sides, and equally on the top and bottom sides. +When the arguments are negative, this operation deflates this Rect, but not beyond zero.

      +
      see

      grow, addMargin, subtractMargin

      +

      Parameters

      • w: number
        +

        The additional width on each side, left and right; may be negative.

        +
      • h: number
        +

        The additional height on each side, top and bottom; may be negative.

        +

      Returns Rect

      this.

      +
    • intersect(x: number, y: number, w: number, h: number): Rect
    • +

      Modify this Rect so that it is the intersection of this Rect and the rectangle +defined by x, y, w, h.

      +
      see

      intersectRect, intersects

      +

      Parameters

      • x: number
      • y: number
      • w: number
      • h: number

      Returns Rect

      this.

      +
    • +

      Modify this Rect so that it is the intersection of this Rect and the given Rect.

      +
      see

      intersect, intersects

      +

      Parameters

      • r: Rect
        +

        Rect to intersect with.

        +

      Returns Rect

      this.

      +
    • intersects(x: number, y: number, w: number, h: number): boolean
    • +

      Determine if this Rect partly or wholly overlaps the rectangle +defined by x, y, w, h.

      +
      see

      intersectsRect, intersect

      +

      Parameters

      • x: number
      • y: number
      • w: number
      • h: number

      Returns boolean

      true if there is any overlap.

      +
    • intersectsRect(r: Rect): boolean
    • +

      Determine if a given Rect is partly or wholly inside of this Rect.

      +
      see

      intersects, intersectRect

      +

      Parameters

      • r: Rect
        +

        Rect to test intersection with.

        +

      Returns boolean

      true if there is an intersection.

      +
    • isEmpty(): boolean
    • +

      True if this Rect has a Width and Height of zero.

      +

      Returns boolean

    • isReal(): boolean
    • +

      True if this Rect has X, Y, Width, and Height values that are real numbers and not infinity.

      +

      Returns boolean

    • offset(dx: number, dy: number): Rect
    • +

      Modify this Rect by shifting its values with the given DX and DY offsets.

      +

      Parameters

      • dx: number
      • dy: number

      Returns Rect

      this.

      +
    • +

      Modify this Rect so that its X, Y, Width, and Height values are the same as the given Rect.

      +

      Parameters

      • r: Rect
        +

        the given Rect.

        +

      Returns Rect

      this.

      +
    • +

      Modify this Rect so that its X and Y values are the same as the given Point.

      +

      Parameters

      • p: Point
        +

        the given Point.

        +

      Returns Rect

      this.

      +
    • +

      Modify this Rect so that its Width and Height values are the same as the given Size.

      +

      Parameters

      • s: Size
        +

        the given Size.

        +

      Returns Rect

      this.

      +
    • setSpot(x: number, y: number, spot: Spot): Rect
    • +

      Modify this Rect so that a given Spot is at a given (x,y) point using this Rect's size. +Return this rectangle for which the spot is at that point, without modifying the size.

      +

      The result is meaningless if Spot.isNoSpot is true.

      +

      Parameters

      • x: number
        +

        the point where the spot should be.

        +
      • y: number
        +

        the point where the spot should be.

        +
      • spot: Spot
        +

        a Spot; Spot.isSpot must be true.

        +

      Returns Rect

      this.

      +
    • setTo(x: number, y: number, w: number, h: number): Rect
    • +

      Modify this Rect with new X, Y, Width, and Height values.

      +

      Parameters

      • x: number
      • y: number
      • w: number
        +

        the width.

        +
      • h: number
        +

        the height.

        +

      Returns Rect

      this.

      +
    • +

      Modify this Rect by subtracting the given Margin from each side of the Rect.

      +
      see

      addMargin, grow, inflate

      +

      Parameters

      • m: Margin
        +

        The Margin to subtract from the Rect.

        +

      Returns Rect

      this smaller Rect.

      +
    • union(x: number, y: number, w?: number, h?: number): Rect
    • +

      Modify this Rect to be exactly big enough to contain both the original Rect and the given rectangular area.

      +
      see

      unionRect, unionPoint

      +

      Parameters

      • x: number
        +

        The X coordinate of the Point or Rect to include in the new bounds.

        +
      • y: number
        +

        The Y coordinate of the Point or Rect to include in the new bounds.

        +
      • Optional w: number
        +

        The Width of the Rect to include in the new bounds, defaults to zero.

        +
      • Optional h: number
        +

        The Height of the Rect to include in the new bounds, defaults to zero.

        +

      Returns Rect

      this.

      +
    • +

      Modify this Rect to be exactly big enough to contain both the original Rect and the given Point.

      +
      see

      unionRect, union

      +

      Parameters

      • p: Point
        +

        The Point to include in the new bounds.

        +

      Returns Rect

      this.

      +
    • +

      Modify this Rect to be exactly big enough to contain this Rect and the given Rect.

      +
      see

      unionPoint, union

      +

      Parameters

      • r: Rect
        +

        The Rect to include in the new bounds.

        +

      Returns Rect

      this.

      +
    • contains(rx: number, ry: number, rw: number, rh: number, x: number, y: number, w?: number, h?: number): boolean
    • +

      This static function indicates whether a Rect contains the given Point/Rect.

      +

      Parameters

      • rx: number
        +

        The X coordinate of a Rect.

        +
      • ry: number
        +

        The Y coordinate of a Rect.

        +
      • rw: number
        +

        The Width of a Rect.

        +
      • rh: number
        +

        The Height of a Rect.

        +
      • x: number
        +

        The X coordinate of the Point or Rect that might be in the bounds (RX, RY, RW, RH).

        +
      • y: number
        +

        The Y coordinate of the Point or Rect that might be in the bounds (RX, RY, RW, RH).

        +
      • Optional w: number
        +

        The Width of the Rect to include in the new bounds, defaults to zero.

        +
      • Optional h: number
        +

        The Height of the Rect to include in the new bounds, defaults to zero.

        +

      Returns boolean

      True if the Point/Rect is contained within this Rect, +false otherwise.

      +
    • intersects(rx: number, ry: number, rw: number, rh: number, x: number, y: number, w: number, h: number): boolean
    • +

      This static function indicates whether a Rect partly or wholly overlaps the given Rect.

      +

      Parameters

      • rx: number
        +

        The X coordinate of a Rect.

        +
      • ry: number
        +

        The Y coordinate of a Rect.

        +
      • rw: number
        +

        The Width of a Rect.

        +
      • rh: number
        +

        The Height of a Rect.

        +
      • x: number
        +

        The X coordinate of the Point or Rect that might overlap the bounds (RX, RY, RW, RH).

        +
      • y: number
        +

        The Y coordinate of the Point or Rect that might overlap the bounds (RX, RY, RW, RH).

        +
      • w: number
      • h: number

      Returns boolean

      true if there is any overlap.

      +
    • intersectsLineSegment(x: number, y: number, w: number, h: number, p1x: number, p1y: number, p2x: number, p2y: number): boolean
    • since

      2.2

      +

      Parameters

      • x: number
        +

        The X coordinate of the rectangle to check for intersection with the line segment.

        +
      • y: number
        +

        The Y coordinate of the rectangle to check for intersection with the line segment.

        +
      • w: number
        +

        The Width of the rectangle to check for intersection with the line segment.

        +
      • h: number
        +

        The Height of the rectangle to check for intersection with the line segment.

        +
      • p1x: number
        +

        The X coordinate of one end of the line segment.

        +
      • p1y: number
        +

        The Y coordinate of one end of the line segment.

        +
      • p2x: number
        +

        The X coordinate of other end of the line segment.

        +
      • p2y: number
        +

        The Y coordinate of other end of the line segment.

        +

      Returns boolean

      True if the given finite line segment intersects with the given rectangular area, false otherwise.

      +
    • parse(str: string): Rect
    • +

      This static function can be used to read in a Rect from a string that was produced by Rect.stringify.

      +

      go.Rect.parse("1 2 3 4") produces the Rect new go.Rect(1, 2, 3, 4).

      +

      Parameters

      • str: string

      Returns Rect

    • stringify(val: Rect): string
    • +

      This static function can be used to write out a Rect as a string that can be read by Rect.parse.

      +

      go.Rect.stringify(new go.Rect(1, 2, 3, 4)) produces the string "1 2 3 4".

      +

      Parameters

      Returns string

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/RelinkingTool.html b/api/symbols/RelinkingTool.html index 8b6d8b319..1fb229a13 100644 --- a/api/symbols/RelinkingTool.html +++ b/api/symbols/RelinkingTool.html @@ -1,615 +1,146 @@ - - - - - - RelinkingTool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class RelinkingTool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    The RelinkingTool allows the user to reconnect an existing Link - if the Link.relinkableTo and/or Link.relinkableFrom properties are true.

    -

    - For a general discussion of validation, see Introduction to Validation. -

    By default an instance of this tool is installed as a mouse-down tool in the - Diagram.toolManager as the ToolManager.relinkingTool.

    -

    This tool makes use of two Adornments, - each including a relink handle (potentially one for each end of the link), - shown when a link is selected.

    -

    This tool conducts a transaction while the tool is active. - A successful relinking will result in a "LinkRelinked" DiagramEvent and a "Relinking" transaction.

    -

    If you want to programmatically start a new user's relinking of a Link, - you can set the handle property to the specific "RelinkFrom" or "RelinkTo" handle and - then start and activate the tool.

    -
      var tool = myDiagram.toolManager.relinkingTool;
    -  tool.originalLink = ...;   // specify which Link to have the user reconnect
    -  tool.isForwards = true;    // specify which end of the Link to reconnect
    -  myDiagram.currentTool = tool;  // starts the RelinkingTool
    -  tool.doActivate();             // activates the RelinkingTool
    +RelinkingTool | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class RelinkingTool

    Hierarchy

    +

    The RelinkingTool allows the user to reconnect an existing Link +if the Link.relinkableTo and/or Link.relinkableFrom properties are true.

    +

    +For a general discussion of validation, see Introduction to Validation.

    By default an instance of this tool is installed as a mouse-down tool in the +Diagram.toolManager as the ToolManager.relinkingTool.

    +

    This tool makes use of two Adornments, +each including a relink handle (potentially one for each end of the link), +shown when a link is selected.

    +

    This tool conducts a transaction while the tool is active. +A successful relinking will result in a "LinkRelinked" DiagramEvent and a "Relinking" transaction.

    +

    If you want to programmatically start a new user's relinking of a Link, +you can set the handle property to the specific "RelinkFrom" or "RelinkTo" handle and +then start and activate the tool.

    +
      var tool = myDiagram.toolManager.relinkingTool;
    tool.originalLink = ...; // specify which Link to have the user reconnect
    tool.isForwards = true; // specify which end of the Link to reconnect
    myDiagram.currentTool = tool; // starts the RelinkingTool
    tool.doActivate(); // activates the RelinkingTool
    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - fromHandleArchetype - : GraphObject

    -
      -
    • -
      -

      Gets or sets a small GraphObject that is copied as a relinking handle for the selected link path - at the "from" end of the link. - By default this is a Shape that is a small blue diamond. - Setting this property does not raise any events.

      -

      Here is an example of changing the default handle to be larger green triangles:

      -
      myDiagram.toolManager.relinkingTool.toHandleArchetype =
      -  $(go.Shape, "Triangle",
      -    { width: 10, height: 10, fill: "limegreen", segmentIndex: 0 });
      +

    Index

    Inherited Members

    Constructors

    Properties

    • +

      Gets or sets a small GraphObject that is copied as a relinking handle for the selected link path +at the "from" end of the link. +By default this is a Shape that is a small blue diamond. +Setting this property does not raise any events.

      +

      Here is an example of changing the default handle to be larger green triangles:

      +
      myDiagram.toolManager.relinkingTool.toHandleArchetype =
      $(go.Shape, "Triangle",
      { width: 10, height: 10, fill: "limegreen", segmentIndex: 0 });
      -
      -
      see
      -

      toHandleArchetype

      -
      -
      -
      -
    • -
    -
    -
    - -

    - handle - : GraphObject

    -
      -
    • -
      -

      Returns the GraphObject that is the tool handle being dragged by the user. - This will be contained by an Adornment whose category is "RelinkFrom" or "RelinkTo". - Its Adornment.adornedPart is the same as the originalLink.

      -

      This property is also settable, but should only be set either within an override of doActivate - or prior to calling doActivate.

      -
      -
    • -
    -
    -
    - -

    - toHandleArchetype - : GraphObject

    -
      -
    • -
      -

      Gets or sets a small GraphObject that is copied as a relinking handle for the selected link path - at the "to" end of the link. - By default this is a Shape that is a small blue diamond. - Setting this property does not raise any events.

      -

      Here is an example of changing the default handle to be larger orange triangles:

      -
        myDiagram.toolManager.relinkingTool.toHandleArchetype =
      -  $(go.Shape, "Triangle",
      -    { width: 10, height: 10, fill: "orange", segmentIndex: -1 });
      +
      see

      toHandleArchetype

      +
    • +

      Gets or sets a small GraphObject that is copied as a relinking handle for the selected link path +at the "to" end of the link. +By default this is a Shape that is a small blue diamond. +Setting this property does not raise any events.

      +

      Here is an example of changing the default handle to be larger orange triangles:

      +
        myDiagram.toolManager.relinkingTool.toHandleArchetype =
      $(go.Shape, "Triangle",
      { width: 10, height: 10, fill: "orange", segmentIndex: -1 });
      -
      -
      see
      -

      fromHandleArchetype

      -
      -
      -
      -
    • -
    -
    - -
    -

    Methods

    -
    - -

    - Override - canStart -

    -
      -
    • canStart(): boolean
    • -
    -
      -
    • -
      -

      This tool can run when the diagram allows relinking, the model is modifiable, - and there is a relink handle at the mouse-down point.

      -

      This method may be overridden, but we recommend that you call this base method.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Protected Virtual - copyLinkProperties -

    -
      -
    • copyLinkProperties(reallink: Link, templink: Link): void
    • -
    -
      -
    • -
      -

      Make a temporary link look and act like the real Link being relinked. - By default this method copies many of the routing-oriented properties - from the LinkingBaseTool.originalLink to the LinkingBaseTool.temporaryLink.

      -

      This method may be overridden, but we recommend that you call this base method. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -
      since
      -

      1.3

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        reallink: Link
        -
      • -
      • -
        templink: Link
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doActivate -

    -
      -
    • doActivate(): void
    • -
    -
      -
    • -
      -

      Start the relinking operation.

      -

      Find the relink handle by calling Tool.findToolHandleAt - looking for either the "RelinkFrom" adornment or the "RelinkTo" adornment, - saving the result in handle.

      -

      Normally when this method is called the value of LinkingBaseTool.originalLink and handle will be null, - resulting in a call to Tool.findToolHandleAt to find a "RelinkFrom" or "RelinkTo" tool handle, - which is then remembered as the value of handle. - If when this method is called the value of handle is already set, - then there is no need to call Tool.findToolHandleAt, - because the programmer has already set up which relinking handle they want the user to be relinking. - Finding a handle is not necessary if LinkingBaseTool.originalLink and - isForwards have been set before calling this method.

      -

      This starts a transaction, captures the mouse, and sets the cursor.

      -

      If LinkingBaseTool.originalLink or handle was not set beforehand, - the value of isForwards is set depending on the category of the relink handle found. - The LinkingBaseTool.originalLink property and various - "Original..." port and node properties are set too. - The temporary nodes and temporary link are also initialized.

      -

      This method may be overridden, but we recommend that you call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doDeactivate -

    -
      -
    • doDeactivate(): void
    • -
    -
      -
    • -
      -

      Finishing the linking operation stops the transaction, releases the mouse, and resets the cursor.

      -

      This method may be overridden, but we recommend that you call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseUp -

    -
      -
    • doMouseUp(): void
    • -
    -
      -
    • -
      -

      A mouse-up ends the relinking operation; if there is a valid targetPort nearby, - this modifies the old link to connect with the target port.

      -

      A successful relinking calls reconnectLink to actually change the link. - The "LinkRelinked" DiagramEvent is raised with the link as the DiagramEvent.subject - and with the now-disconnected original port as the DiagramEvent.parameter. - If the link was not reconnected, this calls doNoRelink. - In any case this stops the tool.

      -

      A failure to find a valid target port results in no changes and no DiagramEvent.

      -

      This method may be overridden, but we recommend that you call this base method. - You might find it easier to override reconnectLink. - It is actually most common to implement a "LinkRelinked" DiagramEvent listener on the Diagram.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - doNoRelink -

    -
      -
    • doNoRelink(existinglink: Link, toend: boolean): void
    • -
    -
      -
    • -
      -

      This method is called upon a mouse up when reconnectLink is not called.

      -

      This method may be overridden. By default this method does nothing. - If you want to successfully perform any side-effects, you will need to set Tool.transactionResult to a string; - otherwise this tool's transaction will be rolled-back. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -
      since
      -

      1.7

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        existinglink: Link
        -
      • -
      • -
        toend: boolean
        -
        -

        If true, the user was trying to modify the link's "to" node and port.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - reconnectLink -

    -
      -
    • reconnectLink(existinglink: Link, newnode: Node, newport: GraphObject, toend: boolean): boolean
    • -
    -
      -
    • -
      -

      Modify an existing Link to connect to a new node and port.

      -

      This method may be overridden, but we recommend that you call this base method. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -
      see
      -

      doNoRelink

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        existinglink: Link
        -
      • -
      • -
        newnode: Node
        -
        -

        the Node to connect to or from.

        -
        -
      • -
      • -
        newport: GraphObject
        -
        -

        the GraphObject port to connect to or from.

        -
        -
      • -
      • -
        toend: boolean
        -
        -

        If true, this modifies the link's "to" node and port; otherwise it modifies the "from" node and port.

        -
        -
      • -
      -

      Returns boolean

      -

      true if successful.

      -
    • -
    -
    -
    - -

    - Override - updateAdornments -

    -
      -
    • updateAdornments(part: Part): void
    • -
    - -
    -
    -
    - -
    - -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/RescalingTool.html b/api/symbols/RescalingTool.html index 53bdeb553..4c3fa317d 100644 --- a/api/symbols/RescalingTool.html +++ b/api/symbols/RescalingTool.html @@ -1,595 +1,93 @@ - - - - - - RescalingTool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class RescalingTool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    -
      -
    • - Tool -
        -
      • - RescalingTool -
      • -
      -
    • -
    -
    -
    -
    -

    A custom tool for rescaling an object by modifying its GraphObject.scale property.

    -

    Install the RescalingTool as a mouse-down tool by calling: - myDiagram.toolManager.mouseDownTools.add(new RescalingTool());

    -

    Normally it would not make sense for the same object to be both resizable and rescalable.

    -

    Note that there is no Part.rescaleObjectName property and there is no Part.rescalable property. - So although you cannot customize any Node to affect this tool, you can set - RescalingTool.rescaleObjectName and set RescalingTool.isEnabled to control - whether objects are rescalable and when.

    -

    If you want to experiment with this extension, try the Rescaling sample.

    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - adornedObject - : GraphObject

    -
      -
    • -
      -

      Gets the GraphObject that is being rescaled. - This may be the same object as the selected Part or it may be contained within that Part.

      -

      This property is also settable, but should only be set when overriding functions - in RescalingTool, and not during normal operation.

      -
      -
    • -
    -
    -
    - -

    - handle - : GraphObject

    - -
    -
    - -

    - handleArchetype - : GraphObject

    -
      -
    • -
      -

      Gets or sets a small GraphObject that is copied as a rescale handle for the selected part. - By default this is a Shape that is a small blue square. - Setting this property does not raise any events.

      -

      Here is an example of changing the default handle to be green "X":

      -
        tool.handleArchetype =
      -    $(go.Shape, "XLine",
      -      { width: 8, height: 8, stroke: "green", fill: "transparent" });
      +RescalingTool | GoJS API
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class RescalingTool Extension

      This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

      Hierarchy

      +

      A custom tool for rescaling an object by modifying its GraphObject.scale property.

      +

      Install the RescalingTool as a mouse-down tool by calling: +myDiagram.toolManager.mouseDownTools.add(new RescalingTool());

      +

      Normally it would not make sense for the same object to be both resizable and rescalable.

      +

      Note that there is no Part.rescaleObjectName property and there is no Part.rescalable property. +So although you cannot customize any Node to affect this tool, you can set +RescalingTool.rescaleObjectName and set RescalingTool.isEnabled to control +whether objects are rescalable and when.

      +

      If you want to experiment with this extension, try the Rescaling sample.

      +

      Index

      Inherited Members

      Constructors

      • +

        Don't construct this directly -- this is an abstract class.

        +

        Returns RescalingTool

      Properties

      • +

        Gets the GraphObject that is being rescaled. +This may be the same object as the selected Part or it may be contained within that Part.

        +

        This property is also settable, but should only be set when overriding functions +in RescalingTool, and not during normal operation.

        +
      • +

        Gets or sets a small GraphObject that is copied as a rescale handle for the selected part. +By default this is a Shape that is a small blue square. +Setting this property does not raise any events.

        +

        Here is an example of changing the default handle to be green "X":

        +
          tool.handleArchetype =
        $(go.Shape, "XLine",
        { width: 8, height: 8, stroke: "green", fill: "transparent" });
        -
        -
      • -
      -
      -
      - -

      - rescaleObjectName - : string

      -
        -
      • -
        -

        This property returns the name of the GraphObject that identifies the object to be rescaled by this tool.

        -

        The default value is the empty string, resulting in the whole Node being rescaled. - This property is used by findRescaleObject when calling Panel.findObject.

        -
        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - Override - canStart -

      -
        -
      • canStart(): boolean
      • -
      -
        -
      • -
        -

        This tool can start running if the mouse-down happens on a "Rescaling" handle.

        -
        -

        Returns boolean

        -
      • -
      -
      -
      - -

      - computeScale -

      -
        -
      • computeScale(newPoint: Point): number
      • -
      -
        -
      • -
        -

        Compute the new scale given a point.

        -

        This method is called by both doMouseMove and doMouseUp. - This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Parameters

        -
          -
        • -
          newPoint: Point
          -
          -

          in document coordinates

          -
          -
        • -
        -

        Returns number

        -
      • -
      -
      -
      - -

      - Override - doActivate -

      -
        -
      • doActivate(): void
      • -
      -
        -
      • -
        -

        Activating this tool remembers the handle that was dragged, - the adornedObject that is being rescaled, - starts a transaction, and captures the mouse.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doCancel -

      -
        -
      • doCancel(): void
      • -
      -
        -
      • -
        -

        Restore the original GraphObject.scale of the adorned object.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doDeactivate -

      -
        -
      • doDeactivate(): void
      • -
      -
        -
      • -
        -

        Stop the current transaction, forget the handle and adornedObject, and release the mouse.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doMouseMove -

      -
        -
      • doMouseMove(): void
      • -
      -
        -
      • -
        -

        Call scale with a new scale determined by the current mouse point. - This determines the new scale by calling computeScale.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - Override - doMouseUp -

      -
        -
      • doMouseUp(): void
      • -
      -
        -
      • -
        -

        Call scale with a new scale determined by the most recent mouse point, - and commit the transaction.

        -
        -

        Returns void

        -
      • -
      -
      -
      - -

      - findRescaleObject -

      - -
        -
      • -
        -

        Return the GraphObject to be rescaled by the user.

        -
        -

        Parameters

        -
          -
        • -
          part: Part
          -
        • -
        -

        Returns GraphObject

        -
      • -
      -
      -
      - -

      - makeAdornment -

      - - -
      -
      - -

      - scale -

      -
        -
      • scale(newScale: number): void
      • -
      - -
      -
      - -

      - Override - updateAdornments -

      -
        -
      • updateAdornments(part: Part): void
      • -
      -
        -
      • -

        Parameters

        -
          -
        • -
          part: Part
          -
          -
          -
        • -
        -

        Returns void

        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/ResizeMultipleTool.html b/api/symbols/ResizeMultipleTool.html index 1549ace90..12323ab6a 100644 --- a/api/symbols/ResizeMultipleTool.html +++ b/api/symbols/ResizeMultipleTool.html @@ -1,259 +1,39 @@ - - - - - - ResizeMultipleTool | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class ResizeMultipleTool

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

      -
      -
      -

      Hierarchy

      - -
      -
      -
      -

      The ResizeMultipleTool class lets the user resize multiple objects at once.

      -

      If you want to experiment with this extension, try the Resize Multiple sample.

      -
      -
      -
      -

      Index

      -
      -
      -
      -

      Constructors

      - -
      -
      -

      Methods

      - -
      -
      -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - -
        -
      • -
        -

        Constructs a ResizeMultipleTool and sets the name for the tool.

        -
        -

        Returns ResizeMultipleTool

        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - Override - resize -

      -
        -
      • resize(newr: Rect): void
      • -
      -
        -
      • -
        -

        Overrides ResizingTool.resize to resize all selected objects to the same size.

        -
        -

        Parameters

        - -

        Returns void

        -
      • -
      -
      -
      -
      - -
      -
      -
      - -
      -
      - - -
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class ResizeMultipleTool Extension

      This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

      Hierarchy

      +

      The ResizeMultipleTool class lets the user resize multiple objects at once.

      +

      If you want to experiment with this extension, try the Resize Multiple sample.

      +

      Index

      Constructors

      Methods

      Inherited Members

      Constructors

      • +

        Constructs a ResizeMultipleTool and sets the name for the tool.

        +

        Returns ResizeMultipleTool

      Methods

      • resize(newr: Rect): void

      Settings

      Theme

      + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/ResizingTool.html b/api/symbols/ResizingTool.html index f4f6d1501..1cb10889c 100644 --- a/api/symbols/ResizingTool.html +++ b/api/symbols/ResizingTool.html @@ -1,943 +1,249 @@ - - - - - - ResizingTool | GoJS API - - - - - - - -
      - -
      -
      -
      -
      - -
      -
      - Options -
      -
      - All -
        -
      • Public
      • -
      • Public/Protected
      • -
      • All
      • -
      -
      -
      -
      - Menu -
      -
      -
      -
      -
      -
      - -
      -

      Class ResizingTool

      -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      Hierarchy

      - -
      -
      -
      -

      The ResizingTool is used to interactively change the size of a GraphObject - in the selected Part or Node by setting its GraphObject.desiredSize property. - You may want to save the size to the model by using a TwoWay Binding on the "desiredSize" property - of the GraphObject that is named by Part.resizeObjectName. - This tool does not operate on Links.

      -

      You can limit the permitted minimum and maximum dimensions by setting - minSize and maxSize. - The resizing will also respect the GraphObject.minSize and - GraphObject.maxSize properties. - Width or height values that are NaN do not constrain the resizing. - Override computeMinSize and/or computeMaxSize to change this behavior.

      -

      You can also limit the width and/or height to be multiples of a particular size by - setting Part.resizeCellSize. - If either or both of these values are NaN, as they are by default, - it will get the values from this tool's cellSize. - Finally it will consider the Diagram.grid's Panel.gridCellSize - if isGridSnapEnabled is true. - Override computeCellSize to change this behavior.

      -

      Pressing the Shift key or resizing a Shape with a Shape.geometryStretch of - GraphObject.Uniform will maintain the aspect ratio during the resize. - Override computeReshape to change this behavior.

      -

      This tool makes use of an Adornment, shown when the Part or Node is selected, - that includes some number of resize handles. - The resize handles are normally copies of ResizingTool.handleArchetype, - unless you specify a custom resize Adornment by setting Part.resizeAdornmentTemplate. - The resize Adornment is normally a "Spot" Panel with eight resize handles, - each with GraphObject.alignment set to one of the eight standard Spot values -- - the four corners and the four side middles. - The GraphObject.alignment is what identifies and distinguishes each of the handles and - the behavior when the user drags the handle.

      -

      This tool conducts a transaction while the tool is active. - A successful resizing will result in a "PartResized" DiagramEvent and a "Resizing" transaction.

      -

      - For a general discussion of the sizing of objects, see: Introduction to the sizing of GraphObjects. - For customizing the ResizingTool, see Introduction to the ResizingTool. -

      If you want to programmatically start a user's resizing of the Part.resizeObject of an existing selected node, - you can set the handle property to the specific resize handle and then start and activate the tool.

      -
        var node = ...;
      -  myDiagram.select(node);
      -  var adorn = node.findAdornment("Resizing");
      -  var tool = myDiagram.toolManager.resizingTool;
      -  // specify which resize handle of the "Resizing" Adornment of the selected node
      -  tool.handle = adorn.elt(...);
      -  myDiagram.currentTool = tool;  // starts the ResizingTool
      -  tool.doActivate();             // activates the ResizingTool
      +ResizingTool | GoJS API
      Options
      All
      • Public
      • Public/Protected
      • All
      Menu

      Class ResizingTool

      Hierarchy

      +

      The ResizingTool is used to interactively change the size of a GraphObject +in the selected Part or Node by setting its GraphObject.desiredSize property. +You may want to save the size to the model by using a TwoWay Binding on the "desiredSize" property +of the GraphObject that is named by Part.resizeObjectName. +This tool does not operate on Links.

      +

      You can limit the permitted minimum and maximum dimensions by setting +minSize and maxSize. +The resizing will also respect the GraphObject.minSize and +GraphObject.maxSize properties. +Width or height values that are NaN do not constrain the resizing. +Override computeMinSize and/or computeMaxSize to change this behavior.

      +

      You can also limit the width and/or height to be multiples of a particular size by +setting Part.resizeCellSize. +If either or both of these values are NaN, as they are by default, +it will get the values from this tool's cellSize. +Finally it will consider the Diagram.grid's Panel.gridCellSize +if isGridSnapEnabled is true. +Override computeCellSize to change this behavior.

      +

      Pressing the Shift key or resizing a Shape with a Shape.geometryStretch of +GraphObject.Uniform will maintain the aspect ratio during the resize. +Override computeReshape to change this behavior.

      +

      This tool makes use of an Adornment, shown when the Part or Node is selected, +that includes some number of resize handles. +The resize handles are normally copies of ResizingTool.handleArchetype, +unless you specify a custom resize Adornment by setting Part.resizeAdornmentTemplate. +The resize Adornment is normally a "Spot" Panel with eight resize handles, +each with GraphObject.alignment set to one of the eight standard Spot values -- +the four corners and the four side middles. +The GraphObject.alignment is what identifies and distinguishes each of the handles and +the behavior when the user drags the handle.

      +

      This tool conducts a transaction while the tool is active. +A successful resizing will result in a "PartResized" DiagramEvent and a "Resizing" transaction.

      +

      +For a general discussion of the sizing of objects, see: Introduction to the sizing of GraphObjects. +For customizing the ResizingTool, see Introduction to the ResizingTool. + +

      If you want to programmatically start a user's resizing of the Part.resizeObject of an existing selected node, +you can set the handle property to the specific resize handle and then start and activate the tool.

      +
        var node = ...;
      myDiagram.select(node);
      var adorn = node.findAdornment("Resizing");
      var tool = myDiagram.toolManager.resizingTool;
      // specify which resize handle of the "Resizing" Adornment of the selected node
      tool.handle = adorn.elt(...);
      myDiagram.currentTool = tool; // starts the ResizingTool
      tool.doActivate(); // activates the ResizingTool
      -
      -
      -
      -

      Index

      -
      - -
      -
      -
      -

      Constructors

      -
      - -

      - constructor -

      - - -
      -
      -
      -

      Properties

      -
      - -

      - adornedObject - : GraphObject

      -
        -
      • -
        -

        Gets the GraphObject that is being resized. - This may be the same object as the selected Part or it may be contained within that Part.

        -

        This property is also settable, but should only be set when overriding functions - in ResizingTool, and not during normal operation.

        -
        -
      • -
      -
      -
      - -

      - cellSize - : Size

      -
        -
      • -
        -

        Gets or sets the width and height multiples with which the user must resize. - The effective cell size is computed by first looking at the Adornment.adornedPart's Part.resizeCellSize. - If either or both of its width and height are NaN, it will use this property, cellSize. - If either or both of this property's width and height are NaN, it will - consider the Diagram.grid's Panel.gridCellSize.

        -

        The default value is go.Size(NaN, NaN). - Setting this property does not raise any events.

        -
        -
      • -
      -
      -
      - -

      - dragsMembers - : boolean

      -
        -
      • -
        -

        Gets or sets whether the ResizingTool moves the member Parts of a Group that has no Group.placeholder. - By default this property is true. - Setting this property does not raise any events.

        -
        -
        since
        -

        2.1.26

        -
        -
        -
        -
      • -
      -
      -
      - -

      - handle - : GraphObject

      - -
      -
      - -

      - handleArchetype - : GraphObject

      -
        -
      • -
        -

        Gets or sets a small GraphObject that is copied as a resizing handle for the selected part. - By default this is a Shape that is a small blue rectangle. - Setting this property does not raise any events.

        -

        Here is an example of changing the default handle to be larger yellow circles:

        -
          myDiagram.toolManager.resizingTool.handleArchetype =
        -    $(go.Shape, "Circle",
        -      { width: 10, height: 10, fill: "yellow" });
        +

      Index

      Inherited Members

      Constructors

      Properties

      • +

        Gets the GraphObject that is being resized. +This may be the same object as the selected Part or it may be contained within that Part.

        +

        This property is also settable, but should only be set when overriding functions +in ResizingTool, and not during normal operation.

        +
      • +

        Gets or sets the width and height multiples with which the user must resize. +The effective cell size is computed by first looking at the Adornment.adornedPart's Part.resizeCellSize. +If either or both of its width and height are NaN, it will use this property, cellSize. +If either or both of this property's width and height are NaN, it will +consider the Diagram.grid's Panel.gridCellSize.

        +

        The default value is go.Size(NaN, NaN). +Setting this property does not raise any events.

        +
      • +

        Gets or sets whether the ResizingTool moves the member Parts of a Group that has no Group.placeholder. +By default this property is true. +Setting this property does not raise any events.

        +
        since

        2.1.26

        +
      • +

        Gets or sets a small GraphObject that is copied as a resizing handle for the selected part. +By default this is a Shape that is a small blue rectangle. +Setting this property does not raise any events.

        +

        Here is an example of changing the default handle to be larger yellow circles:

        +
          myDiagram.toolManager.resizingTool.handleArchetype =
        $(go.Shape, "Circle",
        { width: 10, height: 10, fill: "yellow" });
        -

        This property is ignored when a custom resizing Adornment is specified as the Part.resizeAdornmentTemplate. - That property is normally null, in which case this tool will automatically construct Adornments - holding eight copies of this handle archetype, each with a GraphObject.alignment being one of the - standard eight Spots.

        -
        -
      • -
      -
      -
      - -

      - isGridSnapEnabled - : boolean

      -
        -
      • -
        -

        Gets or sets whether the ResizingTool snaps object sizes to the diagram's background grid during the resize. - By default this property is false. - Setting this property does not raise any events.

        -
        -
      • -
      -
      -
      - -

      - maxSize - : Size

      -
        -
      • -
        -

        Gets or sets the maximum size to which the user can resize. - The effective maximum size is the minimum of this value and the GraphObject.maxSize, - independently in each direction.

        -

        The default value is go.Size(9999, 9999). - Any new value must be of type Size; NaN width or height values are treated as Infinity. - Setting this property does not raise any events.

        -
        -
      • -
      -
      -
      - -

      - minSize - : Size

      -
        -
      • -
        -

        Gets or sets the minimum size to which the user can resize. - The effective minimum size is the maximum of this value and the GraphObject.minSize, - independently in each direction.

        -

        The default value is go.Size(1, 1). - Any new value must be of type Size; NaN width or height values are treated as zero. - Setting this property does not raise any events.

        -
        -
      • -
      -
      -
      - -

      - oppositePoint - : Point

      -
        -
      • -
        -

        Gets the Point opposite to the chosen, dragged handle of the "Resizing" Adornment. - This property has no meaning until after doActivate has been called.

        -
        -
        since
        -

        2.2

        -
        -
        -
        -
      • -
      -
      -
      - -

      - Read-only - originalDesiredSize - : Size

      -
        -
      • -
        -

        This read-only property returns the Size that was the original value of the GraphObject.desiredSize - of the element that is being resized.

        -
        -
        since
        -

        1.1

        -
        -
        -
        -
      • -
      -
      -
      - -

      - Read-only - originalLocation - : Point

      -
        -
      • -
        -

        This read-only property returns the Point that was the original value of the Part.location - of the Part that is being resized.

        -
        -
        since
        -

        1.1

        -
        -
        -
        -
      • -
      -
      -
      -
      -

      Methods

      -
      - -

      - Override Virtual - canStart -

      -
        -
      • canStart(): boolean
      • -
      -
        -
      • -
        -

        This tool may run when there is a mouse-down event on a resize handle, - the diagram is not read-only and it allows resizing, - the left mouse button is being used, - and this tool's adornment's resize handle is at the current mouse point.

        -

        This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Returns boolean

        -
      • -
      -
      -
      - -

      - Virtual - computeCellSize -

      -
        -
      • computeCellSize(): Size
      • -
      -
        -
      • -
        -

        The size should be a multiple of the value returned by this method.

        -

        This is called once when the tool is activated.

        -

        This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Returns Size

        -
      • -
      -
      -
      - -

      - Virtual - computeMaxSize -

      -
        -
      • computeMaxSize(): Size
      • -
      -
        -
      • -
        -

        The effective maximum resizing size is the minimum of the maxSize and the - adornedObject's GraphObject.maxSize.

        -

        This is called once when the tool is activated.

        -

        This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Returns Size

        -
      • -
      -
      -
      - -

      - Virtual - computeMinSize -

      -
        -
      • computeMinSize(): Size
      • -
      -
        -
      • -
        -

        The effective minimum resizing size is the maximum of minSize and the - adornedObject's GraphObject.minSize.

        -

        This is called once when the tool is activated.

        -

        This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -
        -

        Returns Size

        -
      • -
      -
      -
      - -

      - Virtual - computeReshape -

      -
        -
      • computeReshape(): boolean
      • -
      -
        -
      • -
        -

        Decide whether to allow arbitrary reshaping or whether to keep the same aspect ratio of the object being resized. - If the adornedObject is a Shape, - then if the Shape.geometryStretch is GraphObject.Uniform, - this method will return false to restrict reshaping to maintain the object's current ratio of height to width. - Also, if the user is holding down the Shift key, this method will return false.

        -

        This is called on each mouse-move and on mouse-up; the result is passed to the call to resize. - This permits the user to change the behavior dynamically during resizing.

        -

        This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

        -

        For example, to always keep the object's original aspect ratio, override this method to return false. - When initializing a Diagram:

        -
        const diagram = new go.Diagram, "myDiagramDiv"
        -  {
        -    "resizingTool.computeReshape": function() { return false; },
        -    // ... rest of Diagram init
        -  })
        +

        This property is ignored when a custom resizing Adornment is specified as the Part.resizeAdornmentTemplate. +That property is normally null, in which case this tool will automatically construct Adornments +holding eight copies of this handle archetype, each with a GraphObject.alignment being one of the +standard eight Spots.

        +
    • +

      Gets or sets whether the ResizingTool snaps object sizes to the diagram's background grid during the resize. +By default this property is false. +Setting this property does not raise any events.

      +
    • +

      Gets or sets the maximum size to which the user can resize. +The effective maximum size is the minimum of this value and the GraphObject.maxSize, +independently in each direction.

      +

      The default value is go.Size(9999, 9999). +Any new value must be of type Size; NaN width or height values are treated as Infinity. +Setting this property does not raise any events.

      +
    • +

      Gets or sets the minimum size to which the user can resize. +The effective minimum size is the maximum of this value and the GraphObject.minSize, +independently in each direction.

      +

      The default value is go.Size(1, 1). +Any new value must be of type Size; NaN width or height values are treated as zero. +Setting this property does not raise any events.

      +
    • +

      Gets the Point opposite to the chosen, dragged handle of the "Resizing" Adornment. +This property has no meaning until after doActivate has been called.

      +
      since

      2.2

      +
    • +

      This read-only property returns the Size that was the original value of the GraphObject.desiredSize +of the element that is being resized.

      +
      since

      1.1

      +
    • +

      This read-only property returns the Point that was the original value of the Part.location +of the Part that is being resized.

      +
      since

      1.1

      +

    Methods

    • canStart(): boolean
    • +

      This tool may run when there is a mouse-down event on a resize handle, +the diagram is not read-only and it allows resizing, +the left mouse button is being used, +and this tool's adornment's resize handle is at the current mouse point.

      +

      This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns boolean

    • computeCellSize(): Size
    • +

      The size should be a multiple of the value returned by this method.

      +

      This is called once when the tool is activated.

      +

      This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns Size

    • computeMaxSize(): Size
    • +

      The effective maximum resizing size is the minimum of the maxSize and the +adornedObject's GraphObject.maxSize.

      +

      This is called once when the tool is activated.

      +

      This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns Size

    • computeMinSize(): Size
    • +

      The effective minimum resizing size is the maximum of minSize and the +adornedObject's GraphObject.minSize.

      +

      This is called once when the tool is activated.

      +

      This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns Size

    • computeReshape(): boolean
    • +

      Decide whether to allow arbitrary reshaping or whether to keep the same aspect ratio of the object being resized. +If the adornedObject is a Shape, +then if the Shape.geometryStretch is GraphObject.Uniform, +this method will return false to restrict reshaping to maintain the object's current ratio of height to width. +Also, if the user is holding down the Shift key, this method will return false.

      +

      This is called on each mouse-move and on mouse-up; the result is passed to the call to resize. +This permits the user to change the behavior dynamically during resizing.

      +

      This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      For example, to always keep the object's original aspect ratio, override this method to return false. +When initializing a Diagram:

      +
      const diagram = new go.Diagram, "myDiagramDiv"
      {
      "resizingTool.computeReshape": function() { return false; },
      // ... rest of Diagram init
      })
      -

      Or when overriding the method dynamically:

      -
        myDiagram.toolManager.resizingTool.computeReshape = function() { return false; }
      +

      Or when overriding the method dynamically:

      +
        myDiagram.toolManager.resizingTool.computeReshape = function() { return false; }
       
      -

      Your override might want to look at the this.adornedObject.part.data properties to decide whether to allow reshaping.

      -
      -
      since
      -

      1.7

      -
      -
      -
      -

      Returns boolean

      -

      true to allow any aspect ratio; false to preserve the adornedObject's height/width ratio

      -
    • -
    -
    -
    - -

    - Virtual - computeResize -

    - -
      -
    • -
      -

      Given a Spot in the original bounds of the object being resized and a new Point, - compute the new Rect.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      -
        -
      • -
        newPoint: Point
        -
        -

        a Point in local coordinates.

        -
        -
      • -
      • -
        spot: Spot
        -
        -

        the alignment spot of the handle being dragged.

        -
        -
      • -
      • -
        min: Size
        -
        -

        the result of the call to computeMinSize.

        -
        -
      • -
      • -
        max: Size
        -
        -

        the result of the call to computeMaxSize.

        -
        -
      • -
      • -
        cell: Size
        -
        -

        the result of the call to computeCellSize.

        -
        -
      • -
      • -
        reshape: boolean
        -
        -

        true if the new size may change the aspect ratio from that of the natural bounds of the adornedObject.

        -
        -
      • -
      -

      Returns Rect

      -

      a Rectangle in the adornedObject's local coordinates, not in document coordinates

      -
    • -
    -
    -
    - -

    - Override - doActivate -

    -
      -
    • doActivate(): void
    • -
    -
      -
    • -
      -

      Find the handle, remember the object's original bounds, - save the results of calling computeMinSize, computeMaxSize, and computeCellSize, - capture the mouse, and start a transaction.

      -

      Normally when this method is called the value of handle will be null, - resulting in a call to Tool.findToolHandleAt to find a "Resizing" tool handle, - which is then remembered as the value of handle. - If when this method is called the value of handle is already set, - then there is no need to call Tool.findToolHandleAt, - because the programmer has already set up which resize handle they want the user to be resizing.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doCancel -

    -
      -
    • doCancel(): void
    • -
    -
      -
    • -
      -

      Restore the original size of the GraphObject.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doDeactivate -

    -
      -
    • doDeactivate(): void
    • -
    -
      -
    • -
      -

      Stop the current transaction, forget the handle and adornedObject, and release the mouse.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseMove -

    -
      -
    • doMouseMove(): void
    • -
    - -
    -
    - -

    - Override - doMouseUp -

    -
      -
    • doMouseUp(): void
    • -
    -
      -
    • -
      -

      Call resize with the final bounds based on the most recent mouse point, - commit the transaction, and raise the "PartResized" DiagramEvent. - This determines the new bounds by calling computeResize.

      -

      When this calls computeResize it passes as the reshape argument the result of calling computeReshape.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - resize -

    -
      -
    • resize(newr: Rect): void
    • -
    -
      -
    • -
      -

      Change the size of the selected part's Part.resizeObject to have the given bounds. - This modifies its GraphObject.desiredSize and maybe its Part.location.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      -
        -
      • -
        newr: Rect
        -
        -

        a Rectangle in the adornedObject's local coordinates, not in document coordinates

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override Virtual - updateAdornments -

    -
      -
    • updateAdornments(part: Part): void
    • -
    -
      -
    • -
      -

      Show an Adornment with the resize handles at points along the edge of the bounds of the - selected Part's Part.resizeObject.

      -

      First this finds the object in the visual tree of the Part that should - get the resize adornment and that the user will be able to resize interactively. - It finds the object that has the Part.resizeObjectName property of the Part. - If the Part.resizeObjectName property is an empty string, as it is by default, - it uses the whole part.

      -

      It then builds the adornment, associating it with the chosen resize object. - If Part.resizeAdornmentTemplate is non-null, it is copied. - Otherwise it constructs a new Adornment with a Placeholder and eight copies of handleArchetype, - four at the corners and four at the middle of each side.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      -
        -
      • -
        part: Part
        -
        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Robot.html b/api/symbols/Robot.html index 3851dee21..6b76bfeae 100644 --- a/api/symbols/Robot.html +++ b/api/symbols/Robot.html @@ -1,518 +1,92 @@ - - - - - - Robot | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class Robot

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    -
      -
    • - Robot -
    • -
    -
    -
    -
    -

    A class for simulating mouse and keyboard input.

    -

    As a special hack, this supports limited simulation of drag-and-drop between Diagrams, - by setting both the sourceDiagram and targetDiagram properties - on the eventprops argument of the mouseDown/mouseMove/mouseUp methods. - Although InputEvent.targetDiagram is a real property, - the sourceDiagram property is only used by these Robot methods.

    -

    If you want to experiment with this extension, try the Simulating Input sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Construct a robot for a given Diagram. If none is provided, a new Diagram will be created.

      -
      -

      Parameters

      - -

      Returns Robot

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - diagram - : Diagram

    -
      -
    • -
      -

      Gets or sets the Diagram associated with this Robot.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - keyDown -

    -
      -
    • keyDown(keyorcode: string | number, time?: number, eventprops?: ObjectData): void
    • -
    -
      -
    • -
      -

      Simulate a key down event.

      -
      -

      Parameters

      -
        -
      • -
        keyorcode: string | number
        -
      • -
      • -
        Optional time: number
        -
        -

        the timestamp of the simulated event, in milliseconds; default zero

        -
        -
      • -
      • -
        Optional eventprops: ObjectData
        -
        -

        an optional argument providing properties for the InputEvent.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - keyUp -

    -
      -
    • keyUp(keyorcode: string | number, time?: number, eventprops?: ObjectData): void
    • -
    -
      -
    • -
      -

      Simulate a key up event.

      -
      -

      Parameters

      -
        -
      • -
        keyorcode: string | number
        -
      • -
      • -
        Optional time: number
        -
        -

        the timestamp of the simulated event, in milliseconds; default zero

        -
        -
      • -
      • -
        Optional eventprops: ObjectData
        -
        -

        an optional argument providing properties for the InputEvent.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - mouseDown -

    -
      -
    • mouseDown(x: number, y: number, time?: number, eventprops?: ObjectData): void
    • -
    -
      -
    • -
      -

      Simulate a mouse down event.

      -
      -

      Parameters

      -
        -
      • -
        x: number
        -
        -

        the X-coordinate of the mouse point in document coordinates.

        -
        -
      • -
      • -
        y: number
        -
        -

        the Y-coordinate of the mouse point in document coordinates.

        -
        -
      • -
      • -
        Optional time: number
        -
        -

        the timestamp of the simulated event, in milliseconds; default zero

        -
        -
      • -
      • -
        Optional eventprops: ObjectData
        -
        -

        an optional argument providing properties for the InputEvent.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - mouseMove -

    -
      -
    • mouseMove(x: number, y: number, time?: number, eventprops?: ObjectData): void
    • -
    -
      -
    • -
      -

      Simulate a mouse move event.

      -
      -

      Parameters

      -
        -
      • -
        x: number
        -
        -

        the X-coordinate of the mouse point in document coordinates.

        -
        -
      • -
      • -
        y: number
        -
        -

        the Y-coordinate of the mouse point in document coordinates.

        -
        -
      • -
      • -
        Optional time: number
        -
        -

        the timestamp of the simulated event, in milliseconds; default zero

        -
        -
      • -
      • -
        Optional eventprops: ObjectData
        -
        -

        an optional argument providing properties for the InputEvent.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - mouseUp -

    -
      -
    • mouseUp(x: number, y: number, time?: number, eventprops?: ObjectData): void
    • -
    -
      -
    • -
      -

      Simulate a mouse up event.

      -
      -

      Parameters

      -
        -
      • -
        x: number
        -
        -

        the X-coordinate of the mouse point in document coordinates.

        -
        -
      • -
      • -
        y: number
        -
        -

        the Y-coordinate of the mouse point in document coordinates.

        -
        -
      • -
      • -
        Optional time: number
        -
        -

        the timestamp of the simulated event, in milliseconds; default zero

        -
        -
      • -
      • -
        Optional eventprops: ObjectData
        -
        -

        an optional argument providing properties for the InputEvent.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - mouseWheel -

    -
      -
    • mouseWheel(delta: number, time?: number, eventprops?: ObjectData): void
    • -
    -
      -
    • -
      -

      Simulate a mouse wheel event.

      -
      -

      Parameters

      -
        -
      • -
        delta: number
        -
        -

        non-zero turn

        -
        -
      • -
      • -
        Optional time: number
        -
        -

        the timestamp of the simulated event, in milliseconds; default zero

        -
        -
      • -
      • -
        Optional eventprops: ObjectData
        -
        -

        an optional argument providing properties for the InputEvent.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class Robot Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    • Robot
    +

    A class for simulating mouse and keyboard input.

    +

    As a special hack, this supports limited simulation of drag-and-drop between Diagrams, +by setting both the sourceDiagram and targetDiagram properties +on the eventprops argument of the mouseDown/mouseMove/mouseUp methods. +Although InputEvent.targetDiagram is a real property, +the sourceDiagram property is only used by these Robot methods.

    +

    If you want to experiment with this extension, try the Simulating Input sample.

    +

    Index

    Constructors

    • +

      Construct a robot for a given Diagram. If none is provided, a new Diagram will be created.

      +

      Parameters

      Returns Robot

    Properties

    • +

      Gets or sets the Diagram associated with this Robot.

      +

    Methods

    • keyDown(keyorcode: string | number, time?: number, eventprops?: ObjectData): void
    • +

      Simulate a key down event.

      +

      Parameters

      • keyorcode: string | number
      • Optional time: number
        +

        the timestamp of the simulated event, in milliseconds; default zero

        +
      • Optional eventprops: ObjectData
        +

        an optional argument providing properties for the InputEvent.

        +

      Returns void

    • keyUp(keyorcode: string | number, time?: number, eventprops?: ObjectData): void
    • +

      Simulate a key up event.

      +

      Parameters

      • keyorcode: string | number
      • Optional time: number
        +

        the timestamp of the simulated event, in milliseconds; default zero

        +
      • Optional eventprops: ObjectData
        +

        an optional argument providing properties for the InputEvent.

        +

      Returns void

    • mouseDown(x: number, y: number, time?: number, eventprops?: ObjectData): void
    • +

      Simulate a mouse down event.

      +

      Parameters

      • x: number
        +

        the X-coordinate of the mouse point in document coordinates.

        +
      • y: number
        +

        the Y-coordinate of the mouse point in document coordinates.

        +
      • Optional time: number
        +

        the timestamp of the simulated event, in milliseconds; default zero

        +
      • Optional eventprops: ObjectData
        +

        an optional argument providing properties for the InputEvent.

        +

      Returns void

    • mouseMove(x: number, y: number, time?: number, eventprops?: ObjectData): void
    • +

      Simulate a mouse move event.

      +

      Parameters

      • x: number
        +

        the X-coordinate of the mouse point in document coordinates.

        +
      • y: number
        +

        the Y-coordinate of the mouse point in document coordinates.

        +
      • Optional time: number
        +

        the timestamp of the simulated event, in milliseconds; default zero

        +
      • Optional eventprops: ObjectData
        +

        an optional argument providing properties for the InputEvent.

        +

      Returns void

    • mouseUp(x: number, y: number, time?: number, eventprops?: ObjectData): void
    • +

      Simulate a mouse up event.

      +

      Parameters

      • x: number
        +

        the X-coordinate of the mouse point in document coordinates.

        +
      • y: number
        +

        the Y-coordinate of the mouse point in document coordinates.

        +
      • Optional time: number
        +

        the timestamp of the simulated event, in milliseconds; default zero

        +
      • Optional eventprops: ObjectData
        +

        an optional argument providing properties for the InputEvent.

        +

      Returns void

    • mouseWheel(delta: number, time?: number, eventprops?: ObjectData): void
    • +

      Simulate a mouse wheel event.

      +

      Parameters

      • delta: number
        +

        non-zero turn

        +
      • Optional time: number
        +

        the timestamp of the simulated event, in milliseconds; default zero

        +
      • Optional eventprops: ObjectData
        +

        an optional argument providing properties for the InputEvent.

        +

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/RotateMultipleTool.html b/api/symbols/RotateMultipleTool.html index 15d49a190..f4f95c328 100644 --- a/api/symbols/RotateMultipleTool.html +++ b/api/symbols/RotateMultipleTool.html @@ -1,337 +1,51 @@ - - - - - - RotateMultipleTool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class RotateMultipleTool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    The RotateMultipleTool class lets the user rotate multiple objects at a time. - When more than one part is selected, rotates all parts, revolving them about their collective center. - If the control key is held down during rotation, rotates all parts individually.

    -

    Caution: this only works for Groups that do not have a Placeholder.

    -

    If you want to experiment with this extension, try the Rotate Multiple sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Constructs a RotateMultipleTool and sets the name for the tool.

      -
      -

      Returns RotateMultipleTool

      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override - computeRotate -

    -
      -
    • computeRotate(newPoint: Point): number
    • -
    -
      -
    • -
      -

      Calculate the desired angle with different rotation points, - depending on whether we are rotating the whole selection as one, or Parts individually.

      -
      -

      Parameters

      -
        -
      • -
        newPoint: Point
        -
        -

        in document coordinates

        -
        -
      • -
      -

      Returns number

      -
    • -
    -
    -
    - -

    - Override - doActivate -

    -
      -
    • doActivate(): void
    • -
    -
      -
    • -
      -

      Calls RotatingTool.doActivate, and then remembers the center point of the collection, - and the initial distances and angles of selected parts to the center.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doDeactivate -

    -
      -
    • doDeactivate(): void
    • -
    -
      -
    • -
      -

      Clean up any references to Parts.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - rotate -

    -
      -
    • rotate(newangle: number): void
    • -
    -
      -
    • -
      -

      Rotate all selected objects about their collective center. - When the control key is held down while rotating, all selected objects are rotated individually.

      -
      -

      Parameters

      -
        -
      • -
        newangle: number
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class RotateMultipleTool Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    The RotateMultipleTool class lets the user rotate multiple objects at a time. +When more than one part is selected, rotates all parts, revolving them about their collective center. +If the control key is held down during rotation, rotates all parts individually.

    +

    Caution: this only works for Groups that do not have a Placeholder.

    +

    If you want to experiment with this extension, try the Rotate Multiple sample.

    +

    Index

    Inherited Members

    Constructors

    • +

      Constructs a RotateMultipleTool and sets the name for the tool.

      +

      Returns RotateMultipleTool

    Methods

    • computeRotate(newPoint: Point): number
    • +

      Calculate the desired angle with different rotation points, +depending on whether we are rotating the whole selection as one, or Parts individually.

      +

      Parameters

      • newPoint: Point
        +

        in document coordinates

        +

      Returns number

    • doActivate(): void
    • +

      Calls RotatingTool.doActivate, and then remembers the center point of the collection, +and the initial distances and angles of selected parts to the center.

      +

      Returns void

    • doDeactivate(): void
    • +

      Clean up any references to Parts.

      +

      Returns void

    • rotate(newangle: number): void
    • +

      Rotate all selected objects about their collective center. +When the control key is held down while rotating, all selected objects are rotated individually.

      +

      Parameters

      • newangle: number

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/RotatingTool.html b/api/symbols/RotatingTool.html index 6a442afce..5521657f2 100644 --- a/api/symbols/RotatingTool.html +++ b/api/symbols/RotatingTool.html @@ -1,767 +1,185 @@ - - - - - - RotatingTool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class RotatingTool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    The RotatingTool is used to interactively change the GraphObject.angle of a GraphObject - by setting its GraphObject.angle property. - You may want to save the angle to the model by using a TwoWay Binding on the "angle" property - of the GraphObject that is named by Part.rotateObjectName.

    -

    This tool allows the user to rotate the Part.rotateObject of the selected Part. - The Part must be Part.rotatable, which is false by default. - Normally this works with Parts or Nodes; it does not make sense for whole Links - or Link.paths, so if you want to rotate a label on a Link, make sure to name that label - and refer to it as the Part.rotateObjectName.

    -

    You can control the point about which the object is rotated by setting Part.rotationSpot. - The rotation spot can be computed dynamically by overriding computeRotationPoint. - The value of that method call is saved as rotationPoint.

    -

    You can limit the permitted angles by setting snapAngleMultiple and snapAngleEpsilon. - For example, if you want to permit only angles that are multiples of 90 degrees, - set snapAngleMultiple to 90 and snapAngleEpsilon to 45. - Pressing the Shift key during rotation ignores these two properties.

    -

    This tool makes use of an Adornment that includes a rotation handle. - It is shown when the selected Part is Part.rotatable. - You can control its direction relative to the rotationPoint - by setting handleAngle to a multiple of 90 degrees, - and its distance from the rotation point by setting handleDistance. - The rotate handle is normally a copy of RotatingTool.handleArchetype. - unless you specify a custom rotate Adornment by setting Part.rotateAdornmentTemplate.

    -

    This tool conducts a transaction while the tool is active. - A successful rotation will result in a "PartRotated" DiagramEvent and a "Rotating" transaction.

    -

    - For customizing the RotatingTool, see Introduction to the RotatingTool. -

    If you want to programmatically start a user's rotating of the Part.rotateObject of an existing selected node, - you can set the handle property to the rotate handle and then start and activate the tool.

    -
      var node = ...;
    -  myDiagram.select(node);
    -  var adorn = node.findAdornment("Rotating");
    -  var tool = myDiagram.toolManager.rotatingTool;
    -  // specify the rotation handle of the "Rotating" Adornment of the selected node
    -  tool.handle = adorn.elt(0);
    -  myDiagram.currentTool = tool;  // starts the RotatingTool
    -  tool.doActivate();             // activates the RotatingTool
    +RotatingTool | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class RotatingTool

    Hierarchy

    +

    The RotatingTool is used to interactively change the GraphObject.angle of a GraphObject +by setting its GraphObject.angle property. +You may want to save the angle to the model by using a TwoWay Binding on the "angle" property +of the GraphObject that is named by Part.rotateObjectName.

    +

    This tool allows the user to rotate the Part.rotateObject of the selected Part. +The Part must be Part.rotatable, which is false by default. +Normally this works with Parts or Nodes; it does not make sense for whole Links +or Link.paths, so if you want to rotate a label on a Link, make sure to name that label +and refer to it as the Part.rotateObjectName.

    +

    You can control the point about which the object is rotated by setting Part.rotationSpot. +The rotation spot can be computed dynamically by overriding computeRotationPoint. +The value of that method call is saved as rotationPoint.

    +

    You can limit the permitted angles by setting snapAngleMultiple and snapAngleEpsilon. +For example, if you want to permit only angles that are multiples of 90 degrees, +set snapAngleMultiple to 90 and snapAngleEpsilon to 45. +Pressing the Shift key during rotation ignores these two properties.

    +

    This tool makes use of an Adornment that includes a rotation handle. +It is shown when the selected Part is Part.rotatable. +You can control its direction relative to the rotationPoint +by setting handleAngle to a multiple of 90 degrees, +and its distance from the rotation point by setting handleDistance. +The rotate handle is normally a copy of RotatingTool.handleArchetype. +unless you specify a custom rotate Adornment by setting Part.rotateAdornmentTemplate.

    +

    This tool conducts a transaction while the tool is active. +A successful rotation will result in a "PartRotated" DiagramEvent and a "Rotating" transaction.

    +

    +For customizing the RotatingTool, see Introduction to the RotatingTool. + +

    If you want to programmatically start a user's rotating of the Part.rotateObject of an existing selected node, +you can set the handle property to the rotate handle and then start and activate the tool.

    +
      var node = ...;
    myDiagram.select(node);
    var adorn = node.findAdornment("Rotating");
    var tool = myDiagram.toolManager.rotatingTool;
    // specify the rotation handle of the "Rotating" Adornment of the selected node
    tool.handle = adorn.elt(0);
    myDiagram.currentTool = tool; // starts the RotatingTool
    tool.doActivate(); // activates the RotatingTool
    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - adornedObject - : GraphObject

    -
      -
    • -
      -

      Gets the GraphObject that is being rotated. - This may be the same object as the selected Part or it may be contained within that Part.

      -

      This property is also settable, but should only be set when overriding functions - in RotatingTool, and not during normal operation.

      -
      -
    • -
    -
    -
    - -

    - handle - : GraphObject

    -
      -
    • -
      -

      This read-only property returns the GraphObject that is the tool handle being dragged by the user. - This will be contained by an Adornment whose category is "RotatingTool". - Its Adornment.adornedObject is the same as the adornedObject.

      -

      This property is also settable, but should only be set either within an override of doActivate - or prior to calling doActivate.

      -
      -
    • -
    -
    -
    - -

    - handleAngle - : number

    -
      -
    • -
      -

      Gets or sets the spot to locate the Adornment for the rotation handle when it does not have a Placeholder. - This assumes the Adornment's location will be at the center of the rotation handle.

      -

      By default this is zero degrees, which locates the Adornment - so that it is placed to the right of an un-rotated object. - You can set this to a multiple of 90 degrees to position the rotation handle differently - with respect to the rotationPoint.

      -
      -
      since
      -

      2.0

      -
      -
      -
      -
    • -
    -
    -
    - -

    - handleArchetype - : GraphObject

    -
      -
    • -
      -

      Gets or sets a small GraphObject that is copied as a rotation handle for the selected part. - By default this is a Shape that is a small yellow circle. - Setting this property does not raise any events.

      -

      Here is an example of changing the default handle to be green "X":

      -
        myDiagram.toolManager.rotatingTool.handleArchetype =
      -    $(go.Shape, "XLine",
      -      { width: 8, height: 8, stroke: "green", fill: "transparent" });
      +

    Index

    Inherited Members

    Constructors

    Properties

    • +

      Gets the GraphObject that is being rotated. +This may be the same object as the selected Part or it may be contained within that Part.

      +

      This property is also settable, but should only be set when overriding functions +in RotatingTool, and not during normal operation.

      +
    • +

      Gets or sets the spot to locate the Adornment for the rotation handle when it does not have a Placeholder. +This assumes the Adornment's location will be at the center of the rotation handle.

      +

      By default this is zero degrees, which locates the Adornment +so that it is placed to the right of an un-rotated object. +You can set this to a multiple of 90 degrees to position the rotation handle differently +with respect to the rotationPoint.

      +
      since

      2.0

      +
    • +

      Gets or sets a small GraphObject that is copied as a rotation handle for the selected part. +By default this is a Shape that is a small yellow circle. +Setting this property does not raise any events.

      +

      Here is an example of changing the default handle to be green "X":

      +
        myDiagram.toolManager.rotatingTool.handleArchetype =
      $(go.Shape, "XLine",
      { width: 8, height: 8, stroke: "green", fill: "transparent" });
      -

      This property is ignored when a custom rotating Adornment is specified as the Part.rotateAdornmentTemplate.

      -
      -
    • -
    -
    -
    - -

    - handleDistance - : number

    -
      -
    • -
      -

      Gets or sets the spot to locate the Adornment at a particular distance from the adornedObject. - This assumes the Adornment's location will be at the center of the rotation handle.

      -

      By default this is 50, which locates the Adornment - so that it is placed to the right of an un-rotated object.

      -
      -
      since
      -

      2.0

      -
      -
      -
      -
    • -
    -
    -
    - -

    - Read-only - originalAngle - : number

    -
      -
    • -
      -

      This read-only property returns the angle that was the original value of the GraphObject.angle - of the GraphObject that is being rotated. - The value is invalid when this tool is not active.

      -
      -
      since
      -

      1.1

      -
      -
      -
      -
    • -
    -
    -
    - -

    - rotationPoint - : Point

    -
      -
    • -
      -

      Gets or sets the Point at which the axis of the rotation should be. - doActivate saves here the value returned by the call to computeRotationPoint. - The value is invalid when this tool is not active.

      -
      -
      since
      -

      2.0

      -
      -
      -
      -
    • -
    -
    -
    - -

    - snapAngleEpsilon - : number

    -
      -
    • -
      -

      Gets or sets the the closeness to a desired angle at which the angle is "snapped to".

      -

      The default value is 2 degrees, meaning that any angle within 2 degrees - of a multiple of the snapAngleMultiple automatically - snaps to that multiple. - Values are limited to half of the snapAngleMultiple; - such values restrict user selected angles only to exact multiples of - snapAngleMultiple -- no other angles between them. - Setting this property does not raise any events.

      -
      -
    • -
    -
    -
    - -

    - snapAngleMultiple - : number

    -
      -
    • -
      -

      Gets or sets the preferred angles for the selected object.

      -

      The default value is 45 degrees, meaning that angles that are multiples - of 45 degrees are automatically preferred, if the actual angle is - close to that multiple. - The closeness is determined by the snapAngleEpsilon property. - A value of zero for snapAngleMultiple results in no snapping at all. - Setting this property does not raise any events.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override Virtual - canStart -

    -
      -
    • canStart(): boolean
    • -
    -
      -
    • -
      -

      This tool may run when there is a mouse-down event on a rotate handle, - the diagram is not read-only and it allows rotation, - the left mouse button is being used, - and this tool's adornment's rotate handle is at the current mouse point.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Virtual - computeRotate -

    -
      -
    • computeRotate(newPoint: Point): number
    • -
    -
      -
    • -
      -

      Compute the new angle given a point. - If the Shift key is pressed, this method ignores the snapAngleMultiple and snapAngleEpsilon.

      -

      If the angle is close (by snapAngleEpsilon degrees) - to a multiple of snapAngleMultiple degrees, - make it exactly that multiple.

      -

      This method is called by both doMouseMove and doMouseUp. - This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      -
        -
      • -
        newPoint: Point
        -
        -

        in document coordinates.

        -
        -
      • -
      -

      Returns number

      -

      the new angle, in degrees.

      -
    • -
    -
    -
    - -

    - Virtual - computeRotationPoint -

    - -
      -
    • -
      -

      Compute the Point about which things should rotate. - This is called when this tool is activated and sometimes when updating the Adornment. - The value of the call is remembered as rotationPoint.

      -
      -

      Parameters

      - -

      Returns Point

      -
    • -
    -
    -
    - -

    - Override - doActivate -

    -
      -
    • doActivate(): void
    • -
    -
      -
    • -
      -

      Capture the mouse, remember the original GraphObject.angle, - and start a transaction.

      -

      Normally when this method is called the value of handle will be null, - resulting in a call to Tool.findToolHandleAt to find a "Rotating" tool handle, - which is then remembered as the value of handle. - If when this method is called the value of handle is already set, - then there is no need to call Tool.findToolHandleAt, - because the programmer has already set up which rotate handle they want the user to be rotating.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doCancel -

    -
      -
    • doCancel(): void
    • -
    -
      -
    • -
      -

      Restore the original GraphObject.angle of the adorned object.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doDeactivate -

    -
      -
    • doDeactivate(): void
    • -
    -
      -
    • -
      -

      Stop the current transaction, forget the handle and adornedObject, and release the mouse.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseMove -

    -
      -
    • doMouseMove(): void
    • -
    -
      -
    • -
      -

      Call rotate with a new angle determined by the current mouse point. - This determines the new angle by calling computeRotate.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseUp -

    -
      -
    • doMouseUp(): void
    • -
    -
      -
    • -
      -

      Call rotate with an angle based on the most recent mouse point, - commit the transaction, and raise the "PartRotated" DiagramEvent.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - rotate -

    -
      -
    • rotate(newangle: number): void
    • -
    -
      -
    • -
      -

      Change the angle of the selected part's Part.rotateObject. - This modifies its GraphObject.angle.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      -
        -
      • -
        newangle: number
        -
        -

        in degrees.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override Virtual - updateAdornments -

    -
      -
    • updateAdornments(part: Part): void
    • -
    -
      -
    • -
      -

      Show an Adornment with a rotate handle at a point to the side of the adorned object - if the part is selected and visible and if Part.canRotate() is true.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      -
        -
      • -
        part: Part
        -
        -

        the part.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/RowColumnDefinition.html b/api/symbols/RowColumnDefinition.html index 91aadac15..51d66b742 100644 --- a/api/symbols/RowColumnDefinition.html +++ b/api/symbols/RowColumnDefinition.html @@ -1,883 +1,234 @@ - - - - - - RowColumnDefinition | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class RowColumnDefinition

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - RowColumnDefinition -
    • -
    -
    -
    -
    -

    The RowColumnDefinition class describes constraints on a row or a column - in a Panel of type Panel.Table. - It also provides information about the actual layout after the - Table Panel has been arranged.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -

    Constants

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - actual - : number

    -
      -
    • -
      -

      This read-only property returns the usable row height or column width, after arrangement, in local coordinates, - that objects in this row or column can be arranged within. - This does not include separatorPadding or separatorStrokeWidth, as total does.

      -

      This value gives the row height if isRow is true; - otherwise this gives the column width. - The value is meaningless until after the Table Panel using this - RowColumnDefinition has been arranged.

      -
      -
      see
      -

      total, height, width, sizing

      -
      -
      -
      -
    • -
    -
    -
    - -

    - alignment - : Spot

    - -
    -
    - -

    - background - : BrushLike

    -
      -
    • -
      -

      Gets or sets the background color for a particular row or column, - which fills the entire span of the row or column, including any separatorPadding.

      -

      The default value is null, which means nothing is drawn in the background of the row or column.

      -
      -
      see
      -

      GraphObject.background

      -
      -
      since
      -

      1.2

      -
      -
      -
      -
    • -
    -
    -
    - -

    - coversSeparators - : boolean

    -
      -
    • -
      -

      Determines whether or not the background, if there is one, is in front of or behind the separators.

      -

      The default value is false -- any background is drawn behind any separator lines.

      -
      -
      since
      -

      1.2

      -
      -
      -
      -
    • -
    -
    -
    - -

    - height - : number

    -
      -
    • -
      -

      Gets or sets the row height, in local coordinates. - This describes the row height if isRow is true; - otherwise this property is meaningless. - The value must be non-negative and finite.

      -

      The default value is NaN, which means this row will get a height - that is just big enough to hold all of the objects in the row.

      -

      Setting this value to a number will mean that all of the objects - of this Panel in this row will be allocated that - amount of row height. - Whether an object in the row is actually arranged to have that height - depends on whether the GraphObject.stretch stretches vertically.

      -
      -
      see
      -

      width, minimum, maximum, sizing

      -
      -
      -
      -
    • -
    -
    -
    - -

    - index - : number

    - -
    -
    - -

    - isRow - : boolean

    -
      -
    • -
      -

      This read-only property is true when this describes a row instead of a column in the panel. - When this is true, the height, minimum, and maximum - all describe the row height. - Otherwise width and the other two properties describe the column width.

      -
      -
    • -
    -
    -
    - -

    - maximum - : number

    -
      -
    • -
      -

      Gets or sets the maximum row height or column width, in local coordinates. - The maximum describes the row height if isRow is true; - otherwise this describes the column width.

      -

      The value must be non-negative. - The default value is Infinity. - The arranged height of all objects in this row, - or the arranged width of all objects in this column, - will be no greater than this value.

      -
      -
      see
      -

      width, height, minimum, sizing

      -
      -
      -
      -
    • -
    -
    -
    - -

    - minimum - : number

    -
      -
    • -
      -

      Gets or sets the minimum row height or column width, in local coordinates. - The minimum describes the row height if isRow is true; - otherwise this describes the column width.

      -

      The value must be non-negative and finite. - The default value is zero. - The arranged height of all objects in this row, - or the arranged width of all objects in this column, - will be no less than this value.

      -
      -
      see
      -

      width, height, maximum, sizing

      -
      -
      -
      -
    • -
    -
    -
    - -

    - Read-only - panel - : Panel

    -
      -
    • -
      -

      This read-only property returns the Panel that this row or column definition is in.

      -
      -
    • -
    -
    -
    - -

    - position - : number

    -
      -
    • -
      -

      This read-only property returns the actual arranged row or column starting position, after arrangement, in local coordinates. - This value gives the Y position if isRow is true; - otherwise this gives the X position. - The value is meaningless until after the Table Panel using this - RowColumnDefinition has been arranged.

      -
      -
      see
      -

      Panel.findColumnForLocalX, Panel.findRowForLocalY, Panel.leftIndex, Panel.topIndex, index

      -
      -
      -
      -
    • -
    -
    -
    - -

    - separatorDashArray - : number[]

    - -
    -
    - -

    - separatorPadding - : MarginLike

    - -
    -
    - -

    - separatorStroke - : BrushLike

    - -
    -
    - -

    - separatorStrokeWidth - : number

    - -
    -
    - -

    - sizing - : EnumValue

    - -
    -
    - -

    - stretch - : EnumValue

    - -
    -
    - -

    - Read-only - total - : number

    -
      -
    • -
      -

      This read-only property returns the total arranged row height or column width, after arrangement, in local coordinates. - This value gives the actual size plus the separatorPadding and separatorStrokeWidth.

      -

      This value gives the vertical space occupied by the row if isRow is true; - otherwise this gives the horizontal space occupied by the column. - The value is meaningless until after the Table Panel using this - RowColumnDefinition has been arranged.

      -
      -
      see
      -

      actual, height, width, sizing

      -
      -
      since
      -

      1.2

      -
      -
      -
      -
    • -
    -
    -
    - -

    - width - : number

    -
      -
    • -
      -

      Gets or sets the column width, in local coordinates. - The size describes the column width if isRow is false; - otherwise this property is meaningless. - The value must be non-negative and finite.

      -

      The default value is NaN, which means this column will get a width - that is just big enough to hold all of the objects in the column.

      -

      Setting this value to a number will mean that all of the objects - of this Panel in this column will be allocated that - amount of column width. - Whether an object in the column is actually arranged to have that width - depends on whether the GraphObject.stretch stretches horizontally.

      -
      -
      see
      -

      height, minimum, maximum, sizing

      -
      -
      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - bind -

    - -
      -
    • -
      -

      Add a data-binding to this RowColumnDefinition for the given property names and optional conversion function. - You can pass in the argumetns to a new Binding: .bind(a, b) instead of calling .bind(new go.Binding(a, b).

      -
      -
      since
      -

      2.2

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        Optional targetprop: string
        -
        -

        A string naming the target property on the target object. - This should not be the empty string.

        -
        -
      • -
      • -
        Optional sourceprop: string
        -
        -

        A string naming the source property on the bound data object. - If this is the empty string, the whole Panel.data object is used. - If this argument is not supplied, the source property is assumed to be the same as the target property.

        -
        -
      • -
      • -
        Optional conv: (val: any, targetObj: any) => any
        -
        -

        An optional side-effect-free function converting the data property value to the value to set the target property. - If the function is null or not supplied, no conversion takes place.

        -
        -
          -
        -
      • -
      • -
        Optional backconv: (val: any, sourceData: any, model: Model) => any
        -
        -

        An optional conversion function to convert property values back to data values. - Specifying this modifies the binding to set its Binding.mode to be Binding.TwoWay. - If you want a two-way binding without a back-conversion function, call this method with the new Binding - argument instead, and call Binding.makeTwoWay on it: .bind(new go.Binding(...).makeTwoWay())

        -
        -
          -
        -
      • -
      -

      Returns RowColumnDefinition

      -

      this RowColumnDefinition

      -
    • -
    • -
      -

      Add a data-binding of a property on this RowColumnDefinition to a property on a data object. - You can pass in the argumetns to a new Binding: .bind(a, b) instead of calling .bind(new go.Binding(a, b).

      -

      Read more about Bindings at the Introduction page about Data Bindings.

      -
      -

      Parameters

      - -

      Returns RowColumnDefinition

      -

      this RowColumnDefinition

      -
    • -
    -
    -
    -
    -

    Constants

    -
    - -

    - Static - Default - : EnumValue

    -
    -

    The default sizing, which resolves to RowColumnDefinition.None or else - the Table Panel's rowSizing and columnSizing if present.

    -
    -
    -
    - -

    - Static - None - : EnumValue

    -
    -

    The default sizing if none is specified on the Table Panel's rowSizing and columnSizing.

    -
    -
    -
    - -

    - Static - ProportionalExtra - : EnumValue

    -
    -

    If a Table Panel is larger than all the rows then this sizing - grants this row and any others with the same value the extra space, apportioned proportionally between them

    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class RowColumnDefinition

    Hierarchy

    • RowColumnDefinition
    +

    The RowColumnDefinition class describes constraints on a row or a column +in a Panel of type Panel.Table. +It also provides information about the actual layout after the +Table Panel has been arranged.

    +

    Index

    Constructors

    Properties

    • +

      This read-only property returns the usable row height or column width, after arrangement, in local coordinates, +that objects in this row or column can be arranged within. +This does not include separatorPadding or separatorStrokeWidth, as total does.

      +

      This value gives the row height if isRow is true; +otherwise this gives the column width. +The value is meaningless until after the Table Panel using this +RowColumnDefinition has been arranged.

      +
      see

      total, height, width, sizing

      +
    • +

      Gets or sets the background color for a particular row or column, +which fills the entire span of the row or column, including any separatorPadding.

      +

      The default value is null, which means nothing is drawn in the background of the row or column.

      +
      see

      GraphObject.background

      +
      since

      1.2

      +
    • +

      Determines whether or not the background, if there is one, is in front of or behind the separators.

      +

      The default value is false -- any background is drawn behind any separator lines.

      +
      since

      1.2

      +
    • +

      Gets or sets the row height, in local coordinates. +This describes the row height if isRow is true; +otherwise this property is meaningless. +The value must be non-negative and finite.

      +

      The default value is NaN, which means this row will get a height +that is just big enough to hold all of the objects in the row.

      +

      Setting this value to a number will mean that all of the objects +of this Panel in this row will be allocated that +amount of row height. +Whether an object in the row is actually arranged to have that height +depends on whether the GraphObject.stretch stretches vertically.

      +
      see

      width, minimum, maximum, sizing

      +
    • +

      This read-only property is true when this describes a row instead of a column in the panel. +When this is true, the height, minimum, and maximum +all describe the row height. +Otherwise width and the other two properties describe the column width.

      +
    • +

      Gets or sets the maximum row height or column width, in local coordinates. +The maximum describes the row height if isRow is true; +otherwise this describes the column width.

      +

      The value must be non-negative. +The default value is Infinity. +The arranged height of all objects in this row, +or the arranged width of all objects in this column, +will be no greater than this value.

      +
      see

      width, height, minimum, sizing

      +
    • +

      Gets or sets the minimum row height or column width, in local coordinates. +The minimum describes the row height if isRow is true; +otherwise this describes the column width.

      +

      The value must be non-negative and finite. +The default value is zero. +The arranged height of all objects in this row, +or the arranged width of all objects in this column, +will be no less than this value.

      +
      see

      width, height, maximum, sizing

      +
    • +

      This read-only property returns the Panel that this row or column definition is in.

      +
    • +

      This read-only property returns the total arranged row height or column width, after arrangement, in local coordinates. +This value gives the actual size plus the separatorPadding and separatorStrokeWidth.

      +

      This value gives the vertical space occupied by the row if isRow is true; +otherwise this gives the horizontal space occupied by the column. +The value is meaningless until after the Table Panel using this +RowColumnDefinition has been arranged.

      +
      see

      actual, height, width, sizing

      +
      since

      1.2

      +
    • +

      Gets or sets the column width, in local coordinates. +The size describes the column width if isRow is false; +otherwise this property is meaningless. +The value must be non-negative and finite.

      +

      The default value is NaN, which means this column will get a width +that is just big enough to hold all of the objects in the column.

      +

      Setting this value to a number will mean that all of the objects +of this Panel in this column will be allocated that +amount of column width. +Whether an object in the column is actually arranged to have that width +depends on whether the GraphObject.stretch stretches horizontally.

      +
      see

      height, minimum, maximum, sizing

      +

    Methods

    • +

      Add a data-binding to this RowColumnDefinition for the given property names and optional conversion function. +You can pass in the argumetns to a new Binding: .bind(a, b) instead of calling .bind(new go.Binding(a, b).

      +
      since

      2.2

      +

      Parameters

      • Optional targetprop: string
        +

        A string naming the target property on the target object. + This should not be the empty string.

        +
      • Optional sourceprop: string
        +

        A string naming the source property on the bound data object. + If this is the empty string, the whole Panel.data object is used. + If this argument is not supplied, the source property is assumed to be the same as the target property.

        +
      • Optional conv: (val: any, targetObj: any) => any
        +

        An optional side-effect-free function converting the data property value to the value to set the target property. + If the function is null or not supplied, no conversion takes place.

        +
          • (val: any, targetObj: any): any
          • Parameters

            • val: any
            • targetObj: any

            Returns any

      • Optional backconv: (val: any, sourceData: any, model: Model) => any
        +

        An optional conversion function to convert property values back to data values. +Specifying this modifies the binding to set its Binding.mode to be Binding.TwoWay. +If you want a two-way binding without a back-conversion function, call this method with the new Binding +argument instead, and call Binding.makeTwoWay on it: .bind(new go.Binding(...).makeTwoWay())

        +
          • (val: any, sourceData: any, model: Model): any
          • Parameters

            • val: any
            • sourceData: any
            • model: Model

            Returns any

      Returns RowColumnDefinition

      this RowColumnDefinition

      +
    • +

      Add a data-binding of a property on this RowColumnDefinition to a property on a data object. +You can pass in the argumetns to a new Binding: .bind(a, b) instead of calling .bind(new go.Binding(a, b).

      +

      Parameters

      Returns RowColumnDefinition

      this RowColumnDefinition

      +

    Constants

    +

    The default sizing, which resolves to RowColumnDefinition.None or else +the Table Panel's rowSizing and columnSizing if present.

    +
    +

    The default sizing if none is specified on the Table Panel's rowSizing and columnSizing.

    +
    +

    If a Table Panel is larger than all the rows then this sizing +grants this row and any others with the same value the extra space, apportioned proportionally between them

    +

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/RowResizingTool.html b/api/symbols/RowResizingTool.html index 5870a2b49..553a8ee1a 100644 --- a/api/symbols/RowResizingTool.html +++ b/api/symbols/RowResizingTool.html @@ -1,536 +1,79 @@ - - - - - - RowResizingTool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class RowResizingTool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    -
      -
    • - Tool -
        -
      • - RowResizingTool -
      • -
      -
    • -
    -
    -
    -
    -

    The RowResizingTool class lets the user resize each row of a named Table Panel in a selected Part.

    -

    If you want to experiment with this extension, try the Column Resizing sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Constructs a RowResizingTool and sets the handle and name of the tool.

      -
      -

      Returns RowResizingTool

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - Read-only - adornedTable - : Panel

    -
      -
    • -
      -

      This read-only property returns the Panel of type Panel.Table whose rows are being resized. - This must be contained within the selected Part.

      -
      -
    • -
    -
    -
    - -

    - Read-only - handle - : GraphObject

    - -
    -
    - -

    - handleArchetype - : GraphObject

    -
      -
    • -
      -

      Gets or sets small GraphObject that is copied as a resize handle for each row. - This tool expects that this object's GraphObject.desiredSize (a.k.a width and height) has been set to real numbers.

      -

      The default value is a Shape that is a narrow rectangle.

      -
      -
    • -
    -
    -
    - -

    - tableName - : string

    -
      -
    • -
      -

      Gets or sets the name of the Table Panel to be resized.

      -

      The default value is the name "TABLE".

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override - canStart -

    -
      -
    • canStart(): boolean
    • -
    -
      -
    • -
      -

      This tool may run when there is a mouse-down event on a "RowResizing" handle, - the diagram is not read-only, the left mouse button is being used, - and this tool's adornment's resize handle is at the current mouse point.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Virtual - computeResize -

    - -
      -
    • -
      -

      This can be overridden in order to customize the resizing process.

      -
      -

      Parameters

      -
        -
      • -
        p: Point
        -
        -

        the point where the handle is being dragged.

        -
        -
      • -
      -

      Returns Point

      -
    • -
    -
    -
    - -

    - Override - doActivate -

    -
      -
    • doActivate(): void
    • -
    -
      -
    • -
      -

      Find the handle, ensure type Panel.Table, capture the mouse, and start a transaction.

      -

      If the call to Tool.findToolHandleAt finds no "RowResizing" tool handle, this method returns without activating this tool.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doDeactivate -

    -
      -
    • doDeactivate(): void
    • -
    -
      -
    • -
      -

      Stop the current transaction and release the mouse.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doKeyDown -

    -
      -
    • doKeyDown(): void
    • -
    -
      -
    • -
      -

      Pressing the Delete key removes any column width setting and stops this tool.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseMove -

    -
      -
    • doMouseMove(): void
    • -
    -
      -
    • -
      -

      Call resize with a new size determined by the current mouse point. - This determines the new bounds by calling computeResize.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseUp -

    -
      -
    • doMouseUp(): void
    • -
    -
      -
    • -
      -

      Call resize with the final bounds based on the most recent mouse point, and commit the transaction. - This determines the new bounds by calling computeResize.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - resize -

    -
      -
    • resize(newPoint: Point): void
    • -
    -
      -
    • -
      -

      Change the RowColumnDefinition.height of the row being resized - to a value corresponding to the given mouse point.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - updateAdornments -

    -
      -
    • updateAdornments(part: Part): void
    • -
    - -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class RowResizingTool Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    The RowResizingTool class lets the user resize each row of a named Table Panel in a selected Part.

    +

    If you want to experiment with this extension, try the Column Resizing sample.

    +

    Index

    Inherited Members

    Constructors

    • +

      Constructs a RowResizingTool and sets the handle and name of the tool.

      +

      Returns RowResizingTool

    Properties

    • +

      This read-only property returns the Panel of type Panel.Table whose rows are being resized. +This must be contained within the selected Part.

      +
    • +

      Gets or sets small GraphObject that is copied as a resize handle for each row. +This tool expects that this object's GraphObject.desiredSize (a.k.a width and height) has been set to real numbers.

      +

      The default value is a Shape that is a narrow rectangle.

      +
    • +

      Gets or sets the name of the Table Panel to be resized.

      +

      The default value is the name "TABLE".

      +

    Methods

    • canStart(): boolean
    • +

      This tool may run when there is a mouse-down event on a "RowResizing" handle, +the diagram is not read-only, the left mouse button is being used, +and this tool's adornment's resize handle is at the current mouse point.

      +

      Returns boolean

    • +

      This can be overridden in order to customize the resizing process.

      +

      Parameters

      • p: Point
        +

        the point where the handle is being dragged.

        +

      Returns Point

    • doActivate(): void
    • +

      Find the handle, ensure type Panel.Table, capture the mouse, and start a transaction.

      +

      If the call to Tool.findToolHandleAt finds no "RowResizing" tool handle, this method returns without activating this tool.

      +

      Returns void

    • doDeactivate(): void
    • +

      Stop the current transaction and release the mouse.

      +

      Returns void

    • doKeyDown(): void
    • +

      Pressing the Delete key removes any column width setting and stops this tool.

      +

      Returns void

    • doMouseMove(): void
    • +

      Call resize with a new size determined by the current mouse point. +This determines the new bounds by calling computeResize.

      +

      Returns void

    • doMouseUp(): void
    • +

      Call resize with the final bounds based on the most recent mouse point, and commit the transaction. +This determines the new bounds by calling computeResize.

      +

      Returns void

    • resize(newPoint: Point): void
    • updateAdornments(part: Part): void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/SectorReshapingTool.html b/api/symbols/SectorReshapingTool.html index 67e986c25..ae86a729a 100644 --- a/api/symbols/SectorReshapingTool.html +++ b/api/symbols/SectorReshapingTool.html @@ -1,451 +1,64 @@ - - - - - - SectorReshapingTool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class SectorReshapingTool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    -
      -
    • - Tool -
        -
      • - SectorReshapingTool -
      • -
      -
    • -
    -
    -
    -
    -

    The SectorReshapingTool class lets the user interactively modify the angles of a "pie"-shaped sector of a circle. - When a node is selected, this shows two handles for changing the angles of the sides of the sector and one handle for changing the radius.

    -

    This depends on there being three data properties, "angle", "sweep", and "radius", - that hold the needed information to be able to reproduce the sector.

    -

    If you want to experiment with this extension, try the Sector Reshaping sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Constructs a SectorReshapingTool and sets the name for the tool.

      -
      -

      Returns SectorReshapingTool

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - angleProperty - : string

    -
      -
    • -
      -

      Gets or sets the name of the data property for the sector start angle.

      -

      The default value is "angle".

      -
      -
    • -
    -
    -
    - -

    - radiusProperty - : string

    -
      -
    • -
      -

      Gets or sets the name of the data property for the sector radius.

      -

      The default value is "radius".

      -
      -
    • -
    -
    -
    - -

    - sweepProperty - : string

    -
      -
    • -
      -

      Gets or sets the name of the data property for the sector sweep angle.

      -

      The default value is "sweep".

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override - canStart -

    -
      -
    • canStart(): boolean
    • -
    -
      -
    • -
      -

      This tool can only start if Diagram.allowReshape is true and the mouse-down event - is at a tool handle created by this tool.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Override - doActivate -

    -
      -
    • doActivate(): void
    • -
    -
      -
    • -
      -

      Remember the original angles and radius and start a transaction.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doCancel -

    -
      -
    • doCancel(): void
    • -
    -
      -
    • -
      -

      Restore the original angles and radius and then stop this tool.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doDeactivate -

    -
      -
    • doDeactivate(): void
    • -
    -
      -
    • -
      -

      Stop the transaction.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseMove -

    -
      -
    • doMouseMove(): void
    • -
    -
      -
    • -
      -

      Depending on the current handle being dragged, update the "radius", the "angle", or the "sweep" - properties on the model data. - Those property names are currently parameterized as static members of SectorReshapingTool.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseUp -

    -
      -
    • doMouseUp(): void
    • -
    -
      -
    • -
      -

      Finish the transaction and stop the tool.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - updateAdornments -

    -
      -
    • updateAdornments(part: Part): void
    • -
    -
      -
    • -
      -

      If the Part is selected, show two angle-changing tool handles and one radius-changing tool handle.

      -
      -

      Parameters

      -
        -
      • -
        part: Part
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class SectorReshapingTool Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    • Tool
      • SectorReshapingTool
    +

    The SectorReshapingTool class lets the user interactively modify the angles of a "pie"-shaped sector of a circle. +When a node is selected, this shows two handles for changing the angles of the sides of the sector and one handle for changing the radius.

    +

    This depends on there being three data properties, "angle", "sweep", and "radius", +that hold the needed information to be able to reproduce the sector.

    +

    If you want to experiment with this extension, try the Sector Reshaping sample.

    +

    Index

    Inherited Members

    Constructors

    • +

      Constructs a SectorReshapingTool and sets the name for the tool.

      +

      Returns SectorReshapingTool

    Properties

    • +

      Gets or sets the name of the data property for the sector start angle.

      +

      The default value is "angle".

      +
    • +

      Gets or sets the name of the data property for the sector radius.

      +

      The default value is "radius".

      +
    • +

      Gets or sets the name of the data property for the sector sweep angle.

      +

      The default value is "sweep".

      +

    Methods

    • canStart(): boolean
    • +

      This tool can only start if Diagram.allowReshape is true and the mouse-down event +is at a tool handle created by this tool.

      +

      Returns boolean

    • doActivate(): void
    • +

      Remember the original angles and radius and start a transaction.

      +

      Returns void

    • doCancel(): void
    • +

      Restore the original angles and radius and then stop this tool.

      +

      Returns void

    • doDeactivate(): void
    • +

      Stop the transaction.

      +

      Returns void

    • doMouseMove(): void
    • +

      Depending on the current handle being dragged, update the "radius", the "angle", or the "sweep" +properties on the model data. +Those property names are currently parameterized as static members of SectorReshapingTool.

      +

      Returns void

    • doMouseUp(): void
    • +

      Finish the transaction and stop the tool.

      +

      Returns void

    • updateAdornments(part: Part): void
    • +

      If the Part is selected, show two angle-changing tool handles and one radius-changing tool handle.

      +

      Parameters

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/SerpentineLayout.html b/api/symbols/SerpentineLayout.html index 7cb6280c6..6dcf3c1a0 100644 --- a/api/symbols/SerpentineLayout.html +++ b/api/symbols/SerpentineLayout.html @@ -1,387 +1,64 @@ - - - - - - SerpentineLayout | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class SerpentineLayout

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    -
      -
    • - Layout -
        -
      • - SerpentineLayout -
      • -
      -
    • -
    -
    -
    -
    -

    A custom Layout that lays out a chain of nodes in a snake-like fashion.

    -

    This layout assumes the graph is a chain of Nodes, - positioning nodes in horizontal rows back and forth, alternating between left-to-right - and right-to-left within the wrap limit. - spacing controls the distance between nodes. - leftSpot and rightSpot determine the Spots to use for the Link.fromSpot and Link.toSpot.

    -

    When this layout is the Diagram.layout, it is automatically invalidated when the viewport changes size.

    -

    If you want to experiment with this extension, try the Serpentine Layout sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - leftSpot - : Spot

    -
      -
    • -
      -

      Gets or sets the Spot to use on the left side of a Node.

      -

      The default value is Spot.Left.

      -
      -
    • -
    -
    -
    - -

    - rightSpot - : Spot

    -
      -
    • -
      -

      Gets or sets the Spot to use on the right side of a Node.

      -

      The default value is Spot.Right.

      -
      -
    • -
    -
    -
    - -

    - root - : Node

    -
      -
    • -
      -

      Gets or sets the starting node of the sequence.

      -

      The default value is null, which causes the layout to look for a node without any incoming links.

      -
      -
    • -
    -
    -
    - -

    - spacing - : Size

    -
      -
    • -
      -

      Gets or sets the Size whose width specifies the horizontal space between nodes - and whose height specifies the minimum vertical space between nodes.

      -

      The default value is 30x30.

      -
      -
    • -
    -
    -
    - -

    - wrap - : number

    - -
    -
    -
    -

    Methods

    -
    - -

    - Override - cloneProtected -

    - -
      -
    • -
      -

      Copies properties to a cloned Layout.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doLayout -

    - -
      -
    • -
      -

      This method actually positions all of the Nodes, assuming that the ordering of the nodes - is given by a single link from one node to the next. - This respects the spacing and wrap properties to affect the layout.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class SerpentineLayout Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    A custom Layout that lays out a chain of nodes in a snake-like fashion.

    +

    This layout assumes the graph is a chain of Nodes, +positioning nodes in horizontal rows back and forth, alternating between left-to-right +and right-to-left within the wrap limit. +spacing controls the distance between nodes. +leftSpot and rightSpot determine the Spots to use for the Link.fromSpot and Link.toSpot.

    +

    When this layout is the Diagram.layout, it is automatically invalidated when the viewport changes size.

    +

    If you want to experiment with this extension, try the Serpentine Layout sample.

    +

    Index

    Inherited Members

    Constructors

    Properties

    • +

      Gets or sets the Spot to use on the left side of a Node.

      +

      The default value is Spot.Left.

      +
    • +

      Gets or sets the Spot to use on the right side of a Node.

      +

      The default value is Spot.Right.

      +
    • +

      Gets or sets the starting node of the sequence.

      +

      The default value is null, which causes the layout to look for a node without any incoming links.

      +
    • +

      Gets or sets the Size whose width specifies the horizontal space between nodes +and whose height specifies the minimum vertical space between nodes.

      +

      The default value is 30x30.

      +

    Methods

    • +

      Copies properties to a cloned Layout.

      +

      Parameters

      Returns void

    • +

      This method actually positions all of the Nodes, assuming that the ordering of the nodes +is given by a single link from one node to the next. +This respects the spacing and wrap properties to affect the layout.

      +

      Parameters

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Set.html b/api/symbols/Set.html index 7c067b606..593426563 100644 --- a/api/symbols/Set.html +++ b/api/symbols/Set.html @@ -1,904 +1,178 @@ - - - - - - Set | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class Set<T>

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - Set -
    • -
    -
    -
    -
    -

    NOTE: For 2.0 the constructor argument has changed. - Set now optionally accepts a collection, and only checks types in TypeScript.

    -

    An unordered iterable collection that cannot contain two instances of the same value. - In TypeScript it is a generic class that enforces at compile-time the type of elements that may be added to the Set.

    -

    An example usage:

    -
      var set = new go.Set();  // In TypeScript: new go.Set<string>();
    -  set.add("orange");
    -  set.add("apple");
    -  set.add("orange");
    -  // now set.count === 2
    -  // and set.contains("orange") === true
    -  // and set.contains("banana") === false
    +Set | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class Set<T>

    Hierarchy

    • Set
    +

    NOTE: For 2.0 the constructor argument has changed. +Set now optionally accepts a collection, and only checks types in TypeScript.

    +

    An unordered iterable collection that cannot contain two instances of the same value. +In TypeScript it is a generic class that enforces at compile-time the type of elements that may be added to the Set.

    +

    An example usage:

    +
      var set = new go.Set();  // In TypeScript: new go.Set<string>();
    set.add("orange");
    set.add("apple");
    set.add("orange");
    // now set.count === 2
    // and set.contains("orange") === true
    // and set.contains("banana") === false
    -

    You can iterate over the items in a Set:

    -
      var it = aSet.iterator;
    -  while (it.next()) {
    -    . . . it.value . . .
    -  }
    +

    You can iterate over the items in a Set:

    +
      var it = aSet.iterator;
    while (it.next()) {
    . . . it.value . . .
    }
    -

    Or:

    -
      aSet.each(function(val) {
    -      . . . val . . .
    -    });
    +

    Or:

    +
      aSet.each(function(val) {
    . . . val . . .
    });
    -

    Although not precisely implementing the features of the EcmaScript 6 Set class, - this GoJS Set class has synonyms for the following methods and property:

    - -

    The constructor now takes an optional Iterable or Array argument that provides the initial elements for the new Set.

    -

    Note that GoJS iteration is quite different than ES6 iteration, so that functionality has not been made somewhat compatible. - These collection classes were defined in GoJS before the ES6 collection classes were proposed.

    -
    -
    -
    -

    Type parameters

    -
      -
    • -

      T

      -
    • -
    -
    -
    -

    Implements

    - -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      There are two possible constructors:

      -

      new go.Set(), for JavaScript

      -

      new go.Set<T>() for TypeScript

      -

      In TypeScript, the optional generic argument describes the type of values - that this Set may hold.

      -

      For example, the expression:

      -
      // TypeScript:
      -new go.Set<go.Point>()
      +

      Although not precisely implementing the features of the EcmaScript 6 Set class, +this GoJS Set class has synonyms for the following methods and property:

      + +

      The constructor now takes an optional Iterable or Array argument that provides the initial elements for the new Set.

      +

      Note that GoJS iteration is quite different than ES6 iteration, so that functionality has not been made somewhat compatible. +These collection classes were defined in GoJS before the ES6 collection classes were proposed.

      +

    Type parameters

    • T

    Implements

    Index

    Constructors

    • +

      There are two possible constructors:

      +

      new go.Set(), for JavaScript

      +

      new go.Set<T>() for TypeScript

      +

      In TypeScript, the optional generic argument describes the type of values +that this Set may hold.

      +

      For example, the expression:

      +
      // TypeScript:
      new go.Set<go.Point>()
      -

      Creates a new Set that may only contain Points.

      -
      -

      Type parameters

      -
        -
      • -

        T

        -
      • -
      -

      Parameters

      -
        -
      • -
        Optional coll: Iterable<T> | T[]
        -
        -

        an optional collection of items to add.

        -
        -
      • -
      -

      Returns Set<T>

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - Read-only - count - : number

    -
      -
    • -
      -

      This read-only property is the number of elements in the Set.

      -
      -
    • -
    -
    -
    - -

    - Read-only - iterator - : Iterator<T>

    -
      -
    • -
      -

      Gets an object that you can use for iterating over the Set. - The value will be a member of the Set. - Typical usage:

      -
        var it = aSet.iterator;
      -  while (it.next()) {
      -    . . . " value: " + it.value . . .
      -  }
      +

      Creates a new Set that may only contain Points.

      +

    Type parameters

    • T

    Parameters

    • Optional coll: Iterable<T> | T[]
      +

      an optional collection of items to add.

      +

    Returns Set<T>

    Properties

    • +

      This read-only property is the number of elements in the Set.

      +
    • +

      Gets an object that you can use for iterating over the Set. +The value will be a member of the Set. +Typical usage:

      +
        var it = aSet.iterator;
      while (it.next()) {
      . . . " value: " + it.value . . .
      }
      -
      -
    • -
    -
    -
    - -

    - Read-only - size - : number

    -
      -
    • -
      -

      This read-only property is the number of elements in the Set.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - add -

    -
      -
    • add(val: T): Set<T>
    • -
    -
      -
    • -
      -

      Adds a given value to the Set, if not already present.

      -

      Be careful not to call this method while iterating over the collection.

      -
      -

      Parameters

      -
        -
      • -
        val: T
        -
        -

        The value to add to the Set; must not be null.

        -
        -
      • -
      -

      Returns Set<T>

      -

      This modified Set.

      -
    • -
    -
    -
    - -

    - addAll -

    - -
      -
    • -
      -

      Adds all of the values of a collection to this Set.

      -

      Be careful not to call this method while iterating over the collection.

      -
      -

      Parameters

      -
        -
      • -
        coll: Iterable<T> | T[]
        -
        -

        the collection of items to add.

        -
        -
      • -
      -

      Returns Set<T>

      -

      This modified Set.

      -
    • -
    -
    -
    - -

    - Virtual - all -

    -
      -
    • all(pred: (a: T) => boolean): boolean
    • -
    -
      -
    • -
      -

      This is true if all invocations of the given predicate on items in the collection are true.

      -

      Call the given predicate on each item in the collection. - As soon as a call returns false, this returns false. - Otherwise this returns true. - For an empty collection this returns true.

      -
      -
      since
      -

      1.4

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        pred: (a: T) => boolean
        -
        -

        This function must not have any side-effects.

        -
        -
          -
        -
      • -
      -

      Returns boolean

      -

      True if all predicate calls are true; false otherwise.

      -
    • -
    -
    -
    - -

    - Virtual - any -

    -
      -
    • any(pred: (a: T) => boolean): boolean
    • -
    -
      -
    • -
      -

      This is true if any invocation of the given predicate on items in the collection is true.

      -

      Call the given predicate on each item in the collection. - As soon as a call returns true, this returns true. - Otherwise this returns false. - For an empty collection this returns false.

      -
      -
      since
      -

      1.4

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        pred: (a: T) => boolean
        -
        -

        This function must not have any side-effects.

        -
        -
          -
        -
      • -
      -

      Returns boolean

      -

      True if any predicate call is true; false otherwise.

      -
    • -
    -
    -
    - -

    - clear -

    -
      -
    • clear(): void
    • -
    -
      -
    • -
      -

      Clears the Set. - This sets the count to zero.

      -

      Be careful not to call this method while iterating over the collection.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - contains -

    -
      -
    • contains(val: T): boolean
    • -
    -
      -
    • -
      -

      Returns whether the given value is in this Set.

      -
      -

      Parameters

      -
        -
      • -
        val: T
        -
        -

        The value to check.

        -
        -
      • -
      -

      Returns boolean

      -

      Whether or not the value is contained within the Set.

      -
    • -
    -
    -
    - -

    - containsAll -

    -
      -
    • containsAll(coll: Iterable<T>): boolean
    • -
    -
      -
    • -
      -

      Returns true if all of the values of a given collection are in this Set.

      -
      -

      Parameters

      -
        -
      • -
        coll: Iterable<T>
        -
        -

        the collection of items to check for.

        -
        -
      • -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - containsAny -

    -
      -
    • containsAny(coll: Iterable<T>): boolean
    • -
    -
      -
    • -
      -

      Returns true if any of the values of a given collection are in this Set.

      -
      -

      Parameters

      -
        -
      • -
        coll: Iterable<T>
        -
        -

        the collection of items to check for.

        -
        -
      • -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Virtual - copy -

    -
      -
    • copy(): Set<T>
    • -
    -
      -
    • -
      -

      Makes a shallow copy of this Set. - The values are not copied, - so if they are objects they may continue to be shared with the original Set.

      -
      -

      Returns Set<T>

      -

      The new Set with the same elements.

      -
    • -
    -
    -
    - -

    - delete -

    -
      -
    • delete(val: T): boolean
    • -
    -
      -
    • -
      -

      Removes a value (if found) from the Set.

      -

      Be careful not to call this method while iterating over the collection.

      -
      -

      Parameters

      -
        -
      • -
        val: T
        -
        -

        The value to insert.

        -
        -
      • -
      -

      Returns boolean

      -

      true if the value was found and removed, false otherwise.

      -
    • -
    -
    -
    - -

    - Virtual - each -

    -
      -
    • each(func: (a: T) => void): Set<T>
    • -
    -
      -
    • -
      -

      Call the given function on each item in the collection.

      -
      -
      since
      -

      1.4

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        func: (a: T) => void
        -
        -

        This function must not modify the collection.

        -
        -
          -
        -
      • -
      -

      Returns Set<T>

      -

      This Set itself.

      -
    • -
    -
    -
    - -

    - first -

    -
      -
    • first(): T
    • -
    -
      -
    • -
      -

      Returns the first item in the collection, or null if there is none.

      -
      -

      Returns T

      -

      This returns null if there are no items in the collection.

      -
    • -
    -
    -
    - -

    - has -

    -
      -
    • has(val: T): boolean
    • -
    -
      -
    • -
      -

      Returns whether the given value is in this Set.

      -
      -

      Parameters

      -
        -
      • -
        val: T
        -
        -

        The value to check.

        -
        -
      • -
      -

      Returns boolean

      -

      Whether or not the value is contained within the Set.

      -
    • -
    -
    -
    - -

    - remove -

    -
      -
    • remove(val: T): boolean
    • -
    -
      -
    • -
      -

      Removes a value (if found) from the Set.

      -

      Be careful not to call this method while iterating over the collection.

      -
      -

      Parameters

      -
        -
      • -
        val: T
        -
        -

        The value to remove.

        -
        -
      • -
      -

      Returns boolean

      -

      true if the value was found and removed, false otherwise.

      -
    • -
    -
    -
    - -

    - removeAll -

    - -
      -
    • -
      -

      Removes all of the values of a collection from this Set.

      -

      Be careful not to call this method while iterating over the collection.

      -
      -

      Parameters

      -
        -
      • -
        coll: Iterable<T> | T[]
        -
        -

        the collection of items to remove.

        -
        -
      • -
      -

      Returns Set<T>

      -

      This modified Set.

      -
    • -
    -
    -
    - -

    - retainAll -

    - -
      -
    • -
      -

      Removes from this Set all items that are not in the given collection.

      -

      Be careful not to call this method while iterating over the collection.

      -
      -

      Parameters

      -
        -
      • -
        coll: Iterable<T>
        -
        -

        the collection of items that should be kept in this Set.

        -
        -
      • -
      -

      Returns Set<T>

      -

      This modified Set.

      -
    • -
    -
    -
    - -

    - toArray -

    -
      -
    • toArray(): T[]
    • -
    -
      -
    • -
      -

      Produces a JavaScript Array from the contents of this Set.

      -
      -

      Returns T[]

      -

      A copy of the Set in Array form.

      -
    • -
    -
    -
    - -

    - toList -

    -
      -
    • toList(): List<T>
    • -
    -
      -
    • -
      -

      Converts the Set to a List. - Because there is no ordering within a Set, - the values in the List may be in any order.

      -
      -

      Returns List<T>

      -

      A copy of the contents of this Set in List form.

      -
    • -
    -
    -
    -
    - -
    - -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Shape.html b/api/symbols/Shape.html index 9e17a9551..291aa438f 100644 --- a/api/symbols/Shape.html +++ b/api/symbols/Shape.html @@ -1,1111 +1,322 @@ - - - - - - Shape | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class Shape

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    A Shape is a GraphObject that shows a geometric figure. - The Geometry determines what is drawn; - the properties fill and stroke - (and other stroke properties) determine how it is drawn.

    -

    There are generally two types of shapes: Those that use a custom Geometry by setting - Shape.geometry, and those that receive an automatically generated Geometry using the value of - figure, toArrow, or fromArrow. An explicitly set Geometry always supersedes - the figure and arrowhead properties.

    -

    Some created Shapes:

    -
    // A shape with the figure set to RoundedRectangle:
    -new go.Shape({ figure: "RoundedRectangle", fill: "lightgreen" })
    -// Alternatively:
    -new go.Shape("RoundedRectangle" { fill: "lightgreen" })
    -
    -// A shape with a custom geometry:
    -new go.Shape(
    -    { geometry: go.Geometry.parse("M120 0 L80 80 0 50z") })
    -
    -// A shape with a custom geometry, using geometryString:
    -new go.Shape(
    -   { geometryString: "F M120 0 L80 80 0 50z",
    -     fill: "lightgreen" })
    +Shape | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class Shape

    Hierarchy

    +

    A Shape is a GraphObject that shows a geometric figure. +The Geometry determines what is drawn; +the properties fill and stroke +(and other stroke properties) determine how it is drawn.

    +

    There are generally two types of shapes: Those that use a custom Geometry by setting +Shape.geometry, and those that receive an automatically generated Geometry using the value of +figure, toArrow, or fromArrow. An explicitly set Geometry always supersedes +the figure and arrowhead properties.

    +

    Some created Shapes:

    +
    // A shape with the figure set to RoundedRectangle:
    new go.Shape({ figure: "RoundedRectangle", fill: "lightgreen" })
    // Alternatively:
    new go.Shape("RoundedRectangle" { fill: "lightgreen" })

    // A shape with a custom geometry:
    new go.Shape(
    { geometry: go.Geometry.parse("M120 0 L80 80 0 50z") })

    // A shape with a custom geometry, using geometryString:
    new go.Shape(
    { geometryString: "F M120 0 L80 80 0 50z",
    fill: "lightgreen" })

    // A common link template, using two shapes,
    // the first for the link path and the second for the arrowhead
    // The first shape in a link is special, its geometry is set by the Link's routing,
    // so it does not need a geometry or figure set manually
    myDiagram.linkTemplate =
    new go.Link()
    .add(new go.Shape(
    { strokeWidth: 2, stroke: 'gray' }))
    .add(new go.Shape(
    { toArrow: "Standard", fill: 'gray', stroke: null })) +
    +

    +You can see more custom geometry examples and read about geometryString +on the Geometry Path Strings Introduction page. -// A common link template, using two shapes, -// the first for the link path and the second for the arrowhead -// The first shape in a link is special, its geometry is set by the Link's routing, -// so it does not need a geometry or figure set manually -myDiagram.linkTemplate = - new go.Link() - .add(new go.Shape( - { strokeWidth: 2, stroke: 'gray' })) - .add(new go.Shape( - { toArrow: "Standard", fill: 'gray', stroke: null })) +

    When automatically generating a Shape Geometry, the value of toArrow takes precedence, +then fromArrow, then figure. If the value of toArrow or fromArrow is "None" +then it is ignored, and the "None" value of figure is identical to "Rectangle".

    +

    All of the predefined figures are shown in the Shapes sample. +You can define your own named figures by calling the static function Shape.defineFigureGenerator. +Get a Map of named figures by calling the static function Shape.getFigureGenerators.

    +

    All of the predefined arrowheads are shown in the Arrowheads sample. +You can define your own named arrowheads by calling the static function Shape.defineArrowheadGeometry. +Get a Map of named arrowheads by calling the static function Shape.getArrowheadGeometries.

    +

    You can see a copy of all of the built-in arrowhead definitions in this file: Arrowheads.js.

    +

    The Shape properties parameter1, and parameter2 determine details of the +construction of some figure geometries. +Specifically, they often set the spot1, spot2 for the Shape. +These spots determine the "inner area" of an Auto panel when a Shape is the main object. +See the Auto Panels section of the Panels Introduction page for more details.

    +

    Shapes use their geometric bounds when determining hit testing, +but use rectangular bounds when participating in (panel) layouts.

    +

    Index

    Inherited Members

    Properties

    Methods

    Constructors

    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    -
      -
    • new Shape(figure?: string, init?: Partial<Shape>): Shape
    • -
    • new Shape(init?: Partial<Shape>): Shape
    • -
    -
      -
    • -
      -

      A newly constructed Shape has a default figure of "None", - which constructs a rectangular geometry, and is filled and stroked with a black brush.

      -

      Common usage:

      -
      new go.Shape("RoundedRectangle", {
      -  strokeWidth: 2,
      -  stroke: "red",
      -  fill: "yellow"
      -})
      +

      Or when using a custom geometryString instead of a figure:

      +
      new go.Shape({
      fill: "red",
      stroke: null,
      width: 100,
      height: 100,
      // This SVG-style path creates a thick "+" figure:
      geometryString: "F M2 1 h1 v1 h1 v1 h-1 v1 h-1 v-1 h-1 v-1 h1 z"
      })
      -

      Or when using a custom geometryString instead of a figure:

      -
      new go.Shape({
      -  fill: "red",
      -  stroke: null,
      -  width: 100,
      -  height: 100,
      -  // This SVG-style path creates a thick "+" figure:
      -  geometryString: "F M2 1 h1 v1 h1 v1 h-1 v1 h-1 v-1 h-1 v-1 h1 z"
      -})
      +

      Also common is to set some or all of the Shape properties dynamically, +in the Node data, by way of bindings:

      +
      // A Node used as the node template, holding a single shape
      // The shape has many bindings
      myDiagram.nodeTemplate =
      new go.Node("Horizontal")
      .add(
      new go.Shape()
      .bind("width")
      .bind("height")
      .bind("fill", "color") // binds the data.color to shape.fill
      .bind("figure"));

      // It could be used with model data like this:
      myDiagram.model = new go.GraphLinksModel(
      [
      { key: "1", width: 150, height: 150, color: "red", figure: "Triangle" },
      { key: "2", width: 24, height: 24, color: "blue", figure: "Roundedrectangle" }
      ]);
      -

      Also common is to set some or all of the Shape properties dynamically, - in the Node data, by way of bindings:

      -
      // A Node used as the node template, holding a single shape
      -// The shape has many bindings
      -myDiagram.nodeTemplate =
      -  new go.Node("Horizontal")
      -  .add(
      -    new go.Shape()
      -    .bind("width")
      -    .bind("height")
      -    .bind("fill", "color") // binds the data.color to shape.fill
      -    .bind("figure"));
      +

    Parameters

    • Optional figure: string
      +

      The shape's figure, a predefined geometry. +If no geometry is set then shapes will use the default figure of "None", a rectangle. +Common values are "Rectangle", "Ellipse", "RoundedRectangle".

      +
    • Optional init: Partial<Shape>
      +

      Optional initialization properties.

      +

    Returns Shape

  • +

    A newly constructed Shape has a default figure of "None", +which constructs a rectangular geometry, and is filled and stroked with a black brush.

    +

    Parameters

    • Optional init: Partial<Shape>
      +

      Optional initialization properties.

      +

    Returns Shape

  • Properties

    • +

      Gets or sets the figure name, used to construct a Geometry. +The value must be a string. The default value is "None".

      +

      The name can be any case but will always be canonicalized when set. For instance, +setting "roundedrectangle" will set the value of figure to "RoundedRectangle". +All of the predefined figures are shown in the Shapes sample.

      +

      At most one of the following three properties may be set to a non-"None" value at the same time on the same shape: +figure, toArrow, fromArrow.

      +

      You can define your own named figures by calling the static function Shape.defineFigureGenerator.

      +
    • +

      Gets or sets the Brush or string that describes how the geometry is filled when drawn.

      +

      The default value is "black", causing the shape to be filled with solid black. +Any valid CSS string can specify a solid color, and the Brush +class can be used to specify a gradient or pattern. +A null fill will mean no fill is drawn and the filled portion +of the Shape will not be pickable. +A "transparent" fill is useful when wanting to allow a shape to be pickable +without obscuring any other objects behind it. +More information about the syntax of CSS color strings is available at: +CSS colors (mozilla.org).

      +

      The geometry is filled before the stroke is drawn.

      +
    • +

      Gets or sets the name of the kind of arrowhead that this shape should take +when this shape is an element of a Link. +Value must be a string. +For bi-directional links the arrowhead name often starts with "Backward...".

      +

      The default is "None", which means that this Shape is not an arrowhead, causing it to be the default Shape, a large filled Rectangle. +If you want to have an arrowhead Shape but sometimes not show an arrowhead, you can set or bind +the GraphObject.visible property, or you can set or bind this "toArrow" property to +be the empty string. +The arrowhead named "", an empty string, will display as nothing.

      +

      The name can be any case but will always be canonicalized when set. For instance, +setting "opentriangle" will set the value of the arrowhead to "OpenTriangle". +All of the predefined arrowheads are shown in the Arrowheads sample.

      +

      Setting this property may also set the GraphObject.segmentIndex, +GraphObject.segmentOrientation, and GraphObject.alignmentFocus properties. +This shape should be an element of a Link.

      +

      At most one of the following three properties may be set to a non-"None" value at the same time on the same shape: +figure, toArrow, fromArrow.

      +

      You can define your own named arrowheads by calling the static function Shape.defineArrowheadGeometry.

      +

      You can see a copy of all of the built-in arrowhead definitions in this file: Arrowheads.js.

      +
    • +

      Gets or sets the Shape's Geometry that defines the Shape's figure. +Setting a geometry is not necessary if a figure is specified, +as that will construct a geometry instead.

      +

      Setting this geometry property will freeze the supplied Geometry.

      +

      Setting this geometry property always overrides any set figure. +The default value is null.

      +
      see

      geometryString

      +
    • +

      Gets or sets the fractional distance along the main shape of a "Graduated" Panel at which this kind of tick should end. +The default is 1. Any new value should range from 0 to 1.

      +
      since

      1.7

      +
    • +

      Gets or sets the function to determine which values along a "Graduated" Panel will be skipped. +The default is null and doesn't skip any ticks.

      +

      The function takes a number argument, a value between Panel.graduatedMin and Panel.graduatedMax. +The function will return a boolean, whether the tick will be skipped at the value of the argument.

      +
      since

      2.0

      +
    • +

      Gets or sets the fractional distance along the main shape of a "Graduated" Panel at which this kind of tick should start. +The default is 0. Any new value should range from 0 to 1.

      +
      since

      1.7

      +
    • +

      Gets or sets the whether the GraphObject.position of this shape denotes +the top-left corner of this shape in panel coordinates or the origin of this geometry's coordinate system. +Basically, this determines whether the strokeWidth affects the rendered location. +A true value allows multiple shapes to be positioned precisely in a "Position" Panel independent of the stroke width. +The default is false.

      +
      since

      1.1

      +
    • +

      This read-only property returns the natural bounds of this Shape as determined by its geometry's bounds. +The bounds will always include the (0,0) point. +If the desiredSize is set, it returns a Rect with the desiredSize. If no geometry is available, +and no desiredSize is set, this may have NaN values for the width and height.

      +
    • +

      Gets or sets a property for parameterizing the construction of a Geometry from a figure. +The meaning of this property depends on the particular figure. +The value must be a number; the default value is NaN.

      +
    • +

      Gets or sets a property for parameterizing the construction of a Geometry from a figure. +The meaning of this property depends on the particular figure. +The value must be a number; the default value is NaN.

      +
    • +

      Gets or sets a GraphObject that is drawn repeatedly along the path of the stroke of this shape. +This property may be set to a shared GraphObject; the GraphObject should not belong to any Panel. +Note that data bindings do not work in such shared GraphObjects, because they are not part of the visual tree. +The default value is null, causing no object to be drawn repeatedly.

      +

      Typically the object is a small Shape or a Picture. +The larger the object is the worse the results will be, especially if the stroke has short segments or sharp curves. +The pathPattern object is not part of the measured bounds of the Shape, it is a cosmetic element only.

      +

      The stroke is always drawn normally -- having a value for this property will draw the value along the stroke as well, +so it is commonplace to set the stroke to "transparent" and the strokeWidth to be as wide as +the height of the GraphObject being drawn along the stroke.

      +

      Examples of path patterns can be seen in the Relationships sample.

      +

      This property is ignored by the Shapes in "Grid" or "Graduated" Panels.

      +
      since

      1.6

      +
    • +

      Gets or sets the top-left Spot used by some Panels for determining where in the shape other objects may be placed. +The value is normally Spot.Default, but you may want to set it to override the value that many figures use.

      +
    • +

      Gets or sets the bottom-right Spot used by some Panels for determining where in the shape other objects may be placed. +The value is normally Spot.Default, but you may want to set it to override the value that many figures use.

      +
    • +

      Gets or sets the Brush or string that describes how the geometry is drawn as if by a pen.

      +

      The default value is "black", causing the shape to be outlined in black. +Any valid CSS string can specify a solid color, and the Brush +class can be used to specify a gradient or pattern. +A null stroke will mean no stroke is drawn. +A "transparent" stroke is useful when wanting to allow a shape to be pickable +without obscuring any other objects behind it. +More information about the syntax of CSS color strings is available at: +CSS colors (mozilla.org).

      +

      The stroke is drawn after the geometry is filled with the fill Brush.

      +
    • +

      Gets or sets the style for how the ends of the stroke's line are drawn. +The value must be one of "butt", "round", or "square". The default is "butt".

      +

      For more information, see Stroke Line Cap (w3.org).

      +
    • +

      Gets or sets the dash array for creating dashed or dotted lines. +The value must be an array of positive numbers and zeroes, +or else null to indicate a solid line. +For example, the array [5, 10] would create dashes of 5 pixels and spaces of 10 pixels. +For more information, see Stroke Line Dash Array (w3.org).

      +

      The default value is null, resulting in a line without dashes or dots. +Setting an array with all zeroes will set the value to null.

      +
      since

      1.1

      +
    • +

      Gets or sets the offset for dashed lines, used to start the drawing of the dash pattern with some space. +The value must be a real non-negative number. The default is zero.

      +

      For more information, see Stroke Line Dash Offset (w3.org).

      +
      since

      1.1

      +
    • +

      Gets or sets the type of corner that will be drawn for a stroke at the intersection of two straight segments of the geometry. +The value must be one of "miter", "bevel", or "round". The default is "miter".

      +

      For more information, see Stroke Line Join (w3.org).

      +
    • +

      Gets or sets the style for the stroke's mitre limit ratio. +The value must be a real number greater than or equal to one. +The default is 10.0.

      +

      For more information, see Stroke Miter Limit (w3.org).

      +
    • +

      Gets or sets the thickness of the stroke's pen.

      +

      Value must be a real number greater than or equal to zero. +The default value is 1.0.

      +

      A value of zero will cause the stroke not to be drawn. +However, Main Shapes of Link Selection Adornments with a strokeWidth of 0 +will inherit the strokeWidth from the Link's main Shape.

      +

      The stroke width will affect the GraphObject.measuredBounds and GraphObject.actualBounds of this shape. +The stroke is drawn centered on the path of the geometry.

      +
    • +

      Gets or sets the name of the kind of arrowhead that this shape should take +when this shape is an element of a Link. +Value must be a string.

      +

      The default is "None", which means that this Shape is not an arrowhead, causing it to be the default Shape, a large filled Rectangle. +If you want to have an arrowhead Shape but sometimes not show an arrowhead, you can set or bind +the GraphObject.visible property, or you can set or bind this "toArrow" property to +be the empty string. +The arrowhead named "", an empty string, will display as nothing.

      +

      The name can be any case but will always be canonicalized when set. For instance, +setting "opentriangle" will set the value of the arrowhead to "OpenTriangle". +All of the predefined arrowheads are shown in the Arrowheads sample.

      +

      Setting this property may also set the GraphObject.segmentIndex, +GraphObject.segmentOrientation, and GraphObject.alignmentFocus properties. +This shape should be an element of a Link.

      +

      At most one of the following three properties may be set to a non-"None" value at the same time on the same shape: +figure, toArrow, fromArrow.

      +

      You can define your own named arrowheads by calling the static function Shape.defineArrowheadGeometry.

      +

      You can see a copy of all of the built-in arrowhead definitions in this file: Arrowheads.js.

      +

    Methods

    • defineArrowheadGeometry(name: string, pathstr: string | Geometry): void
    • +

      This static function defines a named arrowhead geometry. +Once this is called one can use the name as a value for Shape.toArrow or Shape.fromArrow.

      +

      The first argument is the new arrowhead name and must be a non-empty string that starts with a capital letter and that is not "None".

      +

      If the second argument is a string, it is converted into a Geometry by calling +go.Geometry.parse(pathstr, false), +which may throw an error if there are problems with the syntax of the string.

      +
      since

      1.5

      +

      Parameters

      • name: string
        +

        a capitalized arrowhead name ("OpenTriangle"); must not be "" or "None"

        +
      • pathstr: string | Geometry
        +

        a Geometry or a Geometry path string, e.g. "m 0,0 l 8,4 -8,4"

        +

      Returns void

    • defineFigureGenerator(name: string, func: string | ((shape: Shape, width: number, height: number) => Geometry)): void
    • +

      This static function defines a named figure geometry generator for Shapes. +Once this is called one can use the name as a value for Shape.figure.

      +

      The first argument is the new figure name and must be a non-empty string that starts with a capital letter and that is not "None".

      +

      If the second argument is a string this call defines a synonym for an existing figure generator. +Do not define cycles of synonyms -- the behavior will be undefined.

      +

      If the second argument is a function, +the Geometry generator function's first argument is the Shape for which the function is producing a Geometry. +But this Shape argument may be null in some circumstances. +The second and third arguments are the desired width and height. +These will always be finite non-negative numbers. +The function may look at the Shape.parameter1 and Shape.parameter2 properties, which may be NaN, +to decide what geometry to create for the figure given its intended width and height.

      +

      The function must return a Geometry; you may want to set Geometry.spot1 and Geometry.spot2 on it +to indicate where content should be placed within the figure when using an "Auto" Panel. +For some figures you may also want to set Geometry.defaultStretch to GraphObject.Uniform +in order to maintain the geometry's aspect ratio within the Shape.

      +

      Generated figures must create a Geometry that is not larger than the supplied with and height. Doing so will signal an error.

      +
      since

      1.5

      +

      Parameters

      • name: string
        +

        a capitalized figure name ("RoundedRectangle"); must not be "" or "None"

        +
      • func: string | ((shape: Shape, width: number, height: number) => Geometry)
        +

        A function that takes (Shape,width,height) and returns a Geometry, + or an existing figure generator name for which the new name will be a synonym.

        +

      Returns void

    • +

      This static function returns a read-only Map of named arrowhead geometries. +The keys are arrowhead names. +The values are Geometry objects.

      +

      The predefined arrowheads can be seen in the Arrowheads sample.

      +
      since

      1.5

      +

      Returns Map<string, Geometry>

    • getFigureGenerators(): Map<string, string | ((a: Shape, b: number, c: number) => Geometry)>
    • +

      This static function returns a read-only Map of named geometry generators. +The keys are figure names. +The values are either string synonyms for other figure names, or functions +that take a Shape and a width and a height and return a Geometry.

      +

      The predefined shape figures can be seen in the Shapes sample.

      +
      since

      1.5

      +

      Returns Map<string, string | ((a: Shape, b: number, c: number) => Geometry)>

    Settings

    Theme

    + - - - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Size.html b/api/symbols/Size.html index 3e4c4a11b..18742e000 100644 --- a/api/symbols/Size.html +++ b/api/symbols/Size.html @@ -1,531 +1,98 @@ - - - - - - Size | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class Size

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - Size -
    • -
    -
    -
    -
    -

    A Size describes a width and a height in two-dimensional coordinates. - The width and height must both be non-negative.

    -

    Use the static functions Size.parse and Size.stringify to convert to and from - a standard string representation that is independent of the current locale.

    -

    When an instance of this class is the value of a property of a GraphObject class or Diagram - or CommandHandler or a Tool class, you should treat the object - as if it were frozen or read-only -- you cannot modify its properties. - This allows the property to return a value without allocating a new instance. - If you need to do your own calculations with the value, call copy to make - a new instance with the same values that you can modify.

    -

    Many methods modify the object's properties and then return a reference to "this" object. - The only instance method to allocate a new object is the copy method. - The static Size.parse method also allocates a new object.

    -

    The "Debug" implementation of this class is significantly slower than the "Release" implementation, - mostly due to additional error checking.

    -

    You cannot inherit from this class.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    -
      -
    • new Size(w?: number, h?: number): Size
    • -
    -
      -
    • -
      -

      The default constructor produces the Size(0,0). - This constructor may take either zero arguments or two arguments.

      -
      -

      Parameters

      -
        -
      • -
        Optional w: number
        -
        -

        The initial width (must be non-negative).

        -
        -
      • -
      • -
        Optional h: number
        -
        -

        The initial height (must be non-negative).

        -
        -
      • -
      -

      Returns Size

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - height - : number

    -
      -
    • -
      -

      Gets or sets the height value of the Size. - The value must not be negative.

      -
      -
    • -
    -
    -
    - -

    - width - : number

    -
      -
    • -
      -

      Gets or sets the width value of the Size. - The value must not be negative.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Virtual - copy -

    - -
      -
    • -
      -

      Create a copy of this Size, with the same values.

      -
      -

      Returns Size

      -
    • -
    -
    -
    - -

    - equalTo -

    -
      -
    • equalTo(w: number, h: number): boolean
    • -
    -
      -
    • -
      -

      Indicates whether the given size is equal to this Size.

      -
      -
      see
      -

      equals

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        w: number
        -
        -

        the width.

        -
        -
      • -
      • -
        h: number
        -
        -

        the height.

        -
        -
      • -
      -

      Returns boolean

      -

      True if the Sizes have the same width and height, - false otherwise.

      -
    • -
    -
    -
    - -

    - equals -

    -
      -
    • equals(s: Size): boolean
    • -
    -
      -
    • -
      -

      Indicates whether the given Size is equal to the current Size.

      -
      -
      see
      -

      equalTo

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        s: Size
        -
        -

        The Size to compare to the current Size.

        -
        -
      • -
      -

      Returns boolean

      -

      True if the Sizes have the same width and height, - false otherwise.

      -
    • -
    -
    -
    - -

    - isReal -

    -
      -
    • isReal(): boolean
    • -
    -
      -
    • -
      -

      True if this Size has Width and Height values that are real numbers and not infinity.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Static - parse -

    -
      -
    • parse(str: string): Size
    • -
    -
      -
    • -
      -

      This static function can be used to read in a Size from a string that was produced by Size.stringify.

      -

      go.Size.parse("1 2") produces the Size new go.Size(1, 2).

      -
      -

      Parameters

      -
        -
      • -
        str: string
        -
      • -
      -

      Returns Size

      -
    • -
    -
    -
    - -

    - set -

    - -
      -
    • -
      -

      Modify this Size so that its Width and Height values are the same as the given Size.

      -
      -

      Parameters

      -
        -
      • -
        s: Size
        -
        -

        the given Size.

        -
        -
      • -
      -

      Returns Size

      -

      this.

      -
    • -
    -
    -
    - -

    - setTo -

    -
      -
    • setTo(w: number, h: number): Size
    • -
    -
      -
    • -
      -

      Modify this Size with new Width and Height values.

      -
      -

      Parameters

      -
        -
      • -
        w: number
        -
        -

        the width.

        -
        -
      • -
      • -
        h: number
        -
        -

        the height.

        -
        -
      • -
      -

      Returns Size

      -

      this.

      -
    • -
    -
    -
    - -

    - Static - stringify -

    -
      -
    • stringify(val: Size): string
    • -
    -
      -
    • -
      -

      This static function can be used to write out a Size as a string that can be read by Size.parse.

      -

      go.Size.stringify(new go.Size(1, 2)) produces the string "1 2".

      -
      -

      Parameters

      - -

      Returns string

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class Size

    Hierarchy

    • Size
    +

    A Size describes a width and a height in two-dimensional coordinates. +The width and height must both be non-negative.

    +

    Use the static functions Size.parse and Size.stringify to convert to and from +a standard string representation that is independent of the current locale.

    +

    When an instance of this class is the value of a property of a GraphObject class or Diagram +or CommandHandler or a Tool class, you should treat the object +as if it were frozen or read-only -- you cannot modify its properties. +This allows the property to return a value without allocating a new instance. +If you need to do your own calculations with the value, call copy to make +a new instance with the same values that you can modify.

    +

    Many methods modify the object's properties and then return a reference to "this" object. +The only instance method to allocate a new object is the copy method. +The static Size.parse method also allocates a new object.

    +

    The "Debug" implementation of this class is significantly slower than the "Release" implementation, +mostly due to additional error checking.

    +

    You cannot inherit from this class.

    +

    Index

    Constructors

    • new Size(w?: number, h?: number): Size
    • +

      The default constructor produces the Size(0,0). +This constructor may take either zero arguments or two arguments.

      +

      Parameters

      • Optional w: number
        +

        The initial width (must be non-negative).

        +
      • Optional h: number
        +

        The initial height (must be non-negative).

        +

      Returns Size

    Properties

    • +

      Gets or sets the height value of the Size. +The value must not be negative.

      +
    • +

      Gets or sets the width value of the Size. +The value must not be negative.

      +

    Methods

    • +

      Create a copy of this Size, with the same values.

      +

      Returns Size

    • equalTo(w: number, h: number): boolean
    • +

      Indicates whether the given size is equal to this Size.

      +
      see

      equals

      +

      Parameters

      • w: number
        +

        the width.

        +
      • h: number
        +

        the height.

        +

      Returns boolean

      True if the Sizes have the same width and height, +false otherwise.

      +
    • equals(s: Size): boolean
    • +

      Indicates whether the given Size is equal to the current Size.

      +
      see

      equalTo

      +

      Parameters

      • s: Size
        +

        The Size to compare to the current Size.

        +

      Returns boolean

      True if the Sizes have the same width and height, +false otherwise.

      +
    • isReal(): boolean
    • +

      True if this Size has Width and Height values that are real numbers and not infinity.

      +

      Returns boolean

    • +

      Modify this Size so that its Width and Height values are the same as the given Size.

      +

      Parameters

      • s: Size
        +

        the given Size.

        +

      Returns Size

      this.

      +
    • setTo(w: number, h: number): Size
    • +

      Modify this Size with new Width and Height values.

      +

      Parameters

      • w: number
        +

        the width.

        +
      • h: number
        +

        the height.

        +

      Returns Size

      this.

      +
    • parse(str: string): Size
    • +

      This static function can be used to read in a Size from a string that was produced by Size.stringify.

      +

      go.Size.parse("1 2") produces the Size new go.Size(1, 2).

      +

      Parameters

      • str: string

      Returns Size

    • stringify(val: Size): string
    • +

      This static function can be used to write out a Size as a string that can be read by Size.parse.

      +

      go.Size.stringify(new go.Size(1, 2)) produces the string "1 2".

      +

      Parameters

      Returns string

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/SnapLinkReshapingTool.html b/api/symbols/SnapLinkReshapingTool.html index b21c6ac86..cca47079a 100644 --- a/api/symbols/SnapLinkReshapingTool.html +++ b/api/symbols/SnapLinkReshapingTool.html @@ -1,371 +1,64 @@ - - - - - - SnapLinkReshapingTool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class SnapLinkReshapingTool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    The SnapLinkReshapingTool class lets the user snap link reshaping handles to the nearest grid point. - If avoidsNodes is true and the link is orthogonal, - it also avoids reshaping the link so that any adjacent segments cross over any avoidable nodes.

    -

    If you want to experiment with this extension, try the Snap Link Reshaping sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - avoidsNodes - : boolean

    -
      -
    • -
      -

      Gets or sets whether a reshape handle's position should only be dragged where the - adjacent segments do not cross over any nodes. - This affects the behavior of computeReshape.

      -

      The default value is true.

      -
      -
    • -
    -
    -
    - -

    - gridCellSize - : Size

    -
      -
    • -
      -

      Gets or sets the Size of each grid cell to which link points will be snapped.

      -

      The default value is NaNxNaN, which means use the Diagram.grid's Panel.gridCellSize.

      -
      -
    • -
    -
    -
    - -

    - gridOrigin - : Point

    -
      -
    • -
      -

      Gets or sets the Point origin for the grid to which link points will be snapped.

      -

      The default value is NaN,NaN, which means use the Diagram.grid's Panel.gridOrigin.

      -
      -
    • -
    -
    -
    - -

    - isGridSnapEnabled - : boolean

    -
      -
    • -
      -

      Gets or sets whether a reshape handle's position should be snapped to a grid point. - This affects the behavior of computeReshape.

      -

      The default value is true.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override - computeReshape -

    - - -
    -
    - -

    - Override - doActivate -

    -
      -
    • doActivate(): void
    • -
    -
      -
    • -
      -

      This override records information about the original point of the handle being dragged, - if the adornedLink is Orthogonal and if avoidsNodes is true.

      -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class SnapLinkReshapingTool Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    The SnapLinkReshapingTool class lets the user snap link reshaping handles to the nearest grid point. +If avoidsNodes is true and the link is orthogonal, +it also avoids reshaping the link so that any adjacent segments cross over any avoidable nodes.

    +

    If you want to experiment with this extension, try the Snap Link Reshaping sample.

    +

    Index

    Inherited Members

    Constructors

    Properties

    • +

      Gets or sets whether a reshape handle's position should only be dragged where the +adjacent segments do not cross over any nodes. +This affects the behavior of computeReshape.

      +

      The default value is true.

      +
    • +

      Gets or sets the Point origin for the grid to which link points will be snapped.

      +

      The default value is NaN,NaN, which means use the Diagram.grid's Panel.gridOrigin.

      +
    • +

      Gets or sets whether a reshape handle's position should be snapped to a grid point. +This affects the behavior of computeReshape.

      +

      The default value is true.

      +

    Methods

    • doActivate(): void
    • +

      This override records information about the original point of the handle being dragged, +if the adornedLink is Orthogonal and if avoidsNodes is true.

      +

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/SpiralLayout.html b/api/symbols/SpiralLayout.html index f7bb05f37..90d95268f 100644 --- a/api/symbols/SpiralLayout.html +++ b/api/symbols/SpiralLayout.html @@ -1,384 +1,58 @@ - - - - - - SpiralLayout | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class SpiralLayout

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    -
      -
    • - Layout -
        -
      • - SpiralLayout -
      • -
      -
    • -
    -
    -
    -
    -

    A custom Layout that lays out a chain of nodes in a spiral.

    -

    This layout assumes the graph is a chain of Nodes, - spacing controls the spacing between nodes.

    -

    If you want to experiment with this extension, try the Spiral Layout sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Create a minimal layout that only positions Nodes that do not have a location.

      -
      -

      Parameters

      -
        -
      • -
        Optional init: Partial<Layout>
        -
        -

        Optional initialization properties.

        -
        -
      • -
      -

      Returns SpiralLayout

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - clockwise - : boolean

    -
      -
    • -
      -

      Gets or sets whether the spiral should go clockwise or counter-clockwise.

      -

      The default value is true.

      -
      -
    • -
    -
    -
    - -

    - radius - : number

    -
      -
    • -
      -

      Gets or sets the radius distance.

      -

      The default value is NaN.

      -
      -
    • -
    -
    -
    - -

    - spacing - : number

    -
      -
    • -
      -

      Gets or sets the spacing between nodes.

      -

      The default value is 100.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override - cloneProtected -

    - -
      -
    • -
      -

      Copies properties to a cloned Layout.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - diameter -

    - -
      -
    • -
      -

      Compute the effective diameter of a Node.

      -
      -

      Parameters

      - -

      Returns number

      -
    • -
    -
    -
    - -

    - Override - doLayout -

    - -
      -
    • -
      -

      This method actually positions all of the Nodes, assuming that the ordering of the nodes - is given by a single link from one node to the next. - This respects the spacing property to affect the layout.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class SpiralLayout Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    A custom Layout that lays out a chain of nodes in a spiral.

    +

    This layout assumes the graph is a chain of Nodes, +spacing controls the spacing between nodes.

    +

    If you want to experiment with this extension, try the Spiral Layout sample.

    +

    Index

    Inherited Members

    Constructors

    • +

      Create a minimal layout that only positions Nodes that do not have a location.

      +

      Parameters

      • Optional init: Partial<Layout>
        +

        Optional initialization properties.

        +

      Returns SpiralLayout

    Properties

    • +

      Gets or sets whether the spiral should go clockwise or counter-clockwise.

      +

      The default value is true.

      +
    • +

      Gets or sets the radius distance.

      +

      The default value is NaN.

      +
    • +

      Gets or sets the spacing between nodes.

      +

      The default value is 100.

      +

    Methods

    • +

      Copies properties to a cloned Layout.

      +

      Parameters

      Returns void

    • +

      Compute the effective diameter of a Node.

      +

      Parameters

      Returns number

    • +

      This method actually positions all of the Nodes, assuming that the ordering of the nodes +is given by a single link from one node to the next. +This respects the spacing property to affect the layout.

      +

      Parameters

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Spot.html b/api/symbols/Spot.html index bd4798a18..9783ba53e 100644 --- a/api/symbols/Spot.html +++ b/api/symbols/Spot.html @@ -1,1172 +1,199 @@ - - - - - - Spot | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class Spot

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - Spot -
    • -
    -
    -
    -
    -

    A Spot represents a relative point from (0,0) to (1,1) within the bounds of - a rectangular area plus an absolute offset.

    -

    Use the static functions Spot.parse and Spot.stringify to convert to and from - a standard string representation that is independent of the current locale.

    -

    When an instance of this class is the value of a property of a GraphObject class or Diagram - or CommandHandler or a Tool class, you should treat the object - as if it were frozen or read-only -- you cannot modify its properties. - This allows the property to return a value without allocating a new instance. - If you need to do your own calculations with the value, call copy to make - a new instance with the same values that you can modify.

    -

    Many methods modify the object's properties and then return a reference to "this" object. - The only instance method to allocate a new object is the copy method. - The static Spot.parse method also allocates a new object.

    -

    The "Debug" implementation of this class is significantly slower than the "Release" implementation, - mostly due to additional error checking.

    -

    You cannot inherit from this class.

    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    -
      -
    • new Spot(x?: number, y?: number, offx?: number, offy?: number): Spot
    • -
    -
      -
    • -
      -

      The default constructor produces the Spot(0, 0, 0, 0), at the top-left corner.

      -
      -

      Parameters

      -
        -
      • -
        Optional x: number
        -
        -

        The x value of the Spot. Default is zero.

        -
        -
      • -
      • -
        Optional y: number
        -
        -

        The y value of the Spot. Default is zero.

        -
        -
      • -
      • -
        Optional offx: number
        -
        -

        (Optional) The absolute x offset. Default is zero.

        -
        -
      • -
      • -
        Optional offy: number
        -
        -

        (Optional) The absolute y offset. Default is zero.

        -
        -
      • -
      -

      Returns Spot

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - offsetX - : number

    -
      -
    • -
      -

      Gets or sets the offsetX value of the Spot. - The value may be negative. - If this represents a side value instead of a specific spot, this value is meaningless.

      -

      A Spot(0,0,5,5) of a large rectangle is near the top-left corner, inside the rectangle. - A Spot(1,1,5,5) would be near the bottom-right corner, outside the rectangle. - A Spot(1,1,-5,-5) would also be near the bottom-right corner, but inside the rectangle.

      -
      -
    • -
    -
    -
    - -

    - offsetY - : number

    -
      -
    • -
      -

      Gets or sets the offsetY value of the Spot. - The value may be negative. - If this represents a side value instead of a specific spot, this value is meaningless.

      -

      A Spot(0,0,5,5) of a large rectangle is near the top-left corner, inside the rectangle. - A Spot(1,1,5,5) would be near the bottom-right corner, outside the rectangle. - A Spot(1,1,-5,-5) would also be near the bottom-right corner, but inside the rectangle.

      -
      -
    • -
    -
    -
    - -

    - x - : number

    -
      -
    • -
      -

      Gets or sets the x value of the Spot, a fractional value between zero and one.

      -

      The Spot(0,0) of a rectangle is at the top-left corner. - This value is commonly available as Spot.TopLeft. - The Spot(0.5,1) would be at the middle of the bottom side. - That value is commonly available as Spot.MiddleBottom.

      -
      -
    • -
    -
    -
    - -

    - y - : number

    -
      -
    • -
      -

      Gets or sets the y value of the Spot, a fractional value between zero and one.

      -

      The Spot(0,1) of a rectangle is at the bottom-left corner. - This value is commonly available as Spot.BottomLeft. - The Spot(1,0.5) would be at the middle of the right side. - That value is commonly available as Spot.MiddleRight.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Virtual - copy -

    - -
      -
    • -
      -

      Create a copy of this Spot, with the same values.

      -
      -

      Returns Spot

      -
    • -
    -
    -
    - -

    - equals -

    -
      -
    • equals(spot: Spot): boolean
    • -
    -
      -
    • -
      -

      Two spots are equal if all four property values are the same.

      -
      -

      Parameters

      -
        -
      • -
        spot: Spot
        -
        -

        The Spot to compare to the current Spot.

        -
        -
      • -
      -

      Returns boolean

      -

      True if the two spots are equal, false otherwise.

      -
    • -
    -
    -
    - -

    - includesSide -

    -
      -
    • includesSide(side: Spot): boolean
    • -
    -
      -
    • -
      -

      This predicate is true if this Spot is a side that - includes the side(s) given by the argument Spot.

      -
      -

      Parameters

      -
        -
      • -
        side: Spot
        -
      • -
      -

      Returns boolean

      -

      false if either this Spot or the argument Spot is not a "Side"; - true if the side(s) that this Spot represents are a superset or the same set of - sides represented by the argument Spot.

      -
    • -
    -
    -
    - -

    - isDefault -

    -
      -
    • isDefault(): boolean
    • -
    -
      -
    • -
      -

      True if this is a special spot indicating that the real spot value will come from another source.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - isNoSpot -

    -
      -
    • isNoSpot(): boolean
    • -
    -
      -
    • -
      -

      True if this is an unspecific special spot, such as Spot.None - or one of the sides.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - isNone -

    -
      -
    • isNone(): boolean
    • -
    -
      -
    • -
      -

      True if this is a special spot referring to no particular spot or side.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - isSide -

    -
      -
    • isSide(): boolean
    • -
    -
      -
    • -
      -

      True if this is a special spot referring to one (or more) of the sides. - This is false if the spot is Spot.None.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - isSpot -

    -
      -
    • isSpot(): boolean
    • -
    -
      -
    • -
      -

      True if this is a specific spot, not a side nor Spot.None.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - opposite -

    -
      -
    • opposite(): Spot
    • -
    -
      -
    • -
      -

      Return a new spot that is opposite this spot. - The X and Y values will be an equal distance - away from the center on the other side of the center. - The OffsetX and OffsetY values are also negated.

      -

      The result is meaningless if isNoSpot is true.

      -
      -

      Returns Spot

      -
    • -
    -
    -
    - -

    - Static - parse -

    -
      -
    • parse(str: string): Spot
    • -
    -
      -
    • -
      -

      This static function can be used to read in a Spot from a string that was produced by Spot.stringify.

      -

      go.Spot.parse("0 1 2 3") produces the Spot new go.Spot(0, 1, 2, 3).

      -
      -

      Parameters

      -
        -
      • -
        str: string
        -
      • -
      -

      Returns Spot

      -
    • -
    -
    -
    - -

    - set -

    - -
      -
    • -
      -

      Modify this Spot so that its X, Y, OffsetX, and OffsetY values are the same as the given Spot.

      -
      -

      Parameters

      -
        -
      • -
        s: Spot
        -
        -

        the given Spot.

        -
        -
      • -
      -

      Returns Spot

      -

      this.

      -
    • -
    -
    -
    - -

    - setTo -

    -
      -
    • setTo(x: number, y: number, offx: number, offy: number): Spot
    • -
    -
      -
    • -
      -

      Modify this Spot with new X, Y, OffsetX, and OffsetY values.

      -
      -

      Parameters

      -
        -
      • -
        x: number
        -
      • -
      • -
        y: number
        -
      • -
      • -
        offx: number
        -
      • -
      • -
        offy: number
        -
      • -
      -

      Returns Spot

      -

      this.

      -
    • -
    -
    -
    - -

    - Static - stringify -

    -
      -
    • stringify(val: Spot): string
    • -
    -
      -
    • -
      -

      This static function can be used to write out a Spot as a string that can be read by Spot.parse.

      -

      go.Spot.stringify(new go.Spot(0, 1, 2, 3)) produces the string "0 1 2 3".

      -
      -

      Parameters

      - -

      Returns string

      -
    • -
    -
    -
    -
    -

    Constants

    -
    - -

    - Static - AllSides - : Spot

    -
    -

    The set of points on all sides of the bounding rectangle.

    -
    -
    -
    - -

    - Static - Bottom - : Spot

    -
    -

    A synonym for Spot.BottomCenter.

    -
    -
    -
    - -

    - Static - BottomCenter - : Spot

    -
    -

    The specific point at the middle of the bottom side of bounding rectangle.

    -
    -
    -
    - -

    - Static - BottomLeft - : Spot

    -
    -

    The specific point at the bottom-left corner of the bounding rectangle.

    -
    -
    -
    - -

    - Static - BottomLeftSides - : Spot

    -
    -

    The set of points at the left or bottom sides of the bounding rectangle.

    -
    -
    -
    - -

    - Static - BottomRight - : Spot

    -
    -

    The specific point at the bottom-right corner of the bounding rectangle.

    -
    -
    -
    - -

    - Static - BottomRightSides - : Spot

    -
    -

    The set of points at the right or bottom sides of the bounding rectangle.

    -
    -
    -
    - -

    - Static - BottomSide - : Spot

    -
    -

    The set of points at the bottom side of the bounding rectangle.

    -
    -
    -
    - -

    - Static - Center - : Spot

    -
    -

    The specific point at the very center of the bounding rectangle.

    -
    -
    -
    - -

    - Static - Default - : Spot

    -
    -

    Use this value to indicate that the real spot value is inherited from elsewhere.

    -
    -
    -
    - -

    - Static - Left - : Spot

    -
    -

    A synonym for Spot.LeftCenter.

    -
    -
    -
    - -

    - Static - LeftCenter - : Spot

    -
    -

    The specific point at the middle of the left side of bounding rectangle.

    -
    -
    -
    - -

    - Static - LeftRightSides - : Spot

    -
    -

    The set of points at the left or right sides of the bounding rectangle.

    -
    -
    -
    - -

    - Static - LeftSide - : Spot

    -
    -

    The set of points at the left side of the bounding rectangle.

    -
    -
    -
    - -

    - Static - MiddleBottom - : Spot

    -
    -

    A synonym for Spot.BottomCenter.

    -
    -
    -
    - -

    - Static - MiddleLeft - : Spot

    -
    -

    A synonym for Spot.LeftCenter.

    -
    -
    -
    - -

    - Static - MiddleRight - : Spot

    -
    -

    A synonym for Spot.RightCenter.

    -
    -
    -
    - -

    - Static - MiddleTop - : Spot

    -
    -

    A synonym for Spot.TopCenter.

    -
    -
    -
    - -

    - Static - None - : Spot

    -
    -

    Use this Spot value to indicate no particular spot -- - code looking for a particular point on an element will need to do their - own calculations to determine the desired point depending on the - circumstances.

    -
    -
    -
    - -

    - Static - NotBottomSide - : Spot

    -
    -

    The set of points on all sides of bounding rectangle except bottom side.

    -
    -
    -
    - -

    - Static - NotLeftSide - : Spot

    -
    -

    The set of points on all sides of the bounding rectangle except left side.

    -
    -
    -
    - -

    - Static - NotRightSide - : Spot

    -
    -

    The set of points on all sides of the bounding rectangle except right side.

    -
    -
    -
    - -

    - Static - NotTopSide - : Spot

    -
    -

    The set of points on all sides of the bounding rectangle except top side.

    -
    -
    -
    - -

    - Static - Right - : Spot

    -
    -

    A synonym for Spot.RightCenter.

    -
    -
    -
    - -

    - Static - RightCenter - : Spot

    -
    -

    The specific point at the middle of the right side of bounding rectangle.

    -
    -
    -
    - -

    - Static - RightSide - : Spot

    -
    -

    The set of points at the right side of the bounding rectangle.

    -
    -
    -
    - -

    - Static - Top - : Spot

    -
    -

    A synonym for Spot.TopCenter.

    -
    -
    -
    - -

    - Static - TopBottomSides - : Spot

    -
    -

    The set of points at the top or bottom sides of the bounding rectangle.

    -
    -
    -
    - -

    - Static - TopCenter - : Spot

    -
    -

    The specific point at the center of the top side of the bounding rectangle.

    -
    -
    -
    - -

    - Static - TopLeft - : Spot

    -
    -

    The specific point at the top-left corner of the bounding rectangle.

    -
    -
    -
    - -

    - Static - TopLeftSides - : Spot

    -
    -

    The set of points at the top or left sides of the bounding rectangle.

    -
    -
    -
    - -

    - Static - TopRight - : Spot

    -
    -

    The specific point at the top-right corner of the bounding rectangle.

    -
    -
    -
    - -

    - Static - TopRightSides - : Spot

    -
    -

    The set of points at the top or right sides of the bounding rectangle.

    -
    -
    -
    - -

    - Static - TopSide - : Spot

    -
    -

    The set of points at the top side of the bounding rectangle.

    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class Spot

    Hierarchy

    • Spot
    +

    A Spot represents a relative point from (0,0) to (1,1) within the bounds of +a rectangular area plus an absolute offset.

    +

    Use the static functions Spot.parse and Spot.stringify to convert to and from +a standard string representation that is independent of the current locale.

    +

    When an instance of this class is the value of a property of a GraphObject class or Diagram +or CommandHandler or a Tool class, you should treat the object +as if it were frozen or read-only -- you cannot modify its properties. +This allows the property to return a value without allocating a new instance. +If you need to do your own calculations with the value, call copy to make +a new instance with the same values that you can modify.

    +

    Many methods modify the object's properties and then return a reference to "this" object. +The only instance method to allocate a new object is the copy method. +The static Spot.parse method also allocates a new object.

    +

    The "Debug" implementation of this class is significantly slower than the "Release" implementation, +mostly due to additional error checking.

    +

    You cannot inherit from this class.

    +

    Index

    Constructors

    • new Spot(x?: number, y?: number, offx?: number, offy?: number): Spot
    • +

      The default constructor produces the Spot(0, 0, 0, 0), at the top-left corner.

      +

      Parameters

      • Optional x: number
        +

        The x value of the Spot. Default is zero.

        +
      • Optional y: number
        +

        The y value of the Spot. Default is zero.

        +
      • Optional offx: number
        +

        (Optional) The absolute x offset. Default is zero.

        +
      • Optional offy: number
        +

        (Optional) The absolute y offset. Default is zero.

        +

      Returns Spot

    Properties

    • +

      Gets or sets the offsetX value of the Spot. +The value may be negative. +If this represents a side value instead of a specific spot, this value is meaningless.

      +

      A Spot(0,0,5,5) of a large rectangle is near the top-left corner, inside the rectangle. +A Spot(1,1,5,5) would be near the bottom-right corner, outside the rectangle. +A Spot(1,1,-5,-5) would also be near the bottom-right corner, but inside the rectangle.

      +
    • +

      Gets or sets the offsetY value of the Spot. +The value may be negative. +If this represents a side value instead of a specific spot, this value is meaningless.

      +

      A Spot(0,0,5,5) of a large rectangle is near the top-left corner, inside the rectangle. +A Spot(1,1,5,5) would be near the bottom-right corner, outside the rectangle. +A Spot(1,1,-5,-5) would also be near the bottom-right corner, but inside the rectangle.

      +
    • +

      Gets or sets the x value of the Spot, a fractional value between zero and one.

      +

      The Spot(0,0) of a rectangle is at the top-left corner. +This value is commonly available as Spot.TopLeft. +The Spot(0.5,1) would be at the middle of the bottom side. +That value is commonly available as Spot.MiddleBottom.

      +
    • +

      Gets or sets the y value of the Spot, a fractional value between zero and one.

      +

      The Spot(0,1) of a rectangle is at the bottom-left corner. +This value is commonly available as Spot.BottomLeft. +The Spot(1,0.5) would be at the middle of the right side. +That value is commonly available as Spot.MiddleRight.

      +

    Methods

    • +

      Create a copy of this Spot, with the same values.

      +

      Returns Spot

    • equals(spot: Spot): boolean
    • +

      Two spots are equal if all four property values are the same.

      +

      Parameters

      • spot: Spot
        +

        The Spot to compare to the current Spot.

        +

      Returns boolean

      True if the two spots are equal, false otherwise.

      +
    • includesSide(side: Spot): boolean
    • +

      This predicate is true if this Spot is a side that +includes the side(s) given by the argument Spot.

      +

      Parameters

      Returns boolean

      false if either this Spot or the argument Spot is not a "Side"; +true if the side(s) that this Spot represents are a superset or the same set of +sides represented by the argument Spot.

      +
    • isDefault(): boolean
    • +

      True if this is a special spot indicating that the real spot value will come from another source.

      +

      Returns boolean

    • isNoSpot(): boolean
    • +

      True if this is an unspecific special spot, such as Spot.None +or one of the sides.

      +

      Returns boolean

    • isNone(): boolean
    • +

      True if this is a special spot referring to no particular spot or side.

      +

      Returns boolean

    • isSide(): boolean
    • +

      True if this is a special spot referring to one (or more) of the sides. +This is false if the spot is Spot.None.

      +

      Returns boolean

    • isSpot(): boolean
    • +

      True if this is a specific spot, not a side nor Spot.None.

      +

      Returns boolean

    • +

      Return a new spot that is opposite this spot. +The X and Y values will be an equal distance +away from the center on the other side of the center. +The OffsetX and OffsetY values are also negated.

      +

      The result is meaningless if isNoSpot is true.

      +

      Returns Spot

    • +

      Modify this Spot so that its X, Y, OffsetX, and OffsetY values are the same as the given Spot.

      +

      Parameters

      • s: Spot
        +

        the given Spot.

        +

      Returns Spot

      this.

      +
    • setTo(x: number, y: number, offx: number, offy: number): Spot
    • +

      Modify this Spot with new X, Y, OffsetX, and OffsetY values.

      +

      Parameters

      • x: number
      • y: number
      • offx: number
      • offy: number

      Returns Spot

      this.

      +
    • parse(str: string): Spot
    • +

      This static function can be used to read in a Spot from a string that was produced by Spot.stringify.

      +

      go.Spot.parse("0 1 2 3") produces the Spot new go.Spot(0, 1, 2, 3).

      +

      Parameters

      • str: string

      Returns Spot

    • stringify(val: Spot): string
    • +

      This static function can be used to write out a Spot as a string that can be read by Spot.parse.

      +

      go.Spot.stringify(new go.Spot(0, 1, 2, 3)) produces the string "0 1 2 3".

      +

      Parameters

      Returns string

    Constants

    +

    The set of points on all sides of the bounding rectangle.

    +
    +

    A synonym for Spot.BottomCenter.

    +
    +

    The specific point at the middle of the bottom side of bounding rectangle.

    +
    +

    The specific point at the bottom-left corner of the bounding rectangle.

    +
    +

    The set of points at the left or bottom sides of the bounding rectangle.

    +
    +

    The specific point at the bottom-right corner of the bounding rectangle.

    +
    +

    The set of points at the right or bottom sides of the bounding rectangle.

    +
    +

    The set of points at the bottom side of the bounding rectangle.

    +
    +

    The specific point at the very center of the bounding rectangle.

    +
    +

    Use this value to indicate that the real spot value is inherited from elsewhere.

    +
    +

    A synonym for Spot.LeftCenter.

    +
    +

    The specific point at the middle of the left side of bounding rectangle.

    +
    +

    The set of points at the left or right sides of the bounding rectangle.

    +
    +

    The set of points at the left side of the bounding rectangle.

    +
    +

    A synonym for Spot.BottomCenter.

    +
    +

    A synonym for Spot.LeftCenter.

    +
    +

    A synonym for Spot.RightCenter.

    +
    +

    A synonym for Spot.TopCenter.

    +
    +

    Use this Spot value to indicate no particular spot -- +code looking for a particular point on an element will need to do their +own calculations to determine the desired point depending on the +circumstances.

    +
    +

    The set of points on all sides of bounding rectangle except bottom side.

    +
    +

    The set of points on all sides of the bounding rectangle except left side.

    +
    +

    The set of points on all sides of the bounding rectangle except right side.

    +
    +

    The set of points on all sides of the bounding rectangle except top side.

    +
    +

    A synonym for Spot.RightCenter.

    +
    +

    The specific point at the middle of the right side of bounding rectangle.

    +
    +

    The set of points at the right side of the bounding rectangle.

    +
    +

    A synonym for Spot.TopCenter.

    +
    +

    The set of points at the top or bottom sides of the bounding rectangle.

    +
    +

    The specific point at the center of the top side of the bounding rectangle.

    +
    +

    The specific point at the top-left corner of the bounding rectangle.

    +
    +

    The set of points at the top or left sides of the bounding rectangle.

    +
    +

    The specific point at the top-right corner of the bounding rectangle.

    +
    +

    The set of points at the top or right sides of the bounding rectangle.

    +
    +

    The set of points at the top side of the bounding rectangle.

    +

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/SpotRotatingTool.html b/api/symbols/SpotRotatingTool.html index c03b83403..921712a84 100644 --- a/api/symbols/SpotRotatingTool.html +++ b/api/symbols/SpotRotatingTool.html @@ -1,343 +1,61 @@ - - - - - - SpotRotatingTool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class SpotRotatingTool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    A custom RotatingTool that also supports the user moving the point about which the object is rotated.

    -

    This tool uses two separate Adornments -- the regular one holding the rotation handle and an - additional one named "MovingSpot" that holds the handle for interactively moving the - RotatingTool.rotationPoint by changing the Part.rotationSpot.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Methods

    -
    - -

    - Override - canStart -

    -
      -
    • canStart(): boolean
    • -
    -
      -
    • -
      -

      In addition to the standard behavior of RotatingTool.canStart, - also start when the user starts dragging the "MovingSpot" adornment/handle.

      -
      -

      Returns boolean

      -

      boolean

      -
    • -
    -
    -
    - -

    - Override - computeAdornmentLocation -

    - -
      -
    • -
      -

      Change the positioning of the "Rotating" Adornment to adapt to the rotation point - potentially being well outside of the object being rotated.

      -

      This assumes that RotatingTool.handleAngle is zero.

      -
      -

      Parameters

      -
        -
      • -
        obj: GraphObject
        -
        -

        the object being rotated

        -
        -
      • -
      -

      Returns Point

      -

      Point in document coordinates

      -
    • -
    -
    -
    - -

    - Virtual - shiftRotationPoint -

    -
      -
    • shiftRotationPoint(): void
    • -
    -
      -
    • -
      -

      This is called by mouse moves and mouse up events when the handle being dragged is "MovingSpot". - This needs to update the Part.rotationSpot and RotatingTool.rotationPoint properties.

      -

      For each of the X and Y directions, when the handle is within the bounds of the rotated object, - the new rotation Spot will be purely fractional; when it is outside the Spot will be limited to - a fraction of zero or one (whichever is closer) and an absolute offset that places the rotation point - where the handle is.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - updateAdornments -

    -
      -
    • updateAdornments(part: Part): void
    • -
    -
      -
    • -
      -

      In addition to updating the standard "Rotating" Adornment, this updates a "MovingSpot" - Adornment that the user may drag in order to move the RotatingTool.rotationPoint.

      -
      -

      Parameters

      -
        -
      • -
        part: Part
        -
        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class SpotRotatingTool Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    A custom RotatingTool that also supports the user moving the point about which the object is rotated.

    +

    This tool uses two separate Adornments -- the regular one holding the rotation handle and an +additional one named "MovingSpot" that holds the handle for interactively moving the +RotatingTool.rotationPoint by changing the Part.rotationSpot.

    +

    Index

    Inherited Members

    Constructors

    Methods

    • canStart(): boolean
    • +

      In addition to the standard behavior of RotatingTool.canStart, +also start when the user starts dragging the "MovingSpot" adornment/handle.

      +

      Returns boolean

      boolean

      +
    • +

      Change the positioning of the "Rotating" Adornment to adapt to the rotation point +potentially being well outside of the object being rotated.

      +

      This assumes that RotatingTool.handleAngle is zero.

      +

      Parameters

      Returns Point

      Point in document coordinates

      +
    • shiftRotationPoint(): void
    • +

      This is called by mouse moves and mouse up events when the handle being dragged is "MovingSpot". +This needs to update the Part.rotationSpot and RotatingTool.rotationPoint properties.

      +

      For each of the X and Y directions, when the handle is within the bounds of the rotated object, +the new rotation Spot will be purely fractional; when it is outside the Spot will be limited to +a fraction of zero or one (whichever is closer) and an absolute offset that places the rotation point +where the handle is.

      +

      Returns void

    • updateAdornments(part: Part): void
    • +

      In addition to updating the standard "Rotating" Adornment, this updates a "MovingSpot" +Adornment that the user may drag in order to move the RotatingTool.rotationPoint.

      +

      Parameters

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/SwimLaneLayout.html b/api/symbols/SwimLaneLayout.html index 41672a982..34dbd24f0 100644 --- a/api/symbols/SwimLaneLayout.html +++ b/api/symbols/SwimLaneLayout.html @@ -1,465 +1,83 @@ - - - - - - SwimLaneLayout | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class SwimLaneLayout

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    A custom LayeredDigraphLayout that knows about "lanes" - and that positions each node in its respective lane.

    -

    This assumes that each Node.data.lane property is a string that names the lane the node should be in. - You can set the laneProperty property to use a different data property name. - It is commonplace to set this property to be the same as the GraphLinksModel.nodeGroupKeyProperty, - so that the one property indicates that a particular node data is a member of a particular group - and thus that that group represents a lane.

    -

    The lanes can be sorted by specifying the laneComparer function.

    -

    You can add extra space between the lanes by increasing laneSpacing from its default of zero. - That number's unit is columns, LayeredDigraphLayout.columnSpacing, not in document coordinates.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - Protected - Read-only - laneBreadths - : Map<string, number>

    -
      -
    • -
      -

      The computed breadths (widths or heights depending on the direction) of each lane, - in the form of a Map mapping lane names (strings) to numbers.

      -
      -
    • -
    -
    -
    - -

    - laneComparer - : (a: string, b: string) => number

    -
      -
    • -
      -

      Gets or sets a function by which to compare lane names, for ordering the lanes within the laneNames Array. - By default the function is null -- the lanes are not sorted.

      -
      -
    • -
    -
    -
    - -

    - laneNames - : string[]

    -
      -
    • -
      -

      Gets or sets an Array of lane names. - If you set this before a layout happens, it will use those lanes in that order. - Any additional lane names that it discovers will be added to the end of this Array.

      -

      This property is reset to an empty Array at the end of each layout. - The default value is an empty Array.

      -
      -
    • -
    -
    -
    - -

    - Protected - Read-only - lanePositions - : Map<string, number>

    -
      -
    • -
      -

      The computed positions of each lane, - in the form of a Map mapping lane names (strings) to numbers.

      -
      -
    • -
    -
    -
    - -

    - laneProperty - : string | ((d: any) => string)

    -
      -
    • -
      -

      Gets or sets the name of the data property that holds the string which is the name of the lane that the node should be in. - The default value is "lane".

      -
      -
    • -
    -
    -
    - -

    - laneSpacing - : number

    -
      -
    • -
      -

      Gets or sets the amount of additional space it allocates between the lanes. - This number specifies the number of columns, with the same meaning as LayeredDigraphLayout.columnSpacing. - The number unit is not in document coordinate or pixels. - The default value is zero columns.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - computeMinLaneWidth -

    -
      -
    • computeMinLaneWidth(lane: string): number
    • -
    -
      -
    • -
      -

      Return the minimum lane width, in columns

      -
      -

      Parameters

      -
        -
      • -
        lane: string
        -
        -
        -
      • -
      -

      Returns number

      -
    • -
    -
    -
    - -

    - Protected - findLane -

    - -
      -
    • -
      -

      This is just like getLane but handles dummy vertexes - for which the getLane returns null by returning the - lane of the edge's source or destination vertex. - This can only be called after the lanes have been set up internally.

      -
      -

      Parameters

      - -

      Returns string

      -
    • -
    -
    -
    - -

    - Protected - getLane -

    - -
      -
    • -
      -

      Given a vertex, get the lane (name) that its node belongs in. - If the lane appears to be undefined, this returns the empty string. - For dummy vertexes (with no node) this will return null.

      -
      -

      Parameters

      - -

      Returns string

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class SwimLaneLayout Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    A custom LayeredDigraphLayout that knows about "lanes" +and that positions each node in its respective lane.

    +

    This assumes that each Node.data.lane property is a string that names the lane the node should be in. +You can set the laneProperty property to use a different data property name. +It is commonplace to set this property to be the same as the GraphLinksModel.nodeGroupKeyProperty, +so that the one property indicates that a particular node data is a member of a particular group +and thus that that group represents a lane.

    +

    The lanes can be sorted by specifying the laneComparer function.

    +

    You can add extra space between the lanes by increasing laneSpacing from its default of zero. +That number's unit is columns, LayeredDigraphLayout.columnSpacing, not in document coordinates.

    +

    Index

    Inherited Members

    Constructors

    Properties

    • +

      The computed breadths (widths or heights depending on the direction) of each lane, +in the form of a Map mapping lane names (strings) to numbers.

      +
    • +

      Gets or sets a function by which to compare lane names, for ordering the lanes within the laneNames Array. +By default the function is null -- the lanes are not sorted.

      +
    • +

      Gets or sets an Array of lane names. +If you set this before a layout happens, it will use those lanes in that order. +Any additional lane names that it discovers will be added to the end of this Array.

      +

      This property is reset to an empty Array at the end of each layout. +The default value is an empty Array.

      +
    • +

      The computed positions of each lane, +in the form of a Map mapping lane names (strings) to numbers.

      +
    • +

      Gets or sets the name of the data property that holds the string which is the name of the lane that the node should be in. +The default value is "lane".

      +
    • +

      Gets or sets the amount of additional space it allocates between the lanes. +This number specifies the number of columns, with the same meaning as LayeredDigraphLayout.columnSpacing. +The number unit is not in document coordinate or pixels. +The default value is zero columns.

      +

    Methods

    • computeMinLaneWidth(lane: string): number
    • +

      Return the minimum lane width, in columns

      +

      Parameters

      • lane: string
        +

      Returns number

    • +

      This is just like getLane but handles dummy vertexes +for which the getLane returns null by returning the +lane of the edge's source or destination vertex. +This can only be called after the lanes have been set up internally.

      +

      Parameters

      Returns string

    • +

      Given a vertex, get the lane (name) that its node belongs in. +If the lane appears to be undefined, this returns the empty string. +For dummy vertexes (with no node) this will return null.

      +

      Parameters

      Returns string

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/TableLayout.html b/api/symbols/TableLayout.html index fc5f52fb1..78b31eaa9 100644 --- a/api/symbols/TableLayout.html +++ b/api/symbols/TableLayout.html @@ -1,590 +1,104 @@ - - - - - - TableLayout | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class TableLayout

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    -
      -
    • - Layout -
        -
      • - TableLayout -
      • -
      -
    • -
    -
    -
    -
    -

    This Layout positions non-Link Parts into a table according to the values of - GraphObject.row, GraphObject.column, GraphObject.rowSpan, GraphObject.columnSpan, - GraphObject.alignment, GraphObject.stretch. - If the value of GraphObject.stretch is not GraphObject.None, the Part will be sized - according to the available space in the cell(s).

    -

    You can specify constraints for whole rows or columns by calling - getRowDefinition or getColumnDefinition and setting one of the following properties: - RowColumnDefinition.alignment, RowColumnDefinition.height, RowColumnDefinition.width, - RowColumnDefinition.maximum, RowColumnDefinition.minimum, RowColumnDefinition.stretch.

    -

    The defaultAlignment and defaultStretch properties apply to all parts if not specified - on the individual Part or in the corresponding row or column definition.

    -

    At the current time, there is no support for separator lines - (RowColumnDefinition.separatorStroke, RowColumnDefinition.separatorStrokeWidth, - and RowColumnDefinition.separatorDashArray properties) - nor background (RowColumnDefinition.background and RowColumnDefinition.coversSeparators properties). - There is no support for RowColumnDefinition.sizing, either.

    -

    If you want to experiment with this extension, try the Table Layout sample.

    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Create a minimal layout that only positions Nodes that do not have a location.

      -
      -

      Parameters

      -
        -
      • -
        Optional init: Partial<Layout>
        -
        -

        Optional initialization properties.

        -
        -
      • -
      -

      Returns TableLayout

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - Read-only - columnCount - : number

    -
      -
    • -
      -

      This read-only property returns the number of columns in this TableLayout. - This value is only valid after the layout has been performed.

      -
      -
    • -
    -
    -
    - -

    - defaultAlignment - : Spot

    -
      -
    • -
      -

      Gets or sets the alignment to use by default for Parts in rows (vertically) and in columns (horizontally).

      -

      The default value is Spot.Default. - Setting this property does not raise any events.

      -
      -
    • -
    -
    -
    - -

    - defaultStretch - : EnumValue

    -
      -
    • -
      -

      Gets or sets whether Parts should be stretched in rows (vertically) and in columns (horizontally).

      -

      The default value is GraphObject.Default. - Setting this property does not raise any events.

      -
      -
    • -
    -
    -
    - -

    - Read-only - rowCount - : number

    -
      -
    • -
      -

      This read-only property returns the number of rows in this TableLayout. - This value is only valid after the layout has been performed.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Protected Virtual - afterArrange -

    -
      -
    • afterArrange(parts: List<Part>, rowcol: any[][][]): void
    • -
    -
      -
    • -
      -

      Override this method in order to perform some operations after arranging. - By default this method does nothing.

      -
      -

      Parameters

      -
        -
      • -
        parts: List<Part>
        -
      • -
      • -
        rowcol: any[][][]
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Protected Virtual - beforeMeasure -

    -
      -
    • beforeMeasure(parts: List<Part>, rowcol: any[][][]): void
    • -
    -
      -
    • -
      -

      Override this method in order to perform some operations before measuring. - By default this method does nothing.

      -
      -

      Parameters

      -
        -
      • -
        parts: List<Part>
        -
      • -
      • -
        rowcol: any[][][]
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - cloneProtected -

    - -
      -
    • -
      -

      Copies properties to a cloned Layout.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doLayout -

    - -
      -
    • -
      -

      This method performs the measuring and arranging of the table, assiging positions to each part.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - findColumnForDocumentX -

    -
      -
    • findColumnForDocumentX(x: number): number
    • -
    -
      -
    • -
      -

      Returns the cell at a given x-coordinate in document coordinates. - This information is only valid when this layout has been performed and Layout.isValidLayout is true.

      -

      If the point is to left of the column 0, this method returns -1. - If the point to to the right of the last column, this returns the last column + 1.

      -
      -
      see
      -

      findRowForDocumentY

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        x: number
        -
      • -
      -

      Returns number

      -

      a zero-based integer

      -
    • -
    -
    -
    - -

    - findRowForDocumentY -

    -
      -
    • findRowForDocumentY(y: number): number
    • -
    -
      -
    • -
      -

      Returns the row at a given y-coordinate in document coordinates. - This information is only valid when this layout has been performed and Layout.isValidLayout is true.

      -

      If the point is above row 0, this method returns -1. - If the point below the last row, this returns the last row + 1.

      -
      -
      see
      -

      findColumnForDocumentX

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        y: number
        -
      • -
      -

      Returns number

      -

      a zero-based integer

      -
    • -
    -
    -
    - -

    - getColumnDefinition -

    - -
      -
    • -
      -

      Gets the RowColumnDefinition for a particular column in this TableLayout. - If you ask for the definition of a column at or beyond the columnCount, - it will automatically create one and return it.

      -
      -

      Parameters

      -
        -
      • -
        idx: number
        -
        -

        the non-negative zero-based integer column index.

        -
        -
      • -
      -

      Returns RowColumnDefinition

      -
    • -
    -
    -
    - -

    - getRowDefinition -

    - -
      -
    • -
      -

      Gets the RowColumnDefinition for a particular row in this TableLayout. - If you ask for the definition of a row at or beyond the rowCount, - it will automatically create one and return it.

      -
      -

      Parameters

      -
        -
      • -
        idx: number
        -
        -

        the non-negative zero-based integer row index.

        -
        -
      • -
      -

      Returns RowColumnDefinition

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class TableLayout Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    This Layout positions non-Link Parts into a table according to the values of +GraphObject.row, GraphObject.column, GraphObject.rowSpan, GraphObject.columnSpan, +GraphObject.alignment, GraphObject.stretch. +If the value of GraphObject.stretch is not GraphObject.None, the Part will be sized +according to the available space in the cell(s).

    +

    You can specify constraints for whole rows or columns by calling +getRowDefinition or getColumnDefinition and setting one of the following properties: +RowColumnDefinition.alignment, RowColumnDefinition.height, RowColumnDefinition.width, +RowColumnDefinition.maximum, RowColumnDefinition.minimum, RowColumnDefinition.stretch.

    +

    The defaultAlignment and defaultStretch properties apply to all parts if not specified +on the individual Part or in the corresponding row or column definition.

    +

    At the current time, there is no support for separator lines +(RowColumnDefinition.separatorStroke, RowColumnDefinition.separatorStrokeWidth, +and RowColumnDefinition.separatorDashArray properties) +nor background (RowColumnDefinition.background and RowColumnDefinition.coversSeparators properties). +There is no support for RowColumnDefinition.sizing, either.

    +

    If you want to experiment with this extension, try the Table Layout sample.

    +

    Index

    Inherited Members

    Constructors

    • +

      Create a minimal layout that only positions Nodes that do not have a location.

      +

      Parameters

      • Optional init: Partial<Layout>
        +

        Optional initialization properties.

        +

      Returns TableLayout

    Properties

    • +

      This read-only property returns the number of columns in this TableLayout. +This value is only valid after the layout has been performed.

      +
    • +

      Gets or sets the alignment to use by default for Parts in rows (vertically) and in columns (horizontally).

      +

      The default value is Spot.Default. +Setting this property does not raise any events.

      +
    • +

      Gets or sets whether Parts should be stretched in rows (vertically) and in columns (horizontally).

      +

      The default value is GraphObject.Default. +Setting this property does not raise any events.

      +
    • +

      This read-only property returns the number of rows in this TableLayout. +This value is only valid after the layout has been performed.

      +

    Methods

    • afterArrange(parts: List<Part>, rowcol: any[][][]): void
    • +

      Override this method in order to perform some operations after arranging. +By default this method does nothing.

      +

      Parameters

      Returns void

    • beforeMeasure(parts: List<Part>, rowcol: any[][][]): void
    • +

      Override this method in order to perform some operations before measuring. +By default this method does nothing.

      +

      Parameters

      Returns void

    • +

      Copies properties to a cloned Layout.

      +

      Parameters

      Returns void

    • +

      This method performs the measuring and arranging of the table, assiging positions to each part.

      +

      Parameters

      Returns void

    • findColumnForDocumentX(x: number): number
    • +

      Returns the cell at a given x-coordinate in document coordinates. +This information is only valid when this layout has been performed and Layout.isValidLayout is true.

      +

      If the point is to left of the column 0, this method returns -1. +If the point to to the right of the last column, this returns the last column + 1.

      +
      see

      findRowForDocumentY

      +

      Parameters

      • x: number

      Returns number

      a zero-based integer

      +
    • findRowForDocumentY(y: number): number
    • +

      Returns the row at a given y-coordinate in document coordinates. +This information is only valid when this layout has been performed and Layout.isValidLayout is true.

      +

      If the point is above row 0, this method returns -1. +If the point below the last row, this returns the last row + 1.

      +
      see

      findColumnForDocumentX

      +

      Parameters

      • y: number

      Returns number

      a zero-based integer

      +
    • +

      Gets the RowColumnDefinition for a particular column in this TableLayout. +If you ask for the definition of a column at or beyond the columnCount, +it will automatically create one and return it.

      +

      Parameters

      • idx: number
        +

        the non-negative zero-based integer column index.

        +

      Returns RowColumnDefinition

    • +

      Gets the RowColumnDefinition for a particular row in this TableLayout. +If you ask for the definition of a row at or beyond the rowCount, +it will automatically create one and return it.

      +

      Parameters

      • idx: number
        +

        the non-negative zero-based integer row index.

        +

      Returns RowColumnDefinition

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/TextBlock.html b/api/symbols/TextBlock.html index 7fcbae416..142c71472 100644 --- a/api/symbols/TextBlock.html +++ b/api/symbols/TextBlock.html @@ -1,1312 +1,308 @@ - - - - - - TextBlock | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class TextBlock

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    A TextBlock is a GraphObject that displays a text string in a given font.

    -

    The size and appearance of the text is specified by font, - which takes a well-formed CSS string as its value. - The order of the CSS properties given is important for cross-browser compatibility, - and should be given in this order:

    -

    "font-style font-variant font-weight font-size font-family"

    -

    For example, "Italic small-caps bold 32px Georgia, Serif" is a valid font string - using every CSS font property. Note that not all browsers may support every property.

    -

    Text is drawn using the stroke brush, which may be any CSS color string or a Brush.

    -

    Some created TextBlocks:

    -
    // A TextBlock with text and stroke properties set:
    -new go.TextBlock({ text: "Hello World", stroke: "gray" })
    -// Alternatively:
    -new go.TextBlock("Hello World", { stroke: "gray" })
    +TextBlock | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class TextBlock

    Hierarchy

    +

    A TextBlock is a GraphObject that displays a text string in a given font.

    +

    The size and appearance of the text is specified by font, +which takes a well-formed CSS string as its value. +The order of the CSS properties given is important for cross-browser compatibility, +and should be given in this order:

    +

    "font-style font-variant font-weight font-size font-family"

    +

    For example, "Italic small-caps bold 32px Georgia, Serif" is a valid font string +using every CSS font property. Note that not all browsers may support every property.

    +

    Text is drawn using the stroke brush, which may be any CSS color string or a Brush.

    +

    Some created TextBlocks:

    +
    // A TextBlock with text and stroke properties set:
    new go.TextBlock({ text: "Hello World", stroke: "gray" })
    // Alternatively:
    new go.TextBlock("Hello World", { stroke: "gray" })
    -

    TextBlocks typically receive a natural size based on their text and font strings, - but often a width is given in order to cause the text to wrap at a certain place. - In order for wrapping to occur, the wrap property must not be TextBlock.None.

    -

    TextBlocks can be edited by users using the TextEditingTool. - The HTMLInfo that a given TextBlock uses as its text editor can be customized - by setting the textEditor property. For an example of custom text editing tool use, - see the Custom TextEditingTool Sample.

    -

    - For examples of TextBlock possibilities and functionality, - see the Introduction page on TextBlocks. -

    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Constructs a TextBlock, which by default has no string to show; if it did, - it would draw the text, wrapping if needed, in the default font using a black stroke.

      -

      Typical usage:

      -
      new go.TextBlock("Hello World", { font: "12px sans-serif", stroke: "gray" })
      +

      TextBlocks typically receive a natural size based on their text and font strings, +but often a width is given in order to cause the text to wrap at a certain place. +In order for wrapping to occur, the wrap property must not be TextBlock.None.

      +

      TextBlocks can be edited by users using the TextEditingTool. +The HTMLInfo that a given TextBlock uses as its text editor can be customized +by setting the textEditor property. For an example of custom text editing tool use, +see the Custom TextEditingTool Sample.

      +

      +For examples of TextBlock possibilities and functionality, +see the Introduction page on TextBlocks.

    Index

    Inherited Members

    Properties

    Methods

    Constructors

    • +

      Constructs a TextBlock, which by default has no string to show; if it did, +it would draw the text, wrapping if needed, in the default font using a black stroke.

      +

      Typical usage:

      +
      new go.TextBlock("Hello World", { font: "12px sans-serif", stroke: "gray" })
       
      -

      It is common to data-bind the text:

      -
      // A Node used as the node template, holding a single TextBlock
      -myDiagram.nodeTemplate =
      -  new go.Node()
      -  .add(
      -    new go.TextBlock({ font: "12px sans-serif", stroke: "darkgray" })
      -    .bind("text"));
      -
      -// It could be used with model data like this:
      -myDiagram.model = new go.GraphLinksModel(
      -  [
      -     { key: "1", text: "First TextBlock" },
      -     { key: "2", text: "Second TextBlock" }
      -  ]);
      +

      It is common to data-bind the text:

      +
      // A Node used as the node template, holding a single TextBlock
      myDiagram.nodeTemplate =
      new go.Node()
      .add(
      new go.TextBlock({ font: "12px sans-serif", stroke: "darkgray" })
      .bind("text"));

      // It could be used with model data like this:
      myDiagram.model = new go.GraphLinksModel(
      [
      { key: "1", text: "First TextBlock" },
      { key: "2", text: "Second TextBlock" }
      ]);
      -
      -

      Parameters

      -
        -
      • -
        Optional text: string
        -
        -

        The textblock's text.

        -
        -
      • -
      • -
        Optional init: Partial<TextBlock>
        -
        -

        Optional initialization properties.

        -
        -
      • -
      -

      Returns TextBlock

      -
    • -
    • -
      -

      A newly constructed TextBlock has no string to show; if it did, - it would draw the text, wrapping if needed, in the default font using a black stroke.

      -
      -

      Parameters

      -
        -
      • -
        Optional init: Partial<TextBlock>
        -
        -

        Optional initialization properties.

        -
        -
      • -
      -

      Returns TextBlock

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - choices - : string[]

    -
      -
    • -
      -

      Gets or sets the an array of possible choices for a custom TextEditingTool. - The value must be an array of strings.

      -

      The default value is null. - For example usage, see the Custom TextEditingTool Sample.

      -
      -
      since
      -

      1.7

      -
      -
      -
      -
    • -
    -
    -
    - -

    - editable - : boolean

    -
      -
    • -
      -

      Gets or sets whether or not this TextBlock allows in-place editing of the text - string by the user with the help of the TextEditingTool. - The default is false.

      -

      See also Part.textEditable.

      -
      -
    • -
    -
    -
    - -

    - errorFunction - : (tool: TextEditingTool, oldString: string, newString: string) => void

    -
      -
    • -
      -

      Gets or sets the function to call if a text edit made with the TextEditingTool is invalid. - The default is null.

      -
      -
    • -
    -
    -
    - -

    - flip - : EnumValue

    - -
    -
    - -

    - font - : string

    -
      -
    • -
      -

      Gets or sets the current font settings. - The font property must be a valid CSS string describing a font. - The font string can accept several CSS properties but they must be - in a specific order in order to render correctly across all browsers:

      -

      "font-style font-variant font-weight font-size font-family"

      -

      For example, "Italic small-caps bold 32px Georgia, Serif" is a valid font string - using every CSS font property. Not every browser can render every font option. - For more information about CSS font syntax, see CSS fonts (mozilla.org).

      -

      If your Node sizes depend on TextBlocks, it is best to ensure any custom fonts you are using are finished loading before you load your Diagram. - This will ensure nodes are sized appropriately for the initial Diagram layout.

      -

      The default font is "13px sans-serif".

      -
      -
    • -
    -
    -
    - -

    - formatting - : EnumValue

    -
      -
    • -
      -

      Gets or sets the policy for trimming whitespace on each line of text.

      -

      Possible values are TextBlock.FormatTrim, which trims whitespace before and after every line of text, - or TextBlock.FormatNone, which will not trim any whitespace and may be useful for preformatted text. - The default is TextBlock.FormatTrim.

      -
      -
      since
      -

      2.2

      -
      -
      -
      -
    • -
    -
    -
    - -

    - graduatedEnd - : number

    -
      -
    • -
      -

      Gets or sets the fractional distance along the main shape of a "Graduated" Panel at which this kind of tick text should end. - The default is 1; the value should range from 0 to 1.

      -
      -
      since
      -

      1.7

      -
      -
      -
      -
    • -
    -
    -
    - -

    - graduatedFunction - : (val: number) => string

    -
      -
    • -
      -

      Gets or sets the function to convert from a value along a "Graduated" Panel to a string. - The default returns a string representing the value rounded to at most 2 decimals.

      -

      The function takes a number argument, a value between Panel.graduatedMin and Panel.graduatedMax. - The function will return a string, the text that will appear at the value of the argument.

      -
      -
      since
      -

      1.7

      -
      -
      -
      -
    • -
    -
    -
    - -

    - graduatedSkip - : (val: number) => boolean

    -
      -
    • -
      -

      Gets or sets the function to determine which values along a "Graduated" Panel will be skipped. - The default is null and doesn't skip any text labels.

      -

      The function takes a number argument, a value between Panel.graduatedMin and Panel.graduatedMax. - The function will return a boolean, whether the text label will be skipped at the value of the argument.

      -
      -
      since
      -

      2.0

      -
      -
      -
      -
    • -
    -
    -
    - -

    - graduatedStart - : number

    -
      -
    • -
      -

      Gets or sets the fractional distance along the main shape of a "Graduated" Panel at which this text should start. - The default is 0; the value should range from 0 to 1.

      -
      -
      since
      -

      1.7

      -
      -
      -
      -
    • -
    -
    -
    - -

    - interval - : number

    -
      -
    • -
      -

      Gets or sets how frequently this text should be drawn within a "Graduated" Panel, - in multiples of the Panel.graduatedTickUnit. - The default is 1. Any new value must be a positive integer.

      -
      -
      since
      -

      1.7

      -
      -
      -
      -
    • -
    -
    -
    - -

    - isMultiline - : boolean

    -
      -
    • -
      -

      Gets or sets whether or not the text displays multiple lines or embedded newlines. - If this is false, all characters including and after the first newline will be omitted. - The default is true.

      -
      -
      see
      -

      maxLines

      -
      -
      -
      -
    • -
    -
    -
    - -

    - isStrikethrough - : boolean

    -
      -
    • -
      -

      Gets or sets whether or not the text has a strikethrough line (line-through). - The default is false.

      -
      -
      see
      -

      isUnderline

      -
      -
      since
      -

      1.2

      -
      -
      -
      -
    • -
    -
    -
    - -

    - isUnderline - : boolean

    -
      -
    • -
      -

      Gets or sets whether or not the text is underlined. - The default is false.

      -
      -
      see
      -

      isStrikethrough

      -
      -
      since
      -

      1.2

      -
      -
      -
      -
    • -
    -
    -
    - -

    - Read-only - lineCount - : number

    -
      -
    • -
      -

      This read-only property returns the total number of lines in this TextBlock, including lines created - from embedded newlines (\n), wrapping, and maxLines.

      -

      This value may be meaningless before the TextBlock is measured.

      -
      -
      see
      -

      lineHeight

      -
      -
      -
      -
    • -
    -
    -
    - -

    - Read-only - lineHeight - : number

    -
      -
    • -
      -

      This read-only property returns the height of a line of text in this TextBlock, not including any spacingAbove or spacingBelow.

      -

      This value may be meaningless before the TextBlock is measured.

      -
      -
      since
      -

      2.2

      -
      -
      see
      -

      lineCount

      -
      -
      -
      -
    • -
    -
    -
    - -

    - maxLines - : number

    -
      -
    • -
      -

      Gets or sets the maximum number of lines that this TextBlock can display. - Value must be a greater than zero whole number or Infinity. - The default is Infinity.

      -

      Modifying this value may modify the computed height of the TextBlock. - If maxLines is set, the value of lineCount will never be larger than maxLines.

      -
      -
      see
      -

      isMultiline

      -
      -
      since
      -

      1.5

      -
      -
      -
      -
    • -
    -
    -
    - -

    - Override - Read-only - naturalBounds - : Rect

    -
      -
    • -
      -

      This read-only property returns the natural bounds of this TextBlock in local coordinates, - as determined by its font and text string, and optionally its desiredSize.

      -
      -
    • -
    -
    -
    - -

    - overflow - : EnumValue

    - -
    -
    - -

    - spacingAbove - : number

    -
      -
    • -
      -

      Gets or sets additional spacing above each line of text. - The default is zero. The value may be negative.

      -

      This can be useful when you need to adjust the font spacing on - custom fonts or monospace fonts to suit your needs.

      -
      -
      since
      -

      2.2

      -
      -
      -
      -
    • -
    -
    -
    - -

    - spacingBelow - : number

    -
      -
    • -
      -

      Gets or sets additional spacing below each line of text. - The default is zero. The value may be negative.

      -

      This can be useful when you need to adjust the font spacing on - custom fonts or monospace fonts to suit your needs.

      -
      -
      since
      -

      2.2

      -
      -
      -
      -
    • -
    -
    -
    - -

    - stroke - : BrushLike

    -
      -
    • -
      -

      Gets or sets the Brush or string that describes the stroke (color) of the text that is drawn.

      -

      The default value is "black". - Any valid CSS string can specify a solid color, and the Brush - class can be used to specify a gradient or pattern. - More information about the syntax of CSS color strings is available at: - CSS colors (mozilla.org).

      -
      -
    • -
    -
    -
    - -

    - text - : string

    -
      -
    • -
      -

      Gets or sets the TextBlock's text string. The default is an empty string. - The text of a TextBlock, along with the values of font, wrap, - isMultiline and sizing restrictions are what naturally determine - the size of the TextBlock.

      -

      The text in textblocks can include manual line-breaks by using the character escape, \n.

      -

      Leading and trailing whitespace is eliminated in each line of TextBlock text.

      -

      If editable is set to true, users can edit textblocks with the TextEditingTool.

      -
      -
    • -
    -
    -
    - -

    - textAlign - : "left" | "right" | "center" | "end" | "start"

    -
      -
    • -
      -

      Gets or sets the alignment location in the TextBlock's given space. - The only possible values are "start", "end", "left", "right", and "center". - Any other value is invalid.

      -

      This property is most pertinent when the TextBlock has multiple lines of text, - or when the TextBlock is given a size that differs from the text's natural size (such as with desiredSize).

      -

      In left-to-right writing systems, "start" and "left" are synonymous, as are "end" and "right".

      -

      The default is "start".

      -
      -
      see
      -

      verticalAlignment

      -
      -
      -
      -
    • -
    -
    -
    - -

    - textEdited - : (thisTextBlock: TextBlock, oldString: string, newString: string) => void

    -
      -
    • -
      -

      Gets or sets the function that is called after the TextBlock's text has been edited by the TextEditingTool.

      -
        -
      • The first argument is a reference to this TextBlock.
      • -
      • The second argument is the previous text, before editing.
      • -
      • The third argument is the current text, which is also TextBlock.text.
      • -
      -
      function(textBlock, previousText, currentText)
      +

    Parameters

    • Optional text: string
      +

      The textblock's text.

      +
    • Optional init: Partial<TextBlock>
      +

      Optional initialization properties.

      +

    Returns TextBlock

  • +

    A newly constructed TextBlock has no string to show; if it did, +it would draw the text, wrapping if needed, in the default font using a black stroke.

    +

    Parameters

    • Optional init: Partial<TextBlock>
      +

      Optional initialization properties.

      +

    Returns TextBlock

  • Properties

    • +

      Gets or sets whether or not this TextBlock allows in-place editing of the text +string by the user with the help of the TextEditingTool. +The default is false.

      +

      See also Part.textEditable.

      +
    • +

      Gets or sets the function to call if a text edit made with the TextEditingTool is invalid. +The default is null.

      +
    • +

      Gets or sets the current font settings. +The font property must be a valid CSS string describing a font. +The font string can accept several CSS properties but they must be +in a specific order in order to render correctly across all browsers:

      +

      "font-style font-variant font-weight font-size font-family"

      +

      For example, "Italic small-caps bold 32px Georgia, Serif" is a valid font string +using every CSS font property. Not every browser can render every font option. +For more information about CSS font syntax, see CSS fonts (mozilla.org).

      +

      If your Node sizes depend on TextBlocks, it is best to ensure any custom fonts you are using are finished loading before you load your Diagram. +This will ensure nodes are sized appropriately for the initial Diagram layout.

      +

      The default font is "13px sans-serif".

      +
    • +

      Gets or sets the policy for trimming whitespace on each line of text.

      +

      Possible values are TextBlock.FormatTrim, which trims whitespace before and after every line of text, +or TextBlock.FormatNone, which will not trim any whitespace and may be useful for preformatted text. +The default is TextBlock.FormatTrim.

      +
      since

      2.2

      +
    • +

      Gets or sets the fractional distance along the main shape of a "Graduated" Panel at which this kind of tick text should end. +The default is 1; the value should range from 0 to 1.

      +
      since

      1.7

      +
    • +

      Gets or sets the function to convert from a value along a "Graduated" Panel to a string. +The default returns a string representing the value rounded to at most 2 decimals.

      +

      The function takes a number argument, a value between Panel.graduatedMin and Panel.graduatedMax. +The function will return a string, the text that will appear at the value of the argument.

      +
      since

      1.7

      +
    • +

      Gets or sets the function to determine which values along a "Graduated" Panel will be skipped. +The default is null and doesn't skip any text labels.

      +

      The function takes a number argument, a value between Panel.graduatedMin and Panel.graduatedMax. +The function will return a boolean, whether the text label will be skipped at the value of the argument.

      +
      since

      2.0

      +
    • +

      Gets or sets the fractional distance along the main shape of a "Graduated" Panel at which this text should start. +The default is 0; the value should range from 0 to 1.

      +
      since

      1.7

      +
    • +

      Gets or sets how frequently this text should be drawn within a "Graduated" Panel, +in multiples of the Panel.graduatedTickUnit. +The default is 1. Any new value must be a positive integer.

      +
      since

      1.7

      +
    • +

      Gets or sets whether or not the text displays multiple lines or embedded newlines. +If this is false, all characters including and after the first newline will be omitted. +The default is true.

      +
      see

      maxLines

      +
    • +

      Gets or sets whether or not the text has a strikethrough line (line-through). +The default is false.

      +
      see

      isUnderline

      +
      since

      1.2

      +
    • +

      Gets or sets whether or not the text is underlined. +The default is false.

      +
      see

      isStrikethrough

      +
      since

      1.2

      +
    • +

      This read-only property returns the total number of lines in this TextBlock, including lines created +from embedded newlines (\n), wrapping, and maxLines.

      +

      This value may be meaningless before the TextBlock is measured.

      +
      see

      lineHeight

      +
    • +

      This read-only property returns the height of a line of text in this TextBlock, not including any spacingAbove or spacingBelow.

      +

      This value may be meaningless before the TextBlock is measured.

      +
      since

      2.2

      +
      see

      lineCount

      +
    • +

      Gets or sets the maximum number of lines that this TextBlock can display. +Value must be a greater than zero whole number or Infinity. +The default is Infinity.

      +

      Modifying this value may modify the computed height of the TextBlock. +If maxLines is set, the value of lineCount will never be larger than maxLines.

      +
      see

      isMultiline

      +
      since

      1.5

      +
    • +

      This read-only property returns the natural bounds of this TextBlock in local coordinates, +as determined by its font and text string, and optionally its desiredSize.

      +
    • +

      Gets or sets additional spacing above each line of text. +The default is zero. The value may be negative.

      +

      This can be useful when you need to adjust the font spacing on +custom fonts or monospace fonts to suit your needs.

      +
      since

      2.2

      +
    • +

      Gets or sets additional spacing below each line of text. +The default is zero. The value may be negative.

      +

      This can be useful when you need to adjust the font spacing on +custom fonts or monospace fonts to suit your needs.

      +
      since

      2.2

      +
    • +

      Gets or sets the Brush or string that describes the stroke (color) of the text that is drawn.

      +

      The default value is "black". +Any valid CSS string can specify a solid color, and the Brush +class can be used to specify a gradient or pattern. +More information about the syntax of CSS color strings is available at: +CSS colors (mozilla.org).

      +
    • +

      Gets or sets the TextBlock's text string. The default is an empty string. +The text of a TextBlock, along with the values of font, wrap, +isMultiline and sizing restrictions are what naturally determine +the size of the TextBlock.

      +

      The text in textblocks can include manual line-breaks by using the character escape, \n.

      +

      Leading and trailing whitespace is eliminated in each line of TextBlock text.

      +

      If editable is set to true, users can edit textblocks with the TextEditingTool.

      +
    • +

      Gets or sets the alignment location in the TextBlock's given space. +The only possible values are "start", "end", "left", "right", and "center". +Any other value is invalid.

      +

      This property is most pertinent when the TextBlock has multiple lines of text, +or when the TextBlock is given a size that differs from the text's natural size (such as with desiredSize).

      +

      In left-to-right writing systems, "start" and "left" are synonymous, as are "end" and "right".

      +

      The default is "start".

      +
      see

      verticalAlignment

      +
    • +

      Gets or sets the function that is called after the TextBlock's text has been edited by the TextEditingTool.

      +
        +
      • The first argument is a reference to this TextBlock.
      • +
      • The second argument is the previous text, before editing.
      • +
      • The third argument is the current text, which is also TextBlock.text.
      • +
      +
      function(textBlock, previousText, currentText)
       
      -

      The default value is null -- no function is called.

      -
      -
      since
      -

      1.7

      -
      -
      -
      -
    • -
    -
    -
    - -

    - textEditor - : HTMLInfo

    -
      -
    • -
      -

      Gets or sets the HTMLInfo that this TextBlock uses as its text editor in the TextEditingTool. - If null, the TextBlock will use the default text editor of the TextEditingTool. - The default is null. - The value should be set to an instance of HTMLInfo. - Setting this property might not affect any ongoing text editing operation.

      -

      As of 2.0 setting this to an HTML Element is no longer supported.

      -

      For example usage, see the Custom TextEditingTool Sample.

      -
      -
    • -
    -
    -
    - -

    - textValidation - : (thisTextBlock: TextBlock, oldString: string, newString: string) => boolean

    -
      -
    • -
      -

      Gets or sets the predicate that determines whether or not a user-edited string of text is valid. - If this is non-null, the predicate is called in addition to any TextEditingTool.textValidation predicate. - See TextEditingTool.isValidText for more details.

      -
      function(textBlock, oldString, newString)
      +

      The default value is null -- no function is called.

      +
      since

      1.7

      +
    • +

      Gets or sets the HTMLInfo that this TextBlock uses as its text editor in the TextEditingTool. +If null, the TextBlock will use the default text editor of the TextEditingTool. +The default is null. +The value should be set to an instance of HTMLInfo. +Setting this property might not affect any ongoing text editing operation.

      +

      As of 2.0 setting this to an HTML Element is no longer supported.

      +

      For example usage, see the Custom TextEditingTool Sample.

      +
    • +

      Gets or sets the predicate that determines whether or not a user-edited string of text is valid. +If this is non-null, the predicate is called in addition to any TextEditingTool.textValidation predicate. +See TextEditingTool.isValidText for more details.

      +
      function(textBlock, oldString, newString)
       
      -

      The default predicate is null, which is equivalent to simply returning true.

      -

      The function, if supplied, must not have any side-effects, and must return true or false.

      -
      -
      see
      -

      TextEditingTool.textValidation

      -
      -
      -
      -
    • -
    -
    -
    - -

    - verticalAlignment - : Spot

    -
      -
    • -
      -

      Gets or sets the vertical alignment Spot of this TextBlock, used when - the TextBlock has more available vertical space than it needs to draw all lines.

      -

      The default value is Spot.Top, which aligns the TextBlock to the top of its available space.

      -

      The textAlign is often used along with this property to specify - where the should be positioned in its available space.

      -

      This does not affect TextBlock coordinates or bounds, it only affects where text is drawn within the given area.

      -
      -
      see
      -

      textAlign

      -
      -
      since
      -

      1.7

      -
      -
      -
      -
    • -
    -
    -
    - -

    - wrap - : EnumValue

    - -
    - -
    -

    Methods

    -
    - -

    - Static - getBaseline -

    -
      -
    • getBaseline(): (textBlock: TextBlock, textHeight: number) => number
    • -
    -
      -
    • -
      -

      Gets the function that, given the TextBlock and numerical text height, computes the position to draw the baseline of a line of text in all TextBlocks. - By default this is null and default behavior returns (textHeight * 0.75).

      -

      This computation affects drawing only, and does not change TextBlock measurement calculations.

      -
      -
      since
      -

      2.0

      -
      -
      -
      -

      Returns (textBlock: TextBlock, textHeight: number) => number

      -
        -
      -
    • -
    -
    -
    - -

    - Static - getUnderline -

    -
      -
    • getUnderline(): (textBlock: TextBlock, textHeight: number) => number
    • -
    -
      -
    • -
      -

      Gets the function that, given the TextBlock and numerical text height, computes the position to draw the underline of a line of text in all TextBlocks. - By default this is null and default behavior returns (textHeight * 0.75).

      -

      This computation affects drawing only, and does not change TextBlock measurement calculations.

      -
      -
      since
      -

      2.0

      -
      -
      -
      -

      Returns (textBlock: TextBlock, textHeight: number) => number

      -
        -
      -
    • -
    -
    -
    - -

    - Static - setBaseline -

    -
      -
    • setBaseline(value: (textBlock: TextBlock, textHeight: number) => number): void
    • -
    -
      -
    • -
      -

      Sets the function that, given the TextBlock and numerical text height, computes the position to draw the baseline of a line of text in all TextBlocks.

      -

      This computation affects drawing only, and does not change TextBlock measurement calculations. - It is expected this method will be called before or during initialization of any Diagram. - Diagrams will not redraw when this method has been called, - and you should call Diagram.redraw() if you are calling this method outside of your initialization.

      -
      -
      since
      -

      2.0

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        value: (textBlock: TextBlock, textHeight: number) => number
        -
          -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Static - setUnderline -

    -
      -
    • setUnderline(value: (textBlock: TextBlock, textHeight: number) => number): void
    • -
    -
      -
    • -
      -

      Sets the function that, given the TextBlock and numerical text height, computes the position to draw the underline of a line of text in all TextBlocks.

      -

      This computation affects drawing only, and does not change TextBlock measurement calculations. - It is expected this method will be called before or during initialization of any Diagram. - Diagrams will not redraw when this method has been called, - and you should call Diagram.redraw() if you are calling this method outside of your initialization.

      -
      -
      since
      -

      2.0

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        value: (textBlock: TextBlock, textHeight: number) => number
        -
          -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    -

    Constants

    -
    - -

    - Static - FormatNone - : EnumValue

    -
    -

    Used as a value for TextBlock.formatting: the TextBlock will not trim any whitespace at the start - or end of each line of text. This can be useful if your text is preformatted.

    -
    -
    since
    -

    2.2

    -
    -
    -
    -
    -
    - -

    - Static - FormatTrim - : EnumValue

    -
    -

    Used as the default value for TextBlock.formatting: the TextBlock will automatically trim any whitespace at the start - or end of each line of text.

    -
    -
    since
    -

    2.2

    -
    -
    -
    -
    -
    - -

    - Static Override - None - : EnumValue

    -
    -

    Used as a value for TextBlock.wrap, the TextBlock will not wrap its text.

    -
    -
    -
    - -

    - Static - OverflowClip - : EnumValue

    -
    -

    Used as the default value for TextBlock.overflow: if the width is too small to display all text, - the TextBlock will clip.

    -
    -
    since
    -

    1.4

    -
    -
    -
    -
    -
    - -

    - Static - OverflowEllipsis - : EnumValue

    -
    -

    Used as a value for TextBlock.overflow: if the width is too small to display all text, - the TextBlock will display an ellipsis.

    -
    -
    since
    -

    1.4

    -
    -
    -
    -
    -
    - -

    - Static - WrapBreakAll - : EnumValue

    -
    -

    Used a a value for TextBlock.wrap, the TextBlock will attempt to wrap at each character, allowing - breaks within "words."

    -
    -
    since
    -

    2.0

    -
    -
    -
    -
    -
    - -

    - Static - WrapDesiredSize - : EnumValue

    -
    -

    Used as the default value for TextBlock.wrap, the TextBlock will wrap text and the width of - the TextBlock will be the desiredSize's width, if any.

    -
    -
    -
    - -

    - Static - WrapFit - : EnumValue

    -
    -

    Used as a value for TextBlock.wrap, the TextBlock will wrap text, making the width of - the TextBlock equal to the width of the longest line.

    -
    -
    -
    -
    - - - -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/TextEditingTool.html b/api/symbols/TextEditingTool.html index 8c52f3cb3..e24879611 100644 --- a/api/symbols/TextEditingTool.html +++ b/api/symbols/TextEditingTool.html @@ -1,983 +1,221 @@ - - - - - - TextEditingTool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class TextEditingTool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - Tool -
        -
      • - TextEditingTool -
      • -
      -
    • -
    -
    -
    -
    -

    The TextEditingTool is used to let the user interactively edit text in place. - This sets the TextBlock.text property; you may want to save the changed text to the model - by using a TwoWay Binding on the "text" property of editable TextBlocks.

    -

    Typically this is used by setting the TextBlock.editable property to true - on a particular TextBlock in a part. - When the part is selected and the user clicks on the TextBlock - or invokes the CommandHandler.editTextBlock command, - this tool is started and it uses an HTMLTextArea to perform in-place text editing. - (For more details see the description for TextEditingTool.doActivate.)

    -

    The TextBlock is accessible as the TextEditingTool.textBlock property. - The text editor is accessible as the TextEditingTool.currentTextEditor property. - From the text editor control one can access the TextBlock being edited via the - 'textEditingTool' property to get to this tool, from which one can use - the TextEditingTool.textBlock property.

    -

    You can disable mouse clicking from starting this text editing tool - by setting Tool.isEnabled to false. - You can disable the F2 key from starting this text editing tool - by making sure Part.canEdit returns false, - by either setting Diagram.allowTextEdit to false - or by setting Part.textEditable to false.

    -

    If you want to programmatically start the user editing a particular TextBlock, - call CommandHandler.editTextBlock. - That command method is also invoked by the F2 key on the keyboard.

    -

    - For a general discussion of text editing validation, see: Introduction to Text Validation. - For customizing the TextEditingTool, read about HTMLInfo and see Introduction to Text Editors. -

    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - currentTextEditor - : HTMLInfo

    -
      -
    • -
      -

      Gets or sets the HTMLInfo that is editing the text.

      -
      -
    • -
    -
    -
    - -

    - defaultTextEditor - : HTMLInfo

    - -
    -
    - -

    - selectsTextOnActivate - : boolean

    -
      -
    • -
      -

      Gets or sets whether to select (highlight) the editable text when the TextEditingTool is activated. - The default is true.

      -
      -
      since
      -

      1.5

      -
      -
      -
      -
    • -
    -
    -
    - -

    - starting - : EnumValue

    - -
    -
    - -

    - state - : EnumValue

    - -
    -
    - -

    - textBlock - : TextBlock

    - -
    -
    - -

    - textValidation - : (aTextBlock: TextBlock, oldString: string, newString: string) => boolean

    -
      -
    • -
      -

      Gets or sets the predicate that determines whether or not a string of text is valid. - If this is non-null, this predicate is called in addition to any TextBlock.textValidation predicate. - See isValidText for more details. - The default predicate is null, which is equivalent to simply returning true.

      -

      The function, if supplied, must not have any side-effects.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Virtual - acceptText -

    -
      -
    • acceptText(reason: EnumValue): void
    • -
    - -
    -
    - -

    - Override Virtual - canStart -

    -
      -
    • canStart(): boolean
    • -
    -
      -
    • -
      -

      This may run when there is a mouse-click on a TextBlock for which the - TextBlock.editable property is true in a Part - that Part.isSelected.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Override - doActivate -

    -
      -
    • doActivate(): void
    • -
    - -
    -
    - -

    - Override - doCancel -

    -
      -
    • doCancel(): void
    • -
    -
      -
    • -
      -

      Abort any text editing operation.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doDeactivate -

    -
      -
    • doDeactivate(): void
    • -
    - -
    -
    - -

    - Virtual - doError -

    -
      -
    • doError(oldstring: string, newstring: string): void
    • -
    -
      -
    • -
      -

      Call the textBlock's TextBlock.errorFunction, if there is one, - and then show the text editor again. - This is called only when the isValidText method returned false. - The value of state will be StateInvalid. - This method may be overridden. - You may wish to override this method in order to not continue showing the editor.

      -
      -
      since
      -

      2.1

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        oldstring: string
        -
      • -
      • -
        newstring: string
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doMouseDown -

    -
      -
    • doMouseDown(): void
    • -
    - -
    -
    - -

    - Override - doMouseUp -

    -
      -
    • doMouseUp(): void
    • -
    - -
    -
    - -

    - Override - doStart -

    -
      -
    • doStart(): void
    • -
    - -
    -
    - -

    - Virtual - doSuccess -

    -
      -
    • doSuccess(oldstring: string, newstring: string): void
    • -
    -
      -
    • -
      -

      Call the textBlock's TextBlock.textEdited event handler, if there is one. - This is called just after the TextBlock.text has been set to the new string value. - When this method returns, this tool raises the "TextEdited" DiagramEvent - and commits the transaction. - This method may be overridden.

      -
      -
      since
      -

      2.1

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        oldstring: string
        -
      • -
      • -
        newstring: string
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - isValidText -

    -
      -
    • isValidText(textblock: TextBlock, oldstr: string, newstr: string): boolean
    • -
    -
      -
    • -
      -

      This predicate checks any TextBlock.textValidation predicate and - this tool's textValidation predicate to make sure the TextBlock.text - property may be set to the new string.

      -

      This method may be overridden, although usually it is sufficient to set textValidation. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      -
        -
      • -
        textblock: TextBlock
        -
        -

        the TextBlock that is being edited.

        -
        -
      • -
      • -
        oldstr: string
        -
        -

        the previous string value.

        -
        -
      • -
      • -
        newstr: string
        -
        -

        the proposed new string value.

        -
        -
      • -
      -

      Returns boolean

      -

      true if the new string is valid for the given TextBlock.

      -
    • -
    -
    -
    - -

    - measureTemporaryTextBlock -

    -
      -
    • measureTemporaryTextBlock(text: string): TextBlock
    • -
    -
      -
    • -
      -

      This method returns a temporary TextBlock used for measuring text during editing. - The TextBlock.text is set to the parameter's value, - and the TextBlock is measured with the last available width of the textBlock.

      -

      Text editors can use the GraphObject.measuredBounds and TextBlock.lineCount - to determine a reasonable size for their text areas.

      -
      -
      since
      -

      1.7

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        text: string
        -
        -

        the text to measure

        -
        -
      • -
      -

      Returns TextBlock

      -
    • -
    -
    -
    -
    -

    Constants

    -
    - -

    - Static - DoubleClick - : EnumValue

    -
    -

    A possible value for TextEditingTool.starting, - A double click on a TextBlock with TextBlock.editable property set to true - will start in-place editing.

    -
    -
    -
    - -

    - Static - Enter - : EnumValue

    -
    -

    A possible value for TextEditingTool.acceptText, the user has typed ENTER.

    -
    -
    -
    - -

    - Static - LostFocus - : EnumValue

    -
    -

    A possible value for TextEditingTool.acceptText, the text editing control has lost focus.

    -
    -
    -
    - -

    - Static - MouseDown - : EnumValue

    -
    -

    A possible value for TextEditingTool.acceptText, the user has clicked somewhere else in the diagram.

    -
    -
    -
    - -

    - Static - SingleClick - : EnumValue

    -
    -

    A possible value for TextEditingTool.starting, - A single click on a TextBlock with TextBlock.editable property set to true - will start in-place editing.

    -
    -
    -
    - -

    - Static - SingleClickSelected - : EnumValue

    -
    -

    A possible value for TextEditingTool.starting, - A single click on a TextBlock with TextBlock.editable property set to true - will start in-place editing, but only if the Part that the TextBlock is in is already selected.

    -
    -
    -
    - -

    - Static - StateActive - : EnumValue

    -
    -

    A possible value for state, - TextEditingTool.doActivate sets the value of state to this.

    -
    -
    -
    - -

    - Static - StateEditing - : EnumValue

    -
    -

    A possible value for state, - The default text editor receiving focus sets the value of state to this.

    -
    -
    -
    - -

    - Static - StateInvalid - : EnumValue

    -
    -

    A possible value for state, - If validation fails, TextEditingTool.acceptText sets the value of state to this.

    -
    -
    -
    - -

    - Static - StateNone - : EnumValue

    -
    -

    A possible value for state, - this is the starting value before the tool is activated.

    -
    -
    -
    - -

    - Static - StateValidated - : EnumValue

    -
    -

    A possible value for state, - Once accepted and the tool begins the "TextEditing" transaction, the value of state is set to this.

    -
    -
    -
    - -

    - Static - StateValidating - : EnumValue

    -
    -

    A possible value for state, - TextEditingTool.acceptText sets the value of state to this.

    -
    -
    -
    - -

    - Static - Tab - : EnumValue

    -
    -

    A possible value for TextEditingTool.acceptText, the user has typed TAB.

    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class TextEditingTool

    Hierarchy

    +

    The TextEditingTool is used to let the user interactively edit text in place. +This sets the TextBlock.text property; you may want to save the changed text to the model +by using a TwoWay Binding on the "text" property of editable TextBlocks.

    +

    Typically this is used by setting the TextBlock.editable property to true +on a particular TextBlock in a part. +When the part is selected and the user clicks on the TextBlock +or invokes the CommandHandler.editTextBlock command, +this tool is started and it uses an HTMLTextArea to perform in-place text editing. +(For more details see the description for TextEditingTool.doActivate.)

    +

    The TextBlock is accessible as the TextEditingTool.textBlock property. +The text editor is accessible as the TextEditingTool.currentTextEditor property. +From the text editor control one can access the TextBlock being edited via the +'textEditingTool' property to get to this tool, from which one can use +the TextEditingTool.textBlock property.

    +

    You can disable mouse clicking from starting this text editing tool +by setting Tool.isEnabled to false. +You can disable the F2 key from starting this text editing tool +by making sure Part.canEdit returns false, +by either setting Diagram.allowTextEdit to false +or by setting Part.textEditable to false.

    +

    If you want to programmatically start the user editing a particular TextBlock, +call CommandHandler.editTextBlock. +That command method is also invoked by the F2 key on the keyboard.

    +

    +For a general discussion of text editing validation, see: Introduction to Text Validation. +For customizing the TextEditingTool, read about HTMLInfo and see Introduction to Text Editors.

    Index

    Inherited Members

    Constructors

    Properties

    • +

      Gets or sets the HTMLInfo that is editing the text.

      +
    • +

      Gets or sets whether to select (highlight) the editable text when the TextEditingTool is activated. +The default is true.

      +
      since

      1.5

      +
    • +

      Gets or sets the predicate that determines whether or not a string of text is valid. +If this is non-null, this predicate is called in addition to any TextBlock.textValidation predicate. +See isValidText for more details. +The default predicate is null, which is equivalent to simply returning true.

      +

      The function, if supplied, must not have any side-effects.

      +

    Methods

    • acceptText(reason: EnumValue): void
    • canStart(): boolean
    • +

      This may run when there is a mouse-click on a TextBlock for which the +TextBlock.editable property is true in a Part +that Part.isSelected.

      +

      This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns boolean

    • doActivate(): void
    • doCancel(): void
    • +

      Abort any text editing operation.

      +

      Returns void

    • doDeactivate(): void
    • doError(oldstring: string, newstring: string): void
    • +

      Call the textBlock's TextBlock.errorFunction, if there is one, +and then show the text editor again. +This is called only when the isValidText method returned false. +The value of state will be StateInvalid. +This method may be overridden. +You may wish to override this method in order to not continue showing the editor.

      +
      since

      2.1

      +

      Parameters

      • oldstring: string
      • newstring: string

      Returns void

    • doMouseDown(): void
    • doMouseUp(): void
    • doStart(): void
    • doSuccess(oldstring: string, newstring: string): void
    • +

      Call the textBlock's TextBlock.textEdited event handler, if there is one. +This is called just after the TextBlock.text has been set to the new string value. +When this method returns, this tool raises the "TextEdited" DiagramEvent +and commits the transaction. +This method may be overridden.

      +
      since

      2.1

      +

      Parameters

      • oldstring: string
      • newstring: string

      Returns void

    • isValidText(textblock: TextBlock, oldstr: string, newstr: string): boolean
    • +

      This predicate checks any TextBlock.textValidation predicate and +this tool's textValidation predicate to make sure the TextBlock.text +property may be set to the new string.

      +

      This method may be overridden, although usually it is sufficient to set textValidation. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Parameters

      • textblock: TextBlock
        +

        the TextBlock that is being edited.

        +
      • oldstr: string
        +

        the previous string value.

        +
      • newstr: string
        +

        the proposed new string value.

        +

      Returns boolean

      true if the new string is valid for the given TextBlock.

      +
    • measureTemporaryTextBlock(text: string): TextBlock
    • +

      This method returns a temporary TextBlock used for measuring text during editing. +The TextBlock.text is set to the parameter's value, +and the TextBlock is measured with the last available width of the textBlock.

      +

      Text editors can use the GraphObject.measuredBounds and TextBlock.lineCount +to determine a reasonable size for their text areas.

      +
      since

      1.7

      +

      Parameters

      • text: string
        +

        the text to measure

        +

      Returns TextBlock

    Constants

    +

    A possible value for TextEditingTool.starting, +A double click on a TextBlock with TextBlock.editable property set to true +will start in-place editing.

    +
    +

    A possible value for TextEditingTool.acceptText, the user has typed ENTER.

    +
    +

    A possible value for TextEditingTool.acceptText, the text editing control has lost focus.

    +
    +

    A possible value for TextEditingTool.acceptText, the user has clicked somewhere else in the diagram.

    +
    +

    A possible value for TextEditingTool.starting, +A single click on a TextBlock with TextBlock.editable property set to true +will start in-place editing.

    +
    +

    A possible value for TextEditingTool.starting, +A single click on a TextBlock with TextBlock.editable property set to true +will start in-place editing, but only if the Part that the TextBlock is in is already selected.

    +
    +

    A possible value for state, +TextEditingTool.doActivate sets the value of state to this.

    +
    +

    A possible value for state, +The default text editor receiving focus sets the value of state to this.

    +
    +

    A possible value for state, +If validation fails, TextEditingTool.acceptText sets the value of state to this.

    +
    +

    A possible value for state, +this is the starting value before the tool is activated.

    +
    +

    A possible value for state, +Once accepted and the tool begins the "TextEditing" transaction, the value of state is set to this.

    +
    +

    A possible value for state, +TextEditingTool.acceptText sets the value of state to this.

    +
    +

    A possible value for TextEditingTool.acceptText, the user has typed TAB.

    +

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Tool.html b/api/symbols/Tool.html index 14919500d..9f378f274 100644 --- a/api/symbols/Tool.html +++ b/api/symbols/Tool.html @@ -1,1458 +1,466 @@ - - - - - - Tool | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class Tool

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    Tools handle mouse, keyboard, and touch events. - The currently running tool, Diagram.currentTool, receives all input events from the Diagram - via canonicalized InputEvents.

    -

    - For more discussion, see Introduction to Tools. - See samples that make use of tools in the samples index. -

    Most tools are "mode-less" tools that are managed by the ToolManager, - which chooses the current tool based on the kind and position of the mouse event and the parts in the diagram. - The ToolManager has properties holding instances of most of the pre-defined Tool classes. - These classes include:

    - -

    The ToolManager chooses a tool to run as the diagram's current tool by finding in its lists of tools the first tool - whose canStart method returns true. The ToolManager then sets Diagram.currentTool to be that tool.

    -

    A tool is in the "running" state when it is the value of Diagram.currentTool. - The Diagram.currentTool property setter will call doStop on the old tool - and then call doStart on the new tool.

    -

    A tool can then go into the "active" state once it decides it can actually do something. - This happens with a call to doActivate, normally called by the ToolManager. - Later it is deactivated (doDeactivate) and then stopped. - isActive should be true when the tool is "active". - Often tools should ignore certain common events, such as calls to doMouseMove, - unless the tool isActive.

    -

    You can prevent a "mode-less" tool (i.e. one managed by the ToolManager) - from being started by the ToolManager by setting isEnabled to false.

    -

    You can also go into a particular "mode" by setting Diagram.currentTool explicitly, - thereby circumventing the normal operation of the ToolManager. - This ignores the isEnabled property and does not call the canStart predicate. - The behavior will depend on the tool -- not all of the predefined tools support operating as a "modal" tool.

    -

    Tools cannot be shared amongst multiple Diagrams.

    -

    If you define a Tool subclass, you may override any of the methods whose names start with "do" - and any other methods that are documented to be overridable, such as canStart. - However you must seriously consider calling the base method in order to gets its default behavior. - There may be situations where not calling the base method may cause subtle bugs. - But that depends on the method and the tool. - Please read the Introduction page on Extensions for how to override methods and how to call the base method.

    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    -
      -
    • new Tool(): Tool
    • -
    -
      -
    • -
      -

      Don't construct this directly -- this is an abstract class.

      -
      -

      Returns Tool

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - diagram - : Diagram

    -
      -
    • -
      -

      This read-only property returns the Diagram that owns this tool and - for which this tool is handling input events.

      -
      -
    • -
    -
    -
    - -

    - isActive - : boolean

    -
      -
    • -
      -

      Gets or sets whether this tool is started and is actively doing something.

      -

      You can set this to true after your tool is started (i.e. when it is the - Diagram.currentTool and doStart - had been called), but when it is not yet in a state - that it is actually "doing" something, because it is waiting for the right - circumstances. This is typically only important when the tool is used in - a modal fashion.

      -

      The default value is false. - This is normally set by doActivate and doDeactivate.

      -
      -
    • -
    -
    -
    - -

    - isEnabled - : boolean

    -
      -
    • -
      -

      Gets or sets whether this tool can be started by a mouse event.

      -

      Set this to false to prevent canStart from returning true. - Setting this property to false should prevent this tool from being used in a mode-less fashion - by the ToolManager with a mouse down/move/up event. - However, even when this property is false, this tool can still be used in a modal fashion: - it can still be started by explicitly setting the - Diagram.currentTool property to this tool.

      -

      The default value is true.

      -
      -
    • -
    -
    -
    - -

    - name - : string

    -
      -
    • -
      -

      Gets or sets the name of this tool. - The default name is an empty string, - but the constructor for each instance of a subclass of Tool will initialize it appropriately. - For example, the name of the DragSelectingTool is "DragSelecting".

      -

      This name is sometimes used by tools that use Adornments as the Part.category for their Adornments. - It is also sometimes used by tools that conduct transactions as the transaction name.

      -
      -
    • -
    -
    -
    - -

    - transactionResult - : string

    -
      -
    • -
      -

      Gets or sets the name of the transaction to be committed by stopTransaction

      -

      If null, the transaction will be rolled back.

      -

      If this is non-null at the time of a call to stopTransaction, - it calls Diagram.commitTransaction with this transaction name; - if this is null at that time, it calls Diagram.rollbackTransaction.

      -

      The default value is null; startTransaction will also set this to null. - Because a value of null when stopTransaction is called will rollback the transaction, - it is important that your code sets this property to a non-null value when it thinks it has succeeded.

      -

      This property exists so that no matter what execution path occurs to end the usage of a tool, - any ongoing transaction can be properly committed or rolled-back. - Many tools call startTransaction and stopTransaction; thus they set this property - for their transaction to be committed. - doCancel also sets this property to null.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Virtual - canStart -

    -
      -
    • canStart(): boolean
    • -
    -
      -
    • -
      -

      This predicate is used by the ToolManager to decide if this tool can be started mode-lessly - by mouse and touch events. - Implementations of this method can look at Diagram.lastInput to get the mouse - event and input state.

      -

      By default this method returns isEnabled. - This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns boolean

      -

      true if isEnabled is true and - if the Diagram.toolManager can make this tool the Diagram.currentTool and - then call the doStart method.

      -
    • -
    -
    -
    - -

    - Virtual - canStartMultiTouch -

    -
      -
    • canStartMultiTouch(): boolean
    • -
    - -
    -
    - -

    - Virtual - cancelWaitAfter -

    -
      -
    • cancelWaitAfter(): void
    • -
    -
      -
    • -
      -

      This is called to cancel any running "WaitAfter" timer.

      -

      This is called when a tool is stopped.

      -

      This method is rarely overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - doActivate -

    -
      -
    • doActivate(): void
    • -
    -
      -
    • -
      -

      The Diagram calls this method after setting Diagram.currentTool, - to make the new tool active. - This should set isActive to true. - Overrides of this method might call startTransaction, - if this tool's activity involves modification of the model. - Implementations of this method can look at Diagram.lastInput to get the mouse - event and input state.

      -

      You should call this method only after setting Diagram.currentTool to the Tool that you want to activate.

      -

      By default this only sets isActive to true. - This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -

      If you override this method, it is commonplace to also override doDeactivate to clean up whatever you set up in this method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - doCancel -

    -
      -
    • doCancel(): void
    • -
    -
      -
    • -
      -

      The diagram will call this method when the user wishes to cancel the - current tool's operation. - Typically this is called when the user hits the ESCAPE key. - This should restore the original state of what was modified by this tool, and then it should call stopTool. - This method is not responsible for cleaning up any side-effects that should be performed - by doDeactivate and/or doStop, which will always be called whether the tool stops normally or abnormally.

      -

      By default this method just sets transactionResult to null and calls stopTool. - You will want to override this method even in tools that call startTransaction and stopTransaction, - because the UndoManager might not be enabled. - This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - doDeactivate -

    -
      -
    • doDeactivate(): void
    • -
    -
      -
    • -
      -

      The Diagram calls this method on the old tool when - Diagram.currentTool is set to a new tool. - This needs to set isActive to false. - Overrides of this method might call stopTransaction, - if this tool's activity involves modification of the model.

      -

      You should have no reason to call this method, because it is automatically called by the - Diagram.currentTool property setter on the old tool.

      -

      By default this only sets isActive to false. - This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -

      It is commonplace to override this method in order to clean up whatever you have set up in an override of doActivate.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - doKeyDown -

    -
      -
    • doKeyDown(): void
    • -
    -
      -
    • -
      -

      The diagram will call this method upon a key down event. - By default this just calls doCancel if the key is the ESCAPE key. - Implementations of this method can look at Diagram.lastInput to get the key.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - doKeyUp -

    -
      -
    • doKeyUp(): void
    • -
    -
      -
    • -
      -

      The diagram will call this method upon a key up event. - Implementations of this method can look at Diagram.lastInput to get the key.

      -

      By default this method does nothing. - This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - doMouseDown -

    -
      -
    • doMouseDown(): void
    • -
    -
      -
    • -
      -

      The diagram will call this method upon a mouse down event. - This is normally overridden for mouse-down tools; - it is not called for mouse-move or mouse-up tools. - However it may also be called when the tool is run in a modal fashion, - when code explicitly sets the diagram's Diagram.currentTool. - Implementations of this method can look at Diagram.lastInput to get the mouse - event and input state.

      -

      By default this method checks isActive; if that is false it calls canStart. - If that in turn is true, this calls doActivate. - This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - doMouseMove -

    -
      -
    • doMouseMove(): void
    • -
    -
      -
    • -
      -

      The diagram will call this method upon a mouse move event. - This is normally overridden for mouse-move tools; - it is not called for mouse-up tools. - However it may also be called when the tool is run in a modal fashion, - when code explicitly sets the diagram's Diagram.currentTool. - An override of this method usually does nothing when isActive is false. - Implementations of this method can look at Diagram.lastInput to get the mouse - event and input state.

      -

      By default this method does nothing. - This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - doMouseUp -

    -
      -
    • doMouseUp(): void
    • -
    -
      -
    • -
      -

      The diagram will call this method upon a mouse up event. - This is normally overridden for mouse-up tools. - An override of this method usually does nothing when isActive is false, - except for calling stopTool. - Tools normally stop upon a mouse up, by calling stopTool. - If you want to handle multiple mouse down-up gestures in one tool activation, - you will need to override this method to only stop the tool when you want. - Implementations of this method can look at Diagram.lastInput to get the mouse - event and input state.

      -

      By default this method just calls stopTool. - This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - doMouseWheel -

    -
      -
    • doMouseWheel(): void
    • -
    -
      -
    • -
      -

      The diagram will call this method as the mouse wheel is rotated. - Implementations of this method can look at Diagram.lastInput to get the mouse - event and input state.

      -

      By default this method does nothing. - (But the ToolManager.doMouseWheel override will call Tool.standardMouseWheel.) - This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - doStart -

    -
      -
    • doStart(): void
    • -
    -
      -
    • -
      -

      The Diagram calls this method when this tool becomes the current tool; you should not call this method. - Tool implementations should perform their per-use initialization here, such - as setting up internal data structures, or capturing the mouse. - Implementations of this method can look at Diagram.lastInput to get the mouse - event and input state.

      -

      You should not call this method -- only the Diagram.currentTool property setter should call this method.

      -

      By default this method does nothing. - This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -

      If you override this method, it is commonplace to also override doStop to clean up whatever you set up in this method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - doStop -

    -
      -
    • doStop(): void
    • -
    -
      -
    • -
      -

      The Diagram calls this method when this tool stops being the current tool; you should not call this method. - Tool implementations should perform their per-use cleanup here, - such as releasing mouse capture.

      -

      You should not call this method -- only the Diagram.currentTool property setter should call this method. - If you want to stop a tool unexpectedly, you should call doCancel. - If your implementation of a tool wants to stop itself, you should call stopTool.

      -

      By default this method does nothing. - This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -

      It is commonplace to override this method in order to clean up whatever you have set up in an override of doStart.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - doWaitAfter -

    - -
      -
    • -
      -

      This is called a certain delay after a call to standardWaitAfter if there - has not been any call to cancelWaitAfter. - The ToolManager overrides this method in order to implement support for mouse-hover behavior and tooltips.

      -

      By default this does nothing. - This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - findToolHandleAt -

    - -
      -
    • -
      -

      This convenience function finds the front-most GraphObject - that is at a given point and that is an element of an Adornment - that is of a given category. - The tool handle must be an immediate element of the Adornment, - not a GraphObject that is nested within Panels within the Adornment.

      -

      This method is very infrequently overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      - -

      Returns GraphObject

      -
    • -
    -
    -
    - -

    - Virtual - isBeyondDragSize -

    -
      -
    • isBeyondDragSize(first?: Point, last?: Point): boolean
    • -
    -
      -
    • -
      -

      Return true when the last mouse point is far enough away from the first mouse down point - to constitute a drag operation instead of just a potential click.

      -

      This uses the value of ToolManager.dragSize. - On touch devices the value is automatically increased to accommodate the unavoidable movement of fingers.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      - -

      Returns boolean

      -
    • -
    -
    -
    - -

    - Virtual - standardMouseClick -

    -
      -
    • standardMouseClick<T>(navig?: (a: GraphObject) => T, pred?: (a: T) => boolean): boolean
    • -
    -
      -
    • -
      -

      Implement the standard behavior for mouse clicks, - searching for and calling click handler functions on GraphObjects - or on Diagram, - and raising the corresponding DiagramEvent.

      -

      A click on a GraphObject of the diagram will raise one of the following DiagramEvents: - "ObjectSingleClicked", "ObjectDoubleClicked", or "ObjectContextClicked". - This will also look at the corresponding click property: - GraphObject.click, GraphObject.doubleClick, or GraphObject.contextClick. - If the value is a function, this will call it, passing the current InputEvent - and the GraphObject. - If the value is null, it tries looking at the parent GraphObject.panel, - and so on, walking up the visual tree until it finds the appropriate function to call. - After calling the click function, if the value of InputEvent.handled is false, - this method will continue walking up the visual tree looking for more click functions - to call. - Once it has looked at the top-level object (a Part) - for a click function, this method stops.

      -

      A click in the background of the diagram will raise one of the following DiagramEvents: - "BackgroundSingleClicked", "BackgroundDoubleClicked", or "BackgroundContextClicked". - This will also look at the corresponding click property: - Diagram.click, Diagram.doubleClick, or Diagram.contextClick. - If the value is a function, this will call it, passing the current InputEvent.

      -

      This method is not responsible for selecting or deselecting any parts. - Call standardMouseSelect for that functionality.

      -

      Note that this calls GraphObject.isEnabledObject on the target object; - if it returns false, no click action will occur.

      -

      The ClickSelectingTool calls this method in its override of doMouseUp in order to raise "click" events. - Note that by default GraphObjects in Layers that are Layer.isTemporary will not be "clicked". - To change that behavior it is easiest to set GraphObject.isActionable to true on those objects for which you wish to handle "click" events. - Then the ActionTool's doMouseUp override will raise the standard "click" events.

      -

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Type parameters

      - -

      Parameters

      -
        -
      • -
        Optional navig: (a: GraphObject) => T
        -
        -

        An optional custom navigation - function to find target objects.

        -
        -
          -
        -
      • -
      • -
        Optional pred: (a: T) => boolean
        -
        -

        An optional custom predicate - function to find target objects. No value means that only objects in layers holding permanent objects.

        -
        -
          -
        -
      • -
      -

      Returns boolean

      -

      true if InputEvent.handled had been set to true on the Diagram.lastInput.

      -
    • -
    -
    -
    - -

    - Virtual - standardMouseOver -

    -
      -
    • standardMouseOver(): void
    • -
    -
      -
    • -
      -

      Implement the standard behavior for mouse enter, over, and leave events, - where the mouse is moving but no button is pressed. - This should be called by mouse move event handlers when wanting to - detect and invoke mouse enter/over/leave event handlers.

      -

      The GraphObject.mouseEnter property provides a function to call - when the mouse first enters an object or any of its contained objects - (if the object is actually a Panel).

      -

      The GraphObject.mouseLeave property provides a function to call - when the mouse leaves an object and all of its contained objects - (if the object is actually a Panel).

      -

      The GraphObject.mouseOver property and Diagram.mouseOver - properties provide functions to call when the mouse moves but stays - within the same GraphObject or when the mouse moves in the - background of the Diagram.

      -

      This method is also responsible for updating the Diagram.currentCursor - according to the value of GraphObject.cursor and Diagram.defaultCursor.

      -

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - standardMouseSelect -

    -
      -
    • standardMouseSelect(): void
    • -
    -
      -
    • -
      -

      Implement the standard behavior for selecting parts with the mouse, - depending on the control and shift modifier keys.

      -

      Control-clicking on a part will select it if it wasn't already, - and will deselect if it had been selected. - Shift-clicking on a part will add it to the selection (if it wasn't already). - Otherwise, clicking on a part will select it (if it wasn't already).

      -

      Note that there are restrictions on selection. - For example, a part cannot be selected in this manner if Part.selectable is false, - or if Diagram.maxSelectionCount would be exceeded.

      -

      A left click in the background of the diagram with no modifier keys clears the selection.

      -

      This method does not implement any click event behavior -- that is implemented by standardMouseClick.

      -

      The ClickSelectingTool calls this method in its override of doMouseUp in order to change the selection.

      -

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - standardMouseWheel -

    -
      -
    • standardMouseWheel(): void
    • -
    -
      -
    • -
      -

      Implement the standard behavior for mouse wheel events. - ToolManager.doMouseWheel calls this method.

      -

      Turning the mouse wheel if Diagram.allowVerticalScroll is true - causes the diagram to scroll up or down. - If InputEvent.shift and Diagram.allowHorizontalScroll are true, - the diagram scrolls left or right.

      -

      If InputEvent.control and Diagram.allowZoom are true, - turning the mouse wheel changes the diagram's scale, - zooming in or out while trying to keep the point in the model - at the same point as the mouse.

      -

      The value of ToolManager.mouseWheelBehavior affects what operations might occur - upon mouse wheel events.

      -

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - standardPinchZoomMove -

    -
      -
    • standardPinchZoomMove(): void
    • -
    - -
    -
    - -

    - Virtual - standardPinchZoomStart -

    -
      -
    • standardPinchZoomStart(): void
    • -
    - -
    -
    - -

    - Virtual - standardWaitAfter -

    -
      -
    • standardWaitAfter(delay: number, event?: InputEvent): void
    • -
    -
      -
    • -
      -

      This is called to start a new timer to call doWaitAfter after a given delay. - It first cancels any previously running "WaitAfter" timer, by calling cancelWaitAfter.

      -

      This is normally used to implement mouse hover and mouse hold events. - If the mouse has moved, it must not have moved beyond the distance as determined by - Tool.isBeyondDragSize for it be considered "stationary". - So the regular ToolManager.doMouseMove implementation only calls - this method when the mouse has moved beyond the drag size.

      -

      This method is rarely overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      -
        -
      • -
        delay: number
        -
        -

        The delay, in milliseconds.

        -
        -
      • -
      • -
        Optional event: InputEvent
        -
        -

        An optional event that caused this timer. Defaults to Diagram.lastInput. - This gets passed on to doWaitAfter.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - startTransaction -

    -
      -
    • startTransaction(tname?: string): boolean
    • -
    - -
    -
    - -

    - Virtual - stopTool -

    -
      -
    • stopTool(): void
    • -
    -
      -
    • -
      -

      If the Diagram.currentTool is this tool, - stop this tool and start the Diagram.defaultTool - by making it be the new current tool. - The implementation of various tool methods can call this method to stop the current tool. - This will call doStop -- you should not call that method directly.

      -

      If you want to stop the current tool and have it restore the original state, call doCancel. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - stopTransaction -

    -
      -
    • stopTransaction(): boolean
    • -
    - -
    -
    - -

    - Virtual - updateAdornments -

    -
      -
    • updateAdornments(part: Part): void
    • -
    -
      -
    • -
      -

      The diagram asks each tool to update any adornments the tool might - use for a given part. - If the tool uses its own tool handles, - this should display them or hide them as appropriate. - Typically this should only show them if the part is selected.

      -

      By default this method does nothing. - This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      -
        -
      • -
        part: Part
        -
        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class Tool Abstract

    Hierarchy

    +

    Tools handle mouse, keyboard, and touch events. +The currently running tool, Diagram.currentTool, receives all input events from the Diagram +via canonicalized InputEvents.

    +

    +For more discussion, see Introduction to Tools. +See samples that make use of tools in the samples index.

    Most tools are "mode-less" tools that are managed by the ToolManager, +which chooses the current tool based on the kind and position of the mouse event and the parts in the diagram. +The ToolManager has properties holding instances of most of the pre-defined Tool classes. +These classes include:

    + +

    The ToolManager chooses a tool to run as the diagram's current tool by finding in its lists of tools the first tool +whose canStart method returns true. The ToolManager then sets Diagram.currentTool to be that tool.

    +

    A tool is in the "running" state when it is the value of Diagram.currentTool. +The Diagram.currentTool property setter will call doStop on the old tool +and then call doStart on the new tool.

    +

    A tool can then go into the "active" state once it decides it can actually do something. +This happens with a call to doActivate, normally called by the ToolManager. +Later it is deactivated (doDeactivate) and then stopped. +isActive should be true when the tool is "active". +Often tools should ignore certain common events, such as calls to doMouseMove, +unless the tool isActive.

    +

    You can prevent a "mode-less" tool (i.e. one managed by the ToolManager) +from being started by the ToolManager by setting isEnabled to false.

    +

    You can also go into a particular "mode" by setting Diagram.currentTool explicitly, +thereby circumventing the normal operation of the ToolManager. +This ignores the isEnabled property and does not call the canStart predicate. +The behavior will depend on the tool -- not all of the predefined tools support operating as a "modal" tool.

    +

    Tools cannot be shared amongst multiple Diagrams.

    +

    If you define a Tool subclass, you may override any of the methods whose names start with "do" +and any other methods that are documented to be overridable, such as canStart. +However you must seriously consider calling the base method in order to gets its default behavior. +There may be situations where not calling the base method may cause subtle bugs. +But that depends on the method and the tool. +Please read the Introduction page on Extensions for how to override methods and how to call the base method.

    +

    Index

    Constructors

    • +

      Don't construct this directly -- this is an abstract class.

      +

      Returns Tool

    Properties

    • +

      This read-only property returns the Diagram that owns this tool and +for which this tool is handling input events.

      +
    • +

      Gets or sets whether this tool is started and is actively doing something.

      +

      You can set this to true after your tool is started (i.e. when it is the +Diagram.currentTool and doStart +had been called), but when it is not yet in a state +that it is actually "doing" something, because it is waiting for the right +circumstances. This is typically only important when the tool is used in +a modal fashion.

      +

      The default value is false. +This is normally set by doActivate and doDeactivate.

      +
    • +

      Gets or sets whether this tool can be started by a mouse event.

      +

      Set this to false to prevent canStart from returning true. +Setting this property to false should prevent this tool from being used in a mode-less fashion +by the ToolManager with a mouse down/move/up event. +However, even when this property is false, this tool can still be used in a modal fashion: +it can still be started by explicitly setting the +Diagram.currentTool property to this tool.

      +

      The default value is true.

      +
    • +

      Gets or sets the name of this tool. +The default name is an empty string, +but the constructor for each instance of a subclass of Tool will initialize it appropriately. +For example, the name of the DragSelectingTool is "DragSelecting".

      +

      This name is sometimes used by tools that use Adornments as the Part.category for their Adornments. +It is also sometimes used by tools that conduct transactions as the transaction name.

      +
    • +

      Gets or sets the name of the transaction to be committed by stopTransaction

      +

      If null, the transaction will be rolled back.

      +

      If this is non-null at the time of a call to stopTransaction, +it calls Diagram.commitTransaction with this transaction name; +if this is null at that time, it calls Diagram.rollbackTransaction.

      +

      The default value is null; startTransaction will also set this to null. +Because a value of null when stopTransaction is called will rollback the transaction, +it is important that your code sets this property to a non-null value when it thinks it has succeeded.

      +

      This property exists so that no matter what execution path occurs to end the usage of a tool, +any ongoing transaction can be properly committed or rolled-back. +Many tools call startTransaction and stopTransaction; thus they set this property +for their transaction to be committed. +doCancel also sets this property to null.

      +

    Methods

    • canStart(): boolean
    • +

      This predicate is used by the ToolManager to decide if this tool can be started mode-lessly +by mouse and touch events. +Implementations of this method can look at Diagram.lastInput to get the mouse +event and input state.

      +

      By default this method returns isEnabled. +This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns boolean

      true if isEnabled is true and +if the Diagram.toolManager can make this tool the Diagram.currentTool and +then call the doStart method.

      +
    • canStartMultiTouch(): boolean
    • cancelWaitAfter(): void
    • +

      This is called to cancel any running "WaitAfter" timer.

      +

      This is called when a tool is stopped.

      +

      This method is rarely overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • doActivate(): void
    • +

      The Diagram calls this method after setting Diagram.currentTool, +to make the new tool active. +This should set isActive to true. +Overrides of this method might call startTransaction, +if this tool's activity involves modification of the model. +Implementations of this method can look at Diagram.lastInput to get the mouse +event and input state.

      +

      You should call this method only after setting Diagram.currentTool to the Tool that you want to activate.

      +

      By default this only sets isActive to true. +This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      If you override this method, it is commonplace to also override doDeactivate to clean up whatever you set up in this method.

      +

      Returns void

    • doCancel(): void
    • +

      The diagram will call this method when the user wishes to cancel the +current tool's operation. +Typically this is called when the user hits the ESCAPE key. +This should restore the original state of what was modified by this tool, and then it should call stopTool. +This method is not responsible for cleaning up any side-effects that should be performed +by doDeactivate and/or doStop, which will always be called whether the tool stops normally or abnormally.

      +

      By default this method just sets transactionResult to null and calls stopTool. +You will want to override this method even in tools that call startTransaction and stopTransaction, +because the UndoManager might not be enabled. +This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • doDeactivate(): void
    • +

      The Diagram calls this method on the old tool when +Diagram.currentTool is set to a new tool. +This needs to set isActive to false. +Overrides of this method might call stopTransaction, +if this tool's activity involves modification of the model.

      +

      You should have no reason to call this method, because it is automatically called by the +Diagram.currentTool property setter on the old tool.

      +

      By default this only sets isActive to false. +This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      It is commonplace to override this method in order to clean up whatever you have set up in an override of doActivate.

      +

      Returns void

    • doKeyDown(): void
    • +

      The diagram will call this method upon a key down event. +By default this just calls doCancel if the key is the ESCAPE key. +Implementations of this method can look at Diagram.lastInput to get the key.

      +

      This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • doKeyUp(): void
    • +

      The diagram will call this method upon a key up event. +Implementations of this method can look at Diagram.lastInput to get the key.

      +

      By default this method does nothing. +This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • doMouseDown(): void
    • +

      The diagram will call this method upon a mouse down event. +This is normally overridden for mouse-down tools; +it is not called for mouse-move or mouse-up tools. +However it may also be called when the tool is run in a modal fashion, +when code explicitly sets the diagram's Diagram.currentTool. +Implementations of this method can look at Diagram.lastInput to get the mouse +event and input state.

      +

      By default this method checks isActive; if that is false it calls canStart. +If that in turn is true, this calls doActivate. +This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • doMouseMove(): void
    • +

      The diagram will call this method upon a mouse move event. +This is normally overridden for mouse-move tools; +it is not called for mouse-up tools. +However it may also be called when the tool is run in a modal fashion, +when code explicitly sets the diagram's Diagram.currentTool. +An override of this method usually does nothing when isActive is false. +Implementations of this method can look at Diagram.lastInput to get the mouse +event and input state.

      +

      By default this method does nothing. +This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • doMouseUp(): void
    • +

      The diagram will call this method upon a mouse up event. +This is normally overridden for mouse-up tools. +An override of this method usually does nothing when isActive is false, +except for calling stopTool. +Tools normally stop upon a mouse up, by calling stopTool. +If you want to handle multiple mouse down-up gestures in one tool activation, +you will need to override this method to only stop the tool when you want. +Implementations of this method can look at Diagram.lastInput to get the mouse +event and input state.

      +

      By default this method just calls stopTool. +This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • doMouseWheel(): void
    • +

      The diagram will call this method as the mouse wheel is rotated. +Implementations of this method can look at Diagram.lastInput to get the mouse +event and input state.

      +

      By default this method does nothing. +(But the ToolManager.doMouseWheel override will call Tool.standardMouseWheel.) +This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • doStart(): void
    • +

      The Diagram calls this method when this tool becomes the current tool; you should not call this method. +Tool implementations should perform their per-use initialization here, such +as setting up internal data structures, or capturing the mouse. +Implementations of this method can look at Diagram.lastInput to get the mouse +event and input state.

      +

      You should not call this method -- only the Diagram.currentTool property setter should call this method.

      +

      By default this method does nothing. +This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      If you override this method, it is commonplace to also override doStop to clean up whatever you set up in this method.

      +

      Returns void

    • doStop(): void
    • +

      The Diagram calls this method when this tool stops being the current tool; you should not call this method. +Tool implementations should perform their per-use cleanup here, +such as releasing mouse capture.

      +

      You should not call this method -- only the Diagram.currentTool property setter should call this method. +If you want to stop a tool unexpectedly, you should call doCancel. +If your implementation of a tool wants to stop itself, you should call stopTool.

      +

      By default this method does nothing. +This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      It is commonplace to override this method in order to clean up whatever you have set up in an override of doStart.

      +

      Returns void

    • +

      This is called a certain delay after a call to standardWaitAfter if there +has not been any call to cancelWaitAfter. +The ToolManager overrides this method in order to implement support for mouse-hover behavior and tooltips.

      +

      By default this does nothing. +This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Parameters

      Returns void

    • +

      This convenience function finds the front-most GraphObject +that is at a given point and that is an element of an Adornment +that is of a given category. +The tool handle must be an immediate element of the Adornment, +not a GraphObject that is nested within Panels within the Adornment.

      +

      This method is very infrequently overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Parameters

      Returns GraphObject

    • isBeyondDragSize(first?: Point, last?: Point): boolean
    • +

      Return true when the last mouse point is far enough away from the first mouse down point +to constitute a drag operation instead of just a potential click.

      +

      This uses the value of ToolManager.dragSize. +On touch devices the value is automatically increased to accommodate the unavoidable movement of fingers.

      +

      This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Parameters

      Returns boolean

    • standardMouseClick<T>(navig?: (a: GraphObject) => T, pred?: (a: T) => boolean): boolean
    • +

      Implement the standard behavior for mouse clicks, +searching for and calling click handler functions on GraphObjects +or on Diagram, +and raising the corresponding DiagramEvent.

      +

      A click on a GraphObject of the diagram will raise one of the following DiagramEvents: +"ObjectSingleClicked", "ObjectDoubleClicked", or "ObjectContextClicked". +This will also look at the corresponding click property: +GraphObject.click, GraphObject.doubleClick, or GraphObject.contextClick. +If the value is a function, this will call it, passing the current InputEvent +and the GraphObject. +If the value is null, it tries looking at the parent GraphObject.panel, +and so on, walking up the visual tree until it finds the appropriate function to call. +After calling the click function, if the value of InputEvent.handled is false, +this method will continue walking up the visual tree looking for more click functions +to call. +Once it has looked at the top-level object (a Part) +for a click function, this method stops.

      +

      A click in the background of the diagram will raise one of the following DiagramEvents: +"BackgroundSingleClicked", "BackgroundDoubleClicked", or "BackgroundContextClicked". +This will also look at the corresponding click property: +Diagram.click, Diagram.doubleClick, or Diagram.contextClick. +If the value is a function, this will call it, passing the current InputEvent.

      +

      This method is not responsible for selecting or deselecting any parts. +Call standardMouseSelect for that functionality.

      +

      Note that this calls GraphObject.isEnabledObject on the target object; +if it returns false, no click action will occur.

      +

      The ClickSelectingTool calls this method in its override of doMouseUp in order to raise "click" events. +Note that by default GraphObjects in Layers that are Layer.isTemporary will not be "clicked". +To change that behavior it is easiest to set GraphObject.isActionable to true on those objects for which you wish to handle "click" events. +Then the ActionTool's doMouseUp override will raise the standard "click" events.

      +

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Type parameters

      Parameters

      • Optional navig: (a: GraphObject) => T
        +

        An optional custom navigation +function to find target objects.

        +
      • Optional pred: (a: T) => boolean
        +

        An optional custom predicate +function to find target objects. No value means that only objects in layers holding permanent objects.

        +
          • (a: T): boolean
          • Parameters

            • a: T

            Returns boolean

      Returns boolean

      true if InputEvent.handled had been set to true on the Diagram.lastInput.

      +
    • standardMouseOver(): void
    • +

      Implement the standard behavior for mouse enter, over, and leave events, +where the mouse is moving but no button is pressed. +This should be called by mouse move event handlers when wanting to +detect and invoke mouse enter/over/leave event handlers.

      +

      The GraphObject.mouseEnter property provides a function to call +when the mouse first enters an object or any of its contained objects +(if the object is actually a Panel).

      +

      The GraphObject.mouseLeave property provides a function to call +when the mouse leaves an object and all of its contained objects +(if the object is actually a Panel).

      +

      The GraphObject.mouseOver property and Diagram.mouseOver +properties provide functions to call when the mouse moves but stays +within the same GraphObject or when the mouse moves in the +background of the Diagram.

      +

      This method is also responsible for updating the Diagram.currentCursor +according to the value of GraphObject.cursor and Diagram.defaultCursor.

      +

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • standardMouseSelect(): void
    • +

      Implement the standard behavior for selecting parts with the mouse, +depending on the control and shift modifier keys.

      +

      Control-clicking on a part will select it if it wasn't already, +and will deselect if it had been selected. +Shift-clicking on a part will add it to the selection (if it wasn't already). +Otherwise, clicking on a part will select it (if it wasn't already).

      +

      Note that there are restrictions on selection. +For example, a part cannot be selected in this manner if Part.selectable is false, +or if Diagram.maxSelectionCount would be exceeded.

      +

      A left click in the background of the diagram with no modifier keys clears the selection.

      +

      This method does not implement any click event behavior -- that is implemented by standardMouseClick.

      +

      The ClickSelectingTool calls this method in its override of doMouseUp in order to change the selection.

      +

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • standardMouseWheel(): void
    • +

      Implement the standard behavior for mouse wheel events. +ToolManager.doMouseWheel calls this method.

      +

      Turning the mouse wheel if Diagram.allowVerticalScroll is true +causes the diagram to scroll up or down. +If InputEvent.shift and Diagram.allowHorizontalScroll are true, +the diagram scrolls left or right.

      +

      If InputEvent.control and Diagram.allowZoom are true, +turning the mouse wheel changes the diagram's scale, +zooming in or out while trying to keep the point in the model +at the same point as the mouse.

      +

      The value of ToolManager.mouseWheelBehavior affects what operations might occur +upon mouse wheel events.

      +

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • standardPinchZoomMove(): void
    • standardPinchZoomStart(): void
    • standardWaitAfter(delay: number, event?: InputEvent): void
    • +

      This is called to start a new timer to call doWaitAfter after a given delay. +It first cancels any previously running "WaitAfter" timer, by calling cancelWaitAfter.

      +

      This is normally used to implement mouse hover and mouse hold events. +If the mouse has moved, it must not have moved beyond the distance as determined by +Tool.isBeyondDragSize for it be considered "stationary". +So the regular ToolManager.doMouseMove implementation only calls +this method when the mouse has moved beyond the drag size.

      +

      This method is rarely overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Parameters

      Returns void

    • startTransaction(tname?: string): boolean
    • stopTool(): void
    • +

      If the Diagram.currentTool is this tool, +stop this tool and start the Diagram.defaultTool +by making it be the new current tool. +The implementation of various tool methods can call this method to stop the current tool. +This will call doStop -- you should not call that method directly.

      +

      If you want to stop the current tool and have it restore the original state, call doCancel. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • stopTransaction(): boolean
    • updateAdornments(part: Part): void
    • +

      The diagram asks each tool to update any adornments the tool might +use for a given part. +If the tool uses its own tool handles, +this should display them or hide them as appropriate. +Typically this should only show them if the part is selected.

      +

      By default this method does nothing. +This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Parameters

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/ToolManager.html b/api/symbols/ToolManager.html index 51968edd9..700f6064b 100644 --- a/api/symbols/ToolManager.html +++ b/api/symbols/ToolManager.html @@ -1,1335 +1,352 @@ - - - - - - ToolManager | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class ToolManager

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - Tool -
        -
      • - ToolManager -
      • -
      -
    • -
    -
    -
    -
    -

    This special Tool is responsible for managing all of the Diagram's - mode-less tools, which you can access as the Diagram.toolManager.

    -

    Mode-less tools are tools that are present in one of the following lists: - mouseDownTools, mouseMoveTools, or mouseUpTools. - This ToolManager tool is normally the Diagram.defaultTool, - so it is also usually the Diagram.currentTool when the user is doing "nothing".

    -

    When this tool is running as the current tool, it handles mouse-down, - mouse-move, and mouse-up events and the corresponding touch events. - For each event it iterates over each of the tools in the corresponding list, - calling the tool's Tool.canStart predicate. - If that predicate returns true, it starts that tool by making it the - diagram's current tool. - It then activates the tool and passes on the event to the tool by calling - the corresponding method (either Tool.doMouseDown, - Tool.doMouseMove, or Tool.doMouseUp).

    -

    Because this tool is typically the one running as the diagram's current tool - when the user isn't "doing" anything, this tool can also handle other events, - such as mouse wheel events and keyboard commands.

    -

    Keyboard events are just passed on to the Diagram.commandHandler's - CommandHandler.doKeyDown or CommandHandler.doKeyUp method.

    -

    This tool also is responsible for showing tooltips. - Tooltip Adornments may be declared as any GraphObject.toolTip, - or as the Diagram.toolTip if the mouse or finger remains motionless in the background of the diagram. - You can set toolTipDuration to control how long the tooltip remains visible after being motionless.

    -

    This tool does not utilize any tool handles. - This tool does not conduct any transactions. - But of course some of the tools that the ToolManager starts can show tool handles and/or - conduct their own transactions.

    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      You do not normally need to create an instance of this tool - because one already exists as the Diagram.toolManager, which you can modify.

      -

      The Tool.name of this tool is "ToolManager".

      -

      The constructor produces a ToolManager that manages no tools. - Call initializeStandardTools to create various tools, - initialize the tool properties such as draggingTool, - and initialize the three mouse tool lists with those newly created tools.

      -
      -

      Returns ToolManager

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - actionTool - : ActionTool

    - -
    -
    - -

    - clickCreatingTool - : ClickCreatingTool

    - -
    -
    - -

    - clickSelectingTool - : ClickSelectingTool

    - -
    -
    - -

    - contextMenuTool - : ContextMenuTool

    - -
    -
    - -

    - currentToolTip - : Adornment | HTMLInfo

    -
      -
    • -
      -

      This read-only property returns the currently showing tooltip, or null if there is none.

      -
      -
    • -
    -
    -
    - -

    - dragSelectingTool - : DragSelectingTool

    - -
    -
    - -

    - dragSize - : Size

    -
      -
    • -
      -

      Gets or sets the distance in view coordinates within which a mouse down-and-up is considered a click and beyond which a mouse movement is considered a drag. - The default value is 2 pixels horizontally and vertically for mouse events, and increases by 6 pixels for touch events. - This value is used by Tool.isBeyondDragSize.

      -
      -
      since
      -

      1.2

      -
      -
      -
      -
    • -
    -
    -
    - -

    - draggingTool - : DraggingTool

    - -
    -
    - -

    - gestureBehavior - : EnumValue

    - -
    -
    - -

    - holdDelay - : number

    -
      -
    • -
      -

      Gets or sets the time between when the mouse stops moving and a hold event, - in milliseconds. - The default value is 850 milliseconds.

      -
      -
    • -
    -
    -
    - -

    - hoverDelay - : number

    -
      -
    • -
      -

      Gets or sets the time between when the mouse stops moving and a hover event, - in milliseconds. This value affects the delay before GraphObject.toolTips are shown. - The default value is 850 milliseconds.

      -

      Set toolTipDuration to control how long a tooltip will remain visible.

      -
      -
    • -
    -
    -
    - -

    - linkReshapingTool - : LinkReshapingTool

    - -
    -
    - -

    - linkingTool - : LinkingTool

    - -
    -
    - -

    - Read-only - mouseDownTools - : List<Tool>

    - -
    -
    - -

    - Read-only - mouseMoveTools - : List<Tool>

    - -
    -
    - -

    - Read-only - mouseUpTools - : List<Tool>

    - -
    -
    - -

    - mouseWheelBehavior - : EnumValue

    - -
    -
    - -

    - panningTool - : PanningTool

    - -
    -
    - -

    - relinkingTool - : RelinkingTool

    - -
    -
    - -

    - resizingTool - : ResizingTool

    - -
    -
    - -

    - rotatingTool - : RotatingTool

    - -
    -
    - -

    - textEditingTool - : TextEditingTool

    - -
    -
    - -

    - toolTipDuration - : number

    -
      -
    • -
      -

      Gets or sets how long a tool tip is visible. - The default value is 5000 milliseconds.

      -

      This is used by showToolTip to determine how long to wait before calling hideToolTip.

      -

      Set hoverDelay to control how long the mouse should stay stationary before it shows a tooltip.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override Virtual - doKeyDown -

    -
      -
    • doKeyDown(): void
    • -
    -
      -
    • -
      -

      This just calls CommandHandler.doKeyDown on the diagram's Diagram.commandHandler.

      -

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override Virtual - doKeyUp -

    -
      -
    • doKeyUp(): void
    • -
    -
      -
    • -
      -

      This just calls CommandHandler.doKeyUp on the diagram's Diagram.commandHandler.

      -

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override Virtual - doMouseDown -

    -
      -
    • doMouseDown(): void
    • -
    -
      -
    • -
      -

      Iterate over the mouseDownTools list and start the first tool - for which its Tool.canStart predicate returns true.

      -

      Starting a tool replaces the Diagram.currentTool with the new tool. - Successfully doing so also activates the new tool by calling Tool.doActivate - and passes on the mouse-down event to it by calling Tool.doMouseDown.

      -

      Not finding any startable tools causes this tool manager to activate, - thereby enabling the mouse-move and mouse-up behaviors and starts - detection of a mouse-hold event after holdDelay milliseconds.

      -

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - doMouseHover -

    -
      -
    • doMouseHover(): void
    • -
    -
      -
    • -
      -

      Implement the standard behavior for mouse hover and mouse hold events, - called by doWaitAfter when the mouse has not moved for a period of time.

      -

      If there has been no mouse down, the timer is set for hoverDelay milliseconds. - If it executes, it calls any GraphObject.mouseHover function on the object - at the mouse or on any of its containing panels, - or it calls any Diagram.mouseHover function for a background mouse-hover event.

      -

      If there had been a mouse down, the timer is set for holdDelay milliseconds. - If it executes, it calls any GraphObject.mouseHold function on the object - at the mouse or on any of its containing panels, - or it calls any Diagram.mouseHold function for a background mouse-held-down event.

      -

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override Virtual - doMouseMove -

    -
      -
    • doMouseMove(): void
    • -
    -
      -
    • -
      -

      Iterate over the mouseMoveTools list and start the first tool - for which its Tool.canStart predicate returns true.

      -

      Starting a tool replaces the Diagram.currentTool with the new tool. - Successfully doing so also activates the new tool by calling Tool.doActivate - and passes on the mouse-move event to it by calling Tool.doMouseMove.

      -

      If no tool is found and activated, this:

      - -

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override Virtual - doMouseUp -

    -
      -
    • doMouseUp(): void
    • -
    -
      -
    • -
      -

      Iterate over the mouseUpTools list and start the first tool - for which its Tool.canStart predicate returns true.

      -

      Starting a tool replaces the Diagram.currentTool with the new tool. - Successfully doing so also activates the new tool by calling Tool.doActivate - and passes on the mouse-up event to it by calling Tool.doMouseUp.

      -

      If no startable tool is found it deactivates this tool manager, - to get ready for a mouse-down and ignore mouse-move and mouse-up events.

      -

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override Virtual - doMouseWheel -

    -
      -
    • doMouseWheel(): void
    • -
    -
      -
    • -
      -

      The diagram will call this method as the mouse wheel is rotated.

      -

      By default this just calls Tool.standardMouseWheel. - This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - doToolTip -

    -
      -
    • doToolTip(): void
    • -
    -
      -
    • -
      -

      Implement the standard behavior for tooltips, - called by doWaitAfter when the mouse has not moved for a period of time.

      -

      This looks for a GraphObject at the latest mouse point. - If it finds an object, it checks for a GraphObject.toolTip. - If it has none, this method searches up the visual tree for a containing - Panel that does have a tooltip.

      -

      If it didn't find any object, this looks for a Diagram.toolTip.

      -

      If it eventually finds a tooltip, this calls showToolTip. - Otherwise this calls hideToolTip.

      -

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override Virtual - doWaitAfter -

    - -
      -
    • -
      -

      Implement the standard behavior for when the mouse has not moved for a period of time. - This is due to an expired timer started by calling Tool.standardWaitAfter.

      -

      This calls doMouseHover and, if not mouse-down, doToolTip. - Afterwards, if the event that called Tool.standardWaitAfter was a touch event, - this simulates a right click, enabling context menu functionality and other actions on touch devices.

      -

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - findTool -

    -
      -
    • findTool(name: string): Tool
    • -
    -
      -
    • -
      -

      Find a mouse tool of a given name. - This searches the mouseDownTools, mouseMoveTools, and mouseUpTools lists.

      -

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      -
        -
      • -
        name: string
        -
        -

        the type of tool, such as "Dragging" or "ClickSelecting".

        -
        -
      • -
      -

      Returns Tool

      -

      a Tool whose Tool.name exactly matches the given name, - or null if no such tool is found in any of the three lists.

      -
    • -
    -
    -
    - -

    - Virtual - hideToolTip -

    -
      -
    • hideToolTip(): void
    • -
    -
      -
    • -
      -

      Hide any tooltip.

      -

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - initializeStandardTools -

    -
      -
    • initializeStandardTools(): void
    • -
    -
      -
    • -
      -

      Initialize the three mouse tool lists with instances of the standard tools. - This adds new instances of tools to the following three mouse tool lists: - mouseDownTools, mouseMoveTools, or mouseUpTools. - This also sets the various tool properties of this ToolManager - to those newly created tools. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - positionToolTip -

    - -
      -
    • -
      -

      This is called by showToolTip to position the part within the viewport. - It normally goes just below the cursor. - But if the mouse is too close to the right edge or the bottom edge of the viewport, - it is positioned left and/or above the cursor.

      -

      This method only operates if the tooltip, an Adornment, does not have a Adornment.placeholder. - When there is a Placeholder in the tooltip, that Adornment is automatically positioned - so that the Placeholder is positioned at the adorned object, the second argument to this method.

      -

      This method may be overridden. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -

      If you override this method to position the tooltip, - the tooltip has already been measured but not arranged, - so you can use its GraphObject.measuredBounds width and height - but not its GraphObject.actualBounds.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - replaceTool -

    -
      -
    • replaceTool(name: string, newtool: Tool): Tool
    • -
    -
      -
    • -
      -

      Replace a mouse tool of a given name with a new tool, or remove an existing tool (if the newtool is null). - This searches the mouseDownTools, mouseMoveTools, - and mouseUpTools lists. - The new tool is inserted into the same list in which the same-named tool is found, - at the same position as the old tool. - However, if no existing tool with the given name is present, this does not add the new tool to any list, since it cannot know where it should be added. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      -
        -
      • -
        name: string
        -
        -

        the type of tool, such as "Dragging" or "ClickSelecting".

        -
        -
      • -
      • -
        newtool: Tool
        -
        -

        If null, any tool that the search finds will just be removed - from the list in which it was found.

        -
        -
      • -
      -

      Returns Tool

      -

      the old tool that was replaced by the new one; this is null if none was found and the new tool was not added to any mouse tool list

      -
    • -
    -
    -
    - -

    - Virtual - showToolTip -

    - -
      -
    • -
      -

      Show a tooltip Adornment or HTMLInfo. - This is called by doToolTip once that method has found a tooltip to display.

      -

      This calls positionToolTip to make it easier to customize how the tooltip - is positioned relative to the object with the tooltip.

      -

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Parameters

      -
        -
      • -
        tooltip: Adornment | HTMLInfo
        -
      • -
      • -
        obj: GraphObject
        -
        -

        The GraphObject getting the tooltip; this is null if the tooltip is being shown for the diagram background.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    -

    Constants

    -
    - -

    - Static - GestureCancel - : EnumValue

    -
    -

    This value for gestureBehavior indicates that the pointer/touch pinch gestures - on the canvas intend to have no effect on the Diagram, but also no effect on the page.

    -
    -
    since
    -

    1.5

    -
    -
    -
    -
    -
    - -

    - Static - GestureNone - : EnumValue

    -
    -

    This value for gestureBehavior indicates that the pointer/touch pinch gestures - on the canvas intend to have no effect on the Diagram, but will not be prevented, - and may bubble up the page to have other effects (such as zooming the page).

    -
    -
    since
    -

    1.5

    -
    -
    -
    -
    -
    - -

    - Static - GestureZoom - : EnumValue

    -
    -

    This value for gestureBehavior indicates that the pointer/touch pinch gestures - on the canvas intend to zoom the Diagram.

    -
    -
    since
    -

    1.5

    -
    -
    -
    -
    -
    - -

    - Static - WheelNone - : EnumValue

    -
    -

    This value for mouseWheelBehavior indicates that the mouse wheel events are ignored, - although scrolling or zooming by other means may still be allowed.

    -
    -
    since
    -

    1.2

    -
    -
    -
    -
    -
    - -

    - Static - WheelScroll - : EnumValue

    -
    -

    This default value for mouseWheelBehavior indicates that mouse wheel events scroll the diagram.

    -
    -
    -
    - -

    - Static - WheelZoom - : EnumValue

    -
    -

    This value for mouseWheelBehavior indicates that the mouse wheel events change the scale of the diagram.

    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class ToolManager

    Hierarchy

    +

    This special Tool is responsible for managing all of the Diagram's +mode-less tools, which you can access as the Diagram.toolManager.

    +

    Mode-less tools are tools that are present in one of the following lists: +mouseDownTools, mouseMoveTools, or mouseUpTools. +This ToolManager tool is normally the Diagram.defaultTool, +so it is also usually the Diagram.currentTool when the user is doing "nothing".

    +

    When this tool is running as the current tool, it handles mouse-down, +mouse-move, and mouse-up events and the corresponding touch events. +For each event it iterates over each of the tools in the corresponding list, +calling the tool's Tool.canStart predicate. +If that predicate returns true, it starts that tool by making it the +diagram's current tool. +It then activates the tool and passes on the event to the tool by calling +the corresponding method (either Tool.doMouseDown, +Tool.doMouseMove, or Tool.doMouseUp).

    +

    Because this tool is typically the one running as the diagram's current tool +when the user isn't "doing" anything, this tool can also handle other events, +such as mouse wheel events and keyboard commands.

    +

    Keyboard events are just passed on to the Diagram.commandHandler's +CommandHandler.doKeyDown or CommandHandler.doKeyUp method.

    +

    This tool also is responsible for showing tooltips. +Tooltip Adornments may be declared as any GraphObject.toolTip, +or as the Diagram.toolTip if the mouse or finger remains motionless in the background of the diagram. +You can set toolTipDuration to control how long the tooltip remains visible after being motionless.

    +

    This tool does not utilize any tool handles. +This tool does not conduct any transactions. +But of course some of the tools that the ToolManager starts can show tool handles and/or +conduct their own transactions.

    +

    Index

    Inherited Members

    Constructors

    • +

      You do not normally need to create an instance of this tool +because one already exists as the Diagram.toolManager, which you can modify.

      +

      The Tool.name of this tool is "ToolManager".

      +

      The constructor produces a ToolManager that manages no tools. +Call initializeStandardTools to create various tools, +initialize the tool properties such as draggingTool, +and initialize the three mouse tool lists with those newly created tools.

      +

      Returns ToolManager

    Properties

    • +

      This read-only property returns the currently showing tooltip, or null if there is none.

      +
    • +

      Gets or sets the distance in view coordinates within which a mouse down-and-up is considered a click and beyond which a mouse movement is considered a drag. +The default value is 2 pixels horizontally and vertically for mouse events, and increases by 6 pixels for touch events. +This value is used by Tool.isBeyondDragSize.

      +
      since

      1.2

      +
    • +

      Gets or sets the time between when the mouse stops moving and a hold event, +in milliseconds. +The default value is 850 milliseconds.

      +
    • +

      Gets or sets the time between when the mouse stops moving and a hover event, +in milliseconds. This value affects the delay before GraphObject.toolTips are shown. +The default value is 850 milliseconds.

      +

      Set toolTipDuration to control how long a tooltip will remain visible.

      +
    • +

      Gets or sets how long a tool tip is visible. +The default value is 5000 milliseconds.

      +

      This is used by showToolTip to determine how long to wait before calling hideToolTip.

      +

      Set hoverDelay to control how long the mouse should stay stationary before it shows a tooltip.

      +

    Methods

    • doKeyDown(): void
    • +

      This just calls CommandHandler.doKeyDown on the diagram's Diagram.commandHandler.

      +

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • doKeyUp(): void
    • +

      This just calls CommandHandler.doKeyUp on the diagram's Diagram.commandHandler.

      +

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • doMouseDown(): void
    • +

      Iterate over the mouseDownTools list and start the first tool +for which its Tool.canStart predicate returns true.

      +

      Starting a tool replaces the Diagram.currentTool with the new tool. +Successfully doing so also activates the new tool by calling Tool.doActivate +and passes on the mouse-down event to it by calling Tool.doMouseDown.

      +

      Not finding any startable tools causes this tool manager to activate, +thereby enabling the mouse-move and mouse-up behaviors and starts +detection of a mouse-hold event after holdDelay milliseconds.

      +

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • doMouseHover(): void
    • +

      Implement the standard behavior for mouse hover and mouse hold events, +called by doWaitAfter when the mouse has not moved for a period of time.

      +

      If there has been no mouse down, the timer is set for hoverDelay milliseconds. +If it executes, it calls any GraphObject.mouseHover function on the object +at the mouse or on any of its containing panels, +or it calls any Diagram.mouseHover function for a background mouse-hover event.

      +

      If there had been a mouse down, the timer is set for holdDelay milliseconds. +If it executes, it calls any GraphObject.mouseHold function on the object +at the mouse or on any of its containing panels, +or it calls any Diagram.mouseHold function for a background mouse-held-down event.

      +

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • doMouseMove(): void
    • doMouseUp(): void
    • +

      Iterate over the mouseUpTools list and start the first tool +for which its Tool.canStart predicate returns true.

      +

      Starting a tool replaces the Diagram.currentTool with the new tool. +Successfully doing so also activates the new tool by calling Tool.doActivate +and passes on the mouse-up event to it by calling Tool.doMouseUp.

      +

      If no startable tool is found it deactivates this tool manager, +to get ready for a mouse-down and ignore mouse-move and mouse-up events.

      +

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • doMouseWheel(): void
    • +

      The diagram will call this method as the mouse wheel is rotated.

      +

      By default this just calls Tool.standardMouseWheel. +This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • doToolTip(): void
    • +

      Implement the standard behavior for tooltips, +called by doWaitAfter when the mouse has not moved for a period of time.

      +

      This looks for a GraphObject at the latest mouse point. +If it finds an object, it checks for a GraphObject.toolTip. +If it has none, this method searches up the visual tree for a containing +Panel that does have a tooltip.

      +

      If it didn't find any object, this looks for a Diagram.toolTip.

      +

      If it eventually finds a tooltip, this calls showToolTip. +Otherwise this calls hideToolTip.

      +

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • +

      Implement the standard behavior for when the mouse has not moved for a period of time. +This is due to an expired timer started by calling Tool.standardWaitAfter.

      +

      This calls doMouseHover and, if not mouse-down, doToolTip. +Afterwards, if the event that called Tool.standardWaitAfter was a touch event, +this simulates a right click, enabling context menu functionality and other actions on touch devices.

      +

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Parameters

      Returns void

    • findTool(name: string): Tool
    • +

      Find a mouse tool of a given name. +This searches the mouseDownTools, mouseMoveTools, and mouseUpTools lists.

      +

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Parameters

      • name: string
        +

        the type of tool, such as "Dragging" or "ClickSelecting".

        +

      Returns Tool

      a Tool whose Tool.name exactly matches the given name, +or null if no such tool is found in any of the three lists.

      +
    • hideToolTip(): void
    • +

      Hide any tooltip.

      +

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • initializeStandardTools(): void
    • +

      Initialize the three mouse tool lists with instances of the standard tools. +This adds new instances of tools to the following three mouse tool lists: +mouseDownTools, mouseMoveTools, or mouseUpTools. +This also sets the various tool properties of this ToolManager +to those newly created tools. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Returns void

    • +

      This is called by showToolTip to position the part within the viewport. +It normally goes just below the cursor. +But if the mouse is too close to the right edge or the bottom edge of the viewport, +it is positioned left and/or above the cursor.

      +

      This method only operates if the tooltip, an Adornment, does not have a Adornment.placeholder. +When there is a Placeholder in the tooltip, that Adornment is automatically positioned +so that the Placeholder is positioned at the adorned object, the second argument to this method.

      +

      This method may be overridden. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      If you override this method to position the tooltip, +the tooltip has already been measured but not arranged, +so you can use its GraphObject.measuredBounds width and height +but not its GraphObject.actualBounds.

      +

      Parameters

      Returns void

    • replaceTool(name: string, newtool: Tool): Tool
    • +

      Replace a mouse tool of a given name with a new tool, or remove an existing tool (if the newtool is null). +This searches the mouseDownTools, mouseMoveTools, +and mouseUpTools lists. +The new tool is inserted into the same list in which the same-named tool is found, +at the same position as the old tool. +However, if no existing tool with the given name is present, this does not add the new tool to any list, since it cannot know where it should be added. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Parameters

      • name: string
        +

        the type of tool, such as "Dragging" or "ClickSelecting".

        +
      • newtool: Tool
        +

        If null, any tool that the search finds will just be removed +from the list in which it was found.

        +

      Returns Tool

      the old tool that was replaced by the new one; this is null if none was found and the new tool was not added to any mouse tool list

      +
    • +

      Show a tooltip Adornment or HTMLInfo. +This is called by doToolTip once that method has found a tooltip to display.

      +

      This calls positionToolTip to make it easier to customize how the tooltip +is positioned relative to the object with the tooltip.

      +

      This method may be overridden, but you should consider calling this base method in order to get all of its functionality. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      Parameters

      • tooltip: Adornment | HTMLInfo
      • obj: GraphObject
        +

        The GraphObject getting the tooltip; this is null if the tooltip is being shown for the diagram background.

        +

      Returns void

    Constants

    +

    This value for gestureBehavior indicates that the pointer/touch pinch gestures +on the canvas intend to have no effect on the Diagram, but also no effect on the page.

    +
    since

    1.5

    +
    +

    This value for gestureBehavior indicates that the pointer/touch pinch gestures +on the canvas intend to have no effect on the Diagram, but will not be prevented, +and may bubble up the page to have other effects (such as zooming the page).

    +
    since

    1.5

    +
    +

    This value for gestureBehavior indicates that the pointer/touch pinch gestures +on the canvas intend to zoom the Diagram.

    +
    since

    1.5

    +
    +

    This value for mouseWheelBehavior indicates that the mouse wheel events are ignored, +although scrolling or zooming by other means may still be allowed.

    +
    since

    1.2

    +
    +

    This default value for mouseWheelBehavior indicates that mouse wheel events scroll the diagram.

    +
    +

    This value for mouseWheelBehavior indicates that the mouse wheel events change the scale of the diagram.

    +

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/Transaction.html b/api/symbols/Transaction.html index 5d6b41195..9613aadf6 100644 --- a/api/symbols/Transaction.html +++ b/api/symbols/Transaction.html @@ -1,429 +1,84 @@ - - - - - - Transaction | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class Transaction

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - Transaction -
    • -
    -
    -
    -
    -

    A Transaction holds a list of ChangedEvents collected during a transaction, - as the value of the read-only changes property.

    -

    Start a transaction by calling UndoManager.startTransaction - (or Model.startTransaction or Diagram.startTransaction, which call that method). - Be sure to finish a transaction with a matching call to UndoManager.commitTransaction - (or Model.commitTransaction or Diagram.commitTransaction), - or a call to UndoManager.rollbackTransaction - (or the same named methods on Model or Diagram).

    -

    If you are performing multiple or repeated changes to a model or diagram, - surround all of the code with calls to start and commit the transaction -- - do not perform repeated calls to start-commit-start-commit. - Typically each change caused by the user, such as a button click or a change of focus or a mouse drag, - should perform one transaction in which all changes are made. - All of the predefined commands and tools perform transactions.

    -

    Undoing or redoing a transaction is done by calling UndoManager.undo or UndoManager.redo. - Those methods call the undo or redo methods here.

    -

    The UndoManager holds a list of Transactions in its UndoManager.history.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - Read-only - changes - : List<ChangedEvent>

    -
      -
    • -
      -

      This read-only property returns the list of ChangedEvents. - The changes are stored in order of occurrence.

      -

      You should not modify this list.

      -
      -
    • -
    -
    -
    - -

    - isComplete - : boolean

    - -
    -
    - -

    - name - : string

    -
      -
    • -
      -

      Gets or sets the transaction name for this collection of changes. - This is set by a top-level call to UndoManager.commitTransaction.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - canRedo -

    -
      -
    • canRedo(): boolean
    • -
    -
      -
    • -
      -

      This predicate returns true if you can call redo, - namely when isComplete is true.

      -
      -

      Returns boolean

      -

      true if ready for redo to be called.

      -
    • -
    -
    -
    - -

    - canUndo -

    -
      -
    • canUndo(): boolean
    • -
    -
      -
    • -
      -

      This predicate returns true if you can call undo, - namely when isComplete is true.

      -
      -

      Returns boolean

      -

      true if ready for undo to be called.

      -
    • -
    -
    -
    - -

    - clear -

    -
      -
    • clear(): void
    • -
    -
      -
    • -
      -

      Clear all of the saved changes.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - optimize -

    -
      -
    • optimize(): void
    • -
    -
      -
    • -
      -

      Remove all but the first and last Property ChangedEvents for each property for each object.

      -

      This is now called by DraggingTool.stopTransaction in order to reduce the memory saved by each dragging transaction.

      -
      -
      since
      -

      2.2

      -
      -
      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - redo -

    -
      -
    • redo(): void
    • -
    -
      -
    • -
      -

      Re-perform these changes after an undo. - This is normally called only by the UndoManager. - canRedo must be true for this method to have any effect.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - undo -

    -
      -
    • undo(): void
    • -
    -
      -
    • -
      -

      Undo all of the changes, in reverse order. - This is normally called only by the UndoManager. - canUndo must be true for this method to have any effect.

      -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class Transaction

    Hierarchy

    • Transaction
    +

    A Transaction holds a list of ChangedEvents collected during a transaction, +as the value of the read-only changes property.

    +

    Start a transaction by calling UndoManager.startTransaction +(or Model.startTransaction or Diagram.startTransaction, which call that method). +Be sure to finish a transaction with a matching call to UndoManager.commitTransaction +(or Model.commitTransaction or Diagram.commitTransaction), +or a call to UndoManager.rollbackTransaction +(or the same named methods on Model or Diagram).

    +

    If you are performing multiple or repeated changes to a model or diagram, +surround all of the code with calls to start and commit the transaction -- +do not perform repeated calls to start-commit-start-commit. +Typically each change caused by the user, such as a button click or a change of focus or a mouse drag, +should perform one transaction in which all changes are made. +All of the predefined commands and tools perform transactions.

    +

    Undoing or redoing a transaction is done by calling UndoManager.undo or UndoManager.redo. +Those methods call the undo or redo methods here.

    +

    The UndoManager holds a list of Transactions in its UndoManager.history.

    +

    Index

    Constructors

    Properties

    • +

      This read-only property returns the list of ChangedEvents. +The changes are stored in order of occurrence.

      +

      You should not modify this list.

      +

    Methods

    • canRedo(): boolean
    • +

      This predicate returns true if you can call redo, +namely when isComplete is true.

      +

      Returns boolean

      true if ready for redo to be called.

      +
    • canUndo(): boolean
    • +

      This predicate returns true if you can call undo, +namely when isComplete is true.

      +

      Returns boolean

      true if ready for undo to be called.

      +
    • clear(): void
    • +

      Clear all of the saved changes.

      +

      Returns void

    • optimize(): void
    • +

      Remove all but the first and last Property ChangedEvents for each property for each object.

      +

      This is now called by DraggingTool.stopTransaction in order to reduce the memory saved by each dragging transaction.

      +
      since

      2.2

      +

      Returns void

    • redo(): void
    • +

      Re-perform these changes after an undo. +This is normally called only by the UndoManager. +canRedo must be true for this method to have any effect.

      +

      Returns void

    • undo(): void
    • +

      Undo all of the changes, in reverse order. +This is normally called only by the UndoManager. +canUndo must be true for this method to have any effect.

      +

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/TreeEdge.html b/api/symbols/TreeEdge.html index 874e7325f..49dc64ebc 100644 --- a/api/symbols/TreeEdge.html +++ b/api/symbols/TreeEdge.html @@ -1,302 +1,46 @@ - - - - - - TreeEdge | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class TreeEdge

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    This holds TreeLayout-specific information about Links.

    -

    This class inherits from LayoutEdge.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - Override - fromVertex - : TreeVertex

    - -
    -
    - -

    - relativePoint - : Point

    -
      -
    • -
      -

      Gets or sets a Point, relative to the parent node, - that may be useful in routing this link.

      -
      -
    • -
    -
    -
    - -

    - Override - toVertex - : TreeVertex

    - -
    -
    -
    -

    Methods

    -
    - -

    - Override - commit -

    -
      -
    • commit(): void
    • -
    -
      -
    • -
      -

      Commits the position of the Link and routes it.

      -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class TreeEdge

    Hierarchy

    +

    This holds TreeLayout-specific information about Links.

    +

    This class inherits from LayoutEdge.

    +

    Index

    Inherited Members

    Constructors

    Properties

    • +

      Gets or sets a Point, relative to the parent node, +that may be useful in routing this link.

      +

    Methods

    • commit(): void
    • +

      Commits the position of the Link and routes it.

      +

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/TreeLayout.html b/api/symbols/TreeLayout.html index d05c0b8e4..32d35b1f1 100644 --- a/api/symbols/TreeLayout.html +++ b/api/symbols/TreeLayout.html @@ -1,2285 +1,691 @@ - - - - - - TreeLayout | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class TreeLayout

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    This layout positions nodes of a tree-structured graph in layers (rows or columns).

    -

    - For a discussion and examples of the most commonly used properties, see Trees page in the Introduction. - If you want to experiment interactively with most of the properties, try the Tree Layout sample. - See samples that make use of TreeLayout in the samples index. -

    This layout makes use of a LayoutNetwork of - TreeVertexes and TreeEdges that normally - correspond to the Nodes and Links of the Diagram.

    -

    The most commonly set properties for controlling the results of a TreeLayout are:

    -
      -
    • angle: the direction in which the tree grows, from parent to child; - the default value of zero means that the tree grows towards the right, with the children of a node arranged in a layer that is a column. - An angle of 0 or 180 means that children form vertical layers -- breadth is height and depth is width; - an angle of 90 or 270 means that children form horizontal layers -- breadth is width and depth is height.
    • -
    • layerSpacing: the distance between layers -- between a parent node and its child nodes.
    • -
    • nodeSpacing: the distance between nodes within a layer -- between siblings.
    • -
    • alignment: the relative position of a parent node with its children.
    • -
    • sorting and comparer: specify the order of the immediate children of a parent node.
    • -
    • compaction: whether subtrees should be packed closer together if there is room.
    • -
    • layerStyle: whether the children of one node are aligned with the children of a sibling node.
    • -
    • setsPortSpot, portSpot, setsChildPortSpot, and childPortSpot: this controls whether to set the Link.fromSpot and - Link.toSpot to be sensible for the angle.
    • -
    • nodeIndent and nodeIndentPastParent: if the alignment is TreeLayout.AlignmentStart or TreeLayout.AlignmentEnd, - control how much extra space the first child is given when positioned.
    • -
    • breadthLimit, rowSpacing: try to limit the total breadth of a subtree to a certain distance; - when there are too many children or when they are too broad, this puts children into additional rows (or columns, depending on the angle) - thereby limiting the breadth while increasing the depth of the tree.
    • -
    -

    When you set one of the TreeLayout properties listed above, that property normally applies to all of the nodes in the tree. - What if you want alignment to be TreeLayout.AlignmentCenterChildren for the root node but TreeLayout.AlignmentBus for the other nodes in the tree? - Or what if you want want layerSpacing to be 50 for all layers except for the layer separating "leaf" nodes from their parent?

    -

    One common solution is to set treeStyle. - For the former scenario, you could set treeStyle to TreeLayout.StyleRootOnly; the value of alignment would only apply to the root node. - For the latter scenario, you could set it to TreeLayout.StyleLastParents; - the value of layerSpacing would apply to all nodes except those that have children but that do not have grandchildren. - How do you then set the alignment or layerSpacing for the other nodes? - By setting the TreeLayout properties whose names start with "alternate...". - In these cases that would mean setting alternateAlignment or alternateLayerSpacing.

    -

    These TreeLayout properties actually apply to the TreeVertex that the TreeLayout uses to represent a Node within the LayoutNetwork. - All of those TreeLayout properties are actually stored in rootDefaults; all of the "alternate..." properties are stored in alternateDefaults. - Depending on the value of treeStyle, the actual TreeVertex properties for each Node are copied appropriately from either rootDefaults or alternateDefaults. - In the default case where treeStyle is TreeLayout.StyleLayered, the alternateDefaults are ignored. - (Note that treeStyle, and a few other properties such as path and arrangement, apply to the whole layout, not to an individual node/vertex.)

    -

    The use of treeStyle and "alternate..." TreeLayout properties will cover a lot of common needs for tree layout customization. - However, there may be times when that is not enough. - Imagine a situation where you want a special TreeVertex property value for a particular Node. - The solution is to override assignTreeVertexValues, where you can examine the given TreeVertex, - including its corresponding LayoutVertex.node, to decide what TreeVertex property values should apply.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -

    Constants

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - alignment - : EnumValue

    -
      -
    • -
      -

      Gets or sets the default alignment of parents relative to their children. - Must be a static constant of TreeLayout whose name starts with "Alignment".

      -

      The default value is TreeLayout.AlignmentCenterChildren.

      -

      This sets the rootDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - alternateAlignment - : EnumValue

    - -
    -
    - -

    - alternateAngle - : number

    -
      -
    • -
      -

      Gets or sets the alternate direction for tree growth.

      -

      The default value is 0; the value must be one of: 0, 90, 180, 270.

      -

      These values are in degrees, where 0 is along the positive X axis, - and where 90 is along the positive Y axis. - This sets the alternateDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - alternateBreadthLimit - : number

    -
      -
    • -
      -

      Gets or sets an alternate limit on how broad a tree should be.

      -

      A value of zero (the default) means there is no limit; - a positive value specifies a limit. - The default value is zero.

      -

      This property is just a suggested constraint on how - broadly the tree will be laid out. - When there isn't enough breadth for all of the children of a node, - the children are placed in as many rows as needed to try to stay - within the given breadth limit. - If the value is too small, since this layout algorithm - does not modify the size or shape of any node, the nodes will - just be laid out in a line, one per row, and the breadth is - determined by the broadest node. - The distance between rows is specified by rowSpacing. - To make room for the links that go around earlier rows to get to - later rows, when the alignment is not a "center" alignment, the - rowIndent property specifies that space at the - start of each row. - This sets the alternateDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - alternateChildPortSpot - : Spot

    -
      -
    • -
      -

      Gets or sets the alternate spot that children nodes' ports get as their ToSpot - The default value is Spot.Default.

      -

      A value of Spot.Default will cause the TreeLayout - to assign a ToSpot based on the parent node's TreeVertex.angle.

      -

      If the value is other than NoSpot, it is just assigned. - When path is PathSource, - the port's FromSpot is set instead of the ToSpot. - This sets the alternateDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - alternateCommentMargin - : number

    -
      -
    • -
      -

      Gets or sets the alternate distance between a node and its comments.

      -

      The default value is 20.

      -

      This is used by addComments and layoutComments. - This sets the alternateDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - alternateCommentSpacing - : number

    - -
    -
    - -

    - alternateCompaction - : EnumValue

    - -
    -
    - -

    - alternateComparer - : (a: TreeVertex, b: TreeVertex) => number

    -
      -
    • -
      -

      Gets or sets the alternate comparison function used for sorting the immediate children of a vertex.

      -

      The default comparer compares the LayoutVertex.node Text values.

      -

      This sets the alternateDefaults' property of the same name. - Whether this comparison function is used is determined by the value of alternateSorting.

      -
      -
    • -
    -
    -
    - -

    - alternateDefaults - : TreeVertex

    - -
    -
    - -

    - alternateLayerSpacing - : number

    -
      -
    • -
      -

      Gets or sets the alternate distance between a parent node and its children.

      -

      The default value is 50.

      -

      This is the distance between a parent node and its first row - of children, in case there are multiple rows of its children. - The rowSpacing property determines the distance - between rows of children. - Negative values may cause children to overlap with the parent. - This sets the alternateDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - alternateLayerSpacingParentOverlap - : number

    -
      -
    • -
      -

      Gets or sets the alternate fraction of the node's depth for which the children's layer starts overlapped with the parent's layer.

      -

      The default value is 0.0 -- there is overlap between layers only if layerSpacing is negative. - A value of 1.0 and a zero layerSpacing will cause child nodes to completely overlap the parent.

      -

      A value greater than zero may still cause overlap between layers, - unless the value of layerSpacing is large enough. - A value of zero might still allow overlap between layers, - if layerSpacing is negative. - This sets the alternateDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - alternateNodeIndent - : number

    -
      -
    • -
      -

      Gets or sets the alternate indentation of the first child.

      -

      The default value is zero. The value should be non-negative.

      -

      This property is only sensible when the alignment - is AlignmentStart or AlignmentEnd. - Having a positive value is useful if you want to reserve space - at the start of the row of children for some reason. - For example, if you want to pretend the parent node is infinitely deep, - you can set this to be the breadth of the parent node. - This sets the alternateDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - alternateNodeIndentPastParent - : number

    -
      -
    • -
      -

      Gets or sets the fraction of this node's breadth is added to nodeIndent - to determine any spacing at the start of the children.

      -

      The default value is 0.0 -- the only indentation is specified by nodeIndent. - When the value is 1.0, the children will be indented past the breadth of the parent node.

      -

      This property is only sensible when the alignment - is AlignmentStart or AlignmentEnd.

      -
      -
    • -
    -
    -
    - -

    - alternateNodeSpacing - : number

    -
      -
    • -
      -

      Gets or sets the alternate distance between child nodes.

      -

      The default value is 20.

      -

      A negative value causes sibling nodes to overlap. - This sets the alternateDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - alternatePortSpot - : Spot

    -
      -
    • -
      -

      Gets or sets the alternate spot that this node's port gets as its FromSpot.

      -

      The default value is Spot.Default.

      -

      A value of Spot.Default will cause the TreeLayout - to assign a FromSpot based on the parent node's TreeVertex.angle. - If the value is other than NoSpot, it is just assigned. - When path is PathSource, - the port's ToSpot is set instead of the FromSpot. - This sets the alternateDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - alternateRowIndent - : number

    -
      -
    • -
      -

      Gets or sets the alternate indentation of the first child of each row, - if the alignment is not a "Center" alignment.

      -

      The default value is 10. The value should be non-negative.

      -

      This is used to leave room for the links that connect a parent node - with the child nodes that are in additional rows. - This sets the alternateDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - alternateRowSpacing - : number

    -
      -
    • -
      -

      Gets or sets the alternate distance between rows of children.

      -

      The default value is 25.

      -

      This property is only used when there is more than one - row of children for a given parent node. - layerSpacing determines the distance between - the parent node and its first row of child nodes. - This sets the alternateDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - alternateSetsChildPortSpot - : boolean

    -
      -
    • -
      -

      Gets or sets whether the TreeLayout should set the - ToSpot for each child node port.

      -

      The default value is true -- this may modify the spot of the ports of the children nodes, - if the node has only a single port.

      -

      The spot used depends on the value of childPortSpot. - This sets the alternateDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - alternateSetsPortSpot - : boolean

    -
      -
    • -
      -

      Gets or sets whether the TreeLayout should set the - FromSpot for this parent node port.

      -

      The default value is true -- this may modify the spot of the port of this node, the parent, - if the node has only a single port.

      -

      The spot used depends on the value of portSpot. - This sets the alternateDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - alternateSorting - : EnumValue

    - -
    -
    - -

    - angle - : number

    -
      -
    • -
      -

      Gets or sets the default direction for tree growth.

      -

      The default value is 0; the value must be one of: 0, 90, 180, 270.

      -

      These values are in degrees, where 0 is along the positive X axis, - and where 90 is along the positive Y axis. - This sets the rootDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - arrangement - : EnumValue

    - -
    -
    - -

    - arrangementSpacing - : Size

    - -
    -
    - -

    - breadthLimit - : number

    -
      -
    • -
      -

      Gets or sets a limit on how broad a tree should be.

      -

      A value of zero (the default) means there is no limit; - a positive value specifies a limit. - The default value is zero.

      -

      This property is just a suggested constraint on how - broadly the tree will be laid out. - When there isn't enough breadth for all of the children of a node, - the children are placed in as many rows as needed to try to stay - within the given breadth limit. - If the value is too small, since this layout algorithm - does not modify the size or shape of any node, the nodes will - just be laid out in a line, one per row, and the breadth is - determined by the broadest node. - The distance between rows is specified by rowSpacing. - To make room for the links that go around earlier rows to get to - later rows, when the alignment is not a "center" alignment, the - rowIndent property specifies that space at the - start of each row. - This sets the rootDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - childPortSpot - : Spot

    -
      -
    • -
      -

      Gets or sets the spot that children nodes' ports get as their ToSpot.

      -

      The default value is Spot.Default.

      -

      A value of Spot.Default will cause the TreeLayout - to assign a ToSpot based on the parent node's TreeVertex.angle. - If the value is other than NoSpot, it is just assigned. - When path is PathSource, - the port's FromSpot is set instead of the ToSpot. - This sets the rootDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - commentMargin - : number

    -
      -
    • -
      -

      Gets or sets the distance between a node and its comments.

      -

      The default value is 20.

      -

      This is used by addComments and layoutComments. - This sets the rootDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - commentSpacing - : number

    -
      -
    • -
      -

      Gets or sets the distance between comments.

      -

      The default value is 10.

      -

      This is used by addComments and layoutComments. - This sets the rootDefaults' property of the same name.

      -
      -
    • -
    -
    -
    - -

    - comments - : boolean

    -
      -
    • -
      -

      Gets or sets whether this layout should find all Nodes - whose category is "Comment" and - whose anchors are nodes represented in the network, - and increase the size of the corresponding TreeVertex to make room for the comment nodes. - The default value is true.

      -
      -
      since
      -

      1.3

      -
      -
      -
      -
    • -
    -
    -
    - -

    - compaction - : EnumValue

    - -
    -
    - -

    - comparer - : (a: TreeVertex, b: TreeVertex) => number

    -
    • +

      Gets or sets the distance between a parent node and its children.

      +

      The default value is 50.

      +

      This is the distance between a parent node and its first row +of children, in case there are multiple rows of its children. +The rowSpacing property determines the distance +between rows of children. +Negative values may cause children to overlap with the parent. +This sets the rootDefaults' property of the same name.

      +
    • +

      Gets or sets the fraction of the node's depth for which the children's layer starts overlapped with the parent's layer.

      +

      The default value is 0.0 -- there is overlap between layers only if layerSpacing is negative. +A value of 1.0 and a zero layerSpacing will cause child nodes to completely overlap the parent.

      +

      A value greater than zero may still cause overlap between layers, +unless the value of layerSpacing is large enough. +A value of zero might still allow overlap between layers, +if layerSpacing is negative. +This sets the rootDefaults' property of the same name.

      +
    • +

      Gets or sets the default indentation of the first child.

      +

      The default value is zero. The value should be non-negative.

      +

      This property is only sensible when the alignment +is AlignmentStart or AlignmentEnd. +Having a positive value is useful if you want to reserve space +at the start of the row of children for some reason. +For example, if you want to pretend the parent node is infinitely deep, +you can set this to be the breadth of the parent node. +This sets the rootDefaults' property of the same name.

      +
    • +

      Gets or sets the fraction of this node's breadth is added to nodeIndent +to determine any spacing at the start of the children.

      +

      The default value is 0.0 -- the only indentation is specified by nodeIndent. +When the value is 1.0, the children will be indented past the breadth of the parent node.

      +

      This property is only sensible when the alignment +is AlignmentStart or AlignmentEnd. +This sets the rootDefaults' property of the same name.

      +
    • +

      Gets or sets the distance between child nodes.

      +

      The default value is 20.

      +

      A negative value causes sibling nodes to overlap. +This sets the rootDefaults' property of the same name.

      +
    • +

      Gets or sets the spot that this node's port gets as its FromSpot.

      +

      The default value is Spot.Default.

      +

      A value of Spot.Default will cause the TreeLayout +to assign a FromSpot based on the parent node's TreeVertex.angle. +If the value is other than NoSpot, it is just assigned. +When path is PathSource, +the port's ToSpot is set instead of the FromSpot. +This sets the rootDefaults' property of the same name.

      +
    • +

      Gets or sets the collection of root vertexes.

      +

      Initially this will be an empty Set.

      +

      If the path is either PathDestination or +PathSource, this layout can easily +determine all of the tree roots by searching the whole network. +Otherwise, you should explicitly initialize this collection +with one or more TreeVertexes.

      +
    • +

      Gets or sets the default indentation of the first child of each row, +if the alignment is not a "Center" alignment.

      +

      The default value is 10. The value should be non-negative.

      +

      This is used to leave room for the links that connect a parent node +with the child nodes that are in additional rows. +This sets the rootDefaults' property of the same name.

      +
    • +

      Gets or sets the distance between rows of children.

      +

      The default value is 25.

      +

      This property is only used when there is more than one +row of children for a given parent node. +layerSpacing determines the distance between +the parent node and its first row of child nodes. +This sets the rootDefaults' property of the same name.

      +
    • +

      Gets or sets whether the TreeLayout should set the +ToSpot for each child node port.

      +

      The default value is true -- this may modify the spot of the ports of the children nodes, +if the node has only a single port.

      +

      The spot used depends on the value of childPortSpot. +This sets the rootDefaults' property of the same name.

      +
    • +

      Gets or sets whether the TreeLayout should set the +FromSpot for this parent node port.

      +

      The default value is true -- this may modify the spot of the port of this node, the parent, +if the node has only a single port.

      +

      The spot used depends on the value of portSpot. +This sets the rootDefaults' property of the same name.

      +

    Methods

    • +

      Find any associated objects to be positioned along with the LayoutVertex.node.

      +

      This looks for visible Node's whose category is "Comment" and +that refer to the tree vertex's Node. +This method is only called when comments is true.

      +

      You may want to override this method in order to customize how +any associated objects are found and how the node's LayoutVertex.bounds +are set to reserve space for those associated objects. +This method should not walk the tree, since it is called for each +TreeVertex in an indeterminate order. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +
      since

      1.2

      +

      Parameters

      Returns void

    • arrangeTrees(): void
    • +

      Position each separate tree.

      +

      This is called after each tree has been laid out and thus each subtree +bounds are known. +The arrangement and arrangementSpacing and Layout.arrangementOrigin +properties affect this method's behavior. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +
      since

      1.2

      +

      Returns void

    • +

      Assign final property values for a TreeVertex.

      +

      This method is commonly overridden in order to provide +tree layout properties for particular nodes. +This method is called after values have been inherited from other +TreeVertexes, so you can examine and modify the +values of related tree nodes. +Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      +

      However, when TreeVertex.alignment is TreeLayout.AlignmentBusBranching, +changing the TreeVertex.sorting or +TreeVertex.comparer properties in this method will have no effect.

      +

      This method should not walk the tree, since it is called for each +TreeVertex in a depth-first manner starting at a root.

      +

      Here is an example where the children are squeezed together if there are many of them, +but only on nodes that have no grandchildren. This makes use of two TreeVertex +properties that are automatically computed for you, TreeVertex.childrenCount and TreeVertex.descendantCount.

      +
        function SqueezingTreeLayout() {
      go.TreeLayout.call(this);
      }
      go.Diagram.inherit(SqueezingTreeLayout, go.TreeLayout);

      public assignTreeVertexValues(v) {
      if (v.childrenCount > 6 && v.childrenCount === v.descendantCount) {
      v.alignment = go.TreeLayout.AlignmentBottomRightBus;
      v.layerSpacing = 10;
      v.rowSpacing = 0;
      }
      }
      -

      If you need to assign TreeVertex values and also have them be "inherited" by the child vertexes, - you should override initializeTreeVertexValues instead. - However at the time that method is called, the computed properties of TreeVertex will not be available.

      -
      -
      since
      -

      1.1

      -
      -
      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - Protected Virtual - commitLayers -

    -
      -
    • commitLayers(layerRects: Rect[], offset: Point): void
    • -
    -
      -
    • -
      -

      This overridable method is called by commitLayout - if layerStyle is LayerUniform - to support custom arrangement of bands or labels across each layout layer. - By default this method does nothing.

      -

      The coordinates used in the resulting Rects may need to be offset by the Layout.arrangementOrigin - and/or by the arrangement of subtrees done by arrangeTrees.

      -
      -
      since
      -

      1.4

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        layerRects: Rect[]
        -
        -

        an Array of Rects with the bounds of each of the "layers"

        -
        -
      • -
      • -
        offset: Point
        -
        -

        the position of the top-left corner of the banded area relative to the coordinates given by the layerRects

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Protected Override - commitLayout -

    -
      -
    • commitLayout(): void
    • -
    -
      -
    • -
      -

      Set the fromSpot and toSpot on each Link, position each Node according - to the vertex position, and then position/route the Links.

      -

      This calls the commitNodes and commitLinks methods, the latter only if isRouting is true. - You should not call this method -- it is a "protected virtual" method. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Protected Virtual - commitLinks -

    -
      -
    • commitLinks(): void
    • -
    -
      -
    • -
      -

      Routes the links.

      -

      This is called by commitLayout. - This is only called if Layout.isRouting is true. - See also commitNodes. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Protected Virtual - commitNodes -

    -
      -
    • commitNodes(): void
    • -
    -
      -
    • -
      -

      Commit the position of all nodes.

      -

      This is called by commitLayout. - See also commitLinks. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - createNetwork -

    - - -
    -
    - -

    - Override - doLayout -

    - -
      -
    • -
      -

      Perform the tree layout.

      -

      If there is no Layout.network, this calls makeNetwork to create a LayoutNetwork from the given collection of Parts.

      -

      If there are no TreeVertex roots specified, this finds all roots in the Layout.network.

      -

      This initializes all of the TreeVertexes and TreeEdges, calling initializeTreeVertexValues on each vertex, - supporting inheritance of vertex values. - Then it calls assignTreeVertexValues on each one, to allow for node/vertex-specific customizations. - Next it sorts all of the child vertexes for each parent vertex, if needed.

      -

      This also calls addComments of each vertex, in order to find any comment nodes associated with each vertex, - so that they can be accommodated by the layout.

      -

      This then actually does the "layout" of the vertexes and optionally the routing of the edges of each tree in the network. - To deal with multiple roots/trees this also calls arrangeTrees to position each separate tree relative to each other.

      -

      Finally this calls Layout.updateParts to commit the Node positions from the vertex positions and the Link routes from the edges. - Layout.updateParts calls commitLayout within a transaction.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - initializeTreeVertexValues -

    -
      -
    • initializeTreeVertexValues(v: TreeVertex): void
    • -
    -
      -
    • -
      -

      Assign initial property values for a TreeVertex.

      -

      The values may be inherited, so this method is called while - propagating values from the root nodes. - This method should not walk the tree, since it is called for each - TreeVertex in a depth-first manner starting at a root.

      -

      You probably do not need to override this method, - but if you do you should call first either the base method - or TreeVertex.copyInheritedPropertiesFrom, since they - assign most of the TreeVertex property values - used to influence the layout. - Informational properties such as TreeVertex.descendantCount - and TreeVertex.maxGenerationCount will not yet have been initialized - by the time this method is called. - It is more common to override assignTreeVertexValues in order to - modify a property or two to customize the layout at that node. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -

      When the TreeVertex.alignment is TreeLayout.AlignmentBusBranching, - this will modify the TreeVertex.angle appropriately depending on which - side of the bus the vertex is on.

      -
      -
      since
      -

      1.2

      -
      -
      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - Virtual - layoutComments -

    - -
      -
    • -
      -

      Position and TreeVertex.comments around the vertex.

      -

      This method should not walk the tree, since it is called for each - TreeVertex in an indeterminate order. - Please read the Introduction page on Extensions for how to override methods and how to call this base method.

      -
      -
      since
      -

      1.2

      -
      -
      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - makeNetwork -

    - - -
    -
    -
    -

    Constants

    -
    - -

    - Static - AlignmentBottomRightBus - : EnumValue

    -
    -

    The children are positioned in a bus, only on the bottom or right side of the parent; - this value is used for TreeLayout.alignment or TreeLayout.alternateAlignment.

    -

    A bus does not take TreeVertex.breadthLimit into account.

    -
    -
    -
    - -

    - Static - AlignmentBus - : EnumValue

    -
    -

    The children are positioned in a bus on both sides of an "aisle" where the links to them go, - with the last odd child (if any) placed at the end of the aisle in the middle; - this value is used for TreeLayout.alignment or TreeLayout.alternateAlignment.

    -

    The children, if they are themselves parents, continue at the same inherited angle; - use TreeLayout.AlignmentBusBranching if you want grandchildren to proceed growing in - the different angle as determined by the side.

    -

    A bus does not take TreeVertex.breadthLimit into account.

    -
    -
    -
    - -

    - Static - AlignmentBusBranching - : EnumValue

    -
    -

    Like TreeLayout.AlignmentBus with the children arranged on both sides of an "aisle" - with any last odd child placed at the end of the aisle, - but the children get an TreeVertex.angle that depends on which side of the aisle - they were placed; - this value is used for TreeLayout.alignment or TreeLayout.alternateAlignment.

    -

    This only works well when the TreeLayout.treeStyle is TreeLayout.StyleLayered.

    -

    A bus does not take TreeVertex.breadthLimit into account.

    -
    -
    -
    - -

    - Static - AlignmentCenterChildren - : EnumValue

    -
    -

    The parent is centered at the middle of the range of its immediate child nodes; - this value is used for TreeLayout.alignment or TreeLayout.alternateAlignment.

    -

    When there is a breadth limit that causes there to be multiple rows, - the links that extend from the parent to those children in rows past - the first one may cross over the nodes that are in earlier rows.

    -
    -
    -
    - -

    - Static - AlignmentCenterSubtrees - : EnumValue

    -
    -

    The parent is centered at the middle of the range of its child subtrees; - this value is used for TreeLayout.alignment or TreeLayout.alternateAlignment.

    -

    When there is a breadth limit that causes there to be multiple rows, - the links that extend from the parent to those children in rows past - the first one may cross over the nodes that are in earlier rows.

    -
    -
    -
    - -

    - Static - AlignmentEnd - : EnumValue

    -
    -

    The parent is positioned near the last of its children; - this value is used for TreeLayout.alignment or TreeLayout.alternateAlignment.

    -
    -
    -
    - -

    - Static - AlignmentStart - : EnumValue

    -
    -

    The parent is positioned near the first of its children; - this value is used for TreeLayout.alignment or TreeLayout.alternateAlignment.

    -
    -
    -
    - -

    - Static - AlignmentTopLeftBus - : EnumValue

    -
    -

    The children are positioned in a bus, only on the top or left side of the parent; - this value is used for TreeLayout.alignment or TreeLayout.alternateAlignment.

    -

    A bus does not take TreeVertex.breadthLimit into account.

    -
    -
    -
    - -

    - Static - ArrangementFixedRoots - : EnumValue

    -
    -

    Do not move each root node, but position all of their descendants relative to their root; - this value is used for TreeLayout.arrangement.

    -
    -
    -
    - -

    - Static - ArrangementHorizontal - : EnumValue

    -
    -

    Position each tree in a non-overlapping fashion by increasing X coordinates, - starting at the Layout.arrangementOrigin; - this value is used for TreeLayout.arrangement.

    -
    -
    -
    - -

    - Static - ArrangementVertical - : EnumValue

    -
    -

    Position each tree in a non-overlapping fashion by increasing Y coordinates, - starting at the Layout.arrangementOrigin; - this value is used for TreeLayout.arrangement.

    -
    -
    -
    - -

    - Static - CompactionBlock - : EnumValue

    -
    -

    A simple fitting of subtrees; - this value is used for TreeLayout.compaction or TreeLayout.alternateCompaction.

    -

    This mode produces more compact trees -- often nicer looking too; - Nodes will not overlap each other, unless you have negative values - for some of the spacing properties; - However it is possible when the links are orthogonally styled that - occasionally the subtrees will be placed so close together that some - links may overlap the links or even the nodes of other subtrees.

    -
    -
    -
    - -

    - Static - CompactionNone - : EnumValue

    -
    -

    Only simple placement of children next to each other, as determined by their subtree breadth; - this value is used for TreeLayout.compaction or TreeLayout.alternateCompaction.

    -

    For any node, there will not be another node at any depth occupying the same breadth position, - unless there are multiple rows; In other words, if there is no breadth limit resulting in - multiple rows, with this compaction mode it is as if every node were infinitely deep.

    -
    -
    -
    - -

    - Static - LayerIndividual - : EnumValue

    -
    -

    The normal layer style, where each node takes up only the depth that it needs; - this value is used for TreeLayout.layerStyle.

    -
    -
    since
    -

    1.4

    -
    -
    -
    -
    -
    - -

    - Static - LayerSiblings - : EnumValue

    -
    -

    A layer style where all of the children of a parent node take up the same amount of depth -- - this typically causes all cousins to be aligned; - this value is used for TreeLayout.layerStyle.

    -
    -
    since
    -

    1.4

    -
    -
    -
    -
    -
    - -

    - Static - LayerUniform - : EnumValue

    -
    -

    A layer style where all nodes with the same TreeVertex.level throughout the tree take up the same amount of depth -- - if the TreeVertex.angle is the same for all nodes, this will result in all nodes in the same layer to be aligned; - this value is used for TreeLayout.layerStyle.

    -
    -
    since
    -

    1.4

    -
    -
    -
    -
    -
    - -

    - Static - PathDefault - : EnumValue

    -
    -

    This value for TreeLayout.path causes the value of Diagram.isTreePathToChildren - to effectively choose either TreeLayout.PathDestination (if true) or TreeLayout.PathSource (if false).

    -
    -
    -
    - -

    - Static - PathDestination - : EnumValue

    -
    -

    The children of a TreeVertex are its LayoutVertex.destinationVertexes, - the collection of connected LayoutEdge.toVertexes; - this value is used for TreeLayout.path.

    -

    The tree roots are those TreeVertexes that have zero source edges.

    -
    -
    -
    - -

    - Static - PathSource - : EnumValue

    -
    -

    The children of a TreeVertex are its LayoutVertex.sourceVertexes, - the collection of connected LayoutEdge.fromVertexes; - this value is used for TreeLayout.path.

    -

    The tree roots are those TreeVertexes that have zero destination edges.

    -
    -
    -
    - -

    - Static - SortingAscending - : EnumValue

    -
    -

    Lay out each child according to the sort order given by TreeVertex.comparer; - this value is used for TreeLayout.sorting or TreeLayout.alternateSorting.

    -
    -
    -
    - -

    - Static - SortingDescending - : EnumValue

    -
    -

    Lay out each child in reverse sort order given by TreeVertex.comparer; - this value is used for TreeLayout.sorting or TreeLayout.alternateSorting.

    -
    -
    -
    - -

    - Static - SortingForwards - : EnumValue

    -
    -

    Lay out each child in the order in which they were found; - this value is used for TreeLayout.sorting or TreeLayout.alternateSorting.

    -
    -
    -
    - -

    - Static - SortingReverse - : EnumValue

    -
    -

    Lay out each child in reverse order from which they were found; - this value is used for TreeLayout.sorting or TreeLayout.alternateSorting.

    -
    -
    -
    - -

    - Static - StyleAlternating - : EnumValue

    -
    -

    Alternate layers of the tree have different properties, typically including the angle; - this value is used for TreeLayout.treeStyle.

    -

    Each TreeVertex gets its properties from its grandparent node; - The root nodes get their defaults from TreeLayout.rootDefaults.

    -

    The immediate children of root nodes get their defaults from TreeLayout.alternateDefaults.

    -

    Depending on the properties used, it is possible for some link routes to cross over nodes.

    -
    -
    -
    - -

    - Static - StyleLastParents - : EnumValue

    -
    -

    Just like the standard layered tree style, except that the nodes with children but no grandchildren - have alternate properties; - this value is used for TreeLayout.treeStyle.

    -

    Each TreeVertex gets its properties from its parent node; - However, for those nodes whose TreeVertex.maxGenerationCount is 1, - in other words when it has children but no grandchildren, - the properties are copied from TreeLayout.alternateDefaults.

    -

    If the tree only has two levels, the root node gets the TreeLayout.rootDefaults.

    -
    -
    -
    - -

    - Static - StyleLayered - : EnumValue

    -
    -

    The normal tree style, where all of the children of each TreeVertex are lined up - horizontally or vertically; - this value is used for TreeLayout.treeStyle.

    -

    Each TreeVertex gets its properties from its parent node; - TreeLayout.rootDefaults is used for all default TreeVertex property values; - TreeLayout.alternateDefaults is ignored.

    -
    -
    -
    - -

    - Static - StyleRootOnly - : EnumValue

    -
    -

    All of the nodes get the alternate properties, except the root node gets the default properties; - this value is used for TreeLayout.treeStyle.

    -

    The root node gets the TreeLayout.rootDefaults properties, - the root node's children get the TreeLayout.alternateDefaults properties, - and all the rest of the TreeVertexes get their properties from their parent node.

    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/TreeMapLayout.html b/api/symbols/TreeMapLayout.html index 38e3ce429..ed0c03056 100644 --- a/api/symbols/TreeMapLayout.html +++ b/api/symbols/TreeMapLayout.html @@ -1,343 +1,47 @@ - - - - - - TreeMapLayout | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class TreeMapLayout

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    -
      -
    • - Layout -
        -
      • - TreeMapLayout -
      • -
      -
    • -
    -
    -
    -
    -

    A custom Layout that lays out hierarchical data using nested rectangles.

    -

    If you want to experiment with this extension, try the Tree Map Layout sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Create a minimal layout that only positions Nodes that do not have a location.

      -
      -

      Parameters

      -
        -
      • -
        Optional init: Partial<Layout>
        -
        -

        Optional initialization properties.

        -
        -
      • -
      -

      Returns TreeMapLayout

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - isTopLevelHorizontal - : boolean

    -
      -
    • -
      -

      Gets or sets whether top level Parts are laid out horizontally.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override - cloneProtected -

    - -
      -
    • -
      -

      Copies properties to a cloned Layout.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - computeTotals -

    -
      -
    • computeTotals(diagram: Diagram): void
    • -
    -
      -
    • -
      -

      Compute the data.total for each node in the Diagram, with a Group's being a sum of its members.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    - -

    - Override - doLayout -

    - -
      -
    • -
      -

      This method actually positions all of the nodes by determining total area and then recursively tiling nodes from the top-level down.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class TreeMapLayout Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    +

    A custom Layout that lays out hierarchical data using nested rectangles.

    +

    If you want to experiment with this extension, try the Tree Map Layout sample.

    +

    Index

    Inherited Members

    Constructors

    • +

      Create a minimal layout that only positions Nodes that do not have a location.

      +

      Parameters

      • Optional init: Partial<Layout>
        +

        Optional initialization properties.

        +

      Returns TreeMapLayout

    Properties

    • +

      Gets or sets whether top level Parts are laid out horizontally.

      +

    Methods

    • +

      Copies properties to a cloned Layout.

      +

      Parameters

      Returns void

    • computeTotals(diagram: Diagram): void
    • +

      Compute the data.total for each node in the Diagram, with a Group's being a sum of its members.

      +

      Parameters

      Returns void

    • +

      This method actually positions all of the nodes by determining total area and then recursively tiling nodes from the top-level down.

      +

      Parameters

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/TreeModel.html b/api/symbols/TreeModel.html index 1fd851b40..eb76a0ba9 100644 --- a/api/symbols/TreeModel.html +++ b/api/symbols/TreeModel.html @@ -1,591 +1,138 @@ - - - - - - TreeModel | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class TreeModel

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - Model -
        -
      • - TreeModel -
      • -
      -
    • -
    -
    -
    -
    -

    TreeModels support tree-structured graphs of nodes and links. - Each node can have at most one "tree parent"; cycles are not permitted. - The reference to the parent node's key is a property of the child node data.

    -

    TreeModels, unlike GraphLinksModels, do not support arbitrary link relationships between nodes, - nor is there a separate link data object for each parent-child relationship. - Furthermore there is no support for grouping or label nodes.

    -

    The nodeParentKeyProperty property names the property on the node data whose value - is the key of the "tree parent" node. - The default value for this property is "parent".

    -

    For example, one can define a graph consisting of one parent node with two child nodes:

    -
     model.nodeDataArray = [
    -   { key: "Alpha" },
    -   { key: "Beta", parent: "Alpha" },
    -   { key: "Gamma", parent: "Alpha" }
    - ];
    +TreeModel | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class TreeModel

    Hierarchy

    +

    TreeModels support tree-structured graphs of nodes and links. +Each node can have at most one "tree parent"; cycles are not permitted. +The reference to the parent node's key is a property of the child node data.

    +

    TreeModels, unlike GraphLinksModels, do not support arbitrary link relationships between nodes, +nor is there a separate link data object for each parent-child relationship. +Furthermore there is no support for grouping or label nodes.

    +

    The nodeParentKeyProperty property names the property on the node data whose value +is the key of the "tree parent" node. +The default value for this property is "parent".

    +

    For example, one can define a graph consisting of one parent node with two child nodes:

    +
     model.nodeDataArray = [
    { key: "Alpha" },
    { key: "Beta", parent: "Alpha" },
    { key: "Gamma", parent: "Alpha" }
    ];
    -

    If you need to show a more complicated graph structure than a tree, use a GraphLinksModel. - If you want to have multiple links between the same pair of nodes, - or if you want to associate more information with each link and cannot put the information on the child node, - you will need to have a separate link data object for each link, - and that would require the use of GraphLinksModel.

    -
    -
    since
    -

    1.1

    -
    -
    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      This constructs an empty TreeModel unless one provides arguments as the initial data array values

      -
      -

      Parameters

      -
        -
      • -
        Optional nodedataarray: ObjectData[]
        -
        -

        an optional Array containing JavaScript objects to be represented by Parts.

        -
        -
      • -
      • -
        Optional init: Partial<TreeModel>
        -
        -

        Optional initialization properties.

        -
        -
      • -
      -

      Returns TreeModel

      -
    • -
    • -
      -

      for the Model.nodeDataArray property.

      -
      -

      Parameters

      -
        -
      • -
        Optional init: Partial<TreeModel>
        -
        -

        Optional initialization properties.

        -
        -
      • -
      -

      Returns TreeModel

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - nodeParentKeyProperty - : string | ((a: ObjectData, b?: Key) => Key)

    -
      -
    • -
      -

      Gets or sets the name of the property on node data that specifies - the string or number key of the node data that acts as the "parent" for this "child" node data. - The value may also be a function taking two arguments, where the first argument will be a node data object. - If the second argument is not supplied, the function should return the string or number key for the parent node data object of which the given data object is a child; - if the second argument is supplied, the function should modify the node data object so that it has that new key - (which may be undefined to refer to no node) as the parent key for that node.. - The default value is the name 'parent', meaning that it expects the data to have a property named 'parent' if the node wants to refer to the parent node by its key. - The value must not be null nor an empty string.

      -

      If you want to set this property you must do so before using the model, and especially before you assign Diagram.model. - Note that functions cannot be serialized into JSON-formatted text, so if you are using toJson and Model.fromJson, - and if you want this property to be a function, you will need to assign this property to your desired function - immediately after creating the model, including when it is created by Model.fromJson.

      -
      -
      see
      -

      getParentKeyForNodeData, setParentKeyForNodeData

      -
      -
      -
      -
    • -
    -
    -
    - -

    - parentLinkCategoryProperty - : string | ((a: ObjectData, b?: string) => string)

    -
      -
    • -
      -

      Gets or sets the name of the data property that returns a string describing that node data's parent link's category. - The value may also be a function taking two arguments, where the first argument will be a node data object. - If the second argument is not supplied, the function should return the category name for any parent link; - if the second argument is supplied, the function should modify the node data object so that its parent link has that new category name. - The default value is the name 'parentLinkCategory'. - This is used by the diagram to distinguish between different kinds of links. - The name must not be null. - If the value is an empty string, - getParentLinkCategoryForNodeData will return an empty string for all node data objects.

      -

      If you want to set this property you must do so before using the model, and especially before you assign Diagram.model. - Note that functions cannot be serialized into JSON-formatted text, so if you are using toJson and Model.fromJson, - and if you want this property to be a function, you will need to assign this property to your desired function - immediately after creating the model, including when it is created by Model.fromJson.

      -
      -
      see
      -

      getParentLinkCategoryForNodeData, setParentLinkCategoryForNodeData

      -
      -
      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Override Virtual - copyNodeData -

    - -
      -
    • -
      -

      This override also makes sure any copied node data does not have a reference to a parent node.

      -
      -
      see
      -

      Model.copyNodeData

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        nodedata: ObjectData
        -
        -

        a JavaScript object represented by a node, group, or non-link.

        -
        -
      • -
      -

      Returns ObjectData

      -
    • -
    -
    -
    - -

    - getParentKeyForNodeData -

    - -
      -
    • -
      -

      If there is a parent node for the given node data, return the parent's key.

      -
      -
      see
      -

      nodeParentKeyProperty, setParentKeyForNodeData

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        nodedata: ObjectData
        -
        -

        a JavaScript object represented by a node.

        -
        -
      • -
      -

      Returns Key

      -

      This returns undefined if there is no parent node data object.

      -
    • -
    -
    -
    - -

    - getParentLinkCategoryForNodeData -

    -
      -
    • getParentLinkCategoryForNodeData(childdata: ObjectData): string
    • -
    - -
    -
    - -

    - Override Virtual - setDataProperty -

    -
      -
    • setDataProperty(data: ObjectData, propname: string, val: any): void
    • -
    -
      -
    • -
      -

      This override changes the value of some property of a node data or an item data, given a string naming the property - and the new value, in a manner that can be undone/redone and that automatically updates any bindings.

      -

      This gets the old value of the property; if the value is the same as the new value, no side-effects occur.

      -
      -
      see
      -

      Model.setDataProperty

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        data: ObjectData
        -
        -

        a JavaScript object typically the value of a Panel.data and represented by a Node, Link, Group, simple Part, - or item in a Panel.itemArray; or this model's modelData.

        -
        -
      • -
      • -
        propname: string
        -
        -

        a string that is not null or the empty string.

        -
        -
      • -
      • -
        val: any
        -
        -

        the new value for the property.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - setParentKeyForNodeData -

    -
      -
    • setParentKeyForNodeData(nodedata: ObjectData, key: Key): void
    • -
    -
      -
    • -
      -

      Change the parent node for the given node data, given a key for the new parent, or undefined if there should be no parent.

      -
      -
      see
      -

      nodeParentKeyProperty, getParentKeyForNodeData

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        nodedata: ObjectData
        -
        -

        a JavaScript object represented by a node.

        -
        -
      • -
      • -
        key: Key
        -
        -

        This may be undefined if there should be no parent node data.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - setParentLinkCategoryForNodeData -

    -
      -
    • setParentLinkCategoryForNodeData(childdata: ObjectData, cat: string): void
    • -
    -
      -
    • -
      -

      Change the category for the parent link of a given child node data, a string naming the link template - that the Diagram should use to represent the link.

      -

      Changing the link template will cause any existing Link - to be removed from the Diagram and replaced with a new Link - created by copying the new link template and applying any data-bindings. - Note that the new template must be an instance of the same class as the original link. - Thus one cannot change the category of a link from an instance of Link - to an instance of a subclass of Link, nor vice-versa.

      -
      -
      see
      -

      parentLinkCategoryProperty, getParentLinkCategoryForNodeData

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        childdata: ObjectData
        -
        -

        a JavaScript object represented by a node data.

        -
        -
      • -
      • -
        cat: string
        -
        -

        Must not be null.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/TreeNetwork.html b/api/symbols/TreeNetwork.html index 82618c522..0122ede72 100644 --- a/api/symbols/TreeNetwork.html +++ b/api/symbols/TreeNetwork.html @@ -1,211 +1,40 @@ - - - - - - TreeNetwork | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class TreeNetwork

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    This class represents an abstract graph of TreeVertexes and TreeEdges - that can be constructed based on the Nodes and Links of a Diagram - so that the TreeLayout can operate independently of the diagram until it - is time to commit any node positioning or link routing.

    -

    This class inherits from LayoutNetwork.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class TreeNetwork

    Hierarchy

    +

    This class represents an abstract graph of TreeVertexes and TreeEdges +that can be constructed based on the Nodes and Links of a Diagram +so that the TreeLayout can operate independently of the diagram until it +is time to commit any node positioning or link routing.

    +

    This class inherits from LayoutNetwork.

    +

    Index

    Constructors

    Inherited Members

    Constructors

    • +

      This constructs an empty network. +It is commonplace to call addParts to build up the network +to have the same structure as a Diagram's or Group's nodes and links.

      +

      Parameters

      Returns TreeNetwork

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/TreeVertex.html b/api/symbols/TreeVertex.html index 01a84aaa1..e1fd9fdc7 100644 --- a/api/symbols/TreeVertex.html +++ b/api/symbols/TreeVertex.html @@ -1,888 +1,206 @@ - - - - - - TreeVertex | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class TreeVertex

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    - -
    -
    -
    -

    This holds TreeLayout-specific information about Nodes.

    -

    This class inherits from LayoutVertex.

    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - - -
    -
    -
    -

    Properties

    -
    - -

    - alignment - : EnumValue

    - -
    -
    - -

    - angle - : number

    -
      -
    • -
      -

      Gets or sets the absolute angle at which this subtree should grow from this vertex.

      -

      The default value is zero, meaning that general tree growth should proceed rightwards along the X axis.

      -

      This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass. - By default this is the same as the Angle of the parent TreeVertex. - However, after the initial propagation of property values, perhaps in - an override of TreeLayout.assignTreeVertexValues, - you could just set this property to specify the angle at which this node grows its subtrees.

      -
      -
    • -
    -
    -
    - -

    - breadthLimit - : number

    -
      -
    • -
      -

      Gets or sets how broad a node and its descendants should be.

      -

      By default this is zero. A value of zero imposes no limit; - a positive value will specify a limit for the total width of this subtree.

      -

      This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass.

      -
      -
    • -
    -
    -
    - -

    - childPortSpot - : Spot

    - -
    -
    - -

    - children - : TreeVertex[]

    -
      -
    • -
      -

      Gets or sets the logical children for this node.

      -

      The default value is an empty array.

      -

      This structural property is computed in TreeLayout.doLayout when building the tree structures. - You should probably not be setting this property.

      -
      -
    • -
    -
    -
    - -

    - Read-only - childrenCount - : number

    -
      -
    • -
      -

      This read-only property returns the number of immediate children this node has.

      -

      The default value is zero.

      -
      -
    • -
    -
    -
    - -

    - commentMargin - : number

    -
      -
    • -
      -

      Gets or sets the space to leave between the node and the comments.

      -

      The default value is 20.

      -

      Negative values may cause comments to overlap with the node. - This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass.

      -
      -
    • -
    -
    -
    - -

    - commentSpacing - : number

    -
      -
    • -
      -

      Gets or sets the space to leave between consecutive comments.

      -

      The default value is 10.

      -

      Negative values may cause comments to overlap. - This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass.

      -
      -
    • -
    -
    -
    - -

    - comments - : Node[]

    -
      -
    • -
      -

      Gets or sets an array of Nodes that will be positioned near this node.

      -

      The default value is null.

      -

      These objects should not have their own TreeVertexes to be laid out. - Typically these will be Nodes whose Category is "Comment". - This array should be allocated and initialized in TreeLayout.addComments.

      -
      -
    • -
    -
    -
    - -

    - compaction - : EnumValue

    - -
    -
    - -

    - comparer - : (a: TreeVertex, b: TreeVertex) => number

    - -
    -
    - -

    - descendantCount - : number

    -
      -
    • -
      -

      Gets or sets the number of descendants this node has.

      -

      For a leaf node, this will be zero.

      -

      This informational property is computed as part of the TreeLayout.initializeTreeVertexValues pass. - You should probably not be setting this property.

      -
      -
    • -
    -
    -
    - -

    - initialized - : boolean

    -
      -
    • -
      -

      Gets or sets whether this node has been initialized as part of TreeLayout.doLayout when building the tree structures.

      -

      The default value is false.

      -
      -
    • -
    -
    -
    - -

    - layerSpacing - : number

    -
      -
    • -
      -

      Gets or sets the distance between this node and its children.

      -

      The default value is 50.

      -

      Negative values may cause children to overlap with the parent. - This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass.

      -
      -
    • -
    -
    -
    - -

    - layerSpacingParentOverlap - : number

    -
      -
    • -
      -

      Gets or sets the fraction of this node's depth that may overlap with the children's layer.

      -

      The default value is 0.0 -- there is overlap only if layerSpacing is negative. - Values must range from 0.0 to 1.0, where 1.0 means the full depth of this node.

      -

      When this value is greater than 0.0, there might not be overlap if layerSpacing - is larger than the depth of this node times this fraction. - Even when this value is 0.0, there may be overlap when layerSpacing is negative. - This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass.

      -
      -
    • -
    -
    -
    - -

    - level - : number

    -
      -
    • -
      -

      Gets or sets the number of single-parent ancestors this node has.

      -

      This could also be interpreted as which layer this node is in. - A root node will have a value of zero.

      -

      This informational property is computed in TreeLayout.doLayout when building the tree structures. - You should probably not be setting this property.

      -
      -
    • -
    -
    -
    - -

    - maxChildrenCount - : number

    -
      -
    • -
      -

      Gets or sets the maximum number of children of any descendant of this node.

      -

      For a leaf node, this will be zero.

      -

      This informational property is computed as part of the TreeLayout.initializeTreeVertexValues pass. - You should probably not be setting this property.

      -
      -
    • -
    -
    -
    - -

    - maxGenerationCount - : number

    -
      -
    • -
      -

      Gets or sets the maximum depth of the subtrees below this node.

      -

      For a leaf node, this will be zero.

      -

      This informational property is computed as part of the TreeLayout.initializeTreeVertexValues pass. - You should probably not be setting this value.

      -
      -
    • -
    -
    -
    - -

    - nodeIndent - : number

    - -
    -
    - -

    - nodeIndentPastParent - : number

    - -
    -
    - -

    - nodeSpacing - : number

    -
      -
    • -
      -

      Gets or sets the distance between child nodes.

      -

      The default value is 20.

      -

      A negative value will cause sibling nodes to overlap. - This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass.

      -
      -
    • -
    -
    -
    - -

    - parent - : TreeVertex

    -
      -
    • -
      -

      Gets or sets the logical parent for this node.

      -

      The default value is null.

      -

      This structural property is computed in TreeLayout.doLayout when building the tree structures. - You should probably not be setting this property.

      -
      -
    • -
    -
    -
    - -

    - portSpot - : Spot

    - -
    -
    - -

    - relativePosition - : Point

    -
      -
    • -
      -

      Gets or sets the position of this node relative to its parent node.

      -

      This informational property is computed during TreeLayout.doLayout. - You should probably not be setting this property.

      -
      -
    • -
    -
    -
    - -

    - rowIndent - : number

    -
      -
    • -
      -

      Gets or sets the distance the first child of each row should be indented.

      -

      The default value is 10. The value should be non-negative.

      -

      This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass. - This property is only used when the breadthLimit is positive, - and some initial space needs to be reserved in each row of nodes for the links - that are routed around those rows.

      -
      -
    • -
    -
    -
    - -

    - rowSpacing - : number

    -
      -
    • -
      -

      Gets or sets the distance between rows within one layer, all sharing the same parent.

      -

      The default value is 25.

      -

      Negative values may cause nodes to overlap. - This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass.

      -
      -
    • -
    -
    -
    - -

    - setsChildPortSpot - : boolean

    -
      -
    • -
      -

      Gets or sets whether the TreeLayout should set the ToSpot for each child node port.

      -

      The default value is true -- this may modify the spots of the ports of the children nodes, - if the node has only a single port.

      -

      This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass. - The spot used depends on the value of childPortSpot.

      -
      -
    • -
    -
    -
    - -

    - setsPortSpot - : boolean

    -
      -
    • -
      -

      Gets or sets whether the TreeLayout should set the FromSpot for this parent node port.

      -

      The default value is true -- this may modify the spot of the port of this node, the parent, - if the node has only a single port.

      -

      This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass. - The spot used depends on the value of portSpot.

      -
      -
    • -
    -
    -
    - -

    - sorting - : EnumValue

    - -
    -
    - -

    - subtreeOffset - : Point

    -
      -
    • -
      -

      Gets or sets the offset of this parent node relative to its whole subtree.

      -

      This informational property is computed during TreeLayout.doLayout. - Of course if there are no children, this is just (0, 0). - You should probably not be setting this property.

      -
      -
    • -
    -
    -
    - -

    - subtreeSize - : Size

    -
      -
    • -
      -

      Gets or sets the size of the subtree (including all descendants) parented by this node.

      -

      This informational property is computed during TreeLayout.doLayout. - Of course if there are no children, this is just the same as Size. - You should probably not be setting this property.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - Virtual - copyInheritedPropertiesFrom -

    -
      -
    • copyInheritedPropertiesFrom(copy: TreeVertex): void
    • -
    -
      -
    • -
      -

      Copy inherited properties from another TreeVertex to this one.

      -
      -

      Parameters

      - -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class TreeVertex

    Hierarchy

    +

    This holds TreeLayout-specific information about Nodes.

    +

    This class inherits from LayoutVertex.

    +

    Index

    Inherited Members

    Constructors

    Properties

    • +

      Gets or sets the absolute angle at which this subtree should grow from this vertex.

      +

      The default value is zero, meaning that general tree growth should proceed rightwards along the X axis.

      +

      This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass. +By default this is the same as the Angle of the parent TreeVertex. +However, after the initial propagation of property values, perhaps in +an override of TreeLayout.assignTreeVertexValues, +you could just set this property to specify the angle at which this node grows its subtrees.

      +
    • +

      Gets or sets how broad a node and its descendants should be.

      +

      By default this is zero. A value of zero imposes no limit; +a positive value will specify a limit for the total width of this subtree.

      +

      This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass.

      +
    • +

      Gets or sets the logical children for this node.

      +

      The default value is an empty array.

      +

      This structural property is computed in TreeLayout.doLayout when building the tree structures. +You should probably not be setting this property.

      +
    • +

      This read-only property returns the number of immediate children this node has.

      +

      The default value is zero.

      +
    • +

      Gets or sets the space to leave between the node and the comments.

      +

      The default value is 20.

      +

      Negative values may cause comments to overlap with the node. +This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass.

      +
    • +

      Gets or sets the space to leave between consecutive comments.

      +

      The default value is 10.

      +

      Negative values may cause comments to overlap. +This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass.

      +
    • +

      Gets or sets an array of Nodes that will be positioned near this node.

      +

      The default value is null.

      +

      These objects should not have their own TreeVertexes to be laid out. +Typically these will be Nodes whose Category is "Comment". +This array should be allocated and initialized in TreeLayout.addComments.

      +
    • +

      Gets or sets the number of descendants this node has.

      +

      For a leaf node, this will be zero.

      +

      This informational property is computed as part of the TreeLayout.initializeTreeVertexValues pass. +You should probably not be setting this property.

      +
    • +

      Gets or sets whether this node has been initialized as part of TreeLayout.doLayout when building the tree structures.

      +

      The default value is false.

      +
    • +

      Gets or sets the distance between this node and its children.

      +

      The default value is 50.

      +

      Negative values may cause children to overlap with the parent. +This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass.

      +
    • +

      Gets or sets the fraction of this node's depth that may overlap with the children's layer.

      +

      The default value is 0.0 -- there is overlap only if layerSpacing is negative. +Values must range from 0.0 to 1.0, where 1.0 means the full depth of this node.

      +

      When this value is greater than 0.0, there might not be overlap if layerSpacing +is larger than the depth of this node times this fraction. +Even when this value is 0.0, there may be overlap when layerSpacing is negative. +This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass.

      +
    • +

      Gets or sets the number of single-parent ancestors this node has.

      +

      This could also be interpreted as which layer this node is in. +A root node will have a value of zero.

      +

      This informational property is computed in TreeLayout.doLayout when building the tree structures. +You should probably not be setting this property.

      +
    • +

      Gets or sets the maximum number of children of any descendant of this node.

      +

      For a leaf node, this will be zero.

      +

      This informational property is computed as part of the TreeLayout.initializeTreeVertexValues pass. +You should probably not be setting this property.

      +
    • +

      Gets or sets the maximum depth of the subtrees below this node.

      +

      For a leaf node, this will be zero.

      +

      This informational property is computed as part of the TreeLayout.initializeTreeVertexValues pass. +You should probably not be setting this value.

      +
    • +

      Gets or sets the distance between child nodes.

      +

      The default value is 20.

      +

      A negative value will cause sibling nodes to overlap. +This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass.

      +
    • +

      Gets or sets the logical parent for this node.

      +

      The default value is null.

      +

      This structural property is computed in TreeLayout.doLayout when building the tree structures. +You should probably not be setting this property.

      +
    • +

      Gets or sets the position of this node relative to its parent node.

      +

      This informational property is computed during TreeLayout.doLayout. +You should probably not be setting this property.

      +
    • +

      Gets or sets the distance the first child of each row should be indented.

      +

      The default value is 10. The value should be non-negative.

      +

      This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass. +This property is only used when the breadthLimit is positive, +and some initial space needs to be reserved in each row of nodes for the links +that are routed around those rows.

      +
    • +

      Gets or sets the distance between rows within one layer, all sharing the same parent.

      +

      The default value is 25.

      +

      Negative values may cause nodes to overlap. +This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass.

      +
    • +

      Gets or sets whether the TreeLayout should set the ToSpot for each child node port.

      +

      The default value is true -- this may modify the spots of the ports of the children nodes, +if the node has only a single port.

      +

      This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass. +The spot used depends on the value of childPortSpot.

      +
    • +

      Gets or sets whether the TreeLayout should set the FromSpot for this parent node port.

      +

      The default value is true -- this may modify the spot of the port of this node, the parent, +if the node has only a single port.

      +

      This inherited property is initialized in the TreeLayout.initializeTreeVertexValues pass. +The spot used depends on the value of portSpot.

      +
    • +

      Gets or sets the offset of this parent node relative to its whole subtree.

      +

      This informational property is computed during TreeLayout.doLayout. +Of course if there are no children, this is just (0, 0). +You should probably not be setting this property.

      +
    • +

      Gets or sets the size of the subtree (including all descendants) parented by this node.

      +

      This informational property is computed during TreeLayout.doLayout. +Of course if there are no children, this is just the same as Size. +You should probably not be setting this property.

      +

    Methods

    • copyInheritedPropertiesFrom(copy: TreeVertex): void
    • +

      Copy inherited properties from another TreeVertex to this one.

      +

      Parameters

      Returns void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/UndoManager.html b/api/symbols/UndoManager.html index d0e808bf6..487c13b93 100644 --- a/api/symbols/UndoManager.html +++ b/api/symbols/UndoManager.html @@ -1,946 +1,272 @@ - - - - - - UndoManager | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class UndoManager

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - UndoManager -
    • -
    -
    -
    -
    -

    An UndoManager observes and records model and diagram changes in transactions and - supports undo/redo operations. - You will need to set the isEnabled property to true in order for - the UndoManager to record changes and for users to perform an undo or a redo.

    -

    Typically an operation will call startTransaction, - make some changes to the Model and/or Diagram, - and then call commitTransaction. - Any ChangedEvents that occur will be recorded in a - Transaction object. - If for some reason you do not wish to complete the transaction - successfully, you can call rollbackTransaction instead - of commitTransaction.

    -

    For convenience the Diagram.commit and Model.commit methods - execute a function within a transaction and then perform a commit, - or else a rollback upon an error.

    -

    The history property is a list of Transactions. - commitTransaction will add the currentTransaction - to the history list. - rollbackTransaction will undo the changes remembered in the - currentTransaction and then discard it, without changing the history. - You can limit how many transactions are remembered in the history - by setting maxHistoryLength.

    -

    Transactions may be nested. - Be sure to call either commitTransaction or rollbackTransaction - for each call to startTransaction. - Avoid repeated start-commit-start-commit calls as a result of a user's actions. - Instead, start, make all changes, and then commit.

    -

    If you want to restore the diagram to the state before the latest complete - transaction, call undo. - Call redo to change the diagram to a later state. - If after some number of undo's you start a transaction, - all of the history after the current state is discarded, - and a new transaction may be recorded. - You cannot undo or redo during a transaction.

    -

    Initially each Model has its own UndoManager. - UndoManagers may be shared by multiple Models by replacing - the standard Model.undoManager created by the model constructor.

    -

    There are several informational properties:

    - -

    A transaction may not be ongoing when replacing a Diagram.model, - because it would not make sense to be replacing the UndoManager (the Model.undoManager) - while changes are being recorded.

    -

    Replacing a Diagram.model copies certain properties from the old UndoManager to the new one, - including isEnabled and maxHistoryLength.

    -
    -
    -
    -

    Index

    -
    - -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      The constructor produces an empty UndoManager - with no transaction history.

      -
      -

      Returns UndoManager

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - Read-only - currentTransaction - : Transaction

    -
      -
    • -
      -

      This read-only property returns the current Transaction for recording additional model change events. - This is initialized and augmented by handleChanged - before it is added to history by a top-level call - to commitTransaction. - The value will be null between transactions.

      -
      -
    • -
    -
    -
    - -

    - Read-only - history - : List<Transaction>

    -
      -
    • -
      -

      This read-only property returns the whole history, a list of all of the Transactions, - each representing a transaction with some number of ChangedEvents.

      -

      You should not modify this List.

      -
      -
    • -
    -
    -
    - -

    - Read-only - historyIndex - : number

    -
      -
    • -
      -

      This read-only property returns the index into history for the current undoable Transaction. - The value is -1 if there is no undoable Transaction to be undone.

      -
      -
    • -
    -
    -
    - -

    - isEnabled - : boolean

    -
      -
    • -
      -

      Gets or sets whether this UndoManager records any changes. - The default value is false -- you need to set this to true if - you want the user to be able to undo or redo.

      -

      You can temporarily turn off recording by setting Diagram.skipsUndoManager - and Model.skipsUndoManager to true.

      -
      -
    • -
    -
    -
    - -

    - Read-only - isInTransaction - : boolean

    - -
    -
    - -

    - Read-only - isUndoingRedoing - : boolean

    -
      -
    • -
      -

      This read-only property is true during a call to undo or redo.

      -
      -
    • -
    -
    -
    - -

    - maxHistoryLength - : number

    -
      -
    • -
      -

      Gets or sets the maximum number of transactions that this undo manager will remember. - When a transaction is committed and the number exceeds this value, - the UndoManager will discard the oldest transaction(s) in order to meet this limit. - The initial value is 999. - Any new value must be an integer. - A negative value is treated as if there were no limit. - A zero value will not remember any Transactions in the history, - but will allow commits and rollbacks to occur normally, - including raising "Transaction" type ChangedEvents.

      -

      This property is useful in helping limit the memory consumption of typical applications. - But this does not limit the number of ChangedEvents that are recorded, - because there may be an unlimited number of those within each Transaction. - Decreasing this value will not necessarily remove any existing Transactions - if there currently exist more in history than the new value permits.

      -
      -
    • -
    -
    -
    - -

    - Read-only - models - : Iterator<Model>

    -
      -
    • -
      -

      This read-only property returns an iterator for all of the Models that this UndoManager is handling.

      -
      -
      see
      -

      addModel, removeModel

      -
      -
      -
      -
    • -
    -
    -
    - -

    - Read-only - nestedTransactionNames - : List<string>

    -
      -
    • -
      -

      This read-only property returns a stack of ongoing transaction names. - The outermost transaction name will be the first item in the list. - The last one will be the name of the most recent (nested) call - to startTransaction.

      -

      You should not modify this List.

      -
      -
    • -
    -
    -
    - -

    - Read-only - transactionLevel - : number

    -
      -
    • -
      -

      This read-only property returns the current transaction level. - The value is zero when there is no ongoing transaction. - The initial value is zero. - startTransaction will increment this value; - commitTransaction or rollbackTransaction will decrement it. - When this value is greater than zero, canUndo - and canRedo will be false, because - additional logically related model change events may occur.

      -
      -
    • -
    -
    -
    - -

    - Read-only - transactionToRedo - : Transaction

    -
      -
    • -
      -

      This read-only property returns the Transaction in the history to be redone next. - The value may be null if the UndoManager is not ready to perform a redo.

      -
      -
      see
      -

      transactionToUndo

      -
      -
      -
      -
    • -
    -
    -
    - -

    - Read-only - transactionToUndo - : Transaction

    -
      -
    • -
      -

      This read-only property returns the Transaction in the history to be undone next. - The value may be null if the UndoManager is not ready to perform an undo.

      -
      -
      see
      -

      transactionToRedo

      -
      -
      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - addModel -

    -
      -
    • addModel(model: Model): void
    • -
    -
      -
    • -
      -

      Make sure this UndoManager knows about a Model for which - it may receive ChangedEvents when the given Model is changed. - The model will also receive notifications about transactions and undo or redo operations.

      -

      You should not call this method during a transaction.

      -
      -
      see
      -

      models, removeModel

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        model: Model
        -
        -

        A Model that this UndoManager is managing.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - canRedo -

    -
      -
    • canRedo(): boolean
    • -
    -
      -
    • -
      -

      This predicate returns true if you can call redo. - This will return false if isEnabled is false (as it is by default), - if any transaction is ongoing, or - if there is no transactionToRedo that can be redone.

      -
      -

      Returns boolean

      -

      true if ready for redo to be called.

      -
    • -
    -
    -
    - -

    - canUndo -

    -
      -
    • canUndo(): boolean
    • -
    -
      -
    • -
      -

      This predicate returns true if you can call undo. - This will return false if isEnabled is false (as it is by default), - if any transaction is ongoing, or - if there is no transactionToUndo that can be undone.

      -
      -

      Returns boolean

      -

      true if ready for undo to be called.

      -
    • -
    -
    -
    - -

    - clear -

    -
      -
    • clear(): void
    • -
    -
      -
    • -
      -

      Clear all of the Transactions and clear all other state, - including any ongoing transaction without rolling back. - However, this maintains its references to its Models.

      -

      You should not call this method during a transaction.

      -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - commitTransaction -

    -
      -
    • commitTransaction(tname?: string): boolean
    • -
    - -
    -
    - -

    - handleChanged -

    - - -
    -
    - -

    - redo -

    -
      -
    • redo(): void
    • -
    - -
    -
    - -

    - removeModel -

    -
      -
    • removeModel(model: Model): void
    • -
    -
      -
    • -
      -

      Inform this UndoManager that it will no longer be receiving ChangedEvents - when the given Model is changed. - The model will no longer receive notifications about transactions and undo or redo operations.

      -

      You should not call this method during a transaction. - If you call this method between transactions when there is a transaction history, - you should be careful that there are no ChangedEvents referring to that model in any Transactions.

      -
      -
      see
      -

      models, addModel

      -
      -
      -
      -

      Parameters

      -
        -
      • -
        model: Model
        -
        -

        A Model that this UndoManager should no longer manage.

        -
        -
      • -
      -

      Returns void

      -
    • -
    -
    -
    - -

    - rollbackTransaction -

    -
      -
    • rollbackTransaction(): boolean
    • -
    - -
    -
    - -

    - Virtual - skipsEvent -

    - - -
    -
    - -

    - startTransaction -

    -
      -
    • startTransaction(tname?: string): boolean
    • -
    - -
    -
    - -

    - undo -

    -
      -
    • undo(): void
    • -
    - -
    -
    -
    - -
    -
    -
    - -
    -
    - - -
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class UndoManager

    Hierarchy

    • UndoManager
    +

    An UndoManager observes and records model and diagram changes in transactions and +supports undo/redo operations. +You will need to set the isEnabled property to true in order for +the UndoManager to record changes and for users to perform an undo or a redo.

    +

    Typically an operation will call startTransaction, +make some changes to the Model and/or Diagram, +and then call commitTransaction. +Any ChangedEvents that occur will be recorded in a +Transaction object. +If for some reason you do not wish to complete the transaction +successfully, you can call rollbackTransaction instead +of commitTransaction.

    +

    For convenience the Diagram.commit and Model.commit methods +execute a function within a transaction and then perform a commit, +or else a rollback upon an error.

    +

    The history property is a list of Transactions. +commitTransaction will add the currentTransaction +to the history list. +rollbackTransaction will undo the changes remembered in the +currentTransaction and then discard it, without changing the history. +You can limit how many transactions are remembered in the history +by setting maxHistoryLength.

    +

    Transactions may be nested. +Be sure to call either commitTransaction or rollbackTransaction +for each call to startTransaction. +Avoid repeated start-commit-start-commit calls as a result of a user's actions. +Instead, start, make all changes, and then commit.

    +

    If you want to restore the diagram to the state before the latest complete +transaction, call undo. +Call redo to change the diagram to a later state. +If after some number of undo's you start a transaction, +all of the history after the current state is discarded, +and a new transaction may be recorded. +You cannot undo or redo during a transaction.

    +

    Initially each Model has its own UndoManager. +UndoManagers may be shared by multiple Models by replacing +the standard Model.undoManager created by the model constructor.

    +

    There are several informational properties:

    + +

    A transaction may not be ongoing when replacing a Diagram.model, +because it would not make sense to be replacing the UndoManager (the Model.undoManager) +while changes are being recorded.

    +

    Replacing a Diagram.model copies certain properties from the old UndoManager to the new one, +including isEnabled and maxHistoryLength.

    +

    Index

    Constructors

    • +

      The constructor produces an empty UndoManager +with no transaction history.

      +

      Returns UndoManager

    Properties

    • +

      This read-only property returns the current Transaction for recording additional model change events. +This is initialized and augmented by handleChanged +before it is added to history by a top-level call +to commitTransaction. +The value will be null between transactions.

      +
    • +

      This read-only property returns the whole history, a list of all of the Transactions, +each representing a transaction with some number of ChangedEvents.

      +

      You should not modify this List.

      +
    • +

      This read-only property returns the index into history for the current undoable Transaction. +The value is -1 if there is no undoable Transaction to be undone.

      +
    • +

      Gets or sets whether this UndoManager records any changes. +The default value is false -- you need to set this to true if +you want the user to be able to undo or redo.

      +

      You can temporarily turn off recording by setting Diagram.skipsUndoManager +and Model.skipsUndoManager to true.

      +
    • +

      This read-only property is true during a call to undo or redo.

      +
    • +

      Gets or sets the maximum number of transactions that this undo manager will remember. +When a transaction is committed and the number exceeds this value, +the UndoManager will discard the oldest transaction(s) in order to meet this limit. +The initial value is 999. +Any new value must be an integer. +A negative value is treated as if there were no limit. +A zero value will not remember any Transactions in the history, +but will allow commits and rollbacks to occur normally, +including raising "Transaction" type ChangedEvents.

      +

      This property is useful in helping limit the memory consumption of typical applications. +But this does not limit the number of ChangedEvents that are recorded, +because there may be an unlimited number of those within each Transaction. +Decreasing this value will not necessarily remove any existing Transactions +if there currently exist more in history than the new value permits.

      +
    • +

      This read-only property returns an iterator for all of the Models that this UndoManager is handling.

      +
      see

      addModel, removeModel

      +
    • +

      This read-only property returns a stack of ongoing transaction names. +The outermost transaction name will be the first item in the list. +The last one will be the name of the most recent (nested) call +to startTransaction.

      +

      You should not modify this List.

      +
    • +

      This read-only property returns the current transaction level. +The value is zero when there is no ongoing transaction. +The initial value is zero. +startTransaction will increment this value; +commitTransaction or rollbackTransaction will decrement it. +When this value is greater than zero, canUndo +and canRedo will be false, because +additional logically related model change events may occur.

      +
    • +

      This read-only property returns the Transaction in the history to be redone next. +The value may be null if the UndoManager is not ready to perform a redo.

      +
      see

      transactionToUndo

      +
    • +

      This read-only property returns the Transaction in the history to be undone next. +The value may be null if the UndoManager is not ready to perform an undo.

      +
      see

      transactionToRedo

      +

    Methods

    • addModel(model: Model): void
    • +

      Make sure this UndoManager knows about a Model for which +it may receive ChangedEvents when the given Model is changed. +The model will also receive notifications about transactions and undo or redo operations.

      +

      You should not call this method during a transaction.

      +
      see

      models, removeModel

      +

      Parameters

      • model: Model
        +

        A Model that this UndoManager is managing.

        +

      Returns void

    • canRedo(): boolean
    • +

      This predicate returns true if you can call redo. +This will return false if isEnabled is false (as it is by default), +if any transaction is ongoing, or +if there is no transactionToRedo that can be redone.

      +

      Returns boolean

      true if ready for redo to be called.

      +
    • canUndo(): boolean
    • +

      This predicate returns true if you can call undo. +This will return false if isEnabled is false (as it is by default), +if any transaction is ongoing, or +if there is no transactionToUndo that can be undone.

      +

      Returns boolean

      true if ready for undo to be called.

      +
    • clear(): void
    • +

      Clear all of the Transactions and clear all other state, +including any ongoing transaction without rolling back. +However, this maintains its references to its Models.

      +

      You should not call this method during a transaction.

      +

      Returns void

    • commitTransaction(tname?: string): boolean
    • redo(): void
    • removeModel(model: Model): void
    • +

      Inform this UndoManager that it will no longer be receiving ChangedEvents +when the given Model is changed. +The model will no longer receive notifications about transactions and undo or redo operations.

      +

      You should not call this method during a transaction. +If you call this method between transactions when there is a transaction history, +you should be careful that there are no ChangedEvents referring to that model in any Transactions.

      +
      see

      models, addModel

      +

      Parameters

      • model: Model
        +

        A Model that this UndoManager should no longer manage.

        +

      Returns void

    • rollbackTransaction(): boolean
    • startTransaction(tname?: string): boolean
    • undo(): void

    Settings

    Theme

    + - - \ No newline at end of file + document.getElementById("contactBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/contact.html', 'contact'); + }); + + document.getElementById("buyBtn").addEventListener("click", function() { + getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy'); + }); + \ No newline at end of file diff --git a/api/symbols/ZoomSlider.html b/api/symbols/ZoomSlider.html index 56f20863b..dce4e4d8e 100644 --- a/api/symbols/ZoomSlider.html +++ b/api/symbols/ZoomSlider.html @@ -1,427 +1,86 @@ - - - - - - ZoomSlider | GoJS API - - - - - - - -
    - -
    -
    -
    -
    - -
    -
    - Options -
    -
    - All -
      -
    • Public
    • -
    • Public/Protected
    • -
    • All
    • -
    -
    -
    -
    - Menu -
    -
    -
    -
    -
    -
    - -
    -

    Class ZoomSlider

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - This is an extension and not part of the main GoJS library. - Note that the API for this class may change at any time. - If you intend to use an extension in production, you should copy the code to your own source directory. - Extensions can be found in the GoJS kit under the extensions, - extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. - See the Extensions intro page for more information. -

    -
    -
    -

    Hierarchy

    -
      -
    • - ZoomSlider -
    • -
    -
    -
    -
    -

    This class implements a zoom slider for GoJS diagrams. - The constructor takes two arguments:

    -
      -
    • diagram Diagram a reference to a GoJS Diagram
    • -
    • options Object an optional JS Object describing options for the slider
    • -
    -

    Options:

    - -

    Example usage of ZoomSlider:

    -
    var zoomSlider = new ZoomSlider(myDiagram,
    -  {
    -    alignment: go.Spot.TopRight, alignmentFocus: go.Spot.TopRight,
    -    size: 150, buttonSize: 30, orientation: 'horizontal'
    -  });
    +ZoomSlider | GoJS API
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Class ZoomSlider Extension

    This is an extension and not part of the main GoJS library. Note that the API for this class may change at any time. If you intend to use an extension in production, you should copy the code to your own source directory. Extensions can be found in the GoJS kit under the extensions,extensionsTS (UMD modules), or extensionsJSM (ES6 modules) folders. See the Extensions intro page for more information.

    Hierarchy

    • ZoomSlider
    +

    This class implements a zoom slider for GoJS diagrams. +The constructor takes two arguments:

    +
      +
    • diagram Diagram a reference to a GoJS Diagram
    • +
    • options Object an optional JS Object describing options for the slider
    • +
    +

    Options:

    + +

    Example usage of ZoomSlider:

    +
    var zoomSlider = new ZoomSlider(myDiagram,
    {
    alignment: go.Spot.TopRight, alignmentFocus: go.Spot.TopRight,
    size: 150, buttonSize: 30, orientation: 'horizontal'
    });
    -

    This is the basic HTML Structure that the ZoomSlider creates as a sibling div of the diagram:

    -
    <div class="zoomSlider">
    -  <button id="zoomSliderOut" class="zoomButton">-</button>
    -  <div id="zoomSliderRangeCtn" class="zoomRangeContainer">
    -    <input id="zoomSliderRange" class="zoomRangeInput" type="range" min="-50" max="100">
    -  </div>
    -  <button id="zoomSliderIn" class="zoomButton">+</button>
    -</div>
    +

    This is the basic HTML Structure that the ZoomSlider creates as a sibling div of the diagram:

    +
    <div class="zoomSlider">
    <button id="zoomSliderOut" class="zoomButton">-</button>
    <div id="zoomSliderRangeCtn" class="zoomRangeContainer">
    <input id="zoomSliderRange" class="zoomRangeInput" type="range" min="-50" max="100">
    </div>
    <button id="zoomSliderIn" class="zoomButton">+</button>
    </div>
    -

    - The diagram div's parent element should use `position: relative` to ensure the slider gets positioned properly. -

    If you want to experiment with this extension, try the Zoom Slider sample.

    -
    -
    -
    -

    Index

    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -

    Methods

    - -
    -
    -
    -
    -
    -

    Constructors

    -
    - -

    - constructor -

    - -
      -
    • -
      -

      Constructs a ZoomSlider and sets up properties based on the options provided. - Also sets up change listeners on the Diagram so the ZoomSlider stays up-to-date.

      -
      -

      Parameters

      -
        -
      • -
        diagram: Diagram
        -
        -

        a reference to a GoJS Diagram

        -
        -
      • -
      • -
        Optional options: {}
        -
        -

        an optional JS Object describing options for the slider

        -
        -
          -
        • -
          [index: string]: any
          -
        • -
        -
      • -
      -

      Returns ZoomSlider

      -
    • -
    -
    -
    -
    -

    Properties

    -
    - -

    - alignment - : Spot

    -
      -
    • -
      -

      Gets or sets the alignment Spot of this slider to determine where it should be placed relative to the diagram. - The default value is Spot.BottomRight.

      -
      -
    • -
    -
    -
    - -

    - alignmentFocus - : Spot

    -
      -
    • -
      -

      Gets or sets the Spot on this slider to be used as the alignment point when placing it relative to the diagram. - The default value is Spot.BottomRight.

      -
      -
    • -
    -
    -
    - -

    - buttonSize - : number

    -
      -
    • -
      -

      Gets or sets the height/width of the buttons at each end of the slider. - The default value is 25.

      -
      -
    • -
    -
    -
    - -

    - Read-only - diagram - : Diagram

    -
      -
    • -
      -

      This read-only property returns the diagram for which the slider is handling zoom.

      -
      -
    • -
    -
    -
    - -

    - opacity - : number

    -
      -
    • -
      -

      Gets or sets the opacity of the slider. - The default value is 0.75.

      -
      -
    • -
    -
    -
    - -

    - orientation - : string

    -
      -
    • -
      -

      Gets or sets whether the slider is oriented vertically or horizontally. - Must be either "horizontal" or "vertical" and is case-sensitive. - The default value is "vertical".

      -
      -
    • -
    -
    -
    - -

    - size - : number

    -
      -
    • -
      -

      Gets or sets the overall length, in pixels, that the slider will occupy. - The default value is 125.

      -
      -
    • -
    -
    -
    -
    -

    Methods

    -
    - -

    - remove -

    -
      -
    • remove(): void
    • -
    -
      -
    • -
      -

      Remove the slider from the page.

      -
      -

      Returns void

      -
    • -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - - - - - \ No newline at end of file +

    If you want to experiment with this extension, try the Zoom Slider sample.

    +

    Index

    Constructors

    • +

      Constructs a ZoomSlider and sets up properties based on the options provided. +Also sets up change listeners on the Diagram so the ZoomSlider stays up-to-date.

      +

      Parameters

      • diagram: Diagram
        +

        a reference to a GoJS Diagram

        +
      • Optional options: {}
        +

        an optional JS Object describing options for the slider

        +
        • [index: string]: any

      Returns ZoomSlider

    Properties

    • +

      Gets or sets the alignment Spot of this slider to determine where it should be placed relative to the diagram. +The default value is Spot.BottomRight.

      +
    • +

      Gets or sets the Spot on this slider to be used as the alignment point when placing it relative to the diagram. +The default value is Spot.BottomRight.

      +
    • +

      Gets or sets the height/width of the buttons at each end of the slider. +The default value is 25.

      +
    • +

      This read-only property returns the diagram for which the slider is handling zoom.

      +
    • +

      Gets or sets the opacity of the slider. +The default value is 0.75.

      +
    • +

      Gets or sets whether the slider is oriented vertically or horizontally. +Must be either "horizontal" or "vertical" and is case-sensitive. +The default value is "vertical".

      +
    • +

      Gets or sets the overall length, in pixels, that the slider will occupy. +The default value is 125.

      +

    Methods

    • remove(): void
    • +

      Remove the slider from the page.

      +

      Returns void

    Settings

    Theme

    + \ No newline at end of file diff --git a/changelog.html b/changelog.html index 2ad1e07ee..fdad88144 100644 --- a/changelog.html +++ b/changelog.html @@ -319,6 +319,20 @@

    Easier Manipulation and Customization of Geometries


    +

    Changes for 2.2.10

    +
      +
    • + Graduated panels now draw all tick marks specifying a Shape.graduatedSkip/TextBlock.graduatedSkip function, + even when they could be very close together. +
    • +
    • + Drawing fixes on very zoomed-out graphs. +
    • +
    • + Multiple orthogonal links between identical nodes side-by-side are now drawn without crossings. This fixes a regression from 2.1.51. +
    • +
    +

    Changes for 2.2.9

    • diff --git a/package.json b/package.json index 875aa81a3..60b4f7aed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gojs", - "version": "2.2.9", + "version": "2.2.10", "description": "Interactive diagrams, charts, and graphs, such as trees, flowcharts, orgcharts, UML, BPMN, or business diagrams", "keywords": [ "GoJS", "diagram", "chart", "tree", "flowchart", "orgchart", "uml", "bpmn", "graph", "editor", "drawing", "canvas", "svg", "hierarchy", "family-tree", "decision-tree", "mindmap", "treeview", "genogram", "ivr-tree", "parse-tree", "concept-map", "visualization", "entity-relationship", "er-diagram", "radial", "sankey", "pert", "gantt", "timeline", "swimlane", "workflow", "flow", "process", "state", "sequential-function", "grafcet", "sequence", "circuit", "dataflow", "data-flow", "planogram", "floorplan", "seating", "pipes", "layout", "tree-layout", "force-directed", "layered", "hierarchical", "circular", "fishbone", "ishikawa", "treemap", "tree-map", "subgraph", "network", "library", "typescript" ], "homepage": "https://gojs.net", diff --git a/release/go-debug-module.js b/release/go-debug-module.js index c3cbb5f65..a61e84034 100644 --- a/release/go-debug-module.js +++ b/release/go-debug-module.js @@ -1,8 +1,8 @@ /* - * GoJS v2.2.9 JavaScript Library for HTML Diagrams, https://gojs.net + * GoJS v2.2.10 JavaScript Library for HTML Diagrams, https://gojs.net * GoJS and Northwoods Software are registered trademarks of Northwoods Software Corporation, https://www.nwoods.com. * Copyright (C) 1998-2022 by Northwoods Software Corporation. All Rights Reserved. - * THIS SOFTWARE IS LICENSED. THE LICENSE AGREEMENT IS AT: https://gojs.net/2.2.9/license.html. + * THIS SOFTWARE IS LICENSED. THE LICENSE AGREEMENT IS AT: https://gojs.net/2.2.10/license.html. * DO NOT MODIFY THIS FILE. DO NOT DISTRIBUTE A MODIFIED COPY OF THE CONTENTS OF THIS FILE. */ (function() { var t;function ba(a){var b=0;return function(){return bc;c++)b["0123456789abcdef".charAt(c>>4)+"0123456789abcdef".charAt(c&15)]=String.fromCharCode(c);a.length%2&&(a="0"+a);c=[];for(var d=0,e=0;ec;c++)b[c]=c;for(c=d=0;256>c;c++)d=(d+b[c]+119)%256,e=b[c],b[c]=b[d],b[d]=e;d=c=0;for(var f="",g=0;gthis.key)return!1;Da(a)}a=a.m;var b=a.length,c=++this.Wa,d=this.nf;if(null!==d)for(;cthis.key)return!1;Da(a)}var b=--this.Wa;if(0<=b)return this.key=b,this.value=a.m[b],!0;this.Wd();return!1};jb.prototype.ud=function(){return this.next()}; -jb.prototype.first=function(){var a=this.ub;this.pa=a.w;var b=a.m;this.Wa=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null};jb.prototype.any=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Wa=e;for(--e;0<=e;e--){if(a(d[e]))return!0;b.w!==c&&Da(b)}return!1};jb.prototype.all=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Wa=e;for(--e;0<=e;e--){if(!a(d[e]))return!1;b.w!==c&&Da(b)}return!0}; -jb.prototype.each=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Wa=e;for(--e;0<=e;e--)a(d[e]),b.w!==c&&Da(b);return this};jb.prototype.map=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=[],e=b.m,f=e.length;this.Wa=f;for(--f;0<=f;f--)d.push(a(e[f])),b.w!==c&&Da(b);a=new H;a.m=d;a.pb();return a.iterator}; -jb.prototype.filter=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=[],e=b.m,f=e.length;this.Wa=f;for(--f;0<=f;f--){var g=e[f];a(g)&&d.push(g);b.w!==c&&Da(b)}a=new H;a.m=d;a.pb();return a.iterator};jb.prototype.Wd=function(){this.key=-1;this.value=null;this.pa=-1;this.ub.Zg=this};jb.prototype.toString=function(){return"ListIteratorBackwards("+this.Wa+"/"+this.ub.count+")"}; -oa.Object.defineProperties(jb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.ub.m.length}}});jb.prototype.first=jb.prototype.first;jb.prototype.hasNext=jb.prototype.ud;jb.prototype.next=jb.prototype.next;jb.prototype.reset=jb.prototype.reset;jb.className="ListIteratorBackwards"; +b.Gm[e.zk],{set:function(a,b){return function(){throw Error("Property "+a.Gm[b.zk]+" of "+a.x+" is read-only.");}}(b,e)})}}}b={Gm:b.Gm,x:b.x}}}};function fb(){}fb.prototype.reset=function(){};fb.prototype.next=function(){return!1};fb.prototype.vd=function(){return!1};fb.prototype.first=function(){return null};fb.prototype.any=function(){return!1};fb.prototype.all=function(){return!0};fb.prototype.each=function(){return this};fb.prototype.map=function(){return this};fb.prototype.filter=function(){return this}; +fb.prototype.Wd=function(){};fb.prototype.toString=function(){return"EmptyIterator"};oa.Object.defineProperties(fb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return 0}}});fb.prototype.first=fb.prototype.first;fb.prototype.hasNext=fb.prototype.vd;fb.prototype.next=fb.prototype.next;fb.prototype.reset=fb.prototype.reset;var gb=null;fb.className="EmptyIterator";gb=new fb;function hb(a){this.key=-1;this.value=a} +hb.prototype.reset=function(){this.key=-1};hb.prototype.next=function(){return-1===this.key?(this.key=0,!0):!1};hb.prototype.vd=function(){return this.next()};hb.prototype.first=function(){this.key=0;return this.value};hb.prototype.any=function(a){this.key=-1;return a(this.value)};hb.prototype.all=function(a){this.key=-1;return a(this.value)};hb.prototype.each=function(a){this.key=-1;a(this.value);return this};hb.prototype.map=function(a){return new hb(a(this.value))}; +hb.prototype.filter=function(a){return a(this.value)?new hb(this.value):gb};hb.prototype.Wd=function(){this.value=null};hb.prototype.toString=function(){return"SingletonIterator("+this.value+")"};oa.Object.defineProperties(hb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return 1}}});hb.prototype.first=hb.prototype.first;hb.prototype.hasNext=hb.prototype.vd;hb.prototype.next=hb.prototype.next; +hb.prototype.reset=hb.prototype.reset;hb.className="SingletonIterator";function ib(a){this.ub=a;this.nf=null;a.Oa=null;this.pa=a.w;this.Va=-1}ib.prototype.reset=function(){var a=this.ub;a.Oa=null;this.pa=a.w;this.Va=-1};ib.prototype.next=function(){var a=this.ub;if(a.w!==this.pa){if(0>this.key)return!1;Da(a)}a=a.m;var b=a.length,c=++this.Va,d=this.nf;if(null!==d)for(;cthis.key)return!1;Da(a)}var b=--this.Va;if(0<=b)return this.key=b,this.value=a.m[b],!0;this.Wd();return!1};jb.prototype.vd=function(){return this.next()}; +jb.prototype.first=function(){var a=this.ub;this.pa=a.w;var b=a.m;this.Va=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null};jb.prototype.any=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Va=e;for(--e;0<=e;e--){if(a(d[e]))return!0;b.w!==c&&Da(b)}return!1};jb.prototype.all=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Va=e;for(--e;0<=e;e--){if(!a(d[e]))return!1;b.w!==c&&Da(b)}return!0}; +jb.prototype.each=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Va=e;for(--e;0<=e;e--)a(d[e]),b.w!==c&&Da(b);return this};jb.prototype.map=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=[],e=b.m,f=e.length;this.Va=f;for(--f;0<=f;f--)d.push(a(e[f])),b.w!==c&&Da(b);a=new H;a.m=d;a.pb();return a.iterator}; +jb.prototype.filter=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=[],e=b.m,f=e.length;this.Va=f;for(--f;0<=f;f--){var g=e[f];a(g)&&d.push(g);b.w!==c&&Da(b)}a=new H;a.m=d;a.pb();return a.iterator};jb.prototype.Wd=function(){this.key=-1;this.value=null;this.pa=-1;this.ub.Zg=this};jb.prototype.toString=function(){return"ListIteratorBackwards("+this.Va+"/"+this.ub.count+")"}; +oa.Object.defineProperties(jb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.ub.m.length}}});jb.prototype.first=jb.prototype.first;jb.prototype.hasNext=jb.prototype.vd;jb.prototype.next=jb.prototype.next;jb.prototype.reset=jb.prototype.reset;jb.className="ListIteratorBackwards"; function H(a){ab(this);this.u=!1;this.m=[];this.w=0;this.Zg=this.Oa=null;(G&&"function"===typeof a||"string"===typeof a)&&v("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=H.prototype;t.pb=function(){var a=this.w;a++;999999999a||a>=b.length)&&Aa(a,"0 <= i < length",H,"elt:i");return b[a]};t.get=function(a){return this.M(a)};t.Rc=function(a,b){G&&D(a,H,"setElt:i");var c=this.m;(0>a||a>=c.length)&&Aa(a,"0 <= i < length",H,"setElt:i");this.u&&xa(this,a);c[a]=b};t.set=function(a,b){this.Rc(a,b)};t.first=function(){var a=this.m;return 0===a.length?null:a[0]}; +t.indexOf=function(a){return null===a?-1:this.m.indexOf(a)};t.M=function(a){G&&D(a,H,"elt:i");var b=this.m;(0>a||a>=b.length)&&Aa(a,"0 <= i < length",H,"elt:i");return b[a]};t.get=function(a){return this.M(a)};t.Sc=function(a,b){G&&D(a,H,"setElt:i");var c=this.m;(0>a||a>=c.length)&&Aa(a,"0 <= i < length",H,"setElt:i");this.u&&xa(this,a);c[a]=b};t.set=function(a,b){this.Sc(a,b)};t.first=function(){var a=this.m;return 0===a.length?null:a[0]}; t.cc=function(){var a=this.m,b=a.length;return 0a&&Aa(a,">= 0",H,"insertAt:i");this.u&&xa(this,a);var c=this.m;a>=c.length?c.push(b):c.splice(a,0,b);this.pb()};t.remove=function(a){if(null===a)return!1;this.u&&xa(this,a);var b=this.m;a=b.indexOf(a);if(-1===a)return!1;a===b.length-1?b.pop():b.splice(a,1);this.pb();return!0};t.delete=function(a){return this.remove(a)}; @@ -53,38 +53,38 @@ t.ij=function(a,b,c){var d=this.m,e=d.length;void 0===b&&(b=0);void 0===c&&(c=e) else for(e=d.slice(b,c),e.sort(a),a=b;a=this.m.length)return gb;var a=this.Oa;return null!==a?(a.reset(),a):new ib(this)}},iteratorBackwards:{configurable:!0, enumerable:!0,get:function(){if(0>=this.m.length)return gb;var a=this.Zg;return null!==a?(a.reset(),a):new jb(this)}}});H.prototype.reverse=H.prototype.reverse;H.prototype.sortRange=H.prototype.ij;H.prototype.sort=H.prototype.sort;H.prototype.toSet=H.prototype.sw;H.prototype.toArray=H.prototype.Ea;H.prototype.removeRange=H.prototype.removeRange;H.prototype.removeAt=H.prototype.kb;H.prototype["delete"]=H.prototype.delete;H.prototype.remove=H.prototype.remove;H.prototype.insertAt=H.prototype.zb; -H.prototype.pop=H.prototype.pop;H.prototype.last=H.prototype.cc;H.prototype.first=H.prototype.first;H.prototype.set=H.prototype.set;H.prototype.setElt=H.prototype.Rc;H.prototype.get=H.prototype.get;H.prototype.elt=H.prototype.M;H.prototype.indexOf=H.prototype.indexOf;H.prototype.has=H.prototype.has;H.prototype.contains=H.prototype.contains;H.prototype.clear=H.prototype.clear;H.prototype.addAll=H.prototype.addAll;H.prototype.push=H.prototype.push;H.prototype.add=H.prototype.add;H.prototype.thaw=H.prototype.ka; -H.prototype.freeze=H.prototype.freeze;H.className="List";function lb(a){this.mg=a;a.Oa=null;this.pa=a.w;this.ra=null}lb.prototype.reset=function(){var a=this.mg;a.Oa=null;this.pa=a.w;this.ra=null};lb.prototype.next=function(){var a=this.mg;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=b.value,this.key=b.key,!0;this.Wd();return!1};lb.prototype.ud=function(){return this.next()}; +H.prototype.pop=H.prototype.pop;H.prototype.last=H.prototype.cc;H.prototype.first=H.prototype.first;H.prototype.set=H.prototype.set;H.prototype.setElt=H.prototype.Sc;H.prototype.get=H.prototype.get;H.prototype.elt=H.prototype.M;H.prototype.indexOf=H.prototype.indexOf;H.prototype.has=H.prototype.has;H.prototype.contains=H.prototype.contains;H.prototype.clear=H.prototype.clear;H.prototype.addAll=H.prototype.addAll;H.prototype.push=H.prototype.push;H.prototype.add=H.prototype.add;H.prototype.thaw=H.prototype.ka; +H.prototype.freeze=H.prototype.freeze;H.className="List";function lb(a){this.mg=a;a.Oa=null;this.pa=a.w;this.ra=null}lb.prototype.reset=function(){var a=this.mg;a.Oa=null;this.pa=a.w;this.ra=null};lb.prototype.next=function(){var a=this.mg;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=b.value,this.key=b.key,!0;this.Wd();return!1};lb.prototype.vd=function(){return this.next()}; lb.prototype.first=function(){var a=this.mg;this.pa=a.w;a=a.ga;if(null!==a){this.ra=a;var b=a.value;this.key=a.key;return this.value=b}return null};lb.prototype.any=function(a){var b=this.mg;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(a(d.value))return!0;b.w!==c&&Da(b);d=d.ua}return!1};lb.prototype.all=function(a){var b=this.mg;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(!a(d.value))return!1;b.w!==c&&Da(b);d=d.ua}return!0}; lb.prototype.each=function(a){var b=this.mg;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;)a(d.value),b.w!==c&&Da(b),d=d.ua;return this};lb.prototype.map=function(a){var b=this.mg;b.Oa=null;for(var c=new H,d=b.w,e=b.ga;null!==e;)c.add(a(e.value)),b.w!==d&&Da(b),e=e.ua;return c.iterator};lb.prototype.filter=function(a){var b=this.mg;b.Oa=null;for(var c=new H,d=b.w,e=b.ga;null!==e;){var f=e.value;a(f)&&c.add(f);b.w!==d&&Da(b);e=e.ua}return c.iterator}; -lb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1;this.mg.Oa=this};lb.prototype.toString=function(){return null!==this.ra?"SetIterator@"+this.ra.value:"SetIterator"};oa.Object.defineProperties(lb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.mg.Nb}}});lb.prototype.first=lb.prototype.first;lb.prototype.hasNext=lb.prototype.ud;lb.prototype.next=lb.prototype.next;lb.prototype.reset=lb.prototype.reset; +lb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1;this.mg.Oa=this};lb.prototype.toString=function(){return null!==this.ra?"SetIterator@"+this.ra.value:"SetIterator"};oa.Object.defineProperties(lb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.mg.Nb}}});lb.prototype.first=lb.prototype.first;lb.prototype.hasNext=lb.prototype.vd;lb.prototype.next=lb.prototype.next;lb.prototype.reset=lb.prototype.reset; lb.className="SetIterator";function I(a){ab(this);this.u=!1;this.Ob={};this.Nb=0;this.Oa=null;this.w=0;this.hf=this.ga=null;(G&&"function"===typeof a||"string"===typeof a)&&v("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=I.prototype;t.pb=function(){var a=this.w;a++;999999999=this.Nb)return gb;var a=this.Oa;return null!==a?(a.reset(),a):new lb(this)}}});I.prototype.toList=I.prototype.rw;I.prototype.toArray=I.prototype.Ea;I.prototype.clear=I.prototype.clear;I.prototype.retainAll=I.prototype.kB;I.prototype.removeAll=I.prototype.Oq; -I.prototype["delete"]=I.prototype.delete;I.prototype.remove=I.prototype.remove;I.prototype.first=I.prototype.first;I.prototype.containsAny=I.prototype.Oz;I.prototype.containsAll=I.prototype.Nz;I.prototype.has=I.prototype.has;I.prototype.contains=I.prototype.contains;I.prototype.addAll=I.prototype.addAll;I.prototype.add=I.prototype.add;I.prototype.thaw=I.prototype.ka;I.prototype.freeze=I.prototype.freeze;var pb=1;I.className="Set";I.uniqueHash=ab;I.hashIdUnique=mb;I.hashId=kb; -function qb(a){this.na=a;this.pa=a.w;this.ra=null}qb.prototype.reset=function(){this.pa=this.na.w;this.ra=null};qb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=this.key=a=b.key,!0;this.Wd();return!1};qb.prototype.ud=function(){return this.next()};qb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;return null!==a?(this.ra=a,this.value=this.key=a=a.key):null}; -qb.prototype.any=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(a(d.key))return!0;b.w!==c&&Da(b);d=d.ua}return!1};qb.prototype.all=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(!a(d.key))return!1;b.w!==c&&Da(b);d=d.ua}return!0};qb.prototype.each=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;)a(d.key),b.w!==c&&Da(b),d=d.ua;return this}; -qb.prototype.map=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;)d.add(a(e.key)),b.w!==c&&Da(b),e=e.ua;return d.iterator};qb.prototype.filter=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;){var f=e.key;a(f)&&d.add(f);b.w!==c&&Da(b);e=e.ua}return d.iterator};qb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1};qb.prototype.toString=function(){return null!==this.ra?"MapKeySetIterator@"+this.ra.value:"MapKeySetIterator"}; -oa.Object.defineProperties(qb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});qb.prototype.first=qb.prototype.first;qb.prototype.hasNext=qb.prototype.ud;qb.prototype.next=qb.prototype.next;qb.prototype.reset=qb.prototype.reset;qb.className="MapKeySetIterator";function ub(a){I.call(this);ab(this);this.u=!0;this.na=a}na(ub,I);t=ub.prototype;t.freeze=function(){return this};t.ka=function(){return this}; +I.prototype["delete"]=I.prototype.delete;I.prototype.remove=I.prototype.remove;I.prototype.first=I.prototype.first;I.prototype.containsAny=I.prototype.Oz;I.prototype.containsAll=I.prototype.Nz;I.prototype.has=I.prototype.has;I.prototype.contains=I.prototype.contains;I.prototype.addAll=I.prototype.addAll;I.prototype.add=I.prototype.add;I.prototype.thaw=I.prototype.ka;I.prototype.freeze=I.prototype.freeze;var qb=1;I.className="Set";I.uniqueHash=ab;I.hashIdUnique=mb;I.hashId=kb; +function rb(a){this.na=a;this.pa=a.w;this.ra=null}rb.prototype.reset=function(){this.pa=this.na.w;this.ra=null};rb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=this.key=a=b.key,!0;this.Wd();return!1};rb.prototype.vd=function(){return this.next()};rb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;return null!==a?(this.ra=a,this.value=this.key=a=a.key):null}; +rb.prototype.any=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(a(d.key))return!0;b.w!==c&&Da(b);d=d.ua}return!1};rb.prototype.all=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(!a(d.key))return!1;b.w!==c&&Da(b);d=d.ua}return!0};rb.prototype.each=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;)a(d.key),b.w!==c&&Da(b),d=d.ua;return this}; +rb.prototype.map=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;)d.add(a(e.key)),b.w!==c&&Da(b),e=e.ua;return d.iterator};rb.prototype.filter=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;){var f=e.key;a(f)&&d.add(f);b.w!==c&&Da(b);e=e.ua}return d.iterator};rb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1};rb.prototype.toString=function(){return null!==this.ra?"MapKeySetIterator@"+this.ra.value:"MapKeySetIterator"}; +oa.Object.defineProperties(rb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});rb.prototype.first=rb.prototype.first;rb.prototype.hasNext=rb.prototype.vd;rb.prototype.next=rb.prototype.next;rb.prototype.reset=rb.prototype.reset;rb.className="MapKeySetIterator";function ub(a){I.call(this);ab(this);this.u=!0;this.na=a}na(ub,I);t=ub.prototype;t.freeze=function(){return this};t.ka=function(){return this}; t.toString=function(){return"MapKeySet("+this.na.toString()+")"};t.add=function(){v("This Set is read-only: "+this.toString())};t.contains=function(a){return this.na.contains(a)};t.has=function(a){return this.contains(a)};t.remove=function(){v("This Set is read-only: "+this.toString())};t.delete=function(a){return this.remove(a)};t.clear=function(){v("This Set is read-only: "+this.toString())};t.first=function(){var a=this.na.ga;return null!==a?a.key:null}; ub.prototype.any=function(a){for(var b=this.na.ga;null!==b;){if(a(b.key))return!0;b=b.ua}return!1};ub.prototype.all=function(a){for(var b=this.na.ga;null!==b;){if(!a(b.key))return!1;b=b.ua}return!0};ub.prototype.each=function(a){for(var b=this.na.ga;null!==b;)a(b.key),b=b.ua;return this};ub.prototype.map=function(a){for(var b=new I,c=this.na.ga;null!==c;)b.add(a(c.key)),c=c.ua;return b};ub.prototype.filter=function(a){for(var b=new I,c=this.na.ga;null!==c;){var d=c.key;a(d)&&b.add(d);c=c.ua}return b}; ub.prototype.copy=function(){return new ub(this.na)};ub.prototype.sw=function(){var a=new I,b=this.na.Ob,c;for(c in b)a.add(b[c].key);return a};ub.prototype.Ea=function(){var a=this.na.Ob,b=Array(this.na.Nb),c=0,d;for(d in a)b[c]=a[d].key,c++;return b};ub.prototype.rw=function(){var a=new H,b=this.na.Ob,c;for(c in b)a.add(b[c].key);return a}; -oa.Object.defineProperties(ub.prototype,{count:{configurable:!0,get:function(){return this.na.Nb}},size:{configurable:!0,get:function(){return this.na.Nb}},iterator:{configurable:!0,get:function(){return 0>=this.na.Nb?gb:new qb(this.na)}}});ub.prototype.toList=ub.prototype.rw;ub.prototype.toArray=ub.prototype.Ea;ub.prototype.toSet=ub.prototype.sw;ub.prototype.first=ub.prototype.first;ub.prototype.clear=ub.prototype.clear;ub.prototype["delete"]=ub.prototype.delete; +oa.Object.defineProperties(ub.prototype,{count:{configurable:!0,get:function(){return this.na.Nb}},size:{configurable:!0,get:function(){return this.na.Nb}},iterator:{configurable:!0,get:function(){return 0>=this.na.Nb?gb:new rb(this.na)}}});ub.prototype.toList=ub.prototype.rw;ub.prototype.toArray=ub.prototype.Ea;ub.prototype.toSet=ub.prototype.sw;ub.prototype.first=ub.prototype.first;ub.prototype.clear=ub.prototype.clear;ub.prototype["delete"]=ub.prototype.delete; ub.prototype.remove=ub.prototype.remove;ub.prototype.has=ub.prototype.has;ub.prototype.contains=ub.prototype.contains;ub.prototype.add=ub.prototype.add;ub.prototype.thaw=ub.prototype.ka;ub.prototype.freeze=ub.prototype.freeze;ub.className="MapKeySet";function vb(a){this.na=a;a.gf=null;this.pa=a.w;this.ra=null}vb.prototype.reset=function(){var a=this.na;a.gf=null;this.pa=a.w;this.ra=null}; -vb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=b.value,this.key=b.key,!0;this.Wd();return!1};vb.prototype.ud=function(){return this.next()};vb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;if(null!==a){this.ra=a;var b=a.value;this.key=a.key;return this.value=b}return null}; +vb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=b.value,this.key=b.key,!0;this.Wd();return!1};vb.prototype.vd=function(){return this.next()};vb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;if(null!==a){this.ra=a;var b=a.value;this.key=a.key;return this.value=b}return null}; vb.prototype.any=function(a){var b=this.na;b.gf=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(a(d.value))return!0;b.w!==c&&Da(b);d=d.ua}return!1};vb.prototype.all=function(a){var b=this.na;b.gf=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(!a(d.value))return!1;b.w!==c&&Da(b);d=d.ua}return!0};vb.prototype.each=function(a){var b=this.na;b.gf=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;)a(d.value),b.w!==c&&Da(b),d=d.ua;return this}; vb.prototype.map=function(a){var b=this.na;b.gf=null;var c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;)d.add(a(e.value)),b.w!==c&&Da(b),e=e.ua;return d.iterator};vb.prototype.filter=function(a){var b=this.na;b.gf=null;var c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;){var f=e.value;a(f)&&d.add(f);b.w!==c&&Da(b);e=e.ua}return d.iterator};vb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1;this.na.gf=this}; -vb.prototype.toString=function(){return null!==this.ra?"MapValueSetIterator@"+this.ra.value:"MapValueSetIterator"};oa.Object.defineProperties(vb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});vb.prototype.first=vb.prototype.first;vb.prototype.hasNext=vb.prototype.ud;vb.prototype.next=vb.prototype.next;vb.prototype.reset=vb.prototype.reset;vb.className="MapValueSetIterator"; +vb.prototype.toString=function(){return null!==this.ra?"MapValueSetIterator@"+this.ra.value:"MapValueSetIterator"};oa.Object.defineProperties(vb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});vb.prototype.first=vb.prototype.first;vb.prototype.hasNext=vb.prototype.vd;vb.prototype.next=vb.prototype.next;vb.prototype.reset=vb.prototype.reset;vb.className="MapValueSetIterator"; function nb(a,b){this.key=a;this.value=b;this.Sl=this.ua=null}nb.prototype.toString=function(){return"{"+this.key+":"+this.value+"}"};nb.className="KeyValuePair";function wb(a){this.na=a;a.Oa=null;this.pa=a.w;this.ra=null}wb.prototype.reset=function(){var a=this.na;a.Oa=null;this.pa=a.w;this.ra=null}; -wb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.key=b.key,this.value=b.value,!0;this.Wd();return!1};wb.prototype.ud=function(){return this.next()};wb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;return null!==a?(this.ra=a,this.key=a.key,this.value=a.value,a):null}; +wb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.key=b.key,this.value=b.value,!0;this.Wd();return!1};wb.prototype.vd=function(){return this.next()};wb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;return null!==a?(this.ra=a,this.key=a.key,this.value=a.value,a):null}; wb.prototype.any=function(a){var b=this.na;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(a(d))return!0;b.w!==c&&Da(b);d=d.ua}return!1};wb.prototype.all=function(a){var b=this.na;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(!a(d))return!1;b.w!==c&&Da(b);d=d.ua}return!0};wb.prototype.each=function(a){var b=this.na;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;)a(d),b.w!==c&&Da(b),d=d.ua;return this}; wb.prototype.map=function(a){var b=this.na;b.Oa=null;var c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;)d.add(a(e)),b.w!==c&&Da(b),e=e.ua;return d.iterator};wb.prototype.filter=function(a){var b=this.na;b.Oa=null;var c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;)a(e)&&d.add(e),b.w!==c&&Da(b),e=e.ua;return d.iterator};wb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1;this.na.Oa=this};wb.prototype.toString=function(){return null!==this.ra?"MapIterator@"+this.ra:"MapIterator"}; -oa.Object.defineProperties(wb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});wb.prototype.first=wb.prototype.first;wb.prototype.hasNext=wb.prototype.ud;wb.prototype.next=wb.prototype.next;wb.prototype.reset=wb.prototype.reset;wb.className="MapIterator"; +oa.Object.defineProperties(wb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});wb.prototype.first=wb.prototype.first;wb.prototype.hasNext=wb.prototype.vd;wb.prototype.next=wb.prototype.next;wb.prototype.reset=wb.prototype.reset;wb.className="MapIterator"; function xb(a){ab(this);this.u=!1;this.Ob={};this.Nb=0;this.gf=this.Oa=null;this.w=0;this.hf=this.ga=null;(G&&"function"===typeof a||"string"===typeof a)&&v("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=xb.prototype;t.pb=function(){var a=this.w;a++;999999999=this.count)return gb;var a=this.Oa;return null!==a?(a.reset(),a):new wb(this)}},iteratorKeys:{configurable:!0,get:function(){return 0>=this.count?gb:new qb(this)}},iteratorValues:{configurable:!0,get:function(){if(0>=this.count)return gb; +oa.Object.defineProperties(xb.prototype,{count:{configurable:!0,get:function(){return this.Nb}},size:{configurable:!0,get:function(){return this.Nb}},iterator:{configurable:!0,get:function(){if(0>=this.count)return gb;var a=this.Oa;return null!==a?(a.reset(),a):new wb(this)}},iteratorKeys:{configurable:!0,get:function(){return 0>=this.count?gb:new rb(this)}},iteratorValues:{configurable:!0,get:function(){if(0>=this.count)return gb; var a=this.gf;return null!==a?(a.reset(),a):new vb(this)}}});xb.prototype.toKeySet=xb.prototype.Qf;xb.prototype.toArray=xb.prototype.Ea;xb.prototype.clear=xb.prototype.clear;xb.prototype["delete"]=xb.prototype.delete;xb.prototype.remove=xb.prototype.remove;xb.prototype.get=xb.prototype.get;xb.prototype.getValue=xb.prototype.K;xb.prototype.has=xb.prototype.has;xb.prototype.contains=xb.prototype.contains;xb.prototype.first=xb.prototype.first;xb.prototype.addAll=xb.prototype.addAll; xb.prototype.set=xb.prototype.set;xb.prototype.add=xb.prototype.add;xb.prototype.thaw=xb.prototype.ka;xb.prototype.freeze=xb.prototype.freeze;xb.className="Map";function K(a,b){void 0===a?this.J=this.I=0:"number"===typeof a&&"number"===typeof b?(this.I=a,this.J=b):v("Invalid arguments to Point constructor: "+a+", "+b);this.u=!1}var yb,zb,Ab,Bb,Cb;K.prototype.assign=function(a){this.I=a.I;this.J=a.J;return this};K.prototype.h=function(a,b){this.I=a;this.J=b;return this}; K.prototype.zg=function(a,b){G&&(A(a,"number",K,"setTo:x"),A(b,"number",K,"setTo:y"),this.ha());this.I=a;this.J=b;return this};K.prototype.set=function(a){G&&(x(a,K,K,"set:p"),this.ha());this.I=a.I;this.J=a.J;return this};K.prototype.copy=function(){var a=new K;a.I=this.I;a.J=this.J;return a};t=K.prototype;t.ia=function(){this.u=!0;Object.freeze(this);return this};t.L=function(){return this.u||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.u=!0;return this}; t.ka=function(){Object.isFrozen(this)&&v("cannot thaw constant: "+this);this.u=!1;return this};t.ha=function(a){if(G&&this.u){var b="The Point is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);v(b)}};function Db(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));return new K(c,e)}return new K} function Eb(a){G&&x(a,K);return a.x.toString()+" "+a.y.toString()}t.toString=function(){return"Point("+this.x+","+this.y+")"};t.B=function(a){return a instanceof K?this.I===a.x&&this.J===a.y:!1};t.Si=function(a,b){return this.I===a&&this.J===b};t.Ya=function(a){return L.A(this.I,a.x)&&L.A(this.J,a.y)};t.add=function(a){G&&(x(a,K,K,"add:p"),this.ha());this.I+=a.x;this.J+=a.y;return this};t.oe=function(a){G&&(x(a,K,K,"subtract:p"),this.ha());this.I-=a.x;this.J-=a.y;return this}; t.offset=function(a,b){G&&(D(a,K,"offset:dx"),D(b,K,"offset:dy"),this.ha());this.I+=a;this.J+=b;return this};K.prototype.rotate=function(a){G&&(D(a,K,"rotate:angle"),this.ha());if(0===a)return this;var b=this.I,c=this.J;if(0===b&&0===c)return this;360<=a?a-=360:0>a&&(a+=360);if(90===a){a=0;var d=1}else 180===a?(a=-1,d=0):270===a?(a=0,d=-1):(d=a*Math.PI/180,a=Math.cos(d),d=Math.sin(d));this.I=a*b-d*c;this.J=d*b+a*c;return this};t=K.prototype; -t.scale=function(a,b){G&&(D(a,K,"scale:sx"),D(b,K,"scale:sy"),this.ha());this.I*=a;this.J*=b;return this};t.Ff=function(a){G&&x(a,K,K,"distanceSquaredPoint:p");var b=a.x-this.I;a=a.y-this.J;return b*b+a*a};t.td=function(a,b){G&&(D(a,K,"distanceSquared:px"),D(b,K,"distanceSquared:py"));a-=this.I;b-=this.J;return a*a+b*b};t.normalize=function(){G&&this.ha();var a=this.I,b=this.J,c=Math.sqrt(a*a+b*b);0b?270:0;if(0===b)return 0a?c=0>b?c+180:180-c:0>b&&(c=360-c);return c} +t.scale=function(a,b){G&&(D(a,K,"scale:sx"),D(b,K,"scale:sy"),this.ha());this.I*=a;this.J*=b;return this};t.Ff=function(a){G&&x(a,K,K,"distanceSquaredPoint:p");var b=a.x-this.I;a=a.y-this.J;return b*b+a*a};t.ud=function(a,b){G&&(D(a,K,"distanceSquared:px"),D(b,K,"distanceSquared:py"));a-=this.I;b-=this.J;return a*a+b*b};t.normalize=function(){G&&this.ha();var a=this.I,b=this.J,c=Math.sqrt(a*a+b*b);0b?270:0;if(0===b)return 0a?c=0>b?c+180:180-c:0>b&&(c=360-c);return c} t.Mz=function(a,b){G&&(x(a,K,K,"compareWithLineSegmentPoint:p"),x(b,K,K,"compareWithLineSegmentPoint:q"));return L.sm(a.x,a.y,b.x,b.y,this.x,this.y)};t.aB=function(a,b,c,d){G&&(D(a,K,"projectOntoLineSegment:px"),D(b,K,"projectOntoLineSegment:py"),D(c,K,"projectOntoLineSegment:qx"),D(d,K,"projectOntoLineSegment:qy"));L.Ph(a,b,c,d,this.I,this.J,this);return this}; t.bB=function(a,b){G&&(x(a,K,K,"projectOntoLineSegmentPoint:p"),x(b,K,K,"projectOntoLineSegmentPoint:q"));L.Ph(a.x,a.y,b.x,b.y,this.I,this.J,this);return this};t.pB=function(a,b,c,d){G&&(D(a,K,"snapToGrid:originx"),D(b,K,"snapToGrid:originy"),D(c,K,"snapToGrid:cellwidth"),D(d,K,"snapToGrid:cellheight"));L.vq(this.I,this.J,a,b,c,d,this);return this};t.qB=function(a,b){G&&(x(a,K,K,"snapToGridPoint:p"),x(b,Hb,K,"snapToGridPoint:q"));L.vq(this.I,this.J,a.x,a.y,b.width,b.height,this);return this}; t.gj=function(a,b){G&&(x(a,M,K,"setRectSpot:r"),x(b,Ib,K,"setRectSpot:spot"),this.ha());this.I=a.x+b.x*a.width+b.offsetX;this.J=a.y+b.y*a.height+b.offsetY;return this};t.hj=function(a,b,c,d,e){G&&(D(a,K,"setSpot:x"),D(b,K,"setSpot:y"),D(c,K,"setSpot:w"),D(d,K,"setSpot:h"),(0>c||0>d)&&v("Point.setSpot:Width and height cannot be negative"),x(e,Ib,K,"setSpot:spot"),this.ha());this.I=a+e.x*c+e.offsetX;this.J=b+e.y*d+e.offsetY;return this}; @@ -110,8 +110,8 @@ function Nb(a,b,c,d){G&&(D(a,K,"distanceSquared:px"),D(b,K,"distanceSquared:py") t.s=function(){return isFinite(this.x)&&isFinite(this.y)};K.alloc=function(){var a=Qb.pop();return void 0===a?new K:a};K.allocAt=function(a,b){var c=Qb.pop();if(void 0===c)return new K(a,b);c.x=a;c.y=b;return c};K.free=function(a){Qb.push(a)}; oa.Object.defineProperties(K.prototype,{x:{configurable:!0,get:function(){return this.I},set:function(a){G&&(A(a,"number",K,"x"),this.ha(a));this.I=a}},y:{configurable:!0,get:function(){return this.J},set:function(a){G&&(A(a,"number",K,"y"),this.ha(a));this.J=a}}});K.prototype.isReal=K.prototype.s;K.prototype.setSpot=K.prototype.hj;K.prototype.setRectSpot=K.prototype.gj;K.prototype.snapToGridPoint=K.prototype.qB;K.prototype.snapToGrid=K.prototype.pB; K.prototype.projectOntoLineSegmentPoint=K.prototype.bB;K.prototype.projectOntoLineSegment=K.prototype.aB;K.intersectingLineSegments=function(a,b,c,d,e,f,g,h){G&&(D(a,K,"intersectingLineSegments:a1x"),D(b,K,"intersectingLineSegments:a1y"),D(c,K,"intersectingLineSegments:a2x"),D(d,K,"intersectingLineSegments:a2y"),D(e,K,"intersectingLineSegments:b1x"),D(f,K,"intersectingLineSegments:b1y"),D(g,K,"intersectingLineSegments:b2x"),D(h,K,"intersectingLineSegments:b2y"));return L.zm(a,b,c,d,e,f,g,h)}; -K.prototype.compareWithLineSegmentPoint=K.prototype.Mz;K.compareWithLineSegment=function(a,b,c,d,e,f){G&&(D(a,K,"compareWithLineSegment:a1x"),D(b,K,"compareWithLineSegment:a1y"),D(c,K,"compareWithLineSegment:a2x"),D(d,K,"compareWithLineSegment:a2y"),D(e,K,"compareWithLineSegment:b1x"),D(f,K,"compareWithLineSegment:b1y"));return L.sm(a,b,c,d,e,f)};K.prototype.direction=K.prototype.direction;K.prototype.directionPoint=K.prototype.Ua;K.prototype.normalize=K.prototype.normalize; -K.prototype.distanceSquared=K.prototype.td;K.prototype.distanceSquaredPoint=K.prototype.Ff;K.prototype.scale=K.prototype.scale;K.prototype.rotate=K.prototype.rotate;K.prototype.offset=K.prototype.offset;K.prototype.subtract=K.prototype.oe;K.prototype.add=K.prototype.add;K.prototype.equalsApprox=K.prototype.Ya;K.prototype.equalTo=K.prototype.Si;K.prototype.equals=K.prototype.B;K.prototype.set=K.prototype.set;K.prototype.setTo=K.prototype.zg;var Qb=[];K.className="Point";K.parse=Db;K.stringify=Eb; +K.prototype.compareWithLineSegmentPoint=K.prototype.Mz;K.compareWithLineSegment=function(a,b,c,d,e,f){G&&(D(a,K,"compareWithLineSegment:a1x"),D(b,K,"compareWithLineSegment:a1y"),D(c,K,"compareWithLineSegment:a2x"),D(d,K,"compareWithLineSegment:a2y"),D(e,K,"compareWithLineSegment:b1x"),D(f,K,"compareWithLineSegment:b1y"));return L.sm(a,b,c,d,e,f)};K.prototype.direction=K.prototype.direction;K.prototype.directionPoint=K.prototype.Wa;K.prototype.normalize=K.prototype.normalize; +K.prototype.distanceSquared=K.prototype.ud;K.prototype.distanceSquaredPoint=K.prototype.Ff;K.prototype.scale=K.prototype.scale;K.prototype.rotate=K.prototype.rotate;K.prototype.offset=K.prototype.offset;K.prototype.subtract=K.prototype.oe;K.prototype.add=K.prototype.add;K.prototype.equalsApprox=K.prototype.Ya;K.prototype.equalTo=K.prototype.Si;K.prototype.equals=K.prototype.B;K.prototype.set=K.prototype.set;K.prototype.setTo=K.prototype.zg;var Qb=[];K.className="Point";K.parse=Db;K.stringify=Eb; K.distanceLineSegmentSquared=Mb;K.distanceSquared=Nb;K.direction=Ob;K.Origin=yb=(new K(0,0)).ia();K.InfiniteTopLeft=zb=(new K(-Infinity,-Infinity)).ia();K.InfiniteBottomRight=Ab=(new K(Infinity,Infinity)).ia();K.SixPoint=Bb=(new K(6,6)).ia();K.NoPoint=Cb=(new K(NaN,NaN)).ia();K.parse=Db;K.stringify=Eb;K.distanceLineSegmentSquared=Mb;K.distanceSquared=Nb;K.direction=Ob; function Hb(a,b){void 0===a?this.ea=this.fa=0:"number"===typeof a&&(0<=a||isNaN(a))&&"number"===typeof b&&(0<=b||isNaN(b))?(this.fa=a,this.ea=b):v("Invalid arguments to Size constructor: "+a+", "+b);this.u=!1}var Rb,Sb,Tb,Xb,Yb,Zb,$b;Hb.prototype.assign=function(a){this.fa=a.fa;this.ea=a.ea;return this};Hb.prototype.h=function(a,b){this.fa=a;this.ea=b;return this}; Hb.prototype.zg=function(a,b){G&&(A(a,"number",Hb,"setTo:w"),A(b,"number",Hb,"setTo:h"),0>a&&Aa(a,">= 0",Hb,"setTo:w"),0>b&&Aa(b,">= 0",Hb,"setTo:h"),this.ha());this.fa=a;this.ea=b;return this};Hb.prototype.set=function(a){G&&(x(a,Hb,Hb,"set:s"),this.ha());this.fa=a.fa;this.ea=a.ea;return this};Hb.prototype.copy=function(){var a=new Hb;a.fa=this.fa;a.ea=this.ea;return a};t=Hb.prototype;t.ia=function(){this.u=!0;Object.freeze(this);return this}; @@ -122,17 +122,17 @@ oa.Object.defineProperties(Hb.prototype,{width:{configurable:!0,get:function(){r Hb.prototype.equals=Hb.prototype.B;Hb.prototype.set=Hb.prototype.set;Hb.prototype.setTo=Hb.prototype.zg;var cc=[];Hb.className="Size";Hb.parse=ac;Hb.stringify=bc;Hb.ZeroSize=Rb=(new Hb(0,0)).ia();Hb.OneSize=Sb=(new Hb(1,1)).ia();Hb.SixSize=Tb=(new Hb(6,6)).ia();Hb.EightSize=Xb=(new Hb(8,8)).ia();Hb.TenSize=Yb=(new Hb(10,10)).ia();Hb.InfiniteSize=Zb=(new Hb(Infinity,Infinity)).ia();Hb.NoSize=$b=(new Hb(NaN,NaN)).ia();Hb.parse=ac;Hb.stringify=bc; function M(a,b,c,d){void 0===a?this.ea=this.fa=this.J=this.I=0:"number"===typeof a&&"number"===typeof b&&"number"===typeof c&&(0<=c||isNaN(c))&&"number"===typeof d&&(0<=d||isNaN(d))?(this.I=a,this.J=b,this.fa=c,this.ea=d):a instanceof K?(c=a.x,a=a.y,b instanceof K?(d=b.x,b=b.y,this.I=Math.min(c,d),this.J=Math.min(a,b),this.fa=Math.abs(c-d),this.ea=Math.abs(a-b)):b instanceof Hb?(this.I=c,this.J=a,this.fa=b.width,this.ea=b.height):v("Incorrect second argument supplied to Rect constructor "+b)):v("Invalid arguments to Rect constructor: "+ a+", "+b+", "+c+", "+d);this.u=!1}t=M.prototype;t.assign=function(a){this.I=a.I;this.J=a.J;this.fa=a.fa;this.ea=a.ea;return this};t.h=function(a,b,c,d){this.I=a;this.J=b;this.fa=c;this.ea=d;return this};function dc(a,b,c){a.fa=b;a.ea=c}t.zg=function(a,b,c,d){G&&(A(a,"number",M,"setTo:x"),A(b,"number",M,"setTo:y"),A(c,"number",M,"setTo:w"),A(d,"number",M,"setTo:h"),0>c&&Aa(c,">= 0",M,"setTo:w"),0>d&&Aa(d,">= 0",M,"setTo:h"),this.ha());this.I=a;this.J=b;this.fa=c;this.ea=d;return this}; -t.set=function(a){G&&(x(a,M,M,"set:r"),this.ha());this.I=a.I;this.J=a.J;this.fa=a.fa;this.ea=a.ea;return this};t.Sc=function(a){G&&(x(a,K,M,"setPoint:p"),this.ha());this.I=a.x;this.J=a.y;return this};t.oB=function(a){G&&(x(a,Hb,M,"setSize:s"),this.ha());this.fa=a.width;this.ea=a.height;return this};M.prototype.copy=function(){var a=new M;a.I=this.I;a.J=this.J;a.fa=this.fa;a.ea=this.ea;return a};t=M.prototype;t.ia=function(){this.u=!0;Object.freeze(this);return this}; +t.set=function(a){G&&(x(a,M,M,"set:r"),this.ha());this.I=a.I;this.J=a.J;this.fa=a.fa;this.ea=a.ea;return this};t.Tc=function(a){G&&(x(a,K,M,"setPoint:p"),this.ha());this.I=a.x;this.J=a.y;return this};t.oB=function(a){G&&(x(a,Hb,M,"setSize:s"),this.ha());this.fa=a.width;this.ea=a.height;return this};M.prototype.copy=function(){var a=new M;a.I=this.I;a.J=this.J;a.fa=this.fa;a.ea=this.ea;return a};t=M.prototype;t.ia=function(){this.u=!0;Object.freeze(this);return this}; t.L=function(){return this.u||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.u=!0;return this};t.ka=function(){Object.isFrozen(this)&&v("cannot thaw constant: "+this);this.u=!1;return this};t.ha=function(a){if(G&&this.u){var b="The Rect is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);v(b)}}; function ec(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));for(var f=0;""===a[b];)b++;(d=a[b++])&&(f=parseFloat(d));for(var g=0;""===a[b];)b++;(d=a[b++])&&(g=parseFloat(d));return new M(c,e,f,g)}return new M}function fc(a){G&&x(a,M);return a.x.toString()+" "+a.y.toString()+" "+a.width.toString()+" "+a.height.toString()} t.toString=function(){return"Rect("+this.x+","+this.y+","+this.width+","+this.height+")"};t.B=function(a){return a instanceof M?this.I===a.x&&this.J===a.y&&this.fa===a.width&&this.ea===a.height:!1};t.Si=function(a,b,c,d){return this.I===a&&this.J===b&&this.fa===c&&this.ea===d};t.Ya=function(a){return L.A(this.I,a.x)&&L.A(this.J,a.y)&&L.A(this.fa,a.width)&&L.A(this.ea,a.height)};function gc(a,b){return L.da(a.I,b.x)&&L.da(a.J,b.y)&&L.da(a.fa,b.width)&&L.da(a.ea,b.height)} t.ca=function(a){G&&x(a,K,M,"containsPoint:p");return this.I<=a.x&&this.I+this.fa>=a.x&&this.J<=a.y&&this.J+this.ea>=a.y};t.Qe=function(a){G&&x(a,M,M,"containsRect:r");return this.I<=a.x&&a.x+a.width<=this.I+this.fa&&this.J<=a.y&&a.y+a.height<=this.J+this.ea}; t.contains=function(a,b,c,d){G?(D(a,M,"contains:x"),D(b,M,"contains:y"),void 0===c?c=0:D(c,M,"contains:w"),void 0===d?d=0:D(d,M,"contains:h"),(0>c||0>d)&&v("Rect.contains:Width and height cannot be negative")):(void 0===c&&(c=0),void 0===d&&(d=0));return this.I<=a&&a+c<=this.I+this.fa&&this.J<=b&&b+d<=this.J+this.ea};t.offset=function(a,b){G&&(D(a,M,"offset:dx"),D(b,M,"offset:dy"),this.ha());this.I+=a;this.J+=b;return this}; -t.Mc=function(a,b){G&&(D(a,M,"inflate:w"),D(b,M,"inflate:h"));return hc(this,b,a,b,a)};t.jq=function(a){G&&x(a,ic,M,"addMargin:m");return hc(this,a.top,a.right,a.bottom,a.left)};t.qw=function(a){G&&x(a,ic,M,"subtractMargin:m");return hc(this,-a.top,-a.right,-a.bottom,-a.left)};t.EA=function(a,b,c,d){G&&(D(a,M,"grow:t"),D(b,M,"grow:r"),D(c,M,"grow:b"),D(d,M,"grow:l"));return hc(this,a,b,c,d)}; +t.Nc=function(a,b){G&&(D(a,M,"inflate:w"),D(b,M,"inflate:h"));return hc(this,b,a,b,a)};t.jq=function(a){G&&x(a,ic,M,"addMargin:m");return hc(this,a.top,a.right,a.bottom,a.left)};t.qw=function(a){G&&x(a,ic,M,"subtractMargin:m");return hc(this,-a.top,-a.right,-a.bottom,-a.left)};t.EA=function(a,b,c,d){G&&(D(a,M,"grow:t"),D(b,M,"grow:r"),D(c,M,"grow:b"),D(d,M,"grow:l"));return hc(this,a,b,c,d)}; function hc(a,b,c,d,e){G&&a.ha();var f=a.fa;c+e<=-f?(a.I+=f/2,a.fa=0):(a.I-=e,a.fa+=c+e);c=a.ea;b+d<=-c?(a.J+=c/2,a.ea=0):(a.J-=b,a.ea+=b+d);return a}t.yy=function(a){G&&x(a,M,M,"intersectRect:r");return kc(this,a.x,a.y,a.width,a.height)};t.Ov=function(a,b,c,d){G&&(D(a,M,"intersect:x"),D(b,M,"intersect:y"),D(c,M,"intersect:w"),D(d,M,"intersect:h"),(0>c||0>d)&&v("Rect.intersect:Width and height cannot be negative"));return kc(this,a,b,c,d)}; -function kc(a,b,c,d,e){G&&a.ha();var f=Math.max(a.I,b),g=Math.max(a.J,c);b=Math.min(a.I+a.fa,b+d);c=Math.min(a.J+a.ea,c+e);a.I=f;a.J=g;a.fa=Math.max(0,b-f);a.ea=Math.max(0,c-g);return a}t.Oc=function(a){G&&x(a,M,M,"intersectsRect:r");return this.Pv(a.x,a.y,a.width,a.height)}; +function kc(a,b,c,d,e){G&&a.ha();var f=Math.max(a.I,b),g=Math.max(a.J,c);b=Math.min(a.I+a.fa,b+d);c=Math.min(a.J+a.ea,c+e);a.I=f;a.J=g;a.fa=Math.max(0,b-f);a.ea=Math.max(0,c-g);return a}t.Pc=function(a){G&&x(a,M,M,"intersectsRect:r");return this.Pv(a.x,a.y,a.width,a.height)}; t.Pv=function(a,b,c,d){G&&(D(a,M,"intersects:x"),D(b,M,"intersects:y"),D(a,M,"intersects:w"),D(b,M,"intersects:h"),(0>c||0>d)&&v("Rect.intersects:Width and height cannot be negative"));var e=this.fa,f=this.I;if(Infinity!==e&&Infinity!==c&&(e+=f,c+=a,isNaN(c)||isNaN(e)||f>c||a>e))return!1;a=this.ea;c=this.J;return Infinity!==a&&Infinity!==d&&(a+=c,d+=b,isNaN(d)||isNaN(a)||c>d||b>a)?!1:!0}; -function lc(a,b){var c=a.fa,d=a.I,e=b.x-10;if(d>b.width+10+10+e||e>c+d)return!1;c=a.ea;a=a.J;d=b.y-10;return a>b.height+10+10+d||d>c+a?!1:!0}t.Ye=function(a){G&&x(a,K,M,"unionPoint:p");return mc(this,a.x,a.y,0,0)};t.Tc=function(a){G&&x(a,M,M,"unionRect:r");return mc(this,a.I,a.J,a.fa,a.ea)}; +function lc(a,b){var c=a.fa,d=a.I,e=b.x-10;if(d>b.width+10+10+e||e>c+d)return!1;c=a.ea;a=a.J;d=b.y-10;return a>b.height+10+10+d||d>c+a?!1:!0}t.Ye=function(a){G&&x(a,K,M,"unionPoint:p");return mc(this,a.x,a.y,0,0)};t.Uc=function(a){G&&x(a,M,M,"unionRect:r");return mc(this,a.I,a.J,a.fa,a.ea)}; t.uw=function(a,b,c,d){G?(D(a,M,"union:x"),D(b,M,"union:y"),void 0===c?c=0:D(c,M,"union:w"),void 0===d?d=0:D(d,M,"union:h"),(0>c||0>d)&&v("Rect.union:Width and height cannot be negative"),this.ha()):(void 0===c&&(c=0),void 0===d&&(d=0));return mc(this,a,b,c,d)};function mc(a,b,c,d,e){var f=Math.min(a.I,b),g=Math.min(a.J,c);b=Math.max(a.I+a.fa,b+d);c=Math.max(a.J+a.ea,c+e);a.I=f;a.J=g;a.fa=b-f;a.ea=c-g;return a} t.hj=function(a,b,c){G&&(D(a,M,"setSpot:x"),D(b,M,"setSpot:y"),x(c,Ib,M,"setSpot:spot"),this.ha());this.I=a-c.offsetX-c.x*this.fa;this.J=b-c.offsetY-c.y*this.ea;return this}; function nc(a,b,c,d,e,f,g,h){G?(D(a,M,"contains:rx"),D(b,M,"contains:ry"),D(c,M,"contains:rw"),D(d,M,"contains:rh"),D(e,M,"contains:x"),D(f,M,"contains:y"),void 0===g?g=0:D(g,M,"contains:w"),void 0===h?h=0:D(h,M,"contains:h"),(0>c||0>d||0>g||0>h)&&v("Rect.contains:Width and height cannot be negative")):(void 0===g&&(g=0),void 0===h&&(h=0));return a<=e&&e+g<=a+c&&b<=f&&f+h<=b+d} @@ -143,8 +143,8 @@ set:function(a){G&&(A(a,"number",M,"height"),this.ha(a));0>a&&Aa(a,">= 0",M,"hei bottom:{configurable:!0,get:function(){return this.J+this.ea},set:function(a){G&&(D(a,M,"top"),this.ha(a));this.J+=a-(this.J+this.ea)}},position:{configurable:!0,get:function(){return new K(this.I,this.J)},set:function(a){G&&(x(a,K,M,"position"),this.ha(a));this.I=a.x;this.J=a.y}},size:{configurable:!0,get:function(){return new Hb(this.fa,this.ea)},set:function(a){G&&(x(a,Hb,M,"size"),this.ha(a));this.fa=a.width;this.ea=a.height}},center:{configurable:!0, enumerable:!0,get:function(){return new K(this.I+this.fa/2,this.J+this.ea/2)},set:function(a){G&&(x(a,K,M,"center"),this.ha(a));this.I=a.x-this.fa/2;this.J=a.y-this.ea/2}},centerX:{configurable:!0,get:function(){return this.I+this.fa/2},set:function(a){G&&(D(a,M,"centerX"),this.ha(a));this.I=a-this.fa/2}},centerY:{configurable:!0,get:function(){return this.J+this.ea/2},set:function(a){G&&(D(a,M,"centerY"),this.ha(a));this.J=a-this.ea/2}}});M.prototype.isEmpty=M.prototype.KA; M.prototype.isReal=M.prototype.s;M.intersectsLineSegment=function(a,b,c,d,e,f,g,h){G&&(D(a,M,"intersectsLineSegment:x"),D(b,M,"intersectsLineSegment:y"),D(c,M,"intersectsLineSegment:w"),D(d,M,"intersectsLineSegment:h"),D(e,M,"intersectsLineSegment:p1x"),D(f,M,"intersectsLineSegment:p1y"),D(g,M,"intersectsLineSegment:p2x"),D(h,M,"intersectsLineSegment:p2y"),(0>c||0>d)&&v("Rect.intersectsLineSegment: width and height cannot be negative"));return L.zy(a,b,c,d,e,f,g,h)};M.prototype.setSpot=M.prototype.hj; -M.prototype.union=M.prototype.uw;M.prototype.unionRect=M.prototype.Tc;M.prototype.unionPoint=M.prototype.Ye;M.prototype.intersects=M.prototype.Pv;M.prototype.intersectsRect=M.prototype.Oc;M.prototype.intersect=M.prototype.Ov;M.prototype.intersectRect=M.prototype.yy;M.prototype.grow=M.prototype.EA;M.prototype.subtractMargin=M.prototype.qw;M.prototype.addMargin=M.prototype.jq;M.prototype.inflate=M.prototype.Mc;M.prototype.offset=M.prototype.offset;M.prototype.contains=M.prototype.contains; -M.prototype.containsRect=M.prototype.Qe;M.prototype.containsPoint=M.prototype.ca;M.prototype.equalsApprox=M.prototype.Ya;M.prototype.equalTo=M.prototype.Si;M.prototype.equals=M.prototype.B;M.prototype.setSize=M.prototype.oB;M.prototype.setPoint=M.prototype.Sc;M.prototype.set=M.prototype.set;M.prototype.setTo=M.prototype.zg;var qc=null,uc=null,pc=[];M.className="Rect";M.parse=ec;M.stringify=fc;M.contains=nc;M.intersects=oc;M.ZeroRect=qc=(new M(0,0,0,0)).ia();M.NoRect=uc=(new M(NaN,NaN,NaN,NaN)).ia(); +M.prototype.union=M.prototype.uw;M.prototype.unionRect=M.prototype.Uc;M.prototype.unionPoint=M.prototype.Ye;M.prototype.intersects=M.prototype.Pv;M.prototype.intersectsRect=M.prototype.Pc;M.prototype.intersect=M.prototype.Ov;M.prototype.intersectRect=M.prototype.yy;M.prototype.grow=M.prototype.EA;M.prototype.subtractMargin=M.prototype.qw;M.prototype.addMargin=M.prototype.jq;M.prototype.inflate=M.prototype.Nc;M.prototype.offset=M.prototype.offset;M.prototype.contains=M.prototype.contains; +M.prototype.containsRect=M.prototype.Qe;M.prototype.containsPoint=M.prototype.ca;M.prototype.equalsApprox=M.prototype.Ya;M.prototype.equalTo=M.prototype.Si;M.prototype.equals=M.prototype.B;M.prototype.setSize=M.prototype.oB;M.prototype.setPoint=M.prototype.Tc;M.prototype.set=M.prototype.set;M.prototype.setTo=M.prototype.zg;var qc=null,uc=null,pc=[];M.className="Rect";M.parse=ec;M.stringify=fc;M.contains=nc;M.intersects=oc;M.ZeroRect=qc=(new M(0,0,0,0)).ia();M.NoRect=uc=(new M(NaN,NaN,NaN,NaN)).ia(); M.parse=ec;M.stringify=fc;M.contains=nc;M.intersects=oc;function ic(a,b,c,d){void 0===a?this.De=this.se=this.Me=this.Oe=0:void 0===b?this.left=this.bottom=this.right=this.top=a:void 0===c?(this.top=a,this.right=b,this.bottom=a,this.left=b):void 0!==d?(this.top=a,this.right=b,this.bottom=c,this.left=d):v("Invalid arguments to Margin constructor: "+a+", "+b+", "+c+", "+d);this.u=!1}ic.prototype.assign=function(a){this.Oe=a.Oe;this.Me=a.Me;this.se=a.se;this.De=a.De;return this}; ic.prototype.zg=function(a,b,c,d){G&&(A(a,"number",ic,"setTo:t"),A(b,"number",ic,"setTo:r"),A(c,"number",ic,"setTo:b"),A(d,"number",ic,"setTo:l"),this.ha());this.Oe=a;this.Me=b;this.se=c;this.De=d;return this};ic.prototype.set=function(a){G&&(x(a,ic,ic,"assign:m"),this.ha());this.Oe=a.Oe;this.Me=a.Me;this.se=a.se;this.De=a.De;return this};ic.prototype.copy=function(){var a=new ic;a.Oe=this.Oe;a.Me=this.Me;a.se=this.se;a.De=this.De;return a};t=ic.prototype; t.ia=function(){this.u=!0;Object.freeze(this);return this};t.L=function(){return this.u||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.u=!0;return this};t.ka=function(){Object.isFrozen(this)&&v("cannot thaw constant: "+this);this.u=!1;return this};t.ha=function(a){if(G&&this.u){var b="The Margin is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);v(b)}}; @@ -162,10 +162,10 @@ a)return Rc;if("RightSide"===a)return Sc;if("BottomSide"===a)return Tc;if("TopBo var d=a[b++];void 0!==d&&0c,f=0>d;if(al;++l){b=.5*(h+k);if(b===h||b===k)break;var m=a/(b+e),n=g/(b+f);m=m*m+n*n-1;if(0m)k=b;else break}c=e*c/(b+e)-c;d=f*d/(b+f)-d;c=Math.sqrt(c*c+d*d)}else c=Math.abs(d-b);else d=a*a-b*b,f=a*c,fg&&(g+=360),q.startAngle+=g);0>a&&(q.startAngle=180-q.startAngle,q.sweepAngle=-q.sweepAngle); 0>d&&(q.startAngle=-q.startAngle,q.sweepAngle=-q.sweepAngle);q.radiusX*=Math.sqrt(a*a+c*c);void 0!==q.radiusY&&(q.radiusY*=Math.sqrt(b*b+d*d));break;case be:g=q.endX;h=q.endY;q.endX=g*a+h*c+e;q.endY=g*b+h*d+f;if(0===q.radiusX||0===q.radiusY)break;0!==b&&(g=180*Math.atan2(b,a)/Math.PI,0>g&&(g+=360),q.xAxisRotation+=g);0>a&&(q.xAxisRotation=180-q.xAxisRotation,q.isClockwiseArc=!q.isClockwiseArc);0>d&&(q.xAxisRotation=-q.xAxisRotation,q.isClockwiseArc=!q.isClockwiseArc);q.radiusX*=Math.sqrt(a*a+c*c); q.radiusY*=Math.sqrt(b*b+d*d);break;default:v("Unknown Segment type: "+q.type)}}}}this.wa=!0;return this}; -t.ca=function(a,b){void 0===b&&(b=0);var c=this.ed,d=this.fd,e=this.lc,f=this.uc;switch(this.type){case N.j:return L.Rb(c,d,e,f,b,a.x,a.y);case N.F:var g=M.allocAt(Math.min(c,e)-b,Math.min(d,f)-b,Math.abs(e-c)+2*b,Math.abs(f-d)+2*b);a=g.ca(a);M.free(g);return a;case N.P:g=Math.min(c,e)-b;var h=Math.min(d,f)-b;c=(Math.abs(e-c)+2*b)/2;b=(Math.abs(f-d)+2*b)/2;if(0>=c||0>=b)return!1;g=a.x-(g+c);h=a.y-(h+b);return 1>=g*g/(c*c)+h*h/(b*b);case N.o:return ee(this,a,b,!0,!1);default:return!1}}; +t.ca=function(a,b){void 0===b&&(b=0);var c=this.fd,d=this.gd,e=this.lc,f=this.uc;switch(this.type){case N.j:return L.Rb(c,d,e,f,b,a.x,a.y);case N.F:var g=M.allocAt(Math.min(c,e)-b,Math.min(d,f)-b,Math.abs(e-c)+2*b,Math.abs(f-d)+2*b);a=g.ca(a);M.free(g);return a;case N.P:g=Math.min(c,e)-b;var h=Math.min(d,f)-b;c=(Math.abs(e-c)+2*b)/2;b=(Math.abs(f-d)+2*b)/2;if(0>=c||0>=b)return!1;g=a.x-(g+c);h=a.y-(h+b);return 1>=g*g/(c*c)+h*h/(b*b);case N.o:return ee(this,a,b,!0,!1);default:return!1}}; function ee(a,b,c,d,e){var f=b.x;b=b.y;for(var g=a.bounds.x-20,h=0,k,l,m,n,p=a.figures.m,r=p.length,q=0;qa?"M"+this.startX.toString()+" "+this.startY.toString():"M"+this.startX.toFixed(a)+" "+this.startY.toFixed(a);for(var c=this.segments.m,d=c.length,e=0;ea&&(a+=360),this.Le=a,this.Ci=0,G&&D(d,je,"x1"),this.Di=Math.max(d,0),G&&D(e,je,"y1"),this.mh=Math.max(e,0),this.El="boolean"===typeof g?g:"number"===typeof g?!!g:!1,this.$k=!!h):(G&&D(d,je,"x1"),this.Le=d, G&&D(e,je,"y1"),this.Ci=e,G&&D(f,je,"x2"),a===Vd&&(f=Math.max(f,0)),this.Di=f,"number"===typeof g?(a===Vd&&(g=Math.max(g,0)),this.mh=g):this.mh=0,this.$k=this.El=!1);this.Lj=!1;this.wa=!0;this.Ud=null}je.prototype.copy=function(){var a=new je;a.oa=this.oa;a.lc=this.lc;a.uc=this.uc;a.Le=this.Le;a.Ci=this.Ci;a.Di=this.Di;a.mh=this.mh;a.El=this.El;a.$k=this.$k;a.Lj=this.Lj;a.wa=this.wa;return a};t=je.prototype; t.Ya=function(a){if(!(a instanceof je)||this.type!==a.type||this.isClosed!==a.isClosed)return!1;switch(this.type){case Sd:case Hd:return L.A(this.endX,a.endX)&&L.A(this.endY,a.endY);case Td:return L.A(this.endX,a.endX)&&L.A(this.endY,a.endY)&&L.A(this.point1X,a.point1X)&&L.A(this.point1Y,a.point1Y)&&L.A(this.point2X,a.point2X)&&L.A(this.point2Y,a.point2Y);case Ud:return L.A(this.endX,a.endX)&&L.A(this.endY,a.endY)&&L.A(this.point1X,a.point1X)&&L.A(this.point1Y,a.point1Y);case Vd:return L.A(this.startAngle, @@ -269,15 +269,15 @@ a;this.wa=!0}},point2Y:{configurable:!0,get:function(){return this.mh},set:funct get:function(){return this.Di},set:function(a){G&&D(a,je,"radiusX");0>a&&Aa(a,">= zero",je,"radiusX");this.u&&xa(this,a);this.Di=a;this.wa=!0}},radiusY:{configurable:!0,get:function(){return this.mh},set:function(a){G&&D(a,je,"radiusY");0>a&&Aa(a,">= zero",je,"radiusY");this.u&&xa(this,a);this.mh=a;this.wa=!0}},startAngle:{configurable:!0,get:function(){return this.lc},set:function(a){this.lc!==a&&(this.u&&xa(this,a),G&&D(a,je,"startAngle"),a%=360,0>a&&(a+=360),this.lc= a,this.wa=!0)}},sweepAngle:{configurable:!0,get:function(){return this.uc},set:function(a){G&&D(a,je,"sweepAngle");this.u&&xa(this,a);360a&&(a=-360);this.uc=a;this.wa=!0}},isClockwiseArc:{configurable:!0,get:function(){return this.$k},set:function(a){this.u&&xa(this,a);this.$k=a;this.wa=!0}},isLargeArc:{configurable:!0,get:function(){return this.El},set:function(a){this.u&&xa(this,a);this.El=a;this.wa=!0}},xAxisRotation:{configurable:!0, get:function(){return this.Le},set:function(a){G&&D(a,je,"xAxisRotation");a%=360;0>a&&(a+=360);this.u&&xa(this,a);this.Le=a;this.wa=!0}}});je.prototype.equalsApprox=je.prototype.Ya;var Sd=new F(je,"Move",0),Hd=new F(je,"Line",1),Td=new F(je,"Bezier",2),Ud=new F(je,"QuadraticBezier",3),Vd=new F(je,"Arc",4),be=new F(je,"SvgArc",4);je.className="PathSegment";je.Move=Sd;je.Line=Hd;je.Bezier=Td;je.QuadraticBezier=Ud;je.Arc=Vd;je.SvgArc=be; -function le(){this.D=null;this.iv=(new K(0,0)).freeze();this.Ut=(new K(0,0)).freeze();this.er=this.Yr=0;this.fr=1;this.oi="";this.Es=this.vr=!1;this.tr=this.hr=0;this.Eg=this.Hr=this.Nr=!1;this.zr=null;this.Cs=0;this.sd=this.Bs=null}le.prototype.copy=function(){var a=new le;return this.clone(a)}; -le.prototype.clone=function(a){a.D=this.D;a.iv.assign(this.viewPoint);a.Ut.assign(this.documentPoint);a.Yr=this.Yr;a.er=this.er;a.fr=this.fr;a.oi=this.oi;a.vr=this.vr;a.Es=this.Es;a.hr=this.hr;a.tr=this.tr;a.Nr=this.Nr;a.Hr=this.Hr;a.Eg=this.Eg;a.zr=this.zr;a.Cs=this.Cs;a.Bs=this.Bs;a.sd=this.sd;return a}; +function le(){this.D=null;this.iv=(new K(0,0)).freeze();this.Ut=(new K(0,0)).freeze();this.er=this.Yr=0;this.fr=1;this.oi="";this.Es=this.vr=!1;this.tr=this.hr=0;this.Eg=this.Hr=this.Nr=!1;this.zr=null;this.Cs=0;this.td=this.Bs=null}le.prototype.copy=function(){var a=new le;return this.clone(a)}; +le.prototype.clone=function(a){a.D=this.D;a.iv.assign(this.viewPoint);a.Ut.assign(this.documentPoint);a.Yr=this.Yr;a.er=this.er;a.fr=this.fr;a.oi=this.oi;a.vr=this.vr;a.Es=this.Es;a.hr=this.hr;a.tr=this.tr;a.Nr=this.Nr;a.Hr=this.Hr;a.Eg=this.Eg;a.zr=this.zr;a.Cs=this.Cs;a.Bs=this.Bs;a.td=this.td;return a}; le.prototype.toString=function(){var a="^";0!==this.modifiers&&(a+="M:"+this.modifiers);0!==this.button&&(a+="B:"+this.button);""!==this.key&&(a+="K:"+this.key);0!==this.clickCount&&(a+="C:"+this.clickCount);0!==this.delta&&(a+="D:"+this.delta);this.handled&&(a+="h");this.bubbles&&(a+="b");null!==this.documentPoint&&(a+="@"+this.documentPoint.toString());return a};le.prototype.yq=function(a,b){var c=this.diagram;if(null===c)return b;me(c,this.event,a,b);return b}; le.prototype.yA=function(a,b){var c=this.diagram;if(null===c)return b;me(c,this.event,a,b);b.assign(c.xt(b));return b}; oa.Object.defineProperties(le.prototype,{diagram:{configurable:!0,get:function(){return this.D},set:function(a){this.D=a}},viewPoint:{configurable:!0,get:function(){return this.iv},set:function(a){x(a,K,le,"viewPoint");this.iv.assign(a)}},documentPoint:{configurable:!0,get:function(){return this.Ut},set:function(a){x(a,K,le,"documentPoint");this.Ut.assign(a)}},modifiers:{configurable:!0,get:function(){return this.Yr},set:function(a){this.Yr= a}},button:{configurable:!0,get:function(){return this.er},set:function(a){this.er=a;if(null===this.event)switch(a){case 0:this.buttons=1;break;case 1:this.buttons=4;break;case 2:this.buttons=2}}},buttons:{configurable:!0,get:function(){return this.fr},set:function(a){this.fr=a}},key:{configurable:!0,get:function(){return this.oi},set:function(a){this.oi=a}},down:{configurable:!0,get:function(){return this.vr},set:function(a){this.vr=a}},up:{configurable:!0, enumerable:!0,get:function(){return this.Es},set:function(a){this.Es=a}},clickCount:{configurable:!0,get:function(){return this.hr},set:function(a){this.hr=a}},delta:{configurable:!0,get:function(){return this.tr},set:function(a){this.tr=a}},isMultiTouch:{configurable:!0,get:function(){return this.Nr},set:function(a){this.Nr=a}},handled:{configurable:!0,get:function(){return this.Hr},set:function(a){this.Hr=a}},bubbles:{configurable:!0, get:function(){return this.Eg},set:function(a){this.Eg=a}},event:{configurable:!0,get:function(){return this.zr},set:function(a){this.zr=a}},isTouchEvent:{configurable:!0,get:function(){var a=sa.TouchEvent,b=this.event;return a&&b instanceof a?!0:(a=sa.PointerEvent)&&b instanceof a&&("touch"===b.pointerType||"pen"===b.pointerType)}},timestamp:{configurable:!0,get:function(){return this.Cs},set:function(a){this.Cs=a}},targetDiagram:{configurable:!0, -get:function(){return this.Bs},set:function(a){this.Bs=a}},targetObject:{configurable:!0,get:function(){return this.sd},set:function(a){this.sd=a}},control:{configurable:!0,get:function(){return 0!==(this.modifiers&1)},set:function(a){this.modifiers=a?this.modifiers|1:this.modifiers&-2}},shift:{configurable:!0,get:function(){return 0!==(this.modifiers&4)},set:function(a){this.modifiers=a?this.modifiers|4:this.modifiers&-5}},alt:{configurable:!0, +get:function(){return this.Bs},set:function(a){this.Bs=a}},targetObject:{configurable:!0,get:function(){return this.td},set:function(a){this.td=a}},control:{configurable:!0,get:function(){return 0!==(this.modifiers&1)},set:function(a){this.modifiers=a?this.modifiers|1:this.modifiers&-2}},shift:{configurable:!0,get:function(){return 0!==(this.modifiers&4)},set:function(a){this.modifiers=a?this.modifiers|4:this.modifiers&-5}},alt:{configurable:!0, get:function(){return 0!==(this.modifiers&2)},set:function(a){this.modifiers=a?this.modifiers|2:this.modifiers&-3}},meta:{configurable:!0,get:function(){return 0!==(this.modifiers&8)},set:function(a){this.modifiers=a?this.modifiers|8:this.modifiers&-9}},left:{configurable:!0,get:function(){var a=this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons&1):0===this.button},set:function(a){this.buttons= a?this.buttons|1:this.buttons&-2}},right:{configurable:!0,get:function(){var a=this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons&2):2===this.button},set:function(a){this.buttons=a?this.buttons|2:this.buttons&-3}},middle:{configurable:!0,get:function(){var a=this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons& 4):1===this.button},set:function(a){this.buttons=a?this.buttons|4:this.buttons&-5}}});le.prototype.getMultiTouchDocumentPoint=le.prototype.yA;le.prototype.getMultiTouchViewPoint=le.prototype.yq;le.className="InputEvent";function ne(){this.D=null;this.ta="";this.gs=this.xs=null}ne.prototype.copy=function(){var a=new ne;a.D=this.D;a.ta=this.ta;a.xs=this.xs;a.gs=this.gs;return a}; @@ -294,9 +294,9 @@ a}},oldParam:{configurable:!0,get:function(){return this.ep},set:function(a){thi oe.prototype.getValue=oe.prototype.K;oe.prototype.clear=oe.prototype.clear;var qe=new F(oe,"Transaction",-1),pe=new F(oe,"Property",0),re=new F(oe,"Insert",1),se=new F(oe,"Remove",2);oe.className="ChangedEvent";oe.Transaction=qe;oe.Property=pe;oe.Insert=re;oe.Remove=se;function te(){this.o=(new H).freeze();this.ta="";this.j=!1} te.prototype.toString=function(a){var b="Transaction: "+this.name+" "+this.changes.count.toString()+(this.isComplete?"":", incomplete");if(void 0!==a&&0b&&a.Rc(b,d),b++);for(;a.length>b;)a.pop();a.freeze()}}; +te.prototype.lt=function(){if(this.isComplete){var a=this.changes;a.ka();for(var b=new xb,c=0;cb&&a.Sc(b,d),b++);for(;a.length>b;)a.pop();a.freeze()}}; oa.Object.defineProperties(te.prototype,{changes:{configurable:!0,get:function(){return this.o}},name:{configurable:!0,get:function(){return this.ta},set:function(a){this.ta=a}},isComplete:{configurable:!0,get:function(){return this.j},set:function(a){this.j=a}}});te.prototype.optimize=te.prototype.lt;te.prototype.redo=te.prototype.redo;te.prototype.canRedo=te.prototype.canRedo;te.prototype.undo=te.prototype.undo;te.prototype.canUndo=te.prototype.canUndo; -te.prototype.clear=te.prototype.clear;te.className="Transaction";function ue(){this.Au=new I;this.zd=!1;this.F=(new H).freeze();this.ze=-1;this.o=999;this.Be=!1;this.qr=null;this.Ki=0;this.j=!1;G&&(this.j=!0);this.He=(new H).freeze();this.Nl=new H;this.bu=!0;this.lu=this.Lr=this.ou=this.nu=!1} +te.prototype.clear=te.prototype.clear;te.className="Transaction";function ue(){this.Au=new I;this.Ad=!1;this.F=(new H).freeze();this.ze=-1;this.o=999;this.Be=!1;this.qr=null;this.Ki=0;this.j=!1;G&&(this.j=!0);this.He=(new H).freeze();this.Nl=new H;this.bu=!0;this.lu=this.Lr=this.ou=this.nu=!1} ue.prototype.toString=function(a){var b="UndoManager "+this.historyIndex+"<"+this.history.count+"<="+this.maxHistoryLength;b+="[";for(var c=this.nestedTransactionNames.count,d=0;d=this.transactionLevel&&!this.bu&&(a=a.diagram,null!==a&&!1===a.bj||Fa("Change not within a transaction: "+c.toString()))}}; ue.prototype.skipsEvent=function(a){if(null===a||0>a.change.value)return!0;a=a.object;if(null===a)return!1;if(void 0!==a.layer){if(a=a.layer,null!==a&&a.isTemporary)return!0}else if(a.isTemporary)return!0;return!1}; -oa.Object.defineProperties(ue.prototype,{models:{configurable:!0,get:function(){return this.Au.iterator}},isEnabled:{configurable:!0,get:function(){return this.zd},set:function(a){this.zd=a}},transactionToUndo:{configurable:!0,get:function(){return 0<=this.historyIndex&&this.historyIndex<=this.history.count-1?this.history.M(this.historyIndex):null}},transactionToRedo:{configurable:!0,get:function(){return this.historyIndexe&&(e=-3),0g&&(g=-3);if(void 0===h||void (e*=a.scrollHorizontalLineChange/16,0e||Math.abs(b.y-a.y)>d}; -oa.Object.defineProperties(we.prototype,{diagram:{configurable:!0,get:function(){return this.D},set:function(a){a instanceof Q&&(this.D=a)}},name:{configurable:!0,get:function(){return this.ta},set:function(a){A(a,"string",we,"name");this.ta=a}},isEnabled:{configurable:!0,get:function(){return this.zd},set:function(a){A(a,"boolean",we,"isEnabled");this.zd=a}},isActive:{configurable:!0,get:function(){return this.Uc},set:function(a){A(a,"boolean", -we,"isActive");this.Uc=a}},transactionResult:{configurable:!0,get:function(){return this.Hw},set:function(a){null!==a&&A(a,"string",we,"transactionResult");this.Hw=a}}});we.prototype.startTransaction=we.prototype.Da;we.className="Tool";function Ua(){we.call(this);this.name="ToolManager";this.Ec=new H;this.Vc=new H;this.Qd=new H;this.P=this.La=850;this.o=(new Hb(2,2)).ia();this.bb=5E3;this.Ma=Ie;this.F=Ke;this.pr=this.j=null;this.hk=-1}na(Ua,we);Ua.prototype.initializeStandardTools=function(){}; +oa.Object.defineProperties(we.prototype,{diagram:{configurable:!0,get:function(){return this.D},set:function(a){a instanceof Q&&(this.D=a)}},name:{configurable:!0,get:function(){return this.ta},set:function(a){A(a,"string",we,"name");this.ta=a}},isEnabled:{configurable:!0,get:function(){return this.Ad},set:function(a){A(a,"boolean",we,"isEnabled");this.Ad=a}},isActive:{configurable:!0,get:function(){return this.Vc},set:function(a){A(a,"boolean", +we,"isActive");this.Vc=a}},transactionResult:{configurable:!0,get:function(){return this.Hw},set:function(a){null!==a&&A(a,"string",we,"transactionResult");this.Hw=a}}});we.prototype.startTransaction=we.prototype.Da;we.className="Tool";function Ua(){we.call(this);this.name="ToolManager";this.Ec=new H;this.Wc=new H;this.Qd=new H;this.P=this.La=850;this.o=(new Hb(2,2)).ia();this.bb=5E3;this.Ma=Ie;this.F=Ke;this.pr=this.j=null;this.hk=-1}na(Ua,we);Ua.prototype.initializeStandardTools=function(){}; Ua.prototype.updateAdornments=function(a){var b=this.currentToolTip;if(b instanceof Je&&this.pr===a){var c=b.adornedObject;(null!==a?c.part===a:null===c)?this.showToolTip(b,c):this.hideToolTip()}}; Ua.prototype.doMouseDown=function(){var a=this.diagram,b=a.lastInput;b.isTouchEvent&&this.gestureBehavior===Le&&(b.bubbles=!1);if(b.isMultiTouch){this.cancelWaitAfter();if(this.gestureBehavior===Me){b.bubbles=!0;return}if(this.gestureBehavior===Le)return;if(a.currentTool.canStartMultiTouch()){a.currentTool.standardPinchZoomStart();return}}var c=a.undoManager;G&&c.checksTransactionLevel&&0!==c.transactionLevel&&Fa("WARNING: In ToolManager.doMouseDown: UndoManager.transactionLevel is not zero");c=this.mouseDownTools.length; for(var d=0;dg&&(g=l),m>h&&(h=m))}}Infinity===d?f.h(0,0,0,0):f.h(d,e,g-d,h-e);d=f.x+f.width/2;e=f.y+f.height/2;M.free(f); -f=a.vs;g=new xb;h=K.alloc();for(k=b.iterator;k.next();)l=k.value,l instanceof R&&l.canCopy()&&(m=c.K(l),null!==m&&(m.points=l.points,lf(m,f.x-d,f.y-e),m.suspendsRouting=!0,g.add(m,a.Ed())));for(b=b.iterator;b.next();)l=b.value,l.Pc()&&l.canCopy()&&(k=c.K(l),null!==k&&(l=l.location,h.h(f.x-(d-l.x),f.y-(e-l.y)),k.location=h,k.Xa(),g.add(k,a.Ed(h))));K.free(h);a.copiedParts=g;We(a,g.Qf());null!==a.draggedLink&&(c=a.draggedLink,b=c.routeBounds,lf(c,a.startPoint.x-(b.x+b.width/2),a.startPoint.y-(b.y+b.height/ +f=a.vs;g=new xb;h=K.alloc();for(k=b.iterator;k.next();)l=k.value,l instanceof R&&l.canCopy()&&(m=c.K(l),null!==m&&(m.points=l.points,lf(m,f.x-d,f.y-e),m.suspendsRouting=!0,g.add(m,a.Fd())));for(b=b.iterator;b.next();)l=b.value,l.Qc()&&l.canCopy()&&(k=c.K(l),null!==k&&(l=l.location,h.h(f.x-(d-l.x),f.y-(e-l.y)),k.location=h,k.Xa(),g.add(k,a.Fd(h))));K.free(h);a.copiedParts=g;We(a,g.Qf());null!==a.draggedLink&&(c=a.draggedLink,b=c.routeBounds,lf(c,a.startPoint.x-(b.x+b.width/2),a.startPoint.y-(b.y+b.height/ 2)));a.doUpdateCursor(null,!0)}}}Qe.prototype.doSimulatedDragOut=function(){var a=this.diagram;a.ut=!1;this.mayCopy()||this.mayMove()?a.currentCursor="":a.currentCursor=this.nodropCursor;this.Co=null};Qe.prototype.computeMove=function(a,b,c,d){c=this.diagram;return null!==c?c.computeMove(a,b,this.dragOptions,d):new K}; -oa.Object.defineProperties(Qe.prototype,{isCopyEnabled:{configurable:!0,get:function(){return this.Vc},set:function(a){A(a,"boolean",Qe,"isCopyEnabled");this.Vc=a}},copiesEffectiveCollection:{configurable:!0,get:function(){return this.F},set:function(a){A(a,"boolean",Qe,"copiesEffectiveCollection");this.F=a}},dragOptions:{configurable:!0,get:function(){return this.Ma},set:function(a){x(a,Re,Qe,"dragOptions");this.Ma=a}},isGridSnapEnabled:{configurable:!0, +oa.Object.defineProperties(Qe.prototype,{isCopyEnabled:{configurable:!0,get:function(){return this.Wc},set:function(a){A(a,"boolean",Qe,"isCopyEnabled");this.Wc=a}},copiesEffectiveCollection:{configurable:!0,get:function(){return this.F},set:function(a){A(a,"boolean",Qe,"copiesEffectiveCollection");this.F=a}},dragOptions:{configurable:!0,get:function(){return this.Ma},set:function(a){x(a,Re,Qe,"dragOptions");this.Ma=a}},isGridSnapEnabled:{configurable:!0, enumerable:!0,get:function(){return this.dragOptions.isGridSnapEnabled},set:function(a){A(a,"boolean",Qe,"isGridSnapEnabled");this.dragOptions.isGridSnapEnabled=a}},isComplexRoutingRealtime:{configurable:!0,get:function(){return this.Ec},set:function(a){A(a,"boolean",Qe,"isComplexRoutingRealtime");this.Ec=a}},isGridSnapRealtime:{configurable:!0,get:function(){return this.dragOptions.isGridSnapRealtime},set:function(a){A(a,"boolean",Qe,"isGridSnapRealtime");this.dragOptions.isGridSnapRealtime= a}},gridSnapCellSize:{configurable:!0,get:function(){return this.dragOptions.gridSnapCellSize},set:function(a){x(a,Hb,Qe,"gridSnapCellSize");this.dragOptions.gridSnapCellSize.B(a)||(a=a.L(),this.dragOptions.gridSnapCellSize=a)}},gridSnapCellSpot:{configurable:!0,get:function(){return this.dragOptions.gridSnapCellSpot},set:function(a){x(a,Ib,Qe,"gridSnapCellSpot");this.dragOptions.gridSnapCellSpot.B(a)||(a=a.L(),this.dragOptions.gridSnapCellSpot=a)}},gridSnapOrigin:{configurable:!0, enumerable:!0,get:function(){return this.dragOptions.gridSnapOrigin},set:function(a){x(a,K,Qe,"gridSnapOrigin");this.dragOptions.gridSnapOrigin.B(a)||(a=a.L(),this.dragOptions.gridSnapOrigin=a)}},dragsLink:{configurable:!0,get:function(){return this.dragOptions.dragsLink},set:function(a){A(a,"boolean",Qe,"dragsLink");this.dragOptions.dragsLink=a}},dragsTree:{configurable:!0,get:function(){return this.dragOptions.dragsTree},set:function(a){A(a,"boolean",Qe,"dragsTree"); @@ -401,7 +401,7 @@ get:function(){return this.o},set:function(a){this.o=a}},draggedParts:{configura isDragOutStarted:{configurable:!0,get:function(){return this.Qd},set:function(a){this.Qd=a}},startPoint:{configurable:!0,get:function(){return this.vs},set:function(a){x(a,K,Qe,"startPoint");this.vs.B(a)||this.vs.assign(a)}},delay:{configurable:!0,get:function(){return this.ll},set:function(a){A(a,"number",Qe,"delay");this.ll=a}}});Qe.prototype.getDraggingSource=Qe.prototype.xA;var Te=null,Ze=null;Qe.className="DraggingTool";Se=new H; Ta("draggingTool",function(){return this.findTool("Dragging")},function(a){this.gb("Dragging",a,this.mouseMoveTools)});Ua.prototype.doCancel=function(){null!==Te&&Te.doCancel();we.prototype.doCancel.call(this)}; function Gf(){0b.firstPickIndex+1&&c=n&&(n=1);0>=p&&(p=1);n=p/n}p=K.alloc();L.vq(a.x,a.y,h,k,e.width,e.height,p);a=g.copy();0>=b.x?0>=b.y?(a.x=Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=Math.max(l-a.x,c.width),a.y=Math.max(p.y,m-d.height),a.y=Math.min(a.y,m-c.height),a.height=Math.max(m-a.y,c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n* a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width),a.x=l-a.width,a.y=m-a.height)):1<=b.y?(a.x=Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=Math.max(l-a.x,c.width),a.height=Math.max(Math.min(p.y-k,d.height),c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width),a.x=l-a.width)):(a.x= Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=l-a.x,f||(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n,a.y=k+.5*(m-k-a.height))):1<=b.x?0>=b.y?(a.width=Math.max(Math.min(p.x-h,d.width),c.width),a.y=Math.max(p.y,m-d.height),a.y=Math.min(a.y,m-c.height),a.height=Math.max(m-a.y,c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width), @@ -501,9 +501,9 @@ wg.prototype.doActivate=function(){var a=this.diagram;if(null===this.adornedObje wg.prototype.computeRotationPoint=function(a){var b=a.part,c=b.locationObject;return b.rotationSpot.fb()?a.ja(b.rotationSpot):a===b||a===c?c.ja(b.locationSpot):a.ja(Kc)}; wg.prototype.computeAdornmentLocation=function(a){var b=this.rotationPoint;b.s()||(b=this.computeRotationPoint(a));b=a.Us(b);var c=this.handleAngle;0>c?c+=360:360<=c&&(c-=360);c=Math.round(45*Math.round(c/45));var d=this.handleDistance;0===c?b.x=a.naturalBounds.width+d:45===c?(b.x=a.naturalBounds.width+d,b.y=a.naturalBounds.height+d):90===c?b.y=a.naturalBounds.height+d:135===c?(b.x=-d,b.y=a.naturalBounds.height+d):180===c?b.x=-d:225===c?(b.x=-d,b.y=-d):270===c?b.y=-d:315===c&&(b.x=a.naturalBounds.width+ d,b.y=-d);return a.ja(b)};wg.prototype.doDeactivate=function(){var a=this.diagram;this.stopTransaction();this.re=this.handle=null;this.ls=new K(NaN,NaN);this.isActive=a.isMouseCaptured=!1};wg.prototype.doCancel=function(){this.diagram.delaysLayout=!1;this.rotate(this.originalAngle);this.stopTool()};wg.prototype.doMouseMove=function(){var a=this.diagram;this.isActive&&(a=this.computeRotate(a.lastInput.documentPoint),this.rotate(a))}; -wg.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){a.delaysLayout=!1;var b=this.computeRotate(a.lastInput.documentPoint);this.rotate(b);a.Va();this.transactionResult=this.name;a.V("PartRotated",this.adornedObject,this.originalAngle)}this.stopTool()}; -wg.prototype.rotate=function(a){G&&D(a,wg,"rotate:newangle");var b=this.adornedObject;if(null!==b){b.angle=a;b=b.part;b.Xa();var c=b.locationObject,d=b.rotateObject;if(c===d||c.yg(d))c=this.gp.copy(),b.location=c.oe(this.rotationPoint).rotate(a-this.originalAngle).add(this.rotationPoint);this.diagram.ld()}}; -wg.prototype.computeRotate=function(a){a=this.rotationPoint.Ua(a)-this.handleAngle;var b=this.adornedObject.panel;null!==b&&(a-=b.Xi());360<=a?a-=360:0>a&&(a+=360);b=Math.min(Math.abs(this.snapAngleMultiple),180);var c=Math.min(Math.abs(this.snapAngleEpsilon),b/2);!this.diagram.lastInput.shift&&0b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a}; +wg.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){a.delaysLayout=!1;var b=this.computeRotate(a.lastInput.documentPoint);this.rotate(b);a.Ua();this.transactionResult=this.name;a.V("PartRotated",this.adornedObject,this.originalAngle)}this.stopTool()}; +wg.prototype.rotate=function(a){G&&D(a,wg,"rotate:newangle");var b=this.adornedObject;if(null!==b){b.angle=a;b=b.part;b.Xa();var c=b.locationObject,d=b.rotateObject;if(c===d||c.yg(d))c=this.gp.copy(),b.location=c.oe(this.rotationPoint).rotate(a-this.originalAngle).add(this.rotationPoint);this.diagram.md()}}; +wg.prototype.computeRotate=function(a){a=this.rotationPoint.Wa(a)-this.handleAngle;var b=this.adornedObject.panel;null!==b&&(a-=b.Xi());360<=a?a-=360:0>a&&(a+=360);b=Math.min(Math.abs(this.snapAngleMultiple),180);var c=Math.min(Math.abs(this.snapAngleEpsilon),b/2);!this.diagram.lastInput.shift&&0b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a}; oa.Object.defineProperties(wg.prototype,{handleArchetype:{configurable:!0,get:function(){return this.o},set:function(a){null!==a&&x(a,O,wg,"handleArchetype");this.o=a}},handle:{configurable:!0,get:function(){return this.j},set:function(a){if(null!==a&&(x(a,O,wg,"handle"),!(a.part instanceof Je)))throw Error("new handle is not in an Adornment: "+a);this.j=a}},adornedObject:{configurable:!0,get:function(){return this.re},set:function(a){if(null!==a&&(x(a,O, wg,"handle"),a.part instanceof Je))throw Error("new handle must not be in an Adornment: "+a);this.re=a}},snapAngleMultiple:{configurable:!0,get:function(){return this.Ma},set:function(a){A(a,"number",wg,"snapAngleMultiple");this.Ma=a}},snapAngleEpsilon:{configurable:!0,get:function(){return this.La},set:function(a){A(a,"number",wg,"snapAngleEpsilon");this.La=a}},originalAngle:{configurable:!0,get:function(){return this.ux}},rotationPoint:{configurable:!0, enumerable:!0,get:function(){return this.ls},set:function(a){this.ls=a.copy()}},handleAngle:{configurable:!0,get:function(){return this.F},set:function(a){A(a,"number",wg,"handleAngle");this.F=a}},handleDistance:{configurable:!0,get:function(){return this.P},set:function(a){A(a,"number",wg,"handleDistance");this.P=a}}});wg.className="RotatingTool";Ta("rotatingTool",function(){return this.findTool("Rotating")},function(a){this.gb("Rotating",a,this.mouseDownTools)}); @@ -513,7 +513,7 @@ Gg.prototype.doMouseMove=function(){if(this.isActive){var a=this.diagram.lastInp Gg.prototype.doCancel=function(){var a=this.diagram.lastInput,b=this.Qk;null!==b&&(a.targetObject=b,null!==b.actionCancel&&b.actionCancel(a,b),this.stopTool())};Gg.prototype.doStop=function(){this.Qk=null};Gg.className="ActionTool";function Hg(){we.call(this);0a&&Aa(a,">= 1",oh,"duration");this.Rg=a}},isAnimating:{configurable:!0, +oa.Object.defineProperties(oh.prototype,{animationReasons:{configurable:!0,get:function(){return this.Sd}},isEnabled:{configurable:!0,get:function(){return this.Ad},set:function(a){A(a,"boolean",oh,"isEnabled");(this.Ad=a)&&this.mj.each(function(a){a.isAnimating||Infinity!==a.runCount||a.start()})}},duration:{configurable:!0,get:function(){return this.Rg},set:function(a){A(a,"number",oh,"duration");1>a&&Aa(a,">= 1",oh,"duration");this.Rg=a}},isAnimating:{configurable:!0, enumerable:!0,get:function(){return this.nc}},isTicking:{configurable:!0,get:function(){return this.Qr}},isInitial:{configurable:!0,get:function(){return this.ki},set:function(a){A(a,"boolean",oh,"isInitial");this.ki=a}},defaultAnimation:{configurable:!0,get:function(){return this.Vd}},activeAnimations:{configurable:!0,get:function(){return this.mj}},initialAnimationStyle:{configurable:!0,get:function(){return this.ul},set:function(a){G&& cb(a,oh,oh,"initialAnimationStyle");this.ul=a}}});oh.prototype.stopAnimation=oh.prototype.tc;var Yh=null,ph=!1,rh=new F(oh,"Default",1),xh=new F(oh,"AnimateLocations",2),wh=new F(oh,"None",3);oh.className="AnimationManager";oh.defineAnimationEffect=function(a,b){ph||(qh(),ph=!0);Yh.add(a,b)};oh.Default=rh;oh.AnimateLocations=xh;oh.None=wh; -function sh(a){this.gv=this.Gx=this.Rd=this.D=null;this.Bl=this.nc=this.j=!1;this.Vn=this.Fd=0;this.nr=this.Xt=Zh;this.Al=this.wp=!1;this.Ou=1;this.Mu=0;this.yd=this.Rg=NaN;this.Vw=0;this.Wn=null;this.o=yb;this.pc=new xb;this.Eu=new xb;this.lm=new I;this.Fu=new I;this.Sw=$h;a&&Object.assign(this,a)}sh.prototype.suspend=function(){this.Bl=!0};sh.prototype.advanceTo=function(a,b){b&&(this.Bl=!1);this.wp&&a>=this.yd&&(this.Al=!0,a-=this.yd);this.Vw=a;Sh(this,!0);Bh(this.Rd);Ef(this.D);Dh(this.Rd);this.D.redraw()}; -function yh(a,b){a.Eu.clear();a.Al=!1;a.Mu=0;a.yd=NaN;0=this.zd&&(this.Al=!0,a-=this.zd);this.Vw=a;Sh(this,!0);Bh(this.Rd);Ef(this.D);Dh(this.Rd);this.D.redraw()}; +function yh(a,b){a.Eu.clear();a.Al=!1;a.Mu=0;a.zd=NaN;0a.Vn?a.yd:d-a.Fd;b&&(e=a.Vw,ea.Vn&&(a.wp&&!a.Al?(a.Fd=+new Date,a.Vn=a.Fd+a.yd,a.Al=!0):a.um(!1))}}} -function Ch(a,b){for(var c=a.yd,d=a.pc.iterator,e=a.Al;d.next();){var f=d.key;if(!(f instanceof O&&null===f.diagram)){var g=d.value,h=e?g.end:g.start;g=e?g.start:g.end;var k=Yh,l;for(l in g)"position"===l&&(g["position:placeholder"]||g["position:nodeCollapse"])||null===k.get(l)||k.get(l)(f,h[l],g[l],a.nr,b,c,a)}}}t.stop=function(){if(!this.nc)return this;this.um(!0);return this}; +function Sh(a,b){if(!a.Bl||b){var c=a.Rd;if(!1!==a.nc){var d=+new Date,e=d>a.Vn?a.zd:d-a.Gd;b&&(e=a.Vw,ea.Vn&&(a.wp&&!a.Al?(a.Gd=+new Date,a.Vn=a.Gd+a.zd,a.Al=!0):a.um(!1))}}} +function Ch(a,b){for(var c=a.zd,d=a.pc.iterator,e=a.Al;d.next();){var f=d.key;if(!(f instanceof O&&null===f.diagram)){var g=d.value,h=e?g.end:g.start;g=e?g.start:g.end;var k=Yh,l;for(l in g)"position"===l&&(g["position:placeholder"]||g["position:nodeCollapse"])||null===k.get(l)||k.get(l)(f,h[l],g[l],a.nr,b,c,a)}}}t.stop=function(){if(!this.nc)return this;this.um(!0);return this}; t.um=function(a){null!==this.gv&&this.gv.Dp.remove(this.Gx);if(this.nc){var b=this.D,c=this.Rd;this.Bl=this.nc=c.tl=!1;Bh(c);for(var d=this.pc,e=this.lm.iterator;e.next();)b.remove(e.value);for(e=this.Fu.iterator;e.next();)e.value.v();e=this.wp;d=d.iterator;for(var f=Yh;d.next();){var g=d.key,h=d.value,k=e?h.end:h.start,l=e?h.start:h.end,m=h.Cv,n;for(n in l)if(null!==f.get(n)){var p=n;!h.uv||"position:nodeCollapse"!==p&&"position:placeholder"!==p||(p="position");f.get(p)(g,k[n],void 0!==m[n]?m[n]: -h.uv?k[n]:l[n],this.nr,this.yd,this.yd,this)}h.uv&&void 0!==m.location&&g instanceof U&&(g.location=m.location);h.cw&&g instanceof U&&g.Sb(!1)}b.ft.clear();ff(b,!1);b.Va();b.R();Ef(b,!0);if(c.defaultAnimation===this){for(n=c.Vl.iterator;n.next();)e=n.value,null!==e.qf&&(e.points=e.qf,e.qf=null);c.Vl.clear()}this.isViewportUnconstrained&&(b.scrollMode=this.Sw);Dh(c);this.Mu++;!a&&this.Ou>this.Mu?(this.Al=!1,this.start()):(this.Wn&&this.Wn(this),yh(this,null),c.um(this),b.Lb())}}; +h.uv?k[n]:l[n],this.nr,this.zd,this.zd,this)}h.uv&&void 0!==m.location&&g instanceof U&&(g.location=m.location);h.cw&&g instanceof U&&g.Sb(!1)}b.ft.clear();ff(b,!1);b.Ua();b.R();Ef(b,!0);if(c.defaultAnimation===this){for(n=c.Vl.iterator;n.next();)e=n.value,null!==e.qf&&(e.points=e.qf,e.qf=null);c.Vl.clear()}this.isViewportUnconstrained&&(b.scrollMode=this.Sw);Dh(c);this.Mu++;!a&&this.Ou>this.Mu?(this.Al=!1,this.start()):(this.Wn&&this.Wn(this),yh(this,null),c.um(this),b.Lb())}}; t.kk=function(a,b){var c=b.actualBounds,d=null;b instanceof vf&&(d=b.placeholder);null!==d?(c=d.ja(Ec),d=d.padding,c.x+=d.left,c.y+=d.top,this.add(a,"position",c,a.position,!1)):this.add(a,"position",new K(c.x+c.width/2,c.y+c.height/2),a.position,!1);this.add(a,"scale",.01,a.scale,!1);if(a instanceof vf)for(a=a.memberParts;a.next();)d=a.value,d instanceof V&&this.kk(d,b)}; t.ik=function(a,b){if(a.isVisible()){var c=null;b instanceof vf&&(c=b.placeholder);null!==c?this.add(a,"position:placeholder",a.position,c,!0):this.add(a,"position:nodeCollapse",a.position,b,!0);this.add(a,"scale",a.scale,.01,!0);c=this.pc;c.contains(a)&&(c.K(a).cw=!0);if(a instanceof vf)for(a=a.memberParts;a.next();)c=a.value,c instanceof V&&this.ik(c,b)}};t.BA=function(a){var b=this.Eu.get(a);null===b&&(b={},this.Eu.add(a,b));return b}; oa.Object.defineProperties(sh.prototype,{duration:{configurable:!0,get:function(){return this.Rg},set:function(a){A(a,"number",sh,"duration");1>a&&Aa(a,">= 1",sh,"duration");this.Rg=a}},reversible:{configurable:!0,get:function(){return this.wp},set:function(a){this.wp=a}},runCount:{configurable:!0,get:function(){return this.Ou},set:function(a){0a?c/2*a*a+b:-c/2*(--a*(a-2)-1)+b}function ai(a,b,c,d){return a===d?b+c:c*(-Math.pow(2,-10*a/d)+1)+b}sh.className="Animation";sh.EaseLinear=function(a,b,c,d){return c*a/d+b};sh.EaseInOutQuad=Zh;sh.EaseInQuad=function(a,b,c,d){return c*(a/=d)*a+b};sh.EaseOutQuad=function(a,b,c,d){return-c*(a/=d)*(a-2)+b};sh.EaseInExpo=function(a,b,c,d){return 0===a?b:c*Math.pow(2,10*(a/d-1))+b};sh.EaseOutExpo=ai; -function gi(a,b,c){this.start=a;this.end=b;this.Cv={};this.uv=c;this.cw=!1}gi.className="AnimationState";function hi(a,b,c){this.sd=null;this.pf=a;this.Tp=c||ii;this.Vk=null;void 0!==b&&(this.Vk=b,void 0===c&&(this.Tp=ji))}hi.prototype.copy=function(){var a=new hi(this.pf);a.Tp=this.Tp;var b=this.Vk;if(null!==b){var c={};void 0!==b.duration&&(c.duration=b.duration);void 0!==b.finished&&(c.finished=b.finished);void 0!==b.easing&&(c.easing=b.easing);a.Vk=c}return a}; +function gi(a,b,c){this.start=a;this.end=b;this.Cv={};this.uv=c;this.cw=!1}gi.className="AnimationState";function hi(a,b,c){this.td=null;this.pf=a;this.Tp=c||ii;this.Vk=null;void 0!==b&&(this.Vk=b,void 0===c&&(this.Tp=ji))}hi.prototype.copy=function(){var a=new hi(this.pf);a.Tp=this.Tp;var b=this.Vk;if(null!==b){var c={};void 0!==b.duration&&(c.duration=b.duration);void 0!==b.finished&&(c.finished=b.finished);void 0!==b.easing&&(c.easing=b.easing);a.Vk=c}return a}; function ki(a,b){a=a.Vk;null!==a&&(a.duration&&(b.duration=a.duration),a.finished&&(b.finished=a.finished),a.easing&&(b.easing=a.easing))} oa.Object.defineProperties(hi.prototype,{propertyName:{configurable:!0,get:function(){return this.pf},set:function(a){this.pf=a}},animationSettings:{configurable:!0,get:function(){return this.Vk},set:function(a){this.Vk=a}},startCondition:{configurable:!0,get:function(){return this.Tp},set:function(a){G&&cb(a,hi,hi,"startCondition");this.Tp=a}}});var ii=new F(hi,"Default",1),ji=new F(hi,"Immediate",2),li=new F(hi,"Bundled",3);hi.className="AnimationTrigger"; hi.Default=ii;hi.Immediate=ji;hi.Bundled=li;function mi(a){ab(this);this.D=null;this.Ka=new H;this.ta="";this.qb=1;this.o=!1;this.j=this.Bi=this.F=this.wj=this.vj=this.uj=this.tj=this.rj=this.sj=this.qj=this.yj=this.pj=this.xj=this.oj=this.nj=!0;this.hp=[];a&&Object.assign(this,a)}t=mi.prototype;t.clear=function(){this.Ka.clear();this.hp.length=0};t.Xe=function(a){this.D=a}; @@ -611,9 +611,9 @@ t.Hf=function(a,b,c,d,e){void 0===b&&(b=null);void 0===c&&(c=null);void 0===d&&( t.Hv=function(a,b,c,d,e,f,g){if(!1===this.Bi)return e;for(var h=this.Ka.m,k=h.length;k--;){var l=h[k];if((!0!==g||!1!==qg(l))&&f(l)&&l.isVisible()){var m=l;l.Hf(a,b,c,d,e)&&(null!==b&&(m=b(m)),null===m||null!==c&&!c(m)||e.add(m))}}return e}; t.wg=function(a,b,c,d,e,f){void 0===c&&(c=null);void 0===d&&(d=null);void 0===e&&(e=!0);if(!1!==e&&!0!==e){if(e instanceof H||e instanceof I)f=e;e=!0}f instanceof H||f instanceof I||(f=new I);if(!1===this.Bi)return f;G&&!a.s()&&v("findObjectsNear: Point must have a real value, not: "+a.toString());var g=!1;null!==this.diagram&&this.diagram.viewportBounds.ca(a)&&(g=!0);for(var h=K.alloc(),k=K.alloc(),l=this.Ka.m,m=l.length;m--;){var n=l[m];if((!0!==g||!1!==qg(n))&&n.isVisible()){h.assign(a);Lb(h,n.le); k.h(a.x+b,a.y);Lb(k,n.le);var p=n;n.wg(h,k,c,d,e,f)&&(null!==c&&(p=c(p)),null===p||null!==d&&!d(p)||f.add(p))}}K.free(h);K.free(k);return f}; -t.Pd=function(a,b){if(this.visible){var c=this.Ka.m,d=c.length;if(0!==d){a=Ma();for(var e=Ma(),f=0;fc.Wr||h.height*e>c.Wr?b.rc(a,c):(e=b.actualBounds,f=b.naturalBounds,0===e.width||0===e.height||isNaN(e.x)|| +t.Qi=function(a,b,c,d,e,f,g){if(!g||qg(b)){if(null!==d&&b instanceof R&&(b.isOrthogonal&&d.push(b),!1===b.yd))return;g=!1;for(d=b.containingGroup;null!==d;)g?null!==d.hb&&f.yy(d.hb):null!==d.hb&&(g=!0,f.assign(d.hb)),d=d.containingGroup;var h=b.actualBounds;d=!1;if(g&&b.isVisible()){if(!f.Pc(h))return;d=!f.Qe(h)}d&&(a.save(),a.beginPath(),a.rect(f.x,f.y,f.width,f.height),a.clip());h.width*e>c.Wr||h.height*e>c.Wr?b.rc(a,c):(e=b.actualBounds,f=b.naturalBounds,0===e.width||0===e.height||isNaN(e.x)|| isNaN(e.y)||!b.isVisible()||(c=b.transform,null!==b.areaBackground&&(pi(b,a,b.areaBackground,!0,!0,f,e),a.fillRect(e.x,e.y,e.width,e.height)),null===b.areaBackground&&null===b.background&&(pi(b,a,"rgba(0,0,0,0.3)",!0,!1,f,e),a.fillRect(e.x,e.y,e.width,e.height)),null!==b.background&&(a.transform(c.m11,c.m12,c.m21,c.m22,c.dx,c.dy),pi(b,a,b.background,!0,!1,f,e),a.fillRect(0,0,f.width/2,f.height/2),c.bt()||(b=1/(c.m11*c.m22-c.m12*c.m21),a.transform(c.m22*b,-c.m12*b,-c.m21*b,c.m11*b,b*(c.m21*c.dy-c.m22* c.dx),b*(c.m12*c.dx-c.m11*c.dy))))));d&&(a.restore(),a.Kc(!0))}};t.g=function(a,b,c,d,e){var f=this.diagram;null!==f&&f.ab(pe,a,this,b,c,d,e)};t.$i=function(a,b,c){var d=this.Ka;b.ri=this;if(a>=d.count)a=d.count;else if(d.M(a)===b)return-1;d.zb(a,b);b.Bq(c);d=this.diagram;null!==d&&(c?d.R():d.$i(b));qi(this,a,b);return a}; t.hc=function(a,b,c){if(!c&&b.layer!==this&&null!==b.layer)return b.layer.hc(a,b,c);var d=this.Ka;if(0>a||a>=d.length){if(a=d.indexOf(b),0>a)return-1}else if(d.M(a)!==b&&(a=d.indexOf(b),0>a))return-1;b.Cq(c);d.kb(a);d=this.diagram;null!==d&&(c?d.R():d.hc(b));b.ri=null;return a}; @@ -623,7 +623,7 @@ e&&(k=a.M(h).zOrder,isNaN(k)););}return b} oa.Object.defineProperties(mi.prototype,{parts:{configurable:!0,get:function(){return this.Ka.iterator}},partsBackwards:{configurable:!0,get:function(){return this.Ka.iteratorBackwards}},diagram:{configurable:!0,get:function(){return this.D}},name:{configurable:!0,get:function(){return this.ta},set:function(a){A(a,"string",mi,"name");var b=this.ta;if(b!==a){var c=this.diagram;if(null!==c)for(""===b&&v("Cannot rename default Layer to: "+a),c= c.layers;c.next();)c.value.name===a&&v("Layer.name is already present in this diagram: "+a);this.ta=a;this.g("name",b,a);for(a=this.Ka.iterator;a.next();)a.value.layerName=this.ta}}},opacity:{configurable:!0,get:function(){return this.qb},set:function(a){var b=this.qb;b!==a&&(A(a,"number",mi,"opacity"),(0>a||1q&&(this.position=w.h(-(b.scrollWidth-this.Ba)+y-this.Ba/e+m,this.position.y))),a.pz&&this.allowVerticalScroll&&(hu&&(this.position= w.h(this.position.x,-(b.scrollHeight-this.Aa)+a.scrollTop-this.Aa/e+f))),K.free(w),dj(this),this.Jj=this.os=!1,d=this.documentBounds,e=this.viewportBounds,m=d.right,q=e.right,f=d.bottom,u=e.bottom,g=d.x,n=e.x,h=d.y,d=e.y,p>=k&&g>=n&&m<=q&&(c.style.width="1px"),r>=l&&h>=d&&f<=u&&(c.style.height="1px"))}};Q.prototype.computeBounds=function(a){void 0===a&&(a=new M);uh(this);return ej(this,a)}; -function ej(a,b){if(a.fixedBounds.s())return b.assign(a.fixedBounds),b.jq(a.rb),b;for(var c=!0,d=a.Ta.m,e=d.length,f=0;fc&&(b=c),ba.maxScale&&(b=a.maxScale),b):b===lj?(b=k>h?(g-a.xb)/d:(f-a.xb)/e,b>c&&(b=c),ba.maxScale&&(b=a.maxScale),b):a.scale} @@ -682,62 +682,62 @@ Q.prototype.OA=function(a){var b=this.D;if(!b.isEnabled)return!1;var c=pj(b,a,!1 Q.prototype.Xz=function(a){var b=this.D;if(!b.isEnabled)return!1;var c=pj(b,a,!0);null!==b.mouseEnter&&b.mouseEnter(c);return tj(b,c,a)};Q.prototype.Yz=function(a){var b=this.D;if(!b.isEnabled)return!1;var c=pj(b,a,!0);null!==b.mouseLeave&&b.mouseLeave(c);return tj(b,c,a)}; Q.prototype.getMouse=function(a){var b=this.Ga;if(null===b)return new K(0,0);var c=b.getBoundingClientRect();b=a.clientX-this.Ba/c.width*c.left;a=a.clientY-this.Aa/c.height*c.top;return null!==this.yb?Lb(new K(b,a),this.yb):new K(b,a)}; function qj(a,b,c){var d=a.Ga,e=a.Ba,f=a.Aa,g=0,h=0;null!==d&&(d=d.getBoundingClientRect(),g=b.clientX-e/d.width*d.left,h=b.clientY-f/d.height*d.top);c.viewPoint.h(g,h);null!==a.yb?(b=K.allocAt(g,h),a.yb.Ld(b),c.documentPoint.assign(b),K.free(b)):c.documentPoint.h(g,h)} -function me(a,b,c,d){if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;b=b.targetTouches[c]}else if(null!==a.Rl[0])b=a.Rl[c];else return;c=a.Ga;null!==c&&(c=c.getBoundingClientRect(),d.h(b.clientX-a.Ba/c.width*c.left,b.clientY-a.Aa/c.height*c.top))}Q.prototype.Va=function(){this.Ij||(this.Ij=!0,this.Lb(!0))};function uj(a){a.ad||uh(a);a.Xa()}Q.prototype.redraw=function(){this.tb||this.ad||(this.R(),ij(this),this.ld())};t=Q.prototype;t.MA=function(){return this.qg}; -t.Sz=function(a){void 0===a&&(a=null);var b=this.animationManager,c=b.isEnabled;b.tc();b.isEnabled=!1;Ef(this);this.bg=!1;this.Pu=new K(NaN,NaN);b.isEnabled=c;this.ad=!0;var d=this;null!==a&&va(function(){d.ad=!1;th(b,"Model");a(d)},1)};t.Lb=function(a){void 0===a&&(a=!1);if(!0!==this.qg&&!(this.tb||!1===a&&this.ad)){this.qg=!0;var b=this;sa.requestAnimationFrame(function(){b.qg&&b.ld()})}};t.ld=function(){if(!this.Xn||this.qg)this.Xn&&(this.Xn=!1),Ef(this)}; +function me(a,b,c,d){if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;b=b.targetTouches[c]}else if(null!==a.Rl[0])b=a.Rl[c];else return;c=a.Ga;null!==c&&(c=c.getBoundingClientRect(),d.h(b.clientX-a.Ba/c.width*c.left,b.clientY-a.Aa/c.height*c.top))}Q.prototype.Ua=function(){this.Ij||(this.Ij=!0,this.Lb(!0))};function uj(a){a.bd||uh(a);a.Xa()}Q.prototype.redraw=function(){this.tb||this.bd||(this.R(),ij(this),this.md())};t=Q.prototype;t.MA=function(){return this.qg}; +t.Sz=function(a){void 0===a&&(a=null);var b=this.animationManager,c=b.isEnabled;b.tc();b.isEnabled=!1;Ef(this);this.bg=!1;this.Pu=new K(NaN,NaN);b.isEnabled=c;this.bd=!0;var d=this;null!==a&&va(function(){d.bd=!1;th(b,"Model");a(d)},1)};t.Lb=function(a){void 0===a&&(a=!1);if(!0!==this.qg&&!(this.tb||!1===a&&this.bd)){this.qg=!0;var b=this;sa.requestAnimationFrame(function(){b.qg&&b.md()})}};t.md=function(){if(!this.Xn||this.qg)this.Xn&&(this.Xn=!1),Ef(this)}; function jj(a,b,c){a.animationManager.defaultAnimation.isAnimating||a.tb||!a.Jj||bj(a)||(b&&uh(a),c&&fj(a,!1))} -function Ef(a,b){if(!a.ad&&(a.qg=!1,null!==a.Ja||a.cq.s())){a.ad=!0;var c=a.animationManager,d=a.mp;if(!c.isAnimating&&0!==d.length){for(var e=d.m,f=e.length,g=0;gb;b++){var c=a.Ae.iterator;if(null===c||0===a.Ae.count)break;a.Ae=new I;a.yw(c,a.Ae);G&&22===b&&Fa("failure to validate parts")}a.nodes.each(function(a){a instanceof vf&&0!==(a.U&65536)!==!1&&(a.U=a.U^65536)})}} -t.yw=function(a,b){for(a.reset();a.next();){var c=a.value;!c.Pc()||c instanceof vf||(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}for(a.reset();a.next();)c=a.value,c instanceof vf&&c.isVisible()&&zj(this,c);for(a.reset();a.next();)c=a.value,c instanceof R&&c.isVisible()&&(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c));for(a.reset();a.next();)c=a.value,c instanceof Je&&c.isVisible()&&(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}; +b||a.rc(a.Xb);e&&(a.skipsUndoManager=d);a.bd=!1}}function yj(a){var b=a.ya;if(a.Xg!==zh)a.scale=gj(a,a.Xg);else if(a.Zh!==zh)a.scale=gj(a,a.Zh);else{var c=a.initialScale;isFinite(c)&&0b;b++){var c=a.Ae.iterator;if(null===c||0===a.Ae.count)break;a.Ae=new I;a.yw(c,a.Ae);G&&22===b&&Fa("failure to validate parts")}a.nodes.each(function(a){a instanceof vf&&0!==(a.U&65536)!==!1&&(a.U=a.U^65536)})}} +t.yw=function(a,b){for(a.reset();a.next();){var c=a.value;!c.Qc()||c instanceof vf||(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}for(a.reset();a.next();)c=a.value,c instanceof vf&&c.isVisible()&&zj(this,c);for(a.reset();a.next();)c=a.value,c instanceof R&&c.isVisible()&&(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c));for(a.reset();a.next();)c=a.value,c instanceof Je&&c.isVisible()&&(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}; function zj(a,b){for(var c=Ma(),d=Ma(),e=b.memberParts;e.next();){var f=e.value;f.isVisible()&&(f instanceof vf?(Aj(f)||Bj(f)||Cj(f))&&zj(a,f):f instanceof R?f.fromNode===b||f.toNode===b?d.push(f):c.push(f):(f.measure(Infinity,Infinity),f.arrange()))}a=c.length;for(e=0;en&&(z=S.left,B= S.right),y.height>J&&(C=S.top,E=S.bottom)):(z=S.left,B=S.right,C=S.top,E=S.bottom);S=y.width+z+B;var aa=y.height+C+E;z=y.x-z;var Y=e.x;B=y.right+B;var T=e.right+r;C=y.y-C;var P=e.y;y=y.bottom+E;E=e.bottom+q;var ma="1px",ia="1px";e=a.scale;u=S>u/e;w=aa>w/e;a.scrollMode===$h&&(u||w)&&(u&&a.hasHorizontalScrollbar&&a.allowHorizontalScroll&&(u=1,z+1T+1&&(u=Math.max((B-T)*e+a.Ba,u)),n+r+1E+1&&(u=Math.max((y-E)*e+a.Aa,u)),J+q+1T+1&&(r=Math.max((B-T)*e+a.Ba,r)),n+1E+1&&(q=Math.max((y-E)*e+r,q)),J+1E+1&&(q=Math.max((y-E)*e+r,q)),J+1T+1&&(b=a.position.x*e));if(a.uo)switch(a.Nu){case "negative":b=-(l.scrollWidth-b-l.clientWidth);break;case "reverse":b=l.scrollWidth-b-l.clientWidth}l.scrollLeft=b;a.hasVerticalScrollbar&&a.allowVerticalScroll&&(J+1E+1&&(l.scrollTop=a.position.y*e));u=a.Ba;w=a.Aa;l.style.width=u+(a.$f?a.xb:0)+"px";l.style.height=w+(a.ff?a.xb:0)+"px";return c!==u||d!==w||a.animationManager.wb?(c=M.allocAt(f,g,h,k),a.onViewportBoundsChanged(c,a.viewportBounds,e,p),M.free(c),!1):!0}t=Q.prototype; -t.add=function(a){x(a,U,Q,"add:part");var b=a.diagram;if(b!==this&&(null!==b&&v("Cannot add part "+a.toString()+" to "+this.toString()+". It is already a part of "+b.toString()),b=this.wk(a.layerName),null===b&&(b=this.wk("")),null===b&&v('Cannot add a Part when unable find a Layer named "'+a.layerName+'" and there is no default Layer'),a.layer!==b)){var c=b.$i(99999999,a,a.diagram===this);0<=c&&this.ab(re,"parts",b,null,a,null,c);b.isTemporary||this.Va();a.C(1);c=a.layerChanged;null!==c&&c(a,null, -b)}};t.$i=function(a){this.partManager.$i(a);var b=this;Nj(a,function(a){Oj(b,a)});(a instanceof Je||a instanceof vf&&null!==a.placeholder)&&a.v();null!==a.data&&Nj(a,function(a){Pj(b.partManager,a)});!0!==Bj(a)&&!0!==Cj(a)||this.Ae.add(a);Qj(a,!0,this);Rj(a)?(a.actualBounds.s()&&this.R(Lj(a,a.actualBounds)),this.Va()):a.isVisible()&&a.actualBounds.s()&&this.R(Lj(a,a.actualBounds));this.Lb()}; -t.hc=function(a){a.mk();this.partManager.hc(a);var b=this;null!==a.data&&Nj(a,function(a){Sj(b.partManager,a,b)});this.Ae.remove(a);Rj(a)?(a.actualBounds.s()&&this.R(Lj(a,a.actualBounds)),this.Va()):a.isVisible()&&a.actualBounds.s()&&this.R(Lj(a,a.actualBounds));this.Lb()};t.remove=function(a){x(a,U,Q,"remove:part");Tj(this,a,!0)}; +t.add=function(a){x(a,U,Q,"add:part");var b=a.diagram;if(b!==this&&(null!==b&&v("Cannot add part "+a.toString()+" to "+this.toString()+". It is already a part of "+b.toString()),b=this.wk(a.layerName),null===b&&(b=this.wk("")),null===b&&v('Cannot add a Part when unable find a Layer named "'+a.layerName+'" and there is no default Layer'),a.layer!==b)){var c=b.$i(99999999,a,a.diagram===this);0<=c&&this.ab(re,"parts",b,null,a,null,c);b.isTemporary||this.Ua();a.C(1);c=a.layerChanged;null!==c&&c(a,null, +b)}};t.$i=function(a){this.partManager.$i(a);var b=this;Nj(a,function(a){Oj(b,a)});(a instanceof Je||a instanceof vf&&null!==a.placeholder)&&a.v();null!==a.data&&Nj(a,function(a){Pj(b.partManager,a)});!0!==Bj(a)&&!0!==Cj(a)||this.Ae.add(a);Qj(a,!0,this);Rj(a)?(a.actualBounds.s()&&this.R(Lj(a,a.actualBounds)),this.Ua()):a.isVisible()&&a.actualBounds.s()&&this.R(Lj(a,a.actualBounds));this.Lb()}; +t.hc=function(a){a.mk();this.partManager.hc(a);var b=this;null!==a.data&&Nj(a,function(a){Sj(b.partManager,a,b)});this.Ae.remove(a);Rj(a)?(a.actualBounds.s()&&this.R(Lj(a,a.actualBounds)),this.Ua()):a.isVisible()&&a.actualBounds.s()&&this.R(Lj(a,a.actualBounds));this.Lb()};t.remove=function(a){x(a,U,Q,"remove:part");Tj(this,a,!0)}; function Tj(a,b,c){var d=b.layer;null!==d&&d.diagram===a&&(b.isSelected=!1,b.isHighlighted=!1,b.C(2),c&&b.tk(),c=d.hc(-1,b,!1),0<=c&&a.ab(se,"parts",d,b,null,c,null),a=b.layerChanged,null!==a&&a(b,d,null))}t.ot=function(a,b){void 0===b&&(b=!1);if(Ha(a))for(var c=a.length,d=0;dd&&this.Va();return this}; -t.wz=function(a,b){Zj(this,a,b);a.Xe(this);var c=this.Ta,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Yb&&this.ab(se,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Va();return this}; -t.fB=function(a){x(a,mi,Q,"removeLayer:layer");a.diagram!==this&&v("Cannot remove a Layer from another Diagram: "+a+" of "+a.diagram);if(""!==a.name){var b=this.Ta,c=b.indexOf(a);if(b.remove(a)){for(b=a.Ka.copy().iterator;b.next();){var d=b.value,e=d.layerName;e!==a.name?d.layerName=e:d.layerName=""}null!==this.Yb&&this.ab(se,"layers",this,a,null,c,null);this.R();this.Va()}}};t.wk=function(a){for(var b=this.layers;b.next();){var c=b.value;if(c.name===a)return c}return null}; +b+"'; a Layer with the same name is already present in this Diagram.")}}t.om=function(a){Zj(this,a,null);a.Xe(this);var b=this.Ta,c=b.count-1;if(!a.isTemporary)for(;0<=c&&b.M(c).isTemporary;)c--;b.zb(c+1,a);null!==this.Yb&&this.ab(re,"layers",this,null,a,null,c+1);this.R();this.Ua();return this}; +t.Ox=function(a,b){Zj(this,a,b);a.Xe(this);var c=this.Ta,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Yb&&this.ab(se,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Ua();return this}; +t.wz=function(a,b){Zj(this,a,b);a.Xe(this);var c=this.Ta,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Yb&&this.ab(se,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Ua();return this}; +t.fB=function(a){x(a,mi,Q,"removeLayer:layer");a.diagram!==this&&v("Cannot remove a Layer from another Diagram: "+a+" of "+a.diagram);if(""!==a.name){var b=this.Ta,c=b.indexOf(a);if(b.remove(a)){for(b=a.Ka.copy().iterator;b.next();){var d=b.value,e=d.layerName;e!==a.name?d.layerName=e:d.layerName=""}null!==this.Yb&&this.ab(se,"layers",this,a,null,c,null);this.R();this.Ua()}}};t.wk=function(a){for(var b=this.layers;b.next();){var c=b.value;if(c.name===a)return c}return null}; t.Qx=function(a){A(a,"function",Q,"addModelChangedListener:listener");null===this.mf&&(this.mf=new H);this.mf.add(a);this.model.Fh(a);return this};t.hB=function(a){A(a,"function",Q,"removeModelChangedListener:listener");null!==this.mf&&(this.mf.remove(a),0===this.mf.count&&(this.mf=null));this.model.Nk(a)};t.Fh=function(a){A(a,"function",Q,"addChangedListener:listener");null===this.Gg&&(this.Gg=new H);this.Gg.add(a);return this}; t.Nk=function(a){A(a,"function",Q,"removeChangedListener:listener");null!==this.Gg&&(this.Gg.remove(a),0===this.Gg.count&&(this.Gg=null))};t.Js=function(a){this.skipsUndoManager||this.model.skipsUndoManager||this.model.undoManager.Nv(a);a.change!==qe&&(this.isModified=!0);if(null!==this.Gg)for(var b=this.Gg,c=b.length,d=0;dn.Ka.indexOf(r)&&n.$i(p,r,q):(r.isSelected=!1,r.isHighlighted=!1,r.Qb(),n.hc(q?p:-1,r,q)))}else n instanceof Q?"number"===typeof p&&r instanceof mi&&(b?(r.Xe(this),this.Ta.zb(p,r)):this.Ta.kb(p)):v("unknown ChangedEvent.Remove object: "+a.toString());this.isModified=!0}else d!==qe&&v("unknown ChangedEvent: "+a.toString())}finally{this.skipsModelSourceBindings= c}}};Q.prototype.Da=function(a){return this.undoManager.Da(a)};Q.prototype.cb=function(a){return this.undoManager.cb(a)};Q.prototype.Pf=function(){return this.undoManager.Pf()};Q.prototype.commit=function(a,b){void 0===b&&(b="");var c=this.skipsUndoManager;null===b&&(this.skipsUndoManager=!0,b="");this.undoManager.Da(b);var d=!1;try{a(this),d=!0}finally{d?this.undoManager.cb(b):this.undoManager.Pf(),this.skipsUndoManager=c}};Q.prototype.updateAllTargetBindings=function(a){this.partManager.updateAllTargetBindings(a)}; Q.prototype.Yq=function(){this.partManager.Yq()}; -function ek(a,b,c){var d=a.animationManager;if(a.tb||a.ad)a.ya=c,Li(a),a=a.ya,d.wb&&(Eh(d)||d.Vd.add(d.D,"scale",b,a));else if(null===a.Ga)a.ya=c,Li(a);else{a.tb=!0;var e=a.viewportBounds.copy(),f=a.Ba,g=a.Aa;e.width=a.Ba/b;e.height=a.Aa/b;var h=a.zoomPoint.x,k=a.zoomPoint.y,l=a.contentAlignment;isNaN(h)&&(l.Qc()?l.Lf(Rc)?h=0:l.Lf(Sc)&&(h=f-1):h=l.fb()?l.x*(f-1):f/2);isNaN(k)&&(l.Qc()?l.Lf(Qc)?k=0:l.Lf(Tc)&&(k=g-1):k=l.fb()?l.y*(g-1):g/2);null===a.scaleComputation||a.animationManager.defaultAnimation.isAnimating|| +function ek(a,b,c){var d=a.animationManager;if(a.tb||a.bd)a.ya=c,Li(a),a=a.ya,d.wb&&(Eh(d)||d.Vd.add(d.D,"scale",b,a));else if(null===a.Ga)a.ya=c,Li(a);else{a.tb=!0;var e=a.viewportBounds.copy(),f=a.Ba,g=a.Aa;e.width=a.Ba/b;e.height=a.Aa/b;var h=a.zoomPoint.x,k=a.zoomPoint.y,l=a.contentAlignment;isNaN(h)&&(l.Rc()?l.Lf(Rc)?h=0:l.Lf(Sc)&&(h=f-1):h=l.fb()?l.x*(f-1):f/2);isNaN(k)&&(l.Rc()?l.Lf(Qc)?k=0:l.Lf(Tc)&&(k=g-1):k=l.fb()?l.y*(g-1):g/2);null===a.scaleComputation||a.animationManager.defaultAnimation.isAnimating|| (c=a.scaleComputation(a,c));ca.maxScale&&(c=a.maxScale);f=K.allocAt(a.qa.x+h/b-h/c,a.qa.y+k/b-k/c);a.position=f;K.free(f);a.ya=c;Li(a);a.onViewportBoundsChanged(e,a.viewportBounds,b,!1);a.tb=!1;fj(a,!1);c=a.ya;d.wb&&(Eh(d)||d.Vd.add(d.D,"scale",b,c));a.R();ij(a)}} -Q.prototype.onViewportBoundsChanged=function(a,b,c,d){if(!a.B(b)){void 0===d&&(d=!1);d||ij(this);dj(this);var e=this.layout;null===e||!e.isViewportSized||this.autoScale!==zh||d||a.width===b.width&&a.height===b.height||e.C();e=this.currentTool;!0===this.zl&&e instanceof Ua&&(this.lastInput.documentPoint=this.xt(this.lastInput.viewPoint),Ne(e,this));this.tb||this.invalidateViewport(a,b);wj(this);this.hd.scale=c;this.hd.position.x=a.x;this.hd.position.y=a.y;this.hd.bounds.assign(a);this.hd.Ux.width= -Math.round(a.width*c);this.hd.Ux.height=Math.round(a.height*c);this.hd.Hy.width=this.Ba;this.hd.Hy.height=this.Aa;this.hd.By=d;this.V("ViewportBoundsChanged",this.hd,a);this.isVirtualized&&this.links.each(function(a){a.isAvoiding&&a.actualBounds.Oc(b)&&a.Za()})}}; +Q.prototype.onViewportBoundsChanged=function(a,b,c,d){if(!a.B(b)){void 0===d&&(d=!1);d||ij(this);dj(this);var e=this.layout;null===e||!e.isViewportSized||this.autoScale!==zh||d||a.width===b.width&&a.height===b.height||e.C();e=this.currentTool;!0===this.zl&&e instanceof Ua&&(this.lastInput.documentPoint=this.xt(this.lastInput.viewPoint),Ne(e,this));this.tb||this.invalidateViewport(a,b);wj(this);this.jd.scale=c;this.jd.position.x=a.x;this.jd.position.y=a.y;this.jd.bounds.assign(a);this.jd.Ux.width= +Math.round(a.width*c);this.jd.Ux.height=Math.round(a.height*c);this.jd.Hy.width=this.Ba;this.jd.Hy.height=this.Aa;this.jd.By=d;this.V("ViewportBoundsChanged",this.jd,a);this.isVirtualized&&this.links.each(function(a){a.isAvoiding&&a.actualBounds.Pc(b)&&a.Za()})}}; function wj(a,b){var c=a.ae;if(null!==c&&c.visible){for(var d=Hb.alloc(),e=1,f=1,g=c.W.m,h=g.length,k=0;km||(fk(l.figure)?f=f*m/L.ny(f,m):e=e*m/L.ny(e,m))}g=c.gridCellSize;d.h(f*g.width,e*g.height);if(void 0!==b)e=b.width,f=b.height,a=b.x,g=b.y;else{b=M.alloc();a=a.viewportBounds;b.h(a.x,a.y,a.width,a.height);if(!b.s()){M.free(b);return}e=b.width;f=b.height;a=b.x;g=b.y;M.free(b)}c.width=e+2*d.width;c.height=f+2*d.height;b=K.alloc();L.vq(a,g,0,0,d.width, d.height,b);b.offset(-d.width,-d.height);Hb.free(d);c.part.location=b;K.free(b)}}Q.prototype.clearSelection=function(a){void 0===a&&(a=!1);var b=this.selection;if(0!==b.count){a||this.V("ChangingSelection",b);for(var c=b.Ea(),d=c.length,e=0;e=d&&!f.defaultAnimation.isAnimating&&!f.wb&&(b||th(f,"Layout"));a.Yh=!1;for(var g=a.Ji.iterator;g.next();)ok(a,g.value,b,d);e.isValidLayout||(!b||e.isRealtime||null===e.isRealtime||0===d?(e.doLayout(a),uh(a),e.isValidLayout=!0):a.Yh=!0)}finally{b=a.undoManager.isInternalTransaction,0===d&&(a.cb("Layout"),a.undoManager.isInternalTransaction= !1),!b||0!==d&&1!==d||vh(f),a.ba=c}}}function ok(a,b,c,d){if(null!==b){for(var e=b.Ml.iterator;e.next();)ok(a,e.value,c,d);e=b.layout;null===e||e.isValidLayout||(!c||e.isRealtime||0===d?(b.Qh=!b.location.s(),e.doLayout(b),b.C(32),zj(a,b),e.isValidLayout=!0):a.Yh=!0)}}t.vA=function(){for(var a=new H,b=this.nodes;b.next();){var c=b.value;c.isTopLevel&&null===c.Vi()&&a.add(c)}return a.iterator}; @@ -777,11 +777,11 @@ b("LostFocus");b("Modified");b("ObjectSingleClicked");b("ObjectDoubleClicked");b function Ij(a,b){var c=a.Ww.K(b);return null!==c?c:a.Ww.K(b.toLowerCase())}function pk(a,b){var c=a.Xw.K(b);if(null!==c)return c;c=a.Xw.K(b.toLowerCase());if(null!==c)return c;v("Unknown DiagramEvent name: "+b)}t.jk=function(a,b){A(a,"string",Q,"addDiagramListener:name");A(b,"function",Q,"addDiagramListener:listener");a=pk(this,a);null!==a&&a.add(b);return this};t.Im=function(a,b){A(a,"string",Q,"removeDiagramListener:name");A(b,"function",Q,"addDiagramListener:listener");a=pk(this,a);null!==a&&a.remove(b)}; t.V=function(a,b,c){G&&A(a,"string",Q,"raiseDiagramEvent:name");var d=pk(this,a),e=new ne;e.diagram=this;a=Ij(this,a);null!==a&&(e.name=a);void 0!==b&&(e.subject=b);void 0!==c&&(e.parameter=c);b=d.length;if(1===b)d.M(0)(e);else if(0!==b)for(d=d.Ea(),c=0;c=c.top&&0>=c.left&&0>=c.right&&0>=c.bottom)return b;var d=this.viewportBounds,e=this.scale;d=M.allocAt(0,0,d.width*e,d.height*e);var f=K.allocAt(0,0);if(a.x>=d.x&&a.xd.x+d.width-c.right&&this.allowHorizontalScroll&&(g=Math.max(this.scrollHorizontalLineChange, 1),g|=0,f.x+=g,a.x>d.x+d.width-c.right/2&&(f.x+=g),a.x>d.x+d.width-c.right/4&&(f.x+=4*g));a.y>=d.y&&a.yd.y+d.height-c.bottom&&this.allowVerticalScroll&&(g=Math.max(this.scrollVerticalLineChange,1),g|=0,f.y+=g,a.y>d.y+d.height-c.bottom/2&&(f.y+=g),a.y>d.y+d.height-c.bottom/4&&(f.y+=4*g));f.Ya(yb)||(b=new K(b.x+f.x/e,b.y+f.y/e)); M.free(d);K.free(f);return b};t=Q.prototype;t.ht=function(){return null};t.Uv=function(){return null};t.Az=function(a,b){this.mz.add(a,b)};t.rv=function(a){(this.Ix=a)||this.nodes.each(function(a){a instanceof vf&&(a.Ar=null)})}; @@ -789,10 +789,10 @@ function Kk(a,b,c){function d(){var a=+new Date;f=!0;for(g.reset();g.next();)if( t.Ey=function(a){void 0===a&&(a={});return Kk(this,this.TA,a)}; t.TA=function(a,b,c){var d=Lk(c,a,"canvas",null);if(null===d)return null;c=d.aa.canvas;var e=null;if(null!==c)switch(e=a.returnType,void 0===e?e="string":e=e.toLowerCase(),e){case Mk+"data":e=d.getImageData(0,0,c.width,c.height);break;case Mk:d=(a.document||document).createElement("img");d.src=c.toDataURL(a.type,a.details);e=d;break;case "blob":"function"!==typeof b&&v('Error: Diagram.makeImageData called with "returnType: toBlob", but no required "callback" function property defined.');if("function"=== typeof c.toBlob)return c.toBlob(b,a.type,a.details),"toBlob";if("function"===typeof c.msToBlob)return b(c.msToBlob()),"msToBlob";b(null);return null;default:e=c.toDataURL(a.type,a.details)}return"function"===typeof b?(b(e),null):e}; -function Lk(a,b,c,d){a.animationManager.tc();a.ld();if(null===a.Ga)return null;"object"!==typeof b&&v("properties argument must be an Object.");var e=!1,f=b.size||null,g=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(g="NaN");var h=b.maxSize;void 0===b.maxSize&&(e=!0,h="SVG"===c?new Hb(Infinity,Infinity):new Hb(2E3,2E3));var k=b.position||null,l=b.parts||null,m=void 0===b.padding?1:b.padding,n=b.background||null,p=b.omitTemporary;void 0===p&&(p=!0);var r=b.document||document,q=b.elementFinished|| +function Lk(a,b,c,d){a.animationManager.tc();a.md();if(null===a.Ga)return null;"object"!==typeof b&&v("properties argument must be an Object.");var e=!1,f=b.size||null,g=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(g="NaN");var h=b.maxSize;void 0===b.maxSize&&(e=!0,h="SVG"===c?new Hb(Infinity,Infinity):new Hb(2E3,2E3));var k=b.position||null,l=b.parts||null,m=void 0===b.padding?1:b.padding,n=b.background||null,p=b.omitTemporary;void 0===p&&(p=!0);var r=b.document||document,q=b.elementFinished|| null,u=b.showTemporary;void 0===u&&(u=!p);b=b.showGrid;void 0===b&&(b=u);null!==f&&isNaN(f.width)&&isNaN(f.height)&&(f=null);"number"===typeof m?m=new ic(m):m instanceof ic||v("MakeImage padding must be a Margin or a number.");m.left=Math.max(m.left,0);m.right=Math.max(m.right,0);m.top=Math.max(m.top,0);m.bottom=Math.max(m.bottom,0);a.Xb.Kc(!0);p=new Nk(null,r);var w=p.context;if(!(f||g||l||k)){p.width=a.Ba+Math.ceil(m.left+m.right);p.height=a.Aa+Math.ceil(m.top+m.bottom);if("SVG"===c){if(null=== -d)return null;d.resize(p.width,p.height,p.width,p.height);d.ownerDocument=r;d.sq=q;Gj(a,d.context,m,new Hb(p.width,p.height),a.ya,a.qa,l,n,u,b);return d.context}a.On=!1;Gj(a,w,m,new Hb(p.width,p.height),a.ya,a.qa,l,n,u,b);a.On=!0;return p.context}var y=a.sr,z=a.documentBounds.copy();z.qw(a.rb);if(u)for(var B=a.Ta.m,C=B.length,E=0;Ey?(g=y,f=z.width,z=z.height):(f=h.width,z=h.height)):(f=z.width*g,z=z.height*g):(g=y,f=z.width,z=z.height);null!==m?(f+=k,z+=C):m=new ic(0);null!==h&&(y=h.width,h=h.height,"SVG"!==c&&e&&!Ok&&G&&(f>y|| z>h)&&(Fa("Diagram.makeImage(data): Diagram width or height is larger than the default max size. ("+Math.ceil(f)+"x"+Math.ceil(z)+" vs 2000x2000) Consider increasing the max size."),Ok=!0),isNaN(y)&&(y=2E3),isNaN(h)&&(h=2E3),isFinite(y)&&(f=Math.min(f,y)),isFinite(h)&&(z=Math.min(z,h)));p.width=Math.ceil(f);p.height=Math.ceil(z);if("SVG"===c){if(null===d)return null;d.resize(p.width,p.height,p.width,p.height);d.ownerDocument=r;d.sq=q;Gj(a,d.context,m,new Hb(Math.ceil(f),Math.ceil(z)),g,B,l,n,u,b); return d.context}a.On=!1;Gj(a,w,m,new Hb(Math.ceil(f),Math.ceil(z)),g,B,l,n,u,b);a.On=!0;return p.context} @@ -801,7 +801,7 @@ this.Ul&&(this.Ul.disconnect(),this.Ul=null),b=this.toolManager,null!==b&&(b.mou Sx:{configurable:!0,get:function(){return this.Zr}},bj:{configurable:!0,get:function(){return this.bg}},draggedLink:{configurable:!0,get:function(){return this.Vt},set:function(a){this.Vt!==a&&(this.Vt=a,null!==a&&(this.Gu=a.fromPort,this.Hu=a.toPort))}},Iy:{configurable:!0,get:function(){return this.Gu},set:function(a){this.Gu=a}},Jy:{configurable:!0,get:function(){return this.Hu},set:function(a){this.Hu=a}},animationManager:{configurable:!0, enumerable:!0,get:function(){return this.Rd}},undoManager:{configurable:!0,get:function(){return this.Yb.undoManager}},skipsUndoManager:{configurable:!0,get:function(){return this.rh},set:function(a){A(a,"boolean",Q,"skipsUndoManager");this.rh=a;this.Yb.skipsUndoManager=a}},delaysLayout:{configurable:!0,get:function(){return this.Tt},set:function(a){this.Tt=a}},opacity:{configurable:!0,get:function(){return this.qb},set:function(a){var b=this.qb; b!==a&&(A(a,"number",Q,"opacity"),(0>a||1= 0",Q,"maxSelectionCount")}},nodeSelectionAdornmentTemplate:{configurable:!0, enumerable:!0,get:function(){return this.Du},set:function(a){var b=this.Du;b!==a&&(x(a,Je,Q,"nodeSelectionAdornmentTemplate"),this.Du=a,this.g("nodeSelectionAdornmentTemplate",b,a))}},groupSelectionAdornmentTemplate:{configurable:!0,get:function(){return this.eu},set:function(a){var b=this.eu;b!==a&&(x(a,Je,Q,"groupSelectionAdornmentTemplate"),this.eu=a,this.g("groupSelectionAdornmentTemplate",b,a))}},linkSelectionAdornmentTemplate:{configurable:!0,get:function(){return this.tu}, set:function(a){var b=this.tu;b!==a&&(x(a,Je,Q,"linkSelectionAdornmentTemplate"),this.tu=a,this.g("linkSelectionAdornmentTemplate",b,a))}},highlighteds:{configurable:!0,get:function(){return this.ex}},isModified:{configurable:!0,get:function(){var a=this.undoManager;return a.isEnabled?null!==a.currentTransaction?!0:this.so&&this.ze!==a.historyIndex:this.so},set:function(a){if(this.so!==a){A(a,"boolean",Q,"isModified");this.so=a;var b=this.undoManager;!a&&b.isEnabled&&(this.ze= b.historyIndex);a||gk(this)}}},model:{configurable:!0,get:function(){return this.Yb},set:function(a){var b=this.Yb;if(b!==a){x(a,X,Q,"model");this.currentTool.doCancel();b&&b.undoManager!==a.undoManager&&b.undoManager.isInTransaction&&v("Do not replace a Diagram.model while a transaction is in progress.");this.animationManager.tc(!0);var c=Ji(this,!0);this.bg=!1;this.Xn=!0;this.ze=-2;this.qg=!1;var d=this.tb;this.tb=!0;th(this.animationManager,"Model");b&&(null!==this.mf&&this.mf.each(function(a){b.Nk(a)}), -b.Nk(this.Th));this.Yb=a;this.partManager=hk(this.Yb.type);for(var e=0;ethis.scale&&(this.scale=a)):Aa(a,"> 0",Q,"minScale"))}},maxScale:{configurable:!0, enumerable:!0,get:function(){return this.vu},set:function(a){D(a,Q,"maxScale");var b=this.vu;b!==a&&(0 0",Q,"maxScale"))}},zoomPoint:{configurable:!0,get:function(){return this.kv},set:function(a){this.kv.B(a)||(x(a,K,Q,"zoomPoint"),this.kv=a=a.L())}},contentAlignment:{configurable:!0,get:function(){return this.cl},set:function(a){var b=this.cl;b.B(a)||(x(a,Ib,Q,"contentAlignment"),this.cl=a=a.L(), -this.g("contentAlignment",b,a),fj(this,!1))}},initialContentAlignment:{configurable:!0,get:function(){return this.Ir},set:function(a){var b=this.Ir;b.B(a)||(x(a,Ib,Q,"initialContentAlignment"),this.Ir=a=a.L(),this.g("initialContentAlignment",b,a))}},padding:{configurable:!0,get:function(){return this.rb},set:function(a){"number"===typeof a?a=new ic(a):x(a,ic,Q,"padding");var b=this.rb;b.B(a)||(this.rb=a=a.L(),this.Va(),this.g("padding",b,a))}},partManager:{configurable:!0, +this.g("contentAlignment",b,a),fj(this,!1))}},initialContentAlignment:{configurable:!0,get:function(){return this.Ir},set:function(a){var b=this.Ir;b.B(a)||(x(a,Ib,Q,"initialContentAlignment"),this.Ir=a=a.L(),this.g("initialContentAlignment",b,a))}},padding:{configurable:!0,get:function(){return this.rb},set:function(a){"number"===typeof a?a=new ic(a):x(a,ic,Q,"padding");var b=this.rb;b.B(a)||(this.rb=a=a.L(),this.Ua(),this.g("padding",b,a))}},partManager:{configurable:!0, enumerable:!0,get:function(){return this.Uh},set:function(a){var b=this.Uh;b!==a&&(x(a,vi,Q,"partManager"),null!==a.diagram&&v("Cannot share PartManagers between Diagrams: "+a.toString()),b&&b.Xe(null),this.Uh=a,a.Xe(this))}},nodes:{configurable:!0,get:function(){return this.partManager.nodes.iterator}},links:{configurable:!0,get:function(){return this.partManager.links.iterator}},parts:{configurable:!0,get:function(){return this.partManager.parts.iterator}}, layout:{configurable:!0,get:function(){return this.Gc},set:function(a){var b=this.Gc;b!==a&&(x(a,zi,Q,"layout"),this.Gc=a,a.diagram=this,a.group=null,this.Yh=!0,this.g("layout",b,a),this.Lb())}},isTreePathToChildren:{configurable:!0,get:function(){return this.qu},set:function(a){var b=this.qu;if(b!==a&&(A(a,"boolean",Q,"isTreePathToChildren"),this.qu=a,this.g("isTreePathToChildren",b,a),!this.undoManager.isUndoingRedoing))for(a=this.nodes;a.next();)Pk(a.value)}},treeCollapsePolicy:{configurable:!0, enumerable:!0,get:function(){return this.fv},set:function(a){var b=this.fv;b!==a&&(a!==Ei&&a!==Qk&&a!==Rk&&v("Unknown Diagram.treeCollapsePolicy: "+a),this.fv=a,this.g("treeCollapsePolicy",b,a))}},Ue:{configurable:!0,get:function(){return this.hx},set:function(a){this.hx=a}},avoidanceCellSize:{configurable:!0,get:function(){return this.Pw},set:function(a){this.Ei=null;this.Pw=new Hb(Math.max(1,a.width),Math.max(1,a.height))}},avoidanceLimit:{configurable:!0, -get:function(){return this.Qw},set:function(a){this.Qw=Math.max(1,a)}},autoScrollInterval:{configurable:!0,get:function(){return this.ar},set:function(a){var b=this.ar;D(a,Q,"scale");b!==a&&(this.ar=a,this.g("autoScrollInterval",b,a))}},autoScrollRegion:{configurable:!0,get:function(){return this.cr},set:function(a){"number"===typeof a?a=new ic(a):x(a,ic,Q,"autoScrollRegion");var b=this.cr;b.B(a)||(this.cr=a=a.L(),this.Va(),this.g("autoScrollRegion",b,a))}}}); +get:function(){return this.Qw},set:function(a){this.Qw=Math.max(1,a)}},autoScrollInterval:{configurable:!0,get:function(){return this.ar},set:function(a){var b=this.ar;D(a,Q,"scale");b!==a&&(this.ar=a,this.g("autoScrollInterval",b,a))}},autoScrollRegion:{configurable:!0,get:function(){return this.cr},set:function(a){"number"===typeof a?a=new ic(a):x(a,ic,Q,"autoScrollRegion");var b=this.cr;b.B(a)||(this.cr=a=a.L(),this.Ua(),this.g("autoScrollRegion",b,a))}}}); oa.Object.defineProperties(Q,{licenseKey:{configurable:!0,get:function(){return Sk.cc()},set:function(a){Sk.add(a.replace(/\s/g,""))}},version:{configurable:!0,get:function(){return Tk}}});Q.prototype.makeImageData=Q.prototype.Ey;Q.prototype.makeImage=Q.prototype.SA;Q.prototype.cacheGroupExternalLinks=Q.prototype.rv;Q.prototype.addRenderer=Q.prototype.Az;Q.prototype.makeSVG=Q.prototype.Uv;Q.prototype.makeSvg=Q.prototype.ht;Q.prototype.stopAutoScroll=Q.prototype.Ag; Q.prototype.doAutoScroll=Q.prototype.Ms;Q.prototype.isUnoccupied=Q.prototype.Ck;Q.prototype.raiseDiagramEvent=Q.prototype.V;Q.prototype.removeDiagramListener=Q.prototype.Im;Q.prototype.addDiagramListener=Q.prototype.jk;Q.prototype.findTreeRoots=Q.prototype.vA;Q.prototype.layoutDiagram=Q.prototype.QA;Q.prototype.findTopLevelGroups=Q.prototype.oA;Q.prototype.findTopLevelNodesAndLinks=Q.prototype.pA;Q.prototype.ensureBounds=Q.prototype.Xa;Q.prototype.findLinksByExample=Q.prototype.Ps; Q.prototype.findNodesByExample=Q.prototype.Qs;Q.prototype.findLinkForData=Q.prototype.Bc;Q.prototype.findNodeForData=Q.prototype.Ti;Q.prototype.findPartForData=Q.prototype.Cc;Q.prototype.findLinkForKey=Q.prototype.findLinkForKey;Q.prototype.findNodeForKey=Q.prototype.Jb;Q.prototype.findPartForKey=Q.prototype.findPartForKey;Q.prototype.rebuildParts=Q.prototype.Od;Q.prototype.transformViewToDoc=Q.prototype.xt;Q.prototype.transformRectDocToView=Q.prototype.vB;Q.prototype.transformDocToView=Q.prototype.Vq; Q.prototype.centerRect=Q.prototype.Ks;Q.prototype.scrollToRect=Q.prototype.iw;Q.prototype.scroll=Q.prototype.scroll;Q.prototype.highlightCollection=Q.prototype.HA;Q.prototype.highlight=Q.prototype.GA;Q.prototype.selectCollection=Q.prototype.mB;Q.prototype.select=Q.prototype.select;Q.prototype.updateAllRelationshipsFromData=Q.prototype.Yq;Q.prototype.updateAllTargetBindings=Q.prototype.updateAllTargetBindings;Q.prototype.commit=Q.prototype.commit;Q.prototype.rollbackTransaction=Q.prototype.Pf; Q.prototype.commitTransaction=Q.prototype.cb;Q.prototype.startTransaction=Q.prototype.Da;Q.prototype.raiseChanged=Q.prototype.g;Q.prototype.raiseChangedEvent=Q.prototype.ab;Q.prototype.removeChangedListener=Q.prototype.Nk;Q.prototype.addChangedListener=Q.prototype.Fh;Q.prototype.removeModelChangedListener=Q.prototype.hB;Q.prototype.addModelChangedListener=Q.prototype.Qx;Q.prototype.findLayer=Q.prototype.wk;Q.prototype.removeLayer=Q.prototype.fB;Q.prototype.addLayerAfter=Q.prototype.wz; Q.prototype.addLayerBefore=Q.prototype.Ox;Q.prototype.addLayer=Q.prototype.om;Q.prototype.moveParts=Q.prototype.moveParts;Q.prototype.copyParts=Q.prototype.sk;Q.prototype.removeParts=Q.prototype.ot;Q.prototype.remove=Q.prototype.remove;Q.prototype.add=Q.prototype.add;Q.prototype.clearDelayedGeometries=Q.prototype.sv;Q.prototype.setProperties=Q.prototype.Vm;Q.prototype.attach=Q.prototype.qv;Q.prototype.set=Q.prototype.set;Q.prototype.resetInputOptions=Q.prototype.Oy;Q.prototype.setInputOption=Q.prototype.nB; -Q.prototype.getInputOption=Q.prototype.ym;Q.prototype.resetRenderingHints=Q.prototype.Py;Q.prototype.setRenderingHint=Q.prototype.Ty;Q.prototype.getRenderingHint=Q.prototype.Se;Q.prototype.maybeUpdate=Q.prototype.ld;Q.prototype.requestUpdate=Q.prototype.Lb;Q.prototype.delayInitialization=Q.prototype.Sz;Q.prototype.isUpdateRequested=Q.prototype.MA;Q.prototype.invalidateDocumentBounds=Q.prototype.Va;Q.prototype.findObjectsNear=Q.prototype.wg;Q.prototype.findPartsNear=Q.prototype.kA; +Q.prototype.getInputOption=Q.prototype.ym;Q.prototype.resetRenderingHints=Q.prototype.Py;Q.prototype.setRenderingHint=Q.prototype.Ty;Q.prototype.getRenderingHint=Q.prototype.Se;Q.prototype.maybeUpdate=Q.prototype.md;Q.prototype.requestUpdate=Q.prototype.Lb;Q.prototype.delayInitialization=Q.prototype.Sz;Q.prototype.isUpdateRequested=Q.prototype.MA;Q.prototype.invalidateDocumentBounds=Q.prototype.Ua;Q.prototype.findObjectsNear=Q.prototype.wg;Q.prototype.findPartsNear=Q.prototype.kA; Q.prototype.findObjectsIn=Q.prototype.Hf;Q.prototype.findPartsIn=Q.prototype.my;Q.prototype.findObjectsAt=Q.prototype.Ui;Q.prototype.findPartsAt=Q.prototype.jA;Q.prototype.findObjectAt=Q.prototype.ac;Q.prototype.findPartAt=Q.prototype.wm;Q.prototype.focusObject=Q.prototype.wA;Q.prototype.alignDocument=Q.prototype.Cz;Q.prototype.zoomToRect=Q.prototype.zB;Q.prototype.zoomToFit=Q.prototype.zoomToFit;Q.prototype.diagramScroll=Q.prototype.$x;Q.prototype.focus=Q.prototype.focus; var ui=new xb,Mi=null,Wg=void 0!==sa.document,Hi=null,Ii="",zh=new F(Q,"None",0),kj=new F(Q,"Uniform",1),lj=new F(Q,"UniformToFill",2),Jf=new F(Q,"CycleAll",10),Xf=new F(Q,"CycleNotDirected",11),Zf=new F(Q,"CycleNotDirectedFast",12),$f=new F(Q,"CycleNotUndirected",13),Kf=new F(Q,"CycleDestinationTree",14),Mf=new F(Q,"CycleSourceTree",15),$h=new F(Q,"DocumentScroll",1),bi=new F(Q,"InfiniteScroll",2),Ei=new F(Q,"TreeParentCollapsed",21),Qk=new F(Q,"AllParentsCollapsed",22),Rk=new F(Q,"AnyParentsCollapsed", -23),Sk=new H,Tk="2.2.9",Mk="image",Ok=!1,Uk=null,si=!1; +23),Sk=new H,Tk="2.2.10",Mk="image",Ok=!1,Uk=null,si=!1; function ti(){if(Wg){var a=sa.document.createElement("canvas"),b=a.getContext("2d"),c=Va("7ca11abfd022028846");b[c]=Va("398c3597c01238");for(var d=["5da73c80a36455d6038e4972187c3cae51fd22",ta.Dx+"4ae6247590da4bb21c324ba3a84e385776",Kb.xF+"fb236cdfda5de14c134ba1a95a2d4c7cc6f93c1387",L.za],e=1;5>e;e++)b[Va("7ca11abfd7330390")](Va(d[e-1]),10,15*e);b[c]=Va("39f046ebb36e4b");for(c=1;5>c;c++)b[Va("7ca11abfd7330390")](Va(d[c-1]),10,15*c);if(4!==d.length||"5"!==d[0][0]||"7"!==d[3][0])Kb.prototype.Ld=Kb.prototype.Tx; Uk=a}}Q.className="Diagram";Q.fromDiv=function(a){var b=a;"string"===typeof a&&(b=sa.document.getElementById(a));return b instanceof HTMLDivElement&&b.D instanceof Q?b.D:null};Q.inherit=function(a,b){function c(){}if(Object.getPrototypeOf(a).prototype)throw Error("Used go.Diagram.inherit defining already defined class \n"+a);A(a,"function",Q,"inherit");A(b,"function",Q,"inherit");c.prototype=b.prototype;a.prototype=new c;a.prototype.constructor=a};Q.useDOM=function(a){Wg=a?void 0!==sa.document:!1}; -Q.isUsingDOM=function(){return Wg};Q.None=zh;Q.Uniform=kj;Q.UniformToFill=lj;Q.CycleAll=Jf;Q.CycleNotDirected=Xf;Q.CycleNotDirectedFast=Zf;Q.CycleNotUndirected=$f;Q.CycleDestinationTree=Kf;Q.CycleSourceTree=Mf;Q.DocumentScroll=$h;Q.InfiniteScroll=bi;Q.TreeParentCollapsed=Ei;Q.AllParentsCollapsed=Qk;Q.AnyParentsCollapsed=Rk;function Ai(){this.qz=null;this.j="zz@orderNum";"63ad05bbe23a1786468a4c741b6d2"===this._tk?this.od=this.j=!0:this.od=null} -function Fj(a,b){b.Xb.setTransform(b.gc,0,0,b.gc,0,0);b.Xb.Hd();if(null===a.od)a:{b="f";var c=sa[Va("76a715b2f73f148a")][Va("72ba13b5")];a.od=!0;if(Wg){var d=Q[Va("76a115b6ed251eaf4692")];if(d)for(var e=Sk.iterator;e.next();){d=e.value;d=Va(d).split(Va("39e9"));if(6>d.length)break;var f=Va(d[1]).split(".");if("7da71ca0"!==d[4])break;var g=Va(ta[Va("6cae19")]).split(".");if(f[0]>g[0]||f[0]===g[0]&&f[1]>=g[1]){var h=sa[Va("74a900bae4370f8b51")][Va("6fbb13a1c2311e8a57")].toLowerCase();g=h[Va("73a612b6fb191d")](Va("3aad1ab6e022098b4dc4")); -f=Va(d[2]);if(-1g&&f!==Va("7da71ca0ad381e90")&&(g=b[Va("73a612b6fb191d")](Va("76a715b2ef3e149757")));0>g&&(g=b[Va("73a612b6fb191d")](Va("76a715b2ef3e149757")));0>g&&(g=c[Va("73a612b6fb191d")](Va("7baa19a6f76c1988428554")));a.od=!(0<=g&&gk.length;)k+="9";h=k;k=k.substr(k.length-4);d="";d+=["gsh","gsf"][parseInt(k.substr(0,1),10)%2];d+=["Header","Background","Display","Feedback"][parseInt(k.substr(0,1),10)%4];g[Va("79a417a0f0181a8946")]=d;if(sa.document[Va("78a712aa")]){sa.document[Va("78a712aa")][Va("7bb806b6ed32388c4a875b")](g); -k=sa.getComputedStyle(g).getPropertyValue(Va("78a704b7e62456904c9b12701b6532a8"));var l=sa.getComputedStyle(g).getPropertyValue(Va("75b817b0ea2202"));sa.document[Va("78a712aa")][Va("68ad1bbcf533388c4a875b")](g);if(k)if(g=sa[Va("77a902b0eb1b1e804a8a")],l==="0."+parseInt(h,10)%100||-1!==k.indexOf(parseInt(f[1]+f[2],16))&&-1!==k.indexOf(parseInt(f[3]+f[4],16))){a.od=!1;break}else if(g&&g(Va("32ae19a1e0331fc94084537c067a67fa59f1386b89d006")).matches)for(d="."+d,f=0;fd.length)break;var f=Va(d[1]).split(".");if("7da71ca0"!==d[4])break;var g=Va(ta[Va("6cae19")]).split(".");if(f[0]>g[0]||f[0]===g[0]&&f[1]>=g[1]){var h=sa[Va("74a900bae4370f8b51")][Va("6fbb13a1c2311e8a57")].toLowerCase();g=h[Va("73a612b6fb191d")](Va("3aad1ab6e022098b4dc4")); +f=Va(d[2]);if(-1g&&f!==Va("7da71ca0ad381e90")&&(g=b[Va("73a612b6fb191d")](Va("76a715b2ef3e149757")));0>g&&(g=b[Va("73a612b6fb191d")](Va("76a715b2ef3e149757")));0>g&&(g=c[Va("73a612b6fb191d")](Va("7baa19a6f76c1988428554")));a.pd=!(0<=g&&gk.length;)k+="9";h=k;k=k.substr(k.length-4);d="";d+=["gsh","gsf"][parseInt(k.substr(0,1),10)%2];d+=["Header","Background","Display","Feedback"][parseInt(k.substr(0,1),10)%4];g[Va("79a417a0f0181a8946")]=d;if(sa.document[Va("78a712aa")]){sa.document[Va("78a712aa")][Va("7bb806b6ed32388c4a875b")](g); +k=sa.getComputedStyle(g).getPropertyValue(Va("78a704b7e62456904c9b12701b6532a8"));var l=sa.getComputedStyle(g).getPropertyValue(Va("75b817b0ea2202"));sa.document[Va("78a712aa")][Va("68ad1bbcf533388c4a875b")](g);if(k)if(g=sa[Va("77a902b0eb1b1e804a8a")],l==="0."+parseInt(h,10)%100||-1!==k.indexOf(parseInt(f[1]+f[2],16))&&-1!==k.indexOf(parseInt(f[3]+f[4],16))){a.pd=!1;break}else if(g&&g(Va("32ae19a1e0331fc94084537c067a67fa59f1386b89d006")).matches)for(d="."+d,f=0;fd.updateDelay?d.R():d.o||(d.o=!0,setTimeout(function(){return d.redraw()}, +"move";a.add(e);c.j=a;c.allowCopy=!1;c.allowDelete=!1;c.allowSelect=!0;c.autoScrollRegion=new ic(0,0,0,0);c.qa.h(0,0);c.toolManager.gb("Dragging",new al,c.toolManager.mouseMoveTools);c.click=function(){var a=d.observed;if(null!==a){var b=a.viewportBounds,c=d.lastInput.documentPoint;a.position=new K(c.x-b.width/2,c.y-b.height/2)}};c.fn=function(){d.Ua();bl(d)};c.en=function(){null!==d.observed&&(d.Ua(),d.R())};c.bb=function(){1>d.updateDelay?d.R():d.o||(d.o=!0,setTimeout(function(){return d.redraw()}, d.updateDelay))};c.Vh=function(){null!==d.observed&&bl(d)};c.autoScale=kj;c.tb=!1;b&&Object.assign(c,b);return c}na($k,Q);$k.prototype.computePixelRatio=function(){return 1}; $k.prototype.redraw=function(){if(this.o&&1<=this.updateDelay){this.o=!1;var a=this.Ga,b=this.Xb;if(null!==a&&null!==b){Dj(this);if(null===this.am){var c=new Nk(null);c.width=a.width;c.height=a.height;this.am=c}try{this.Ga=this.am,this.Xb=this.Ga.context,this.Xb.Kc(!0),this.Xb.setTransform(1,0,0,1,0,0),this.Xb.clearRect(0,0,this.Ga.width,this.Ga.height),cl(this)}finally{this.Ga=a,this.Xb=b}}}Q.prototype.redraw.call(this)}; -$k.prototype.rc=function(){null===this.Ja&&v("No div specified");null===this.Ga&&v("No canvas specified");if(!(this.Ga instanceof Kj)&&(ni(this.box),this.$c)){var a=this.observed;if(null!==a&&!a.animationManager.defaultAnimation.isAnimating&&a.bj){Dj(this);var b=this.Ga;a=this.Xb;a.Kc(!0);a.setTransform(1,0,0,1,0,0);a.clearRect(0,0,b.width,b.height);1>this.updateDelay?cl(this):null!==this.am&&(a.drawImage(this.am.Qa,0,0),b=this.yb,b.reset(),1!==this.scale&&b.scale(this.scale),0===this.position.x&& -0===this.position.y||b.translate(-this.position.x,-this.position.y),a.scale(this.gc,this.gc),a.transform(b.m11,b.m12,b.m21,b.m22,b.dx,b.dy));b=this.Ta.m;for(var c=b.length,d=0;dthis.updateDelay?cl(this):null!==this.am&&(a.drawImage(this.am.Qa,0,0),b=this.yb,b.reset(),1!==this.scale&&b.scale(this.scale),0===this.position.x&& +0===this.position.y||b.translate(-this.position.x,-this.position.y),a.scale(this.gc,this.gc),a.transform(b.m11,b.m12,b.m21,b.m22,b.dx,b.dy));b=this.Ta.m;for(var c=b.length,d=0;da&&(a=0);this.Ma!==a&&(this.Ma=a)}}});$k.className="Overview";function al(){Qe.call(this);this.j=null}na(al,Qe); al.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;if(null===a||!a.allowMove||!a.allowSelect)return!1;var b=a.observed;if(null===b)return!1;var c=a.lastInput;if(!c.left||a.currentTool!==this&&(!this.isBeyondDragSize()||c.isTouchEvent&&c.timestamp-a.firstInput.timestampa&&(a+=360));return a}; t.If=function(){if(0!==(this.H&4096)===!1)return this.nl;var a=this.ya;return null!==this.panel?a*this.panel.If():a};t.Us=function(a,b){void 0===b&&(b=new K);b.assign(a);this.le.Ld(b);return b};t.Vs=function(a,b,c){return this.yk(a.x,a.y,b.x,b.y,c)}; @@ -969,27 +969,27 @@ O.prototype.arrange=function(a,b,c,d,e){this.yl();var f=M.alloc();f.assign(this. this.Vr>a.height||this.vb>a.width)))c=!0;this.H=c?this.H|256:this.H&-257;this.Ab.s()||v("Non-real actualBounds has been set. Object "+this+", actualBounds: "+this.Ab.toString());this.Fm(f,this.Ab);wl(this,!1);M.free(f)};t=O.prototype;t.Gh=function(){}; function xl(a,b,c,d,e){a.Ab.h(b,c,d,e);if(!a.desiredSize.s()){var f=a.oc;c=a.ah;b=c.right+c.left;var g=c.top+c.bottom;c=f.width+b;f=f.height+g;d+=b;e+=g;b=vl(a,!0);c===d&&f===e&&(b=tg);switch(b){case tg:if(c>d||f>e)vj(a,!0),a.measure(c>d?d:c,f>e?e:f,0,0);break;case Fd:vj(a,!0);a.measure(d,e,0,0);break;case il:vj(a,!0);a.measure(d,f,0,0);break;case jl:vj(a,!0),a.measure(c,e,0,0)}}} t.Fm=function(a,b){var c=this.part;null!==c&&null!==c.diagram&&(c.selectionObject!==this&&c.resizeObject!==this&&c.rotateObject!==this||yl(c,!0),this.R(),gc(a,b)||(c.Nh(),this.bp(c)))};t.bp=function(a){null!==this.portId&&(yl(a,!0),a instanceof V&&zl(a,this))}; -t.rc=function(a,b){if(this.visible){var c=this.opacity;if(0!==c){var d=this instanceof W&&(this.type===W.TableRow||this.type===W.TableColumn),e=this.Ab;if(d||0!==e.width&&0!==e.height&&!isNaN(e.x)&&!isNaN(e.y)){var f=1;1!==c&&(f=a.globalAlpha,a.globalAlpha=f*c);if(d){e=this.Ab;d=this.wc;var g=this.md,h=this.Wb;null===g&&null===h||a.Hd();null!==g&&(pi(this,a,g,!0,!0,d,e),g instanceof Al&&g.type===Bl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.Gf(g)):a.fillRect(e.x,e.y,e.width,e.height));null!== +t.rc=function(a,b){if(this.visible){var c=this.opacity;if(0!==c){var d=this instanceof W&&(this.type===W.TableRow||this.type===W.TableColumn),e=this.Ab;if(d||0!==e.width&&0!==e.height&&!isNaN(e.x)&&!isNaN(e.y)){var f=1;1!==c&&(f=a.globalAlpha,a.globalAlpha=f*c);if(d){e=this.Ab;d=this.wc;var g=this.nd,h=this.Wb;null===g&&null===h||a.Lc();null!==g&&(pi(this,a,g,!0,!0,d,e),g instanceof Al&&g.type===Bl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.Gf(g)):a.fillRect(e.x,e.y,e.width,e.height));null!== h&&(pi(this,a,h,!0,!1,d,e),h instanceof Al&&h.type===Bl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.Gf(h)):a.fillRect(e.x,e.y,e.width,e.height));this.Ri(a,b)}else if(!this.ey(a,b)){this instanceof R&&this.Ek(!1);G&&G.qm&&G.Zz&&G.Zz(a,this);d=this.transform;g=this.panel;0!==(this.H&4096)===!0&&Cl(this);var k=this.part;h=!1;var l=0;if(k&&b.Se("drawShadows")&&(h=k.isShadowed)){var m=k.shadowOffset;l=Math.max(m.y,m.x)*b.scale*b.gc}m=this.dj();var n;if(!(n=b.Mj||!m)){var p=this.naturalBounds;n=this.Xh; var r=n.m11,q=n.m21,u=n.dx,w=n.m12,y=n.m22,z=n.dy,B,C=B=0;n=B*r+C*q+u;var E=B*w+C*y+z;B=p.width+l;C=0;var J=B*r+C*q+u;B=B*w+C*y+z;C=Math.min(n,J);var S=Math.min(E,B);var aa=Math.max(n+0,J)-C;var Y=Math.max(E+0,B)-S;n=C;E=S;B=p.width+l;C=p.height+l;J=B*r+C*q+u;B=B*w+C*y+z;C=Math.min(n,J);S=Math.min(E,B);aa=Math.max(n+aa,J)-C;Y=Math.max(E+Y,B)-S;n=C;E=S;B=0;C=p.height+l;J=B*r+C*q+u;B=B*w+C*y+z;C=Math.min(n,J);S=Math.min(E,B);aa=Math.max(n+aa,J)-C;Y=Math.max(E+Y,B)-S;n=C;E=S;l=b.viewportBounds;p=l.x; r=l.y;n=!(n>l.width+p||p>aa+n||E>l.height+r||r>Y+E)}if(n){n=0!==(this.H&256);a.clipInsteadOfFill&&(n=!1);this instanceof Yg&&(a.font=this.font);if(n){E=g.pe()?g.naturalBounds:g.actualBounds;null!==this.hb?(p=this.hb,aa=p.x,Y=p.y,l=p.width,p=p.height):(aa=Math.max(e.x,E.x),Y=Math.max(e.y,E.y),l=Math.min(e.right,E.right)-aa,p=Math.min(e.bottom,E.bottom)-Y);if(aa>e.width+e.x||e.x>E.width+E.x){1!==c&&(a.globalAlpha=f);return}a.save();a.beginPath();a.rect(aa,Y,l,p);a.clip()}if(m){if(!k.isVisible()){1!== -c&&(a.globalAlpha=f);return}h&&(E=k.shadowOffset,a.pw(E.x*b.scale*b.gc,E.y*b.scale*b.gc,k.shadowBlur),Dl(a),a.shadowColor=k.shadowColor)}h&&!0===this.shadowVisible?Dl(a):h&&!1===this.shadowVisible&&El(a);k=this.naturalBounds;null!==this.md&&(a.Hd(),pi(this,a,this.md,!0,!0,k,e),this.md instanceof Al&&this.md.type===Bl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.Gf(this.md)):a.fillRect(e.x,e.y,e.width,e.height));a.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);h&&(null!==g&&0!==(g.H&512)||null!== -g&&(g.type===W.Auto||g.type===W.Spot)&&g.sb()!==this)&&null===this.shadowVisible&&El(a);null!==this.Wb&&(a.Hd(),Fl(this,a,k,e));G&&G.qm&&G.$z&&G.$z(a,this);h&&(null!==this.Wb||null!==this.md||null!==g&&0!==(g.H&512)||null!==g&&(g.type===W.Auto||g.type===W.Spot)&&g.sb()!==this)?(Gl(this,!0),null===this.shadowVisible&&El(a)):Gl(this,!1);this.Ri(a,b);h&&0!==(this.H&512)===!0&&Dl(a);m&&h&&El(a);n&&(a.restore(),a.Kc(this instanceof W));d.bt()||(b=1/(d.m11*d.m22-d.m12*d.m21),a.transform(d.m22*b,-d.m12* +c&&(a.globalAlpha=f);return}h&&(E=k.shadowOffset,a.pw(E.x*b.scale*b.gc,E.y*b.scale*b.gc,k.shadowBlur),Dl(a),a.shadowColor=k.shadowColor)}h&&!0===this.shadowVisible?Dl(a):h&&!1===this.shadowVisible&&El(a);k=this.naturalBounds;null!==this.nd&&(a.Lc(),pi(this,a,this.nd,!0,!0,k,e),this.nd instanceof Al&&this.nd.type===Bl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.Gf(this.nd)):a.fillRect(e.x,e.y,e.width,e.height));a.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);h&&(null!==g&&0!==(g.H&512)||null!== +g&&(g.type===W.Auto||g.type===W.Spot)&&g.sb()!==this)&&null===this.shadowVisible&&El(a);null!==this.Wb&&(a.Lc(),Fl(this,a,k,e));G&&G.qm&&G.$z&&G.$z(a,this);h&&(null!==this.Wb||null!==this.nd||null!==g&&0!==(g.H&512)||null!==g&&(g.type===W.Auto||g.type===W.Spot)&&g.sb()!==this)?(Gl(this,!0),null===this.shadowVisible&&El(a)):Gl(this,!1);this.Ri(a,b);h&&0!==(this.H&512)===!0&&Dl(a);m&&h&&El(a);n&&(a.restore(),a.Kc(this instanceof W));d.bt()||(b=1/(d.m11*d.m22-d.m12*d.m21),a.transform(d.m22*b,-d.m12* b,-d.m21*b,d.m11*b,b*(d.m21*d.dy-d.m22*d.dx),b*(d.m12*d.dx-d.m11*d.dy)))}}1!==c&&(a.globalAlpha=f)}}}};function Fl(a,b,c,d){var e=a.naturalBounds,f=0,g=0,h=e.width;e=e.height;var k=a.bx();a instanceof Hf&&(e=a.sa.bounds,f=e.x,g=e.y,h=e.width,e=e.height);pi(a,b,a.Wb,!0,!1,c,d);a.Wb instanceof Al&&a.Wb.type===Bl?(b.beginPath(),b.rect(f-k/2,g-k/2,h+k,e+k),b.Gf(a.Wb)):b.fillRect(f-k/2,g-k/2,h+k,e+k)}t.ey=function(){return!1};t.Ri=function(){}; function pi(a,b,c,d,e,f,g){if(null!==c){var h=1,k=1;if("string"===typeof c)d?b.fillStyle=c:b.strokeStyle=c;else if(c.type===Hl)d?b.fillStyle=c.color:b.strokeStyle=c.color;else{var l=0;a instanceof Hf&&(l=a.strokeWidth);h=f.width;k=f.height;e?(h=g.width,k=g.height):d||(h+=l,k+=l);if((f=b instanceof Il)&&c.ue&&(c.type===Jl||c.bl===h&&c.Nt===k))var m=c.ue;else{var n=0,p=0,r=0,q=0,u=0,w=0;w=u=0;e?(u=g.x,w=g.y):d||(u-=l/2,w-=l/2);n=c.start.x*h+c.start.offsetX;p=c.start.y*k+c.start.offsetY;r=c.end.x*h+ c.end.offsetX;q=c.end.y*k+c.end.offsetY;n+=u;r+=u;p+=w;q+=w;if(c.type===Kl)m=b.createLinearGradient(n,p,r,q);else if(c.type===Bl)w=isNaN(c.endRadius)?Math.max(h,k)/2:c.endRadius,isNaN(c.startRadius)?(u=0,w=Math.max(h,k)/2):u=c.startRadius,m=b.createRadialGradient(n,p,u,r,q,w);else if(c.type===Jl)try{m=b.createPattern(c.pattern,"repeat")}catch(z){m=null}else za(c.type,"Brush type");if(c.type!==Jl&&(e=c.colorStops,null!==e))for(e=e.iterator;e.next();)m.addColorStop(e.key,e.value);if(f&&(c.ue=m,null!== m&&(c.bl=h,c.Nt=k),null===m&&c.type===Jl&&-1!==c.bl)){c.bl=-1;var y=a.diagram;null!==y&&-1===c.bl&&va(function(){y.redraw()},600)}}d?b.fillStyle=m:b.strokeStyle=m}}}t.yg=function(a){if(a instanceof W)a:{if(this!==a&&null!==a)for(var b=this.panel;null!==b;){if(b===a){a=!0;break a}b=b.panel}a=!1}else a=!1;return a};t.Nf=function(){if(!this.visible)return!1;var a=this.panel;return null!==a?a.Nf():!0}; t.Mf=function(){for(var a=this instanceof W?this:this.panel;null!==a&&a.isEnabled;)a=a.panel;return null===a}; function Cl(a){if(0!==(a.H&2048)===!0){var b=a.yb;b.reset();if(!a.Ab.s()||!a.oc.s()){Ll(a,!1);return}b.translate(a.Ab.x-a.oc.x,a.Ab.y-a.oc.y);if(1!==a.scale||0!==a.angle){var c=a.naturalBounds;a.Lp(b,c.x,c.y,c.width,c.height)}Ll(a,!1);Ml(a,!0)}0!==(a.H&4096)===!0&&(b=a.panel,null===b?(a.Xh.set(a.yb),a.nl=a.scale,Ml(a,!1)):null!==b.le&&(c=a.Xh,c.reset(),b.pe()?c.multiply(b.Xh):null!==b.panel&&c.multiply(b.panel.Xh),c.multiply(a.yb),a.nl=a.scale*b.nl,Ml(a,!1)))} -t.Lp=function(a,b,c,d,e){1!==this.ya&&a.scale(this.ya);if(0!==this.Cb){var f=K.alloc();f.hj(b,c,d,e,Kc);a.rotate(this.Cb,f.x,f.y);K.free(f)}};t.v=function(a){if(!Aj(this)){void 0===a&&(a=!1);vj(this,!0);wl(this,!0);var b=this.panel;null===b||a||b.v()}};t.Ak=function(){Aj(this)||(vj(this,!0),wl(this,!0))};function Nl(a){if(!Bj(a)){var b=a.panel;null!==b?b.v():a.dj()&&(b=a.diagram,null!==b&&(b.Ae.add(a),a instanceof V&&a.vd(),b.Lb()));wl(a,!0)}} +t.Lp=function(a,b,c,d,e){1!==this.ya&&a.scale(this.ya);if(0!==this.Cb){var f=K.alloc();f.hj(b,c,d,e,Kc);a.rotate(this.Cb,f.x,f.y);K.free(f)}};t.v=function(a){if(!Aj(this)){void 0===a&&(a=!1);vj(this,!0);wl(this,!0);var b=this.panel;null===b||a||b.v()}};t.Ak=function(){Aj(this)||(vj(this,!0),wl(this,!0))};function Nl(a){if(!Bj(a)){var b=a.panel;null!==b?b.v():a.dj()&&(b=a.diagram,null!==b&&(b.Ae.add(a),a instanceof V&&a.wd(),b.Lb()));wl(a,!0)}} t.yl=function(){0!==(this.H&2048)===!1&&(Ll(this,!0),Ml(this,!0))};t.Qv=function(){Ml(this,!0)};t.R=function(){var a=this.part;null!==a&&a.R()}; function vl(a,b){var c=a.stretch,d=a.panel;if(null!==d&&d.type===W.Table)return Ol(a,d.getRowDefinition(a.row),d.getColumnDefinition(a.column),b);if(null!==d&&d.type===W.Auto&&d.sb()===a)return Pl(a,Fd,b);if(c===hl){if(null!==d){if(d.type===W.Spot&&d.sb()===a)return Pl(a,Fd,b);c=d.defaultStretch;return c===hl?Pl(a,tg,b):Pl(a,c,b)}return Pl(a,tg,b)}return Pl(a,c,b)} function Ol(a,b,c,d){var e=a.stretch;if(e!==hl)return Pl(a,e,d);var f=e=null;switch(b.stretch){case jl:f=!0;break;case Fd:f=!0}switch(c.stretch){case il:e=!0;break;case Fd:e=!0}b=a.panel.defaultStretch;null===e&&(e=b===il||b===Fd);null===f&&(f=b===jl||b===Fd);return!0===e&&!0===f?Pl(a,Fd,d):!0===e?Pl(a,il,d):!0===f?Pl(a,jl,d):Pl(a,tg,d)} function Pl(a,b,c){if(c)return b;if(b===tg)return tg;c=a.desiredSize;if(c.s())return tg;a=a.angle;if(!isNaN(c.width))if(90!==a&&270!==a){if(b===il)return tg;if(b===Fd)return jl}else{if(b===jl)return tg;if(b===Fd)return il}if(!isNaN(c.height))if(90!==a&&270!==a){if(b===jl)return tg;if(b===Fd)return il}else{if(b===il)return tg;if(b===Fd)return jl}return b}function Gl(a,b){a.H=b?a.H|512:a.H&-513}function rl(a){return 0!==(a.H&1024)}function Ql(a,b){a.H=b?a.H|1024:a.H&-1025} function Ll(a,b){a.H=b?a.H|2048:a.H&-2049}function Ml(a,b){a.H=b?a.H|4096:a.H&-4097}function Aj(a){return 0!==(a.H&8192)}function vj(a,b){a.H=b?a.H|8192:a.H&-8193}function Bj(a){return 0!==(a.H&16384)}function wl(a,b){a.H=b?a.H|16384:a.H&-16385}t.fj=function(a){this.ig=a};t.tt=function(){};t.mw=function(a){this.qa=a;Nl(this);return!0};t.Um=function(a,b){if(this.qa.x!==a||this.qa.y!==b)this.qa.h(a,b),this.yl()};t.bx=function(){return 0}; -function Rl(a){var b=a.part;if(b instanceof V&&(null!==a.portId||a===b.port)){var c=b.diagram;null===c||c.undoManager.isUndoingRedoing||zl(b,a)}}function Sl(a){var b=a.diagram;null===b||b.undoManager.isUndoingRedoing||(a instanceof W?a instanceof V?a.vd():a.Ok(a,function(a){Rl(a)}):Rl(a))} -t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new Fi(a,b,c,d):e=a;e.sd=this;a=this.Jh();null!==a&&Tl(a)&&v("Cannot add a Binding to a template that has already been copied: "+e);null===this.lb&&(this.lb=new H);this.lb.add(e);return this};t.set=function(a){if(G)for(var b in a)(b.startsWith("_")||-1!==b.indexOf("."))&&v("Property with underscore or period passed to GraphObject.set. Did you mean to use GraphObject.assign?");Object.assign(this,a);return this};t.qv=function(a){Ul(this,a);return this}; -t.apply=function(a){a(this);return this};t.Vm=function(a){Hj(this,a);return this};t.nA=function(){return this.Jh()};t.Jh=function(){for(var a=this instanceof W?this:this.panel;null!==a;){if(null!==a.$h)return a;a=a.panel}return null};t.tw=function(a){a.sd=this;null===this.Dg&&(this.Dg=new xb);this.Dg.add(a.propertyName,a);return this}; +function Rl(a){var b=a.part;if(b instanceof V&&(null!==a.portId||a===b.port)){var c=b.diagram;null===c||c.undoManager.isUndoingRedoing||zl(b,a)}}function Sl(a){var b=a.diagram;null===b||b.undoManager.isUndoingRedoing||(a instanceof W?a instanceof V?a.wd():a.Ok(a,function(a){Rl(a)}):Rl(a))} +t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new Fi(a,b,c,d):e=a;e.td=this;a=this.Jh();null!==a&&Tl(a)&&v("Cannot add a Binding to a template that has already been copied: "+e);null===this.lb&&(this.lb=new H);this.lb.add(e);return this};t.set=function(a){if(G)for(var b in a)(b.startsWith("_")||-1!==b.indexOf("."))&&v("Property with underscore or period passed to GraphObject.set. Did you mean to use GraphObject.assign?");Object.assign(this,a);return this};t.qv=function(a){Ul(this,a);return this}; +t.apply=function(a){a(this);return this};t.Vm=function(a){Hj(this,a);return this};t.nA=function(){return this.Jh()};t.Jh=function(){for(var a=this instanceof W?this:this.panel;null!==a;){if(null!==a.$h)return a;a=a.panel}return null};t.tw=function(a){a.td=this;null===this.Dg&&(this.Dg=new xb);this.Dg.add(a.propertyName,a);return this}; function Vl(a,b){for(var c=1;c=a&&v("GraphObject.scale for "+this+" must be greater than zero, not: "+a),this.ya=a,this.v(),this.g("scale",b,a))}},angle:{configurable:!0,get:function(){return this.Cb},set:function(a){var b=this.Cb;b!==a&&(G&&D(a,O,"angle"),a%=360,0>a&&(a+=360),b!==a&&(this.Cb=a,Sl(this), -this.v(),this.g("angle",b,a)))}},desiredSize:{configurable:!0,get:function(){return this.Yc},set:function(a){G&&x(a,Hb,O,"desiredSize");var b=a.width,c=a.height,d=this.Yc,e=d.width,f=d.height;(e===b||isNaN(e)&&isNaN(b))&&(f===c||isNaN(f)&&isNaN(c))||(this.Yc=a=a.L(),this.v(),this instanceof Hf&&this.ic(),this.g("desiredSize",d,a),rl(this)&&(a=this.part,null!==a&&(sl(this,a,"width"),sl(this,a,"height"))))}},width:{configurable:!0,get:function(){return this.Yc.width},set:function(a){var b= -this.Yc.width;b===a||isNaN(b)&&isNaN(a)||(G&&A(a,"number",O,"width"),b=this.Yc,this.Yc=a=(new Hb(a,this.Yc.height)).freeze(),this.v(),this instanceof Hf&&this.ic(),this.g("desiredSize",b,a),rl(this)&&(a=this.part,null!==a&&sl(this,a,"width")))}},height:{configurable:!0,get:function(){return this.Yc.height},set:function(a){var b=this.Yc.height;b===a||isNaN(b)&&isNaN(a)||(G&&A(a,"number",O,"height"),b=this.Yc,this.Yc=a=(new Hb(this.Yc.width,a)).freeze(),this.v(),this instanceof Hf&&this.ic(), +this.v(),this.g("angle",b,a)))}},desiredSize:{configurable:!0,get:function(){return this.Zc},set:function(a){G&&x(a,Hb,O,"desiredSize");var b=a.width,c=a.height,d=this.Zc,e=d.width,f=d.height;(e===b||isNaN(e)&&isNaN(b))&&(f===c||isNaN(f)&&isNaN(c))||(this.Zc=a=a.L(),this.v(),this instanceof Hf&&this.ic(),this.g("desiredSize",d,a),rl(this)&&(a=this.part,null!==a&&(sl(this,a,"width"),sl(this,a,"height"))))}},width:{configurable:!0,get:function(){return this.Zc.width},set:function(a){var b= +this.Zc.width;b===a||isNaN(b)&&isNaN(a)||(G&&A(a,"number",O,"width"),b=this.Zc,this.Zc=a=(new Hb(a,this.Zc.height)).freeze(),this.v(),this instanceof Hf&&this.ic(),this.g("desiredSize",b,a),rl(this)&&(a=this.part,null!==a&&sl(this,a,"width")))}},height:{configurable:!0,get:function(){return this.Zc.height},set:function(a){var b=this.Zc.height;b===a||isNaN(b)&&isNaN(a)||(G&&A(a,"number",O,"height"),b=this.Zc,this.Zc=a=(new Hb(this.Zc.width,a)).freeze(),this.v(),this instanceof Hf&&this.ic(), this.g("desiredSize",b,a),rl(this)&&(a=this.part,null!==a&&sl(this,a,"height")))}},minSize:{configurable:!0,get:function(){return this.fg},set:function(a){var b=this.fg;b.B(a)||(G&&x(a,Hb,O,"minSize"),a=a.copy(),isNaN(a.width)&&(a.width=0),isNaN(a.height)&&(a.height=0),a.freeze(),this.fg=a,this.v(),this.g("minSize",b,a))}},maxSize:{configurable:!0,get:function(){return this.eg},set:function(a){var b=this.eg;b.B(a)||(G&&x(a,Hb,O,"maxSize"),a=a.copy(),isNaN(a.width)&&(a.width= Infinity),isNaN(a.height)&&(a.height=Infinity),a.freeze(),this.eg=a,this.v(),this.g("maxSize",b,a))}},measuredBounds:{configurable:!0,get:function(){return this.oc}},naturalBounds:{configurable:!0,get:function(){return this.wc}},margin:{configurable:!0,get:function(){return this.ah},set:function(a){"number"===typeof a?a=new ic(a):G&&x(a,ic,O,"margin");var b=this.ah;b.B(a)||(this.ah=a=a.L(),this.v(),this.g("margin",b,a))}},transform:{configurable:!0, get:function(){0!==(this.H&2048)===!0&&Cl(this);return this.yb}},le:{configurable:!0,get:function(){0!==(this.H&4096)===!0&&Cl(this);return this.Xh}},alignment:{configurable:!0,get:function(){return this.Bb},set:function(a){var b=this.Bb;b.B(a)||(G&&x(a,Ib,O,"alignment"),a.bc()&&!a.Kb()&&v("GraphObject.alignment for "+this+" must be a real Spot or Spot.Default, not: "+a),this.Bb=a=a.L(),Nl(this),this.g("alignment",b,a))}},column:{configurable:!0,get:function(){return this.Ig}, set:function(a){G&&D(a,O,"column");a=Math.round(a);var b=this.Ig;b!==a&&(0>a&&Aa(a,">= 0",O,"column"),this.Ig=a,this.v(),this.g("column",b,a))}},columnSpan:{configurable:!0,get:function(){return this.wn},set:function(a){G&&A(a,"number",O,"columnSpan");a=Math.round(a);var b=this.wn;b!==a&&(1>a&&Aa(a,">= 1",O,"columnSpan"),this.wn=a,this.v(),this.g("columnSpan",b,a))}},row:{configurable:!0,get:function(){return this.Ap},set:function(a){G&&D(a,O,"row");a=Math.round(a);var b= this.Ap;b!==a&&(0>a&&Aa(a,">= 0",O,"row"),this.Ap=a,this.v(),this.g("row",b,a))}},rowSpan:{configurable:!0,get:function(){return this.Bp},set:function(a){G&&A(a,"number",O,"rowSpan");a=Math.round(a);var b=this.Bp;b!==a&&(1>a&&Aa(a,">= 1",O,"rowSpan"),this.Bp=a,this.v(),this.g("rowSpan",b,a))}},spanAllocation:{configurable:!0,get:function(){return this.Rp},set:function(a){var b=this.Rp;b!==a&&(null!==a&&A(a,"function",O,"spanAllocation"),this.Rp=a,this.v(),this.g("spanAllocation", b,a))}},alignmentFocus:{configurable:!0,get:function(){return this.Tk},set:function(a){var b=this.Tk;b.B(a)||(G&&x(a,Ib,O,"alignmentFocus"),!G||!a.bc()||a.Kb()||a.Eq()&&this instanceof V||v("GraphObject.alignmentFocus must be a real Spot or Spot.Default, not: "+a),this.Tk=a=a.L(),this.v(),this.g("alignmentFocus",b,a))}},portId:{configurable:!0,get:function(){return this.np},set:function(a){var b=this.np;if(b!==a){G&&null!==a&&A(a,"string",O,"portId");var c=this.part;null=== -c||c instanceof V||v("Cannot set portID on a Link: "+a);null!==b&&null!==c&&bm(c,this);this.np=a;null!==a&&null!==c&&(c.Te=!0,cm(c,this));this.g("portId",b,a)}}},toSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Ah:Dc},set:function(a){this.Nc();var b=this.T.Ah;b.B(a)||(G&&x(a,Ib,O,"toSpot"),a=a.L(),this.T.Ah=a,this.g("toSpot",b,a),Rl(this))}},toEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.yh:10},set:function(a){this.Nc(); -var b=this.T.yh;b!==a&&(G&&A(a,"number",O,"toEndSegmentLength"),0>a&&Aa(a,">= 0",O,"toEndSegmentLength"),this.T.yh=a,this.g("toEndSegmentLength",b,a),Rl(this))}},toShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.zh:0},set:function(a){this.Nc();var b=this.T.zh;b!==a&&(G&&A(a,"number",O,"toShortLength"),this.T.zh=a,this.g("toShortLength",b,a),Rl(this))}},toLinkable:{configurable:!0,get:function(){return null!==this.T?this.T.Yp:null},set:function(a){this.Nc(); -var b=this.T.Yp;b!==a&&(G&&null!==a&&A(a,"boolean",O,"toLinkable"),this.T.Yp=a,this.g("toLinkable",b,a))}},toMaxLinks:{configurable:!0,get:function(){return null!==this.T?this.T.Zp:Infinity},set:function(a){this.Nc();var b=this.T.Zp;b!==a&&(G&&A(a,"number",O,"toMaxLinks"),0>a&&Aa(a,">= 0",O,"toMaxLinks"),this.T.Zp=a,this.g("toMaxLinks",b,a))}},fromSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Vg:Dc},set:function(a){this.Nc();var b=this.T.Vg;b.B(a)||(G&& -x(a,Ib,O,"fromSpot"),a=a.L(),this.T.Vg=a,this.g("fromSpot",b,a),Rl(this))}},fromEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.Tg:10},set:function(a){this.Nc();var b=this.T.Tg;b!==a&&(G&&A(a,"number",O,"fromEndSegmentLength"),0>a&&Aa(a,">= 0",O,"fromEndSegmentLength"),this.T.Tg=a,this.g("fromEndSegmentLength",b,a),Rl(this))}},fromShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.Ug:0},set:function(a){this.Nc();var b=this.T.Ug; -b!==a&&(G&&A(a,"number",O,"fromShortLength"),this.T.Ug=a,this.g("fromShortLength",b,a),Rl(this))}},fromLinkable:{configurable:!0,get:function(){return null!==this.T?this.T.Yn:null},set:function(a){this.Nc();var b=this.T.Yn;b!==a&&(G&&null!==a&&A(a,"boolean",O,"fromLinkable"),this.T.Yn=a,this.g("fromLinkable",b,a))}},fromMaxLinks:{configurable:!0,get:function(){return null!==this.T?this.T.Zn:Infinity},set:function(a){this.Nc();var b=this.T.Zn;b!==a&&(G&&A(a,"number",O,"fromMaxLinks"), +c||c instanceof V||v("Cannot set portID on a Link: "+a);null!==b&&null!==c&&bm(c,this);this.np=a;null!==a&&null!==c&&(c.Te=!0,cm(c,this));this.g("portId",b,a)}}},toSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Ah:Dc},set:function(a){this.Oc();var b=this.T.Ah;b.B(a)||(G&&x(a,Ib,O,"toSpot"),a=a.L(),this.T.Ah=a,this.g("toSpot",b,a),Rl(this))}},toEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.yh:10},set:function(a){this.Oc(); +var b=this.T.yh;b!==a&&(G&&A(a,"number",O,"toEndSegmentLength"),0>a&&Aa(a,">= 0",O,"toEndSegmentLength"),this.T.yh=a,this.g("toEndSegmentLength",b,a),Rl(this))}},toShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.zh:0},set:function(a){this.Oc();var b=this.T.zh;b!==a&&(G&&A(a,"number",O,"toShortLength"),this.T.zh=a,this.g("toShortLength",b,a),Rl(this))}},toLinkable:{configurable:!0,get:function(){return null!==this.T?this.T.Yp:null},set:function(a){this.Oc(); +var b=this.T.Yp;b!==a&&(G&&null!==a&&A(a,"boolean",O,"toLinkable"),this.T.Yp=a,this.g("toLinkable",b,a))}},toMaxLinks:{configurable:!0,get:function(){return null!==this.T?this.T.Zp:Infinity},set:function(a){this.Oc();var b=this.T.Zp;b!==a&&(G&&A(a,"number",O,"toMaxLinks"),0>a&&Aa(a,">= 0",O,"toMaxLinks"),this.T.Zp=a,this.g("toMaxLinks",b,a))}},fromSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Vg:Dc},set:function(a){this.Oc();var b=this.T.Vg;b.B(a)||(G&& +x(a,Ib,O,"fromSpot"),a=a.L(),this.T.Vg=a,this.g("fromSpot",b,a),Rl(this))}},fromEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.Tg:10},set:function(a){this.Oc();var b=this.T.Tg;b!==a&&(G&&A(a,"number",O,"fromEndSegmentLength"),0>a&&Aa(a,">= 0",O,"fromEndSegmentLength"),this.T.Tg=a,this.g("fromEndSegmentLength",b,a),Rl(this))}},fromShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.Ug:0},set:function(a){this.Oc();var b=this.T.Ug; +b!==a&&(G&&A(a,"number",O,"fromShortLength"),this.T.Ug=a,this.g("fromShortLength",b,a),Rl(this))}},fromLinkable:{configurable:!0,get:function(){return null!==this.T?this.T.Yn:null},set:function(a){this.Oc();var b=this.T.Yn;b!==a&&(G&&null!==a&&A(a,"boolean",O,"fromLinkable"),this.T.Yn=a,this.g("fromLinkable",b,a))}},fromMaxLinks:{configurable:!0,get:function(){return null!==this.T?this.T.Zn:Infinity},set:function(a){this.Oc();var b=this.T.Zn;b!==a&&(G&&A(a,"number",O,"fromMaxLinks"), 0>a&&Aa(a,">= 0",O,"fromMaxLinks"),this.T.Zn=a,this.g("fromMaxLinks",b,a))}},cursor:{configurable:!0,get:function(){return this.ci},set:function(a){var b=this.ci;b!==a&&(A(a,"string",O,"cursor"),this.ci=a,this.g("cursor",b,a))}},click:{configurable:!0,get:function(){return null!==this.S?this.S.Hg:null},set:function(a){ol(this);var b=this.S.Hg;b!==a&&(null!==a&&A(a,"function",O,"click"),this.S.Hg=a,this.g("click",b,a))}},doubleClick:{configurable:!0,get:function(){return null!== this.S?this.S.Pg:null},set:function(a){ol(this);var b=this.S.Pg;b!==a&&(null!==a&&A(a,"function",O,"doubleClick"),this.S.Pg=a,this.g("doubleClick",b,a))}},contextClick:{configurable:!0,get:function(){return null!==this.S?this.S.Jg:null},set:function(a){ol(this);var b=this.S.Jg;b!==a&&(null!==a&&A(a,"function",O,"contextClick"),this.S.Jg=a,this.g("contextClick",b,a))}},mouseEnter:{configurable:!0,get:function(){return null!==this.S?this.S.eh:null},set:function(a){ol(this); var b=this.S.eh;b!==a&&(null!==a&&A(a,"function",O,"mouseEnter"),this.S.eh=a,this.g("mouseEnter",b,a))}},mouseLeave:{configurable:!0,get:function(){return null!==this.S?this.S.hh:null},set:function(a){ol(this);var b=this.S.hh;b!==a&&(null!==a&&A(a,"function",O,"mouseLeave"),this.S.hh=a,this.g("mouseLeave",b,a))}},mouseOver:{configurable:!0,get:function(){return null!==this.S?this.S.ih:null},set:function(a){ol(this);var b=this.S.ih;b!==a&&(null!==a&&A(a,"function",O,"mouseOver"), @@ -1033,7 +1033,7 @@ this.S?this.S.dh:null},set:function(a){ol(this);var b=this.S.dh;b!==a&&(null!==a b!==a&&(null!==a&&A(a,"function",O,"actionMove"),this.S.jn=a,this.g("actionMove",b,a))}},actionUp:{configurable:!0,get:function(){return null!==this.S?this.S.kn:null},set:function(a){ol(this);var b=this.S.kn;b!==a&&(null!==a&&A(a,"function",O,"actionUp"),this.S.kn=a,this.g("actionUp",b,a))}},actionCancel:{configurable:!0,get:function(){return null!==this.S?this.S.gn:null},set:function(a){ol(this);var b=this.S.gn;b!==a&&(null!==a&&A(a,"function",O,"actionCancel"),this.S.gn= a,this.g("actionCancel",b,a))}},toolTip:{configurable:!0,get:function(){return null!==this.S?this.S.Bh:null},set:function(a){ol(this);var b=this.S.Bh;b!==a&&(!G||null===a||a instanceof Je||a instanceof Oe||v("GraphObject.toolTip must be an Adornment or HTMLInfo."),this.S.Bh=a,this.g("toolTip",b,a))}},contextMenu:{configurable:!0,get:function(){return null!==this.S?this.S.Kg:null},set:function(a){ol(this);var b=this.S.Kg;b!==a&&(!G||a instanceof Je||a instanceof Oe||v("GraphObject.contextMenu must be an Adornment or HTMLInfo."), this.S.Kg=a,this.g("contextMenu",b,a))}}});O.prototype.trigger=O.prototype.tw;O.prototype.findBindingPanel=O.prototype.Jh;O.prototype.findTemplateBinder=O.prototype.nA;O.prototype.setProperties=O.prototype.Vm;O.prototype.apply=O.prototype.apply;O.prototype.attach=O.prototype.qv;O.prototype.set=O.prototype.set;O.prototype.isEnabledObject=O.prototype.Mf;O.prototype.isVisibleObject=O.prototype.Nf;O.prototype.isContainedBy=O.prototype.yg;O.prototype.getNearestIntersectionPoint=O.prototype.Vs; -O.prototype.getLocalPoint=O.prototype.Us;O.prototype.getDocumentScale=O.prototype.If;O.prototype.getDocumentAngle=O.prototype.Xi;O.prototype.getDocumentBounds=O.prototype.Yi;O.prototype.getDocumentPoint=O.prototype.ja;O.prototype.intersectsRect=O.prototype.Oc;O.prototype.containedInRect=O.prototype.Hh;O.prototype.containsRect=O.prototype.Qe;O.prototype.containsPoint=O.prototype.ca;O.prototype.raiseChanged=O.prototype.g;O.prototype.raiseChangedEvent=O.prototype.ab;O.prototype.addCopyProperty=O.prototype.Nx; +O.prototype.getLocalPoint=O.prototype.Us;O.prototype.getDocumentScale=O.prototype.If;O.prototype.getDocumentAngle=O.prototype.Xi;O.prototype.getDocumentBounds=O.prototype.Yi;O.prototype.getDocumentPoint=O.prototype.ja;O.prototype.intersectsRect=O.prototype.Pc;O.prototype.containedInRect=O.prototype.Hh;O.prototype.containsRect=O.prototype.Qe;O.prototype.containsPoint=O.prototype.ca;O.prototype.raiseChanged=O.prototype.g;O.prototype.raiseChangedEvent=O.prototype.ab;O.prototype.addCopyProperty=O.prototype.Nx; var Wl=null;O.className="GraphObject";Wl=new xb; Zl("Button",function(){function a(a,b){return null!==a.diagram.ac(a.documentPoint,function(a){for(;null!==a.panel&&!a.isActionable;)a=a.panel;return a},function(a){return a===b})}var b=Vl(W,W.Auto,{isActionable:!0,enabledChanged:function(a,b){if(a instanceof W){var c=a.eb("ButtonBorder");null!==c&&(c.fill=b?a._buttonFillNormal:a._buttonFillDisabled)}},cursor:"pointer",_buttonFillNormal:"#F5F5F5",_buttonStrokeNormal:"#BDBDBD",_buttonFillOver:"#E0E0E0",_buttonStrokeOver:"#9E9E9E",_buttonFillPressed:"#BDBDBD", _buttonStrokePressed:"#9E9E9E",_buttonFillDisabled:"#E5E5E5"},Vl(Hf,{name:"ButtonBorder",figure:"RoundedRectangle",spot1:new Ib(0,0,2.76142374915397,2.761423749153969),spot2:new Ib(1,1,-2.76142374915397,-2.761423749153969),parameter1:2,parameter2:2,fill:"#F5F5F5",stroke:"#BDBDBD"}));b.mouseEnter=function(a,b){if(b.Mf()&&b instanceof W&&(a=b.eb("ButtonBorder"),a instanceof Hf)){var c=b._buttonFillOver;b._buttonFillNormal=a.fill;a.fill=c;c=b._buttonStrokeOver;b._buttonStrokeNormal=a.stroke;a.stroke= @@ -1061,42 +1061,42 @@ function Kj(a,b){this.ownerDocument=a=void 0===b?sa.document:b;this.YA="http://w Kj.prototype.resize=function(a,b,c,d){return this.width!==a||this.height!==b?(this.style.width=c+"px",this.style.height=d+"px",this.Qa.setAttributeNS(null,"width",c+"px"),this.Qa.setAttributeNS(null,"height",d+"px"),this.Qa.setAttributeNS(null,"viewBox","0 0 "+c+" "+d),this.context.ox.firstElementChild.setAttributeNS(null,"width",c+"px"),this.context.ox.firstElementChild.setAttributeNS(null,"height",d+"px"),!0):!1}; Kj.prototype.Tb=function(a,b,c){a=this.ownerDocument.createElementNS(this.YA,a);if(Ga(b))for(var d in b)a.setAttributeNS("href"===d?"http://www.w3.org/1999/xlink":"",d,b[d]);void 0!==c&&(a.textContent=c);return a};Kj.prototype.getBoundingClientRect=function(){return this.Qa.getBoundingClientRect()};Kj.prototype.focus=function(){this.Qa.focus()};Kj.prototype.by=function(){this.ownerDocument=null}; oa.Object.defineProperties(Kj.prototype,{width:{configurable:!0,get:function(){return this.Qa.width.baseVal.value},set:function(a){this.Qa.width=a}},height:{configurable:!0,get:function(){return this.Qa.height.baseVal.value},set:function(a){this.Qa.height=a}},style:{configurable:!0,get:function(){return this.Qa.style}}});Kj.className="SVGSurface"; -function fm(a){this.wt=a;this.svg=a.Qa;this.stack=[];this.kd=[];this.fillStyle="#000000";this.font="10px sans-serif";this.globalAlpha=1;this.lineCap="butt";this.lineDashOffset=0;this.lineJoin="miter";this.lineWidth=1;this.miterLimit=10;this.shadowBlur=0;this.shadowColor="rgba(0, 0, 0, 0)";this.shadowOffsetY=this.shadowOffsetX=0;this.strokeStyle="#000000";this.textAlign="start";this.clipInsteadOfFill=!1;this.ng=this.ts=this.ss=0;this.dt=null;this.path=[];this.ku=!1;this.th=null;this.uh=0;this.Re=new dm; -gm(this,1,0,0,1,0,0);var b=pb++,c=this.Tb("clipPath",{id:"mainClip"+b});c.appendChild(this.Tb("rect",{x:0,y:0,width:a.width,height:a.height}));this.ox=c;this.wt.Qa.appendChild(c);this.kd[0].setAttributeNS(null,"clip-path","url(#mainClip"+b+")");this.$A={}}t=fm.prototype; +function fm(a){this.wt=a;this.svg=a.Qa;this.stack=[];this.ld=[];this.fillStyle="#000000";this.font="10px sans-serif";this.globalAlpha=1;this.lineCap="butt";this.lineDashOffset=0;this.lineJoin="miter";this.lineWidth=1;this.miterLimit=10;this.shadowBlur=0;this.shadowColor="rgba(0, 0, 0, 0)";this.shadowOffsetY=this.shadowOffsetX=0;this.strokeStyle="#000000";this.textAlign="start";this.clipInsteadOfFill=!1;this.ng=this.ts=this.ss=0;this.dt=null;this.path=[];this.ku=!1;this.th=null;this.uh=0;this.Re=new dm; +gm(this,1,0,0,1,0,0);var b=qb++,c=this.Tb("clipPath",{id:"mainClip"+b});c.appendChild(this.Tb("rect",{x:0,y:0,width:a.width,height:a.height}));this.ox=c;this.wt.Qa.appendChild(c);this.ld[0].setAttributeNS(null,"clip-path","url(#mainClip"+b+")");this.$A={}}t=fm.prototype; t.arc=function(a,b,c,d,e,f,g,h){var k=2*Math.PI,l=k-1E-6,m=c*Math.cos(d),n=c*Math.sin(d),p=a+m,r=b+n,q=f?0:1;d=f?d-e:e-d;(1E-6d&&(d=d%k+k);d>l?(this.path.push(["A",c,c,0,1,q,a-m,b-n]),this.path.push(["A",c,c,0,1,q,p,r])):1E-6=Math.PI),q,a+c*Math.cos(e),b+c*Math.sin(e)])};t.beginPath=function(){this.path=[]};t.bezierCurveTo=function(a,b,c,d,e,f){this.path.push(["C",a,b,c,d,e,f])};t.clearRect=function(){}; t.clip=function(){this.addPath("clipPath",this.path,this.Re)};t.closePath=function(){this.path.push(["z"])};t.createLinearGradient=function(a,b,c,d){var e=new em("linear");e.x1=a;e.y1=b;e.x2=c;e.y2=d;return e}; -t.createPattern=function(a){var b="";a instanceof HTMLCanvasElement&&(b=a.toDataURL());a instanceof HTMLImageElement&&(b=a.getAttribute("src"));var c=this.$A;if(c[b])return"url(#"+c[b]+")";var d="PATTERN"+pb++,e={x:0,y:0,width:a.width,height:a.height,href:b};a=this.Tb("pattern",{width:a.width,height:a.height,id:d,patternUnits:"userSpaceOnUse"});a.appendChild(this.Tb(Mk,e));this.svg.appendChild(a);c[b]=d;return"url(#"+d+")"}; +t.createPattern=function(a){var b="";a instanceof HTMLCanvasElement&&(b=a.toDataURL());a instanceof HTMLImageElement&&(b=a.getAttribute("src"));var c=this.$A;if(c[b])return"url(#"+c[b]+")";var d="PATTERN"+qb++,e={x:0,y:0,width:a.width,height:a.height,href:b};a=this.Tb("pattern",{width:a.width,height:a.height,id:d,patternUnits:"userSpaceOnUse"});a.appendChild(this.Tb(Mk,e));this.svg.appendChild(a);c[b]=d;return"url(#"+d+")"}; t.createRadialGradient=function(a,b,c,d,e,f){var g=new em("radial");g.x1=a;g.y1=b;g.r1=c;g.x2=d;g.y2=e;g.r2=f;return g}; t.drawImage=function(a,b,c,d,e,f,g,h,k){var l="";a instanceof HTMLCanvasElement&&(l=a.toDataURL());a instanceof HTMLImageElement&&(l=a.getAttribute("src"));var m=a instanceof HTMLImageElement?a.naturalWidth:a.width,n=a instanceof HTMLImageElement?a.naturalHeight:a.height;void 0===d&&(f=b,g=c,h=d=m,k=e=n);d=d||0;e=e||0;f=f||0;g=g||0;h=h||0;k=k||0;a={x:0,y:0,width:m||d,height:n||e,href:l};L.da(d,h)&&L.da(e,k)?-1===l.toLowerCase().indexOf(".svg")&&-1===l.toLowerCase().indexOf("data:image/svg")&&(a.preserveAspectRatio= -"xMidYMid slice"):a.preserveAspectRatio="none";l="";h/=d;k/=e;if(0!==f||0!==g)l+=" translate("+f+", "+g+")";if(1!==h||1!==k)l+=" scale("+h+", "+k+")";if(0!==b||0!==c)l+=" translate("+-b+", "+-c+")";if(0!==b||0!==c||d!==m||e!==n)f="CLIP"+pb++,g=this.Tb("clipPath",{id:f}),g.appendChild(this.Tb("rect",{x:b,y:c,width:d,height:e})),this.svg.appendChild(g),a["clip-path"]="url(#"+f+")";hm(this,Mk,a,this.Re,l);this.addElement(Mk,a)};t.fill=function(){this.addPath("fill",this.path,this.Re)}; +"xMidYMid slice"):a.preserveAspectRatio="none";l="";h/=d;k/=e;if(0!==f||0!==g)l+=" translate("+f+", "+g+")";if(1!==h||1!==k)l+=" scale("+h+", "+k+")";if(0!==b||0!==c)l+=" translate("+-b+", "+-c+")";if(0!==b||0!==c||d!==m||e!==n)f="CLIP"+qb++,g=this.Tb("clipPath",{id:f}),g.appendChild(this.Tb("rect",{x:b,y:c,width:d,height:e})),this.svg.appendChild(g),a["clip-path"]="url(#"+f+")";hm(this,Mk,a,this.Re,l);this.addElement(Mk,a)};t.fill=function(){this.addPath("fill",this.path,this.Re)}; t.Gf=function(){this.clipInsteadOfFill?this.clip():this.fill()};t.fillRect=function(a,b,c,d){a=[a,b,c,d];a={x:a[0],y:a[1],width:a[2],height:a[3]};hm(this,"fill",a,this.Re);this.addElement("rect",a)};t.fillText=function(a,b,c){a=[a,b,c];b=this.textAlign;"left"===b?b="start":"right"===b?b="end":"center"===b&&(b="middle");b={x:a[1],y:a[2],style:"font: "+this.font,"text-anchor":b};hm(this,"fill",b,this.Re);this.addElement("text",b,a[0])};t.lineTo=function(a,b){this.path.push(["L",a,b])}; t.moveTo=function(a,b){this.path.push(["M",a,b])};t.quadraticCurveTo=function(a,b,c,d){this.path.push(["Q",a,b,c,d])};t.rect=function(a,b,c,d){this.path.push(["M",a,b],["L",a+c,b],["L",a+c,b+d],["L",a,b+d],["z"])}; t.restore=function(){this.Re=this.stack.pop();this.path=this.stack.pop();var a=this.stack.pop();this.fillStyle=a.fillStyle;this.font=a.font;this.globalAlpha=a.globalAlpha;this.lineCap=a.lineCap;this.lineDashOffset=a.lineDashOffset;this.lineJoin=a.lineJoin;this.lineWidth=a.lineWidth;this.miterLimit=a.miterLimit;this.shadowBlur=a.shadowBlur;this.shadowColor=a.shadowColor;this.shadowOffsetX=a.shadowOffsetX;this.shadowOffsetY=a.shadowOffsetY;this.strokeStyle=a.strokeStyle;this.textAlign=a.textAlign}; t.save=function(){this.stack.push({fillStyle:this.fillStyle,font:this.font,globalAlpha:this.globalAlpha,lineCap:this.lineCap,lineDashOffset:this.lineDashOffset,lineJoin:this.lineJoin,lineWidth:this.lineWidth,miterLimit:this.miterLimit,shadowBlur:this.shadowBlur,shadowColor:this.shadowColor,shadowOffsetX:this.shadowOffsetX,shadowOffsetY:this.shadowOffsetY,strokeStyle:this.strokeStyle,textAlign:this.textAlign});for(var a=[],b=0;bb.offset?1:-1});for(e=0;eg.width+g.x||g.x> k.width+k.x||n>g.height+g.y||g.y>k.height+k.y)return!0;k=!0;gm(a,1,0,0,1,0,0);a.save();a.beginPath();a.rect(m,n,p,l);a.clip()}if(this.dj()&&!this.isVisible())return!0;a.Re.Sa=[1,0,0,1,0,0];(this instanceof Yg&&1b?(this.scale(b/a,1),this.translate((a-b)/2,0)):b>a&&(this.scale(1,a/b),this.translate(0,(b-a)/2));this.vn?this.clip():this.fill();a>b?(this.translate(-(a-b)/2,0),this.scale(1/(b/a),1)):b>a&&(this.translate(0,-(b-a)/2),this.scale(1,1/(a/b)))}else this.vn?this.clip():this.fill()};t.jj=function(){this.vn||this.stroke()};t.pw=function(a,b,c){this.ss=a;this.ts=b;this.ng=c}; t.Ns=function(a,b){var c=this.aa;void 0!==c.setLineDash&&(c.setLineDash(a),c.lineDashOffset=b)};t.Ls=function(){var a=this.aa;void 0!==a.setLineDash&&(a.setLineDash(jm),a.lineDashOffset=0)};t.Kc=function(a){a&&(this.Lt="");this.Kt=this.Mt=""}; oa.Object.defineProperties(Il.prototype,{fillStyle:{configurable:!0,get:function(){return this.aa.fillStyle},set:function(a){this.Kt!==a&&(this.Kt=this.aa.fillStyle=a)}},font:{configurable:!0,get:function(){return this.aa.font},set:function(a){this.Lt!==a&&(this.Lt=this.aa.font=a)}},globalAlpha:{configurable:!0,get:function(){return this.aa.globalAlpha},set:function(a){this.aa.globalAlpha=a}},lineCap:{configurable:!0,get:function(){return this.aa.lineCap}, @@ -1104,8 +1104,8 @@ set:function(a){this.aa.lineCap=a}},lineDashOffset:{configurable:!0,get:function a}},shadowBlur:{configurable:!0,get:function(){return this.aa.shadowBlur},set:function(a){this.aa.shadowBlur=a}},shadowColor:{configurable:!0,get:function(){return this.aa.shadowColor},set:function(a){this.aa.shadowColor=a}},shadowOffsetX:{configurable:!0,get:function(){return this.aa.shadowOffsetX},set:function(a){this.aa.shadowOffsetX=a}},shadowOffsetY:{configurable:!0,get:function(){return this.aa.shadowOffsetY},set:function(a){this.aa.shadowOffsetY= a}},strokeStyle:{configurable:!0,get:function(){return this.aa.strokeStyle},set:function(a){this.Mt!==a&&(this.Mt=this.aa.strokeStyle=a)}},textAlign:{configurable:!0,get:function(){return this.aa.textAlign},set:function(a){this.aa.textAlign=a}},imageSmoothingEnabled:{configurable:!0,get:function(){return this.aa.imageSmoothingEnabled},set:function(a){this.aa.imageSmoothingEnabled=a}},clipInsteadOfFill:{configurable:!0,get:function(){return this.vn}, set:function(a){this.vn=a}}});var jm=Object.freeze([]);Il.className="CanvasSurfaceContext";function km(){this.P=this.o=this.F=this.j=0}km.className="ColorNumbers"; -function Al(a,b){lm||(mm(),lm=!0);ab(this);this.u=!1;void 0===a?(this.oa=Hl,this.al="black"):"string"===typeof a?(this.oa=Hl,G&&!nm(a)&&v('Color "'+a+'" is not a valid color string for Brush constructor'),this.al=a):(G&&cb(a,Al,Al,"constructor:type"),this.oa=a,this.al="black");a=this.oa;a===Kl?(this.Fd=Fc,this.ol=Nc):this.ol=a===Bl?this.Fd=Kc:this.Fd=Dc;this.ws=0;this.xr=NaN;this.ue=this.hs=this.te=null;this.Nt=this.bl=0;b&&Object.assign(this,b)} -Al.prototype.copy=function(){var a=new Al;a.oa=this.oa;a.al=this.al;a.Fd=this.Fd.L();a.ol=this.ol.L();a.ws=this.ws;a.xr=this.xr;null!==this.te&&(a.te=this.te.copy());a.hs=this.hs;return a};t=Al.prototype;t.freeze=function(){this.u=!0;null!==this.te&&this.te.freeze();return this};t.ka=function(){Object.isFrozen(this)&&v("cannot thaw constant: "+this);this.u=!1;null!==this.te&&this.te.ka();return this};t.mb=function(a){a.classType===Al?this.type=a:Ea(this,a)}; +function Al(a,b){lm||(mm(),lm=!0);ab(this);this.u=!1;void 0===a?(this.oa=Hl,this.al="black"):"string"===typeof a?(this.oa=Hl,G&&!nm(a)&&v('Color "'+a+'" is not a valid color string for Brush constructor'),this.al=a):(G&&cb(a,Al,Al,"constructor:type"),this.oa=a,this.al="black");a=this.oa;a===Kl?(this.Gd=Fc,this.ol=Nc):this.ol=a===Bl?this.Gd=Kc:this.Gd=Dc;this.ws=0;this.xr=NaN;this.ue=this.hs=this.te=null;this.Nt=this.bl=0;b&&Object.assign(this,b)} +Al.prototype.copy=function(){var a=new Al;a.oa=this.oa;a.al=this.al;a.Gd=this.Gd.L();a.ol=this.ol.L();a.ws=this.ws;a.xr=this.xr;null!==this.te&&(a.te=this.te.copy());a.hs=this.hs;return a};t=Al.prototype;t.freeze=function(){this.u=!0;null!==this.te&&this.te.freeze();return this};t.ka=function(){Object.isFrozen(this)&&v("cannot thaw constant: "+this);this.u=!1;null!==this.te&&this.te.ka();return this};t.mb=function(a){a.classType===Al?this.type=a:Ea(this,a)}; t.toString=function(){var a="Brush(";if(this.type===Hl)a+=this.color;else if(a=this.type===Kl?a+"Linear ":this.type===Bl?a+"Radial ":this.type===Jl?a+"Pattern ":a+"(unknown) ",a+=this.start+" "+this.end,null!==this.colorStops)for(var b=this.colorStops.iterator;b.next();)a+=" "+b.key+":"+b.value;return a+")"}; t.addColorStop=function(a,b){this.u&&xa(this);("number"!==typeof a||!isFinite(a)||1a)&&Aa(a,"0 <= loc <= 1",Al,"addColorStop:loc");A(b,"string",Al,"addColorStop:color");G&&!nm(b)&&v('Color "'+b+'" is not a valid color string for Brush.addColorStop');null===this.te&&(this.te=new xb);this.te.add(a,b);this.oa===Hl&&(this.type=Kl);this.ue=null;return this}; function nm(a){if("black"===a)return!0;if(""===a)return!1;G&&A(a,"string",Al,"isValidColor");lm||(mm(),lm=!0);var b=om;if(null===b)return!0;b.fillStyle="#000000";var c=b.fillStyle;b.fillStyle=a;if(b.fillStyle!==c)return!0;b.fillStyle="#FFFFFF";c=b.fillStyle;b.fillStyle=a;return b.fillStyle!==c} @@ -1120,7 +1120,7 @@ ei.P+")";default:v("Unknown color space: "+b)}}function ci(a){lm||(mm(),lm=!0);v function di(){var a=um.j/255,b=um.F/255,c=um.o/255,d=Math.max(a,b,c),e=Math.min(a,b,c),f=d-e;e=(d+e)/2;if(0===f)var g=a=0;else{switch(d){case a:g=(b-c)/f%6;break;case b:g=(c-a)/f+2;break;case c:g=(a-b)/f+4}g*=60;0>g&&(g+=360);a=f/(1-Math.abs(2*e-1))}ei.j=Math.round(g);ei.F=Math.round(100*a);ei.o=Math.round(100*e);ei.P=um.P}function wm(a){a/=255;return.04045>=a?a/12.92:Math.pow((a+.055)/1.055,2.4)}function Em(a){return.0031308>=a?12.92*a:1.055*Math.pow(a,1/2.4)-.055} function ym(a){return a>Dm?Math.pow(a,1/3):(Cm*a+16)/116}function Bm(a){var b=a*a*a;return b>Dm?b:(116*a-16)/Cm}function am(a,b){"string"===typeof a?G&&!nm(a)&&v('Color "'+a+'" is not a valid color string for '+b):a instanceof Al||v("Value for "+b+" must be a color string or a Brush, not "+a)}function mm(){om=Wg?(new Nk(null)).context:null} oa.Object.defineProperties(Al.prototype,{type:{configurable:!0,get:function(){return this.oa},set:function(a){this.u&&xa(this,a);cb(a,Al,Al,"type");this.oa=a;this.start.bc()&&(a===Kl?this.start=Fc:a===Bl&&(this.start=Kc));this.end.bc()&&(a===Kl?this.end=Nc:a===Bl&&(this.end=Kc));this.ue=null}},color:{configurable:!0,get:function(){return this.al},set:function(a){this.u&&xa(this,a);G&&!nm(a)&&v('Color "'+a+'" is not a valid color string for Brush.color');this.al=a;this.ue= -null}},start:{configurable:!0,get:function(){return this.Fd},set:function(a){this.u&&xa(this,a);x(a,Ib,Al,"start");this.Fd=a.L();this.ue=null}},end:{configurable:!0,get:function(){return this.ol},set:function(a){this.u&&xa(this,a);x(a,Ib,Al,"end");this.ol=a.L();this.ue=null}},startRadius:{configurable:!0,get:function(){return this.ws},set:function(a){this.u&&xa(this,a);D(a,Al,"startRadius");0>a&&Aa(a,">= zero",Al,"startRadius");this.ws=a;this.ue=null}},endRadius:{configurable:!0, +null}},start:{configurable:!0,get:function(){return this.Gd},set:function(a){this.u&&xa(this,a);x(a,Ib,Al,"start");this.Gd=a.L();this.ue=null}},end:{configurable:!0,get:function(){return this.ol},set:function(a){this.u&&xa(this,a);x(a,Ib,Al,"end");this.ol=a.L();this.ue=null}},startRadius:{configurable:!0,get:function(){return this.ws},set:function(a){this.u&&xa(this,a);D(a,Al,"startRadius");0>a&&Aa(a,">= zero",Al,"startRadius");this.ws=a;this.ue=null}},endRadius:{configurable:!0, enumerable:!0,get:function(){return this.xr},set:function(a){this.u&&xa(this,a);D(a,Al,"endRadius");0>a&&Aa(a,">= zero",Al,"endRadius");this.xr=a;this.ue=null}},colorStops:{configurable:!0,get:function(){return this.te},set:function(a){this.u&&xa(this,a);G&&x(a,xb,Al,"colorStops");this.te=a;this.ue=null}},pattern:{configurable:!0,get:function(){return this.hs},set:function(a){this.u&&xa(this,a);this.hs=a;this.ue=null}}});Al.prototype.isDark=Al.prototype.Ay; Al.prototype.darkenBy=Al.prototype.Rz;Al.prototype.lightenBy=Al.prototype.RA;Al.prototype.addColorStop=Al.prototype.addColorStop;var Dm=216/24389,Cm=24389/27,zm=[95.047,100,108.883],om=null,um=new km,ei=new km,xm=new km,Am=new km,lm=!1;Al.className="Brush";var Hl;Al.Solid=Hl=new F(Al,"Solid",0);var Kl;Al.Linear=Kl=new F(Al,"Linear",1);var Bl;Al.Radial=Bl=new F(Al,"Radial",2);var Jl;Al.Pattern=Jl=new F(Al,"Pattern",4);var pm;Al.Lab=pm=new F(Al,"Lab",5);var Fm;Al.HSL=Fm=new F(Al,"HSL",6); Al.randomColor=function(a,b){void 0===a&&(a=128);G&&(D(a,Al,"randomColor:min"),(0>a||255b.length&&(b="0"+b);2>d.length&&(d="0"+d);2>a.length&&(a="0"+a);return"#"+b+d+ @@ -1151,29 +1151,29 @@ Mm.prototype.arrange=function(a,b){var c=b.length,d=a.sb(),e=d.measuredBounds,f= p.Kb()&&(p=a.defaultAlignment),p.fb()||(p=Kc),k=f.width*p.x+p.offsetX-k*p.x+g.left+f.x,g=f.height*p.y+p.offsetY-m*p.y+g.top+f.y,h.visible&&(nc(f.x,f.y,f.width,f.height,k,g,l.width,l.height)?h.arrange(k,g,l.width,l.height):h.arrange(k,g,l.width,l.height,new M(f.x,f.y,f.width,f.height))));M.free(f)};function Pm(){this.ta="Base";this.name="Table"}na(Pm,Yl); Pm.prototype.measure=function(a,b,c,d,e){for(var f=d.length,g=Ma(),h=Ma(),k=0;kaa&&(Xa=Math.max(aa-Gc,0));var Ag=0===P.ma;P.fc=P.fc+Xa;P.actual=P.ma+Xa;aa=Math.max(aa-(Xa+(Ag?Gc:0)),0)}if(1===Jb.columnSpan&&(tb===tg||tb===jl)){P=a.getColumnDefinition(jc);var Hh=P.Lc();Xa=Math.max(zc-P.actual,0);Xa+Hh>S&&(Xa=Math.max(S-Hh,0));var Rn=0===P.ma;P.fc=P.fc+Xa;P.actual=P.ma+Xa;S=Math.max(S-(Xa+(Rn?Hh:0)),0)}ye&&Jb.Ak()}}}}}Pa(z); -var Wd=0,ze=0;f=a.columnCount;for(var Bg=0;Bg= -a.rowCount);Sf++)P=a.getRowDefinition(Za.row+Sf),Xa=0,Xa=tb===Fd||tb===jl?Math.max(P.minimum,0===Be[Za.row+Sf]?P.maximum:Math.min(Be[Za.row+Sf],P.maximum)):Math.max(P.minimum,isNaN(P.yc)?P.maximum:Math.min(P.yc,P.maximum)),ad.height+=Xa,ae+=P.minimum;for(var Dd=1;Dd=a.columnCount);Dd++)P=a.getColumnDefinition(Za.column+Dd),Xa=0,Xa=tb===Fd||tb===il?Math.max(P.minimum,0===Cd[Za.column+Dd]?P.maximum:Math.min(Cd[Za.column+Dd],P.maximum)):Math.max(P.minimum,isNaN(P.yc)?P.maximum: -Math.min(P.yc,P.maximum)),ad.width+=Xa,Lh+=P.minimum;ob.width+=ad.width;ob.height+=ad.height;var Tf=Za.margin,Ti=Tf.right+Tf.left,De=Tf.top+Tf.bottom;Za.measure(ob.width,ob.height,Lh,ae);for(var Dg=Za.measuredBounds,Uf=Math.max(Dg.width+Ti,0),Ui=Math.max(Dg.height+De,0),qf=0,kd=0;kd=a.rowCount);kd++)P=a.getRowDefinition(Za.row+kd),qf+=P.total||0;if(qf=Ed)&&!(Za.row+ +void 0!==P&&(P.actual=0)}Y=a.Db;f=Y.length;for(var ma=0;maaa&&(Xa=Math.max(aa-Gc,0));var Ag=0===P.ma;P.fc=P.fc+Xa;P.actual=P.ma+Xa;aa=Math.max(aa-(Xa+(Ag?Gc:0)),0)}if(1===Jb.columnSpan&&(ob===tg||ob===jl)){P=a.getColumnDefinition(jc);var Hh=P.Mc();Xa=Math.max(zc-P.actual,0);Xa+Hh>S&&(Xa=Math.max(S-Hh,0));var Rn=0===P.ma;P.fc=P.fc+Xa;P.actual=P.ma+Xa;S=Math.max(S-(Xa+(Rn?Hh:0)),0)}ye&&Jb.Ak()}}}}}Pa(z); +var Wd=0,ze=0;f=a.columnCount;for(var Bg=0;Bg= +a.rowCount);Sf++)P=a.getRowDefinition(Za.row+Sf),Xa=0,Xa=ob===Fd||ob===jl?Math.max(P.minimum,0===Be[Za.row+Sf]?P.maximum:Math.min(Be[Za.row+Sf],P.maximum)):Math.max(P.minimum,isNaN(P.yc)?P.maximum:Math.min(P.yc,P.maximum)),ad.height+=Xa,ae+=P.minimum;for(var Dd=1;Dd=a.columnCount);Dd++)P=a.getColumnDefinition(Za.column+Dd),Xa=0,Xa=ob===Fd||ob===il?Math.max(P.minimum,0===Cd[Za.column+Dd]?P.maximum:Math.min(Cd[Za.column+Dd],P.maximum)):Math.max(P.minimum,isNaN(P.yc)?P.maximum: +Math.min(P.yc,P.maximum)),ad.width+=Xa,Lh+=P.minimum;pb.width+=ad.width;pb.height+=ad.height;var Tf=Za.margin,Ti=Tf.right+Tf.left,De=Tf.top+Tf.bottom;Za.measure(pb.width,pb.height,Lh,ae);for(var Dg=Za.measuredBounds,Uf=Math.max(Dg.width+Ti,0),Ui=Math.max(Dg.height+De,0),qf=0,kd=0;kd=a.rowCount);kd++)P=a.getRowDefinition(Za.row+kd),qf+=P.total||0;if(qf=Ed)&&!(Za.row+ Ee>=a.rowCount);Ee++){P=a.getRowDefinition(Za.row+Ee);var Pd=P.ma||0,Mh=Wf(Za,P,Vf);G&&"number"!==typeof Mh&&v(Za+" spanAllocation does not return a number: "+Mh);P.actual=Math.min(P.maximum,Pd+Mh);P.ma!==Pd&&(Ed-=P.ma-Pd)}for(;0Ve&&(P.actual=Math.min(P.maximum,Ve+Ed),P.ma!==Ve&&(Ed-=P.ma-Ve));if(0===P.index)break;P=a.getRowDefinition(P.index-1)}}for(var Nh=0,Oh=0;Oh=a.columnCount);Oh++)P=a.getColumnDefinition(Za.column+ Oh),Nh+=P.total||0;if(Nh=ld)&&!(Za.column+Ph>=a.columnCount);Ph++){P=a.getColumnDefinition(Za.column+Ph);var Tn=P.ma||0,Un=Sn(Za,P,Vi);G&&"number"!==typeof Un&&v(Za+" spanAllocation does not return a number: "+Un);P.actual=Math.min(P.maximum,Tn+Un);P.ma!==Tn&&(ld-=P.ma-Tn)}for(;0xk&&(P.actual=Math.min(P.maximum,xk+ld),P.ma!==xk&&(ld-=P.ma-xk)); -if(0===P.index)break;P=a.getColumnDefinition(P.index-1)}}}}Pa(B);Hb.free(ad);Hb.free(ob);void 0!==Be&&Pa(Be);void 0!==Cd&&Pa(Cd);var Eg=0,Fg=0,yk=a.desiredSize,wr=a.maxSize;tb=vl(a,!0);var Wi=ze=Wd=0,Xi=0;f=a.columnCount;for(var zk=0;zk=a.rowCount);Y++){var T=a.getRowDefinition(w+ -Y);0!==T.ma&&(u.height+=T.total)}for(Y=1;Y=a.columnCount);Y++)T=a.getColumnDefinition(z+Y),0!==T.ma&&(u.width+=T.total);var P=B.ma+u.width,ma=y.ma+u.height;Y=h;T=k;var ia=P,Ba=ma,Na=h,rb=k,sb=P,Xa=ma;h+P>c.width&&(sb=Math.max(c.width-h,0));k+ma>c.height&&(Xa=Math.max(c.height-k,0));var Pb=S.alignment;if(Pb.Kb()){Pb=a.defaultAlignment;Pb.fb()||(Pb=Kc);var Ub=Pb.x;var jd=Pb.y;var jc=Pb.offsetX;Pb=Pb.offsetY;var yc=B.alignment,Oc=y.alignment;yc.fb()&&(Ub=yc.x,jc=yc.offsetX);Oc.fb()&& +Y);0!==T.ma&&(u.height+=T.total)}for(Y=1;Y=a.columnCount);Y++)T=a.getColumnDefinition(z+Y),0!==T.ma&&(u.width+=T.total);var P=B.ma+u.width,ma=y.ma+u.height;Y=h;T=k;var ia=P,Ba=ma,Na=h,sb=k,tb=P,Xa=ma;h+P>c.width&&(tb=Math.max(c.width-h,0));k+ma>c.height&&(Xa=Math.max(c.height-k,0));var Pb=S.alignment;if(Pb.Kb()){Pb=a.defaultAlignment;Pb.fb()||(Pb=Kc);var Ub=Pb.x;var jd=Pb.y;var jc=Pb.offsetX;Pb=Pb.offsetY;var yc=B.alignment,Oc=y.alignment;yc.fb()&&(Ub=yc.x,jc=yc.offsetX);Oc.fb()&& (jd=Oc.y,Pb=Oc.offsetY)}else Ub=Pb.x,jd=Pb.y,jc=Pb.offsetX,Pb=Pb.offsetY;if(isNaN(Ub)||isNaN(jd))jd=Ub=.5,Pb=jc=0;yc=aa.width;Oc=aa.height;var xe=S.margin,Nf=xe.left+xe.right,Jb=xe.top+xe.bottom,ye=Ol(S,y,B,!1);!isNaN(S.desiredSize.width)||ye!==Fd&&ye!==il||(yc=Math.max(P-Nf,0));!isNaN(S.desiredSize.height)||ye!==Fd&&ye!==jl||(Oc=Math.max(ma-Jb,0));P=S.maxSize;ma=S.minSize;yc=Math.min(P.width,yc);Oc=Math.min(P.height,Oc);yc=Math.max(ma.width,yc);Oc=Math.max(ma.height,Oc);P=Oc+Jb;Y+=ia*Ub-(yc+Nf)* -Ub+jc+xe.left;T+=Ba*jd-P*jd+Pb+xe.top;S.visible&&(nc(Na,rb,sb,Xa,Y,T,aa.width,aa.height)?S.arrange(Y,T,yc,Oc):S.arrange(Y,T,yc,Oc,new M(Na,rb,sb,Xa)))}}Hb.free(u);for(a=0;ab)return a%b===c;if(a%b!==c)return!1;b=d.length;for(var e=0;en)z.measure(Infinity,Infinity,0,0),B=z.measuredBounds,b.Tc(B),q.push(B);else{var C=z.segmentIndex,E=z.segmentFraction,J=z.alignmentFocus;J.bc()&&(J=Kc);var S=z.segmentOrientation,aa=z.segmentOffset;if(isNaN(C)){var Y=h.sa;B=Ma();Y.Kv(E,B);var T=K.allocAt(B[0],B[1]);T.add(h.i(0)); +k&&(Ym(a,p,r,k),g=k.measuredBounds,b.Uc(g),q.push(g));g=Kb.alloc();for(var u=K.alloc(),w=K.alloc(),y=0;yn)z.measure(Infinity,Infinity,0,0),B=z.measuredBounds,b.Uc(B),q.push(B);else{var C=z.segmentIndex,E=z.segmentFraction,J=z.alignmentFocus;J.bc()&&(J=Kc);var S=z.segmentOrientation,aa=z.segmentOffset;if(isNaN(C)){var Y=h.sa;B=Ma();Y.Kv(E,B);var T=K.allocAt(B[0],B[1]);T.add(h.i(0)); Y.type===N.j?T.offset(-Y.startX,-Y.startY):(Y=Y.figures.first(),null!==Y&&T.offset(-Y.startX,-Y.startY));Y=B[2];if(S!==hg){var P=h.computeAngle(z,S,Y);z.Cb=P}P=T.x-l.x;var ma=T.y-l.y;K.free(T);Pa(B)}else if(C<-n||C>=n)B=K.alloc(),h.Bg(),h.computeMidPoint(B),Y=h.midAngle,S!==hg&&(P=h.computeAngle(z,S,Y),z.Cb=P),P=B.x-l.x,ma=B.y-l.y,K.free(B);else{P=0;0<=C?(ma=m.M(C),B=Cia+10?0<=C?Y.Ua(ma):ma.Ua(Y):ia>T+10?0<=C?B.Ua(P):P.Ua(B):0<=C?Y.Ua(P):P.Ua(Y)}else Y=0<=C?ma.Ua(B):B.Ua(ma);S!==hg&&(P=h.computeAngle(z,S,Y),z.Cb=P);P=ma.x+(B.x-ma.x)*E-l.x;ma=ma.y+(B.y-ma.y)*E-l.y}z.measure(Infinity,Infinity,0,0);B=z.measuredBounds;T=z.naturalBounds;var Ba=0;z instanceof Hf&&(Ba=z.strokeWidth);ia=T.width+Ba;var Na=T.height+Ba;g.reset();g.translate(-B.x,-B.y);g.scale(z.scale,z.scale);g.rotate(S===hg?z.angle:Y,ia/2,Na/2);S!==Zm&&S!== -$m||g.rotate(90,ia/2,Na/2);S!==an&&S!==bn||g.rotate(-90,ia/2,Na/2);S===cn&&(45Y||225Y)&&g.rotate(-Y,ia/2,Na/2);T=new M(0,0,ia,Na);u.gj(T,J);g.Fa(u);J=-u.x+Ba/2*z.scale;z=-u.y+Ba/2*z.scale;w.assign(aa);Ba=isNaN(aa.x);var rb=isNaN(aa.y);if(Ba||rb){ia=ia/2+3;Na=Na/2+3;var sb=45<=Y&&135>=Y,Xa=225<=Y&&315>=Y;S===hg&&(sb||Xa)?(w.x=rb?ia:aa.y,w.y=Ba?Na:aa.x,sb?0<=C||isNaN(C)&&.5>E||!Ba||(w.y=-Na):Xa&&((0<=C||isNaN(C)&&.5>E)&&Ba&&(w.y=-Na),rb&&(w.x=-ia))):(Ba&&(w.x=0<=C||isNaN(C)&&.5>E?ia: --ia),rb&&(w.y=-Na),w.rotate(Y))}else w.rotate(Y);P+=w.x;ma+=w.y;T.set(B);T.h(P+J,ma+z,B.width,B.height);q.push(T);b.Tc(T)}}if(null!==f)for(d=f.labelNodes;d.next();)d.value.measure(Infinity,Infinity);a.pg=b;a=a.location;a.h(a.x+b.x,a.y+b.y);dc(e,b.width||0,b.height||0);Kb.free(g);K.free(u);K.free(w)}}}}; +P=1ia+10?0<=C?Y.Wa(ma):ma.Wa(Y):ia>T+10?0<=C?B.Wa(P):P.Wa(B):0<=C?Y.Wa(P):P.Wa(Y)}else Y=0<=C?ma.Wa(B):B.Wa(ma);S!==hg&&(P=h.computeAngle(z,S,Y),z.Cb=P);P=ma.x+(B.x-ma.x)*E-l.x;ma=ma.y+(B.y-ma.y)*E-l.y}z.measure(Infinity,Infinity,0,0);B=z.measuredBounds;T=z.naturalBounds;var Ba=0;z instanceof Hf&&(Ba=z.strokeWidth);ia=T.width+Ba;var Na=T.height+Ba;g.reset();g.translate(-B.x,-B.y);g.scale(z.scale,z.scale);g.rotate(S===hg?z.angle:Y,ia/2,Na/2);S!==Zm&&S!== +$m||g.rotate(90,ia/2,Na/2);S!==an&&S!==bn||g.rotate(-90,ia/2,Na/2);S===cn&&(45Y||225Y)&&g.rotate(-Y,ia/2,Na/2);T=new M(0,0,ia,Na);u.gj(T,J);g.Fa(u);J=-u.x+Ba/2*z.scale;z=-u.y+Ba/2*z.scale;w.assign(aa);Ba=isNaN(aa.x);var sb=isNaN(aa.y);if(Ba||sb){ia=ia/2+3;Na=Na/2+3;var tb=45<=Y&&135>=Y,Xa=225<=Y&&315>=Y;S===hg&&(tb||Xa)?(w.x=sb?ia:aa.y,w.y=Ba?Na:aa.x,tb?0<=C||isNaN(C)&&.5>E||!Ba||(w.y=-Na):Xa&&((0<=C||isNaN(C)&&.5>E)&&Ba&&(w.y=-Na),sb&&(w.x=-ia))):(Ba&&(w.x=0<=C||isNaN(C)&&.5>E?ia: +-ia),sb&&(w.y=-Na),w.rotate(Y))}else w.rotate(Y);P+=w.x;ma+=w.y;T.set(B);T.h(P+J,ma+z,B.width,B.height);q.push(T);b.Uc(T)}}if(null!==f)for(d=f.labelNodes;d.next();)d.value.measure(Infinity,Infinity);a.pg=b;a=a.location;a.h(a.x+b.x,a.y+b.y);dc(e,b.width||0,b.height||0);Kb.free(g);K.free(u);K.free(w)}}}}; Xm.prototype.arrange=function(a,b){var c=b.length;if(a instanceof Je||a instanceof R){var d=a,e=null;a instanceof Je&&(e=a,d=e.adornedPart);var f=a instanceof Je?null:d.path,g=a.j;if(0!==g.length){var h=0;if(null!==f&&h=c)q=K.alloc(),r=n,w=q,r.Bg(),r.computeMidPoint(w),r=n.midAngle,l!==hg&&(n=n.computeAngle(g,l,r),g.angle=n),n=q.x,w=q.y, -K.free(q);else{u=0;0<=h?(q=b.m[h],w=hz+10?0<=h?r.Ua(q):q.Ua(r):z>y+10?0<=h?w.Ua(u):u.Ua(w):0<=h?r.Ua(u):u.Ua(r)}else r=0<=h?q.Ua(w):w.Ua(q);l!==hg&&(n=n.computeAngle(g,l,r),g.angle=n);n=q.x+(w.x-q.x)*k;w=q.y+(w.y-q.y)*k}if(p.Eq())g.location=new K(n,w);else{p.bc()&&(p=Kc);q=Kb.alloc();q.reset();q.scale(g.scale,g.scale);q.rotate(g.angle, +K.free(q);else{u=0;0<=h?(q=b.m[h],w=hz+10?0<=h?r.Wa(q):q.Wa(r):z>y+10?0<=h?w.Wa(u):u.Wa(w):0<=h?r.Wa(u):u.Wa(r)}else r=0<=h?q.Wa(w):w.Wa(q);l!==hg&&(n=n.computeAngle(g,l,r),g.angle=n);n=q.x+(w.x-q.x)*k;w=q.y+(w.y-q.y)*k}if(p.Eq())g.location=new K(n,w);else{p.bc()&&(p=Kc);q=Kb.alloc();q.reset();q.scale(g.scale,g.scale);q.rotate(g.angle, 0,0);var B=g.naturalBounds;u=M.allocAt(0,0,B.width,B.height);y=K.alloc();y.gj(u,p);q.Fa(y);p=-y.x;z=-y.y;var C=B.width,E=B.height;B=K.alloc();B.assign(m);var J=isNaN(m.x),S=isNaN(m.y);if(J||S){C=C/2+3;E=E/2+3;var aa=45<=r&&135>=r,Y=225<=r&&315>=r;l===hg&&(aa||Y)?(B.x=S?C:m.y,B.y=J?E:m.x,aa?0<=h||isNaN(h)&&.5>k||!J||(B.y=-E):Y&&((0<=h||isNaN(h)&&.5>k)&&J&&(B.y=-E),S&&(B.x=-C))):(J&&(B.x=0<=h||isNaN(h)&&.5>k?C:-C),S&&(B.y=-E),B.rotate(r))}else B.rotate(r);n+=B.x;w+=B.y;q.Wq(u);p+=u.x;z+=u.y;h=K.allocAt(n+ p,w+z);g.move(h);K.free(h);K.free(B);K.free(y);M.free(u);Kb.free(q)}}null!==e?e.Ek(!1):d.Ek(!1)}}; function Ym(a,b,c,d){if(!1!==Aj(d)){var e=d.strokeWidth;0===e&&a instanceof Je&&a.type===W.Link&&a.adornedObject instanceof Hf&&(e=a.adornedObject.strokeWidth);e*=d.ya;a instanceof R&&null!==a.sa?(a=a.sa.bounds,d.Fe(a.x-e/2,a.y-e/2,a.width+e,a.height+e)):a instanceof Je&&null!==a.adornedPart.sa?(a=a.adornedPart.sa.bounds,d.Fe(a.x-e/2,a.y-e/2,a.width+e,a.height+e)):d.Fe(-(e/2),-(e/2),b+e,c+e);vj(d,!1)}}function dn(){this.ta="Base"}na(dn,Yl); dn.prototype.measure=function(a,b,c,d,e,f,g){var h=a.sb();a.Wg=[];var k=h.margin,l=k.right+k.left,m=k.top+k.bottom;h.measure(b,c,f,g);var n=h.measuredBounds,p=new M(-k.left,-k.top,Math.max(n.width+l,0),Math.max(n.height+m,0));a.Wg.push(p);e.assign(p);for(var r=h.geometry,q=h.strokeWidth,u=r.flattenedSegments,w=r.flattenedLengths,y=r.flattenedTotalLength,z=u.length,B=0,C=0,E=Ma(),J=0;Jia&&(ia+=360);aa.push(ia)}B=P;C=ma}E.push(aa)}if(null===a.Zf){for(var Ba=[],Na=a.W.m,rb=Na.length,sb=0;sbUb))for(var jd=0;jdUb&&Pb.push(yc)}}}}a.Zf=Ba}var Oc=a.Zf;var xe=a.W.m,Nf=xe.length,Jb=0,ye=0,yg=y;a.Gj=[];for(var Fh,Gh=0;Ghtk*Ni*y/a.graduatedRange)){var zg=w[0][0],Bd=0,zc=0;ye=y*tb.graduatedStart-1E-4;yg=y*tb.graduatedEnd+1E-4;var Of=tk*Ni,Gc=a.graduatedTickBase;if(Gca.graduatedMin+Of&&(Gc-=Math.floor((Gc-a.graduatedMin)/Of)*Of);for(var Hh=Oc[Gh],Rn=Gc,Wd=1;Gcy&&(Jb=y),ye<=Jb&&Jb<=yg)){for(var Xd=E[Bd][zc],Od=w[Bd][zc];Bdzg&&zcsc&&.4995sc?0sc||.9995Pi){var uk=1-Math.abs(.5-sc);Xd=(Ae*uk+$c*(1-uk))%360;break a}}}Xd=Ae}if(tb instanceof Yg){var Yd="";null!== -tb.graduatedFunction?(Yd=tb.graduatedFunction(Gc),Yd=null!==Yd&&void 0!==Yd?Yd.toString():""):Yd=(+Gc.toFixed(2)).toString();""!==Yd&&Fh.push({Hm:Oi,angle:Xd,text:Yd})}else Fh.push({Hm:Oi,angle:Xd})}Gc=Rn+Wd*Of}}}a.Gj.push(Fh)}Pa(E);var Kh=a.Gj;if(null!==Kh)for(var Pf=d.length,ob=0;obRf;Rf++){switch(Rf){case 0:tc.h(of,pf);break;case 1:tc.h(of+Qi,pf);break;case 2:tc.h(of,pf+Ri);break;case 3:tc.h(of+Qi,pf+Ri)}tc.rotate(wk+Vb.angle);tc.offset(vk,Qf);0===Cd&&0===Rf?ad.h(tc.x,tc.y,0,0):ad.Ye(tc);tc.offset(-vk,-Qf);tc.rotate(-wk-Vb.angle)}K.free(tc);null!==Ac.Wg&& -Ac.Wg.push(ad);mc(Hc,ad.x,ad.y,ad.width,ad.height)}else if(Vb instanceof Yg){var Za=a,$d=e;null===Za.xh&&(Za.xh=new Yg);var Gb=Za.xh;en(Gb,Vb);var Lh=Vb.alignmentFocus;Lh.bc()&&(Lh=Fc);for(var ae=Vb.segmentOrientation,Sf=Vb.segmentOffset,Dd=new M,Tf=0,Ti=0,De=0,Dg=0,Uf=0,Ui=Wb.length,qf=0;qfDe||225De)&&Pd.rotate(-De,Wf/2,Ee/2);var Mh=M.allocAt(0,0,Wf,Ee),Ve=K.alloc();Ve.gj(Mh,Lh);Pd.Fa(Ve);var Nh=-Ve.x,Oh=-Ve.y,ld=K.alloc();ld.assign(Sf);isNaN(ld.x)&&(ld.x=Wf/2+3);isNaN(ld.y)&&(ld.y=-(Ee/2+3));ld.rotate(De); -Tf+=ld.x+Nh;Ti+=ld.y+Oh;var Vi=new M(Tf,Ti,Ed.width,Ed.height),Sn=new M(Ed.x,Ed.y,Ed.width,Ed.height),Ph=new M(Vf.x,Vf.y,Vf.width,Vf.height);kd.PA=Dg;kd.lineCount=Gb.lineCount;kd.lines=[Gb.vb,Gb.pi,Gb.ye,Gb.Ke,Gb.Fc,Gb.Ub,Gb.we];kd.actualBounds=Vi;kd.measuredBounds=Sn;kd.naturalBounds=Ph;0===qf?Dd.assign(Vi):Dd.Tc(Vi);K.free(ld);K.free(Ve);M.free(Mh);Kb.free(Pd)}null!==Za.Wg&&Za.Wg.push(Dd);mc($d,Dd.x,Dd.y,Dd.width,Dd.height)}vj(Vb,!1)}}}; +C,P-B)/Math.PI;0>ia&&(ia+=360);aa.push(ia)}B=P;C=ma}E.push(aa)}if(null===a.Zf){for(var Ba=[],Na=a.W.m,sb=Na.length,tb=0;tbUb))for(var jd=0;jdUb&&Pb.push(yc)}}}}a.Zf=Ba}var Oc=a.Zf;var xe=a.W.m,Nf=xe.length,Jb=0,ye=0,yg=y;a.Gj=[];for(var Fh,Gh=0;Ghtk*Ni*y/a.graduatedRange&&null===ob.graduatedSkip)){var zg=w[0][0],Bd=0,zc=0;ye=y*ob.graduatedStart-1E-4;yg=y*ob.graduatedEnd+1E-4;var Of=tk*Ni,Gc=a.graduatedTickBase;if(Gca.graduatedMin+Of&&(Gc-=Math.floor((Gc-a.graduatedMin)/Of)*Of);for(var Hh=Oc[Gh],Rn=Gc,Wd=1;Gcy&&(Jb=y),ye<=Jb&&Jb<=yg)){for(var Xd=E[Bd][zc],Od=w[Bd][zc];Bdzg&&zcsc&&.4995sc?0sc||.9995Pi){var uk=1-Math.abs(.5-sc);Xd=(Ae*uk+$c*(1-uk))%360;break a}}}Xd=Ae}if(ob instanceof Yg){var Yd= +"";null!==ob.graduatedFunction?(Yd=ob.graduatedFunction(Gc),Yd=null!==Yd&&void 0!==Yd?Yd.toString():""):Yd=(+Gc.toFixed(2)).toString();""!==Yd&&Fh.push({Hm:Oi,angle:Xd,text:Yd})}else Fh.push({Hm:Oi,angle:Xd})}Gc=Rn+Wd*Of}}}a.Gj.push(Fh)}Pa(E);var Kh=a.Gj;if(null!==Kh)for(var Pf=d.length,pb=0;pbRf;Rf++){switch(Rf){case 0:tc.h(of,pf);break;case 1:tc.h(of+Qi,pf);break;case 2:tc.h(of,pf+Ri);break;case 3:tc.h(of+Qi,pf+Ri)}tc.rotate(wk+Vb.angle);tc.offset(vk,Qf);0===Cd&&0===Rf?ad.h(tc.x,tc.y,0,0):ad.Ye(tc);tc.offset(-vk,-Qf);tc.rotate(-wk-Vb.angle)}K.free(tc); +null!==Ac.Wg&&Ac.Wg.push(ad);mc(Hc,ad.x,ad.y,ad.width,ad.height)}else if(Vb instanceof Yg){var Za=a,$d=e;null===Za.xh&&(Za.xh=new Yg);var Gb=Za.xh;en(Gb,Vb);var Lh=Vb.alignmentFocus;Lh.bc()&&(Lh=Fc);for(var ae=Vb.segmentOrientation,Sf=Vb.segmentOffset,Dd=new M,Tf=0,Ti=0,De=0,Dg=0,Uf=0,Ui=Wb.length,qf=0;qfDe||225De)&&Pd.rotate(-De,Wf/2,Ee/2);var Mh=M.allocAt(0,0,Wf,Ee),Ve=K.alloc();Ve.gj(Mh,Lh);Pd.Fa(Ve);var Nh=-Ve.x,Oh=-Ve.y,ld=K.alloc();ld.assign(Sf);isNaN(ld.x)&&(ld.x=Wf/2+3);isNaN(ld.y)&&(ld.y=-(Ee/2+3));ld.rotate(De); +Tf+=ld.x+Nh;Ti+=ld.y+Oh;var Vi=new M(Tf,Ti,Ed.width,Ed.height),Sn=new M(Ed.x,Ed.y,Ed.width,Ed.height),Ph=new M(Vf.x,Vf.y,Vf.width,Vf.height);kd.PA=Dg;kd.lineCount=Gb.lineCount;kd.lines=[Gb.vb,Gb.pi,Gb.ye,Gb.Ke,Gb.Fc,Gb.Ub,Gb.we];kd.actualBounds=Vi;kd.measuredBounds=Sn;kd.naturalBounds=Ph;0===qf?Dd.assign(Vi):Dd.Uc(Vi);K.free(ld);K.free(Ve);M.free(Mh);Kb.free(Pd)}null!==Za.Wg&&Za.Wg.push(Dd);mc($d,Dd.x,Dd.y,Dd.width,Dd.height)}vj(Vb,!1)}}}; dn.prototype.arrange=function(a,b,c){if(null!==a.Wg){var d=a.sb(),e=a.Gj;if(null!==e){var f=a.Wg,g=0,h=f[g];g++;null!==d&&d.arrange(h.x-c.x,h.y-c.y,h.width,h.height);for(var k=b.length,l=0;l=e&&(e=1);for(var g=f.actualBounds,h=a.W.m,k=a.Gj,l=h.length,m=0;ma.graduatedTickUnit*n.interval*f.geometry.flattenedTotalLength/a.graduatedRange*e)){var q=n.measuredBounds,u=n.strokeWidth*n.scale,w=n.alignmentFocus;w.bc()&& -(w=Fc);for(var y=0;y=e&&(e=1);for(var g=f.actualBounds,h=a.W.m,k=a.Gj,l=h.length,m=0;ma.graduatedTickUnit*n.interval*f.geometry.flattenedTotalLength/a.graduatedRange*e&&null===n.graduatedSkip)){var q=n.measuredBounds,u=n.strokeWidth*n.scale, +w=n.alignmentFocus;w.bc()&&(w=Fc);for(var y=0;yf.height)continue}else if(l.position>f.width)continue;var m=l.separatorStrokeWidth;isNaN(m)&&(m=c?a.Ng:a.Mg);var n=l.separatorStroke;null===n&&(n=c?a.fi:a.Lg);if(0!==m&&null!==n){pi(a,b,n,!1,!1,g,f);n=!1;var p=l.separatorDashArray;null===p&&(p=c?a.ei:a.di);null!==p&&(n=!0,b.Ns(p,0));b.beginPath();p=l.position+m;c?p>f.height&&(m-= p-f.height):p>f.width&&(m-=p-f.width);l=l.position+m/2;b.lineWidth=m;m=a.rb;c?(l+=m.top,p=f.width-m.right,b.moveTo(m.left,l),b.lineTo(p,l)):(l+=m.left,p=f.height-m.bottom,b.moveTo(l,m.top),b.lineTo(l,p));b.stroke();n&&b.Ls()}}}} -function kn(a,b,c,d,e){for(var f=d.length,g=a.actualBounds,h=a.naturalBounds,k=mn(a,!0),l=mn(a,!1),m=0;mp)){var r=n.Lc(),q=n.separatorStrokeWidth;isNaN(q)&&(q=c?a.Ng:a.Mg);var u=n.separatorStroke;null===u&&(u=c?a.fi:a.Lg);if(null===u||n.index===(c?k:l))q=0;r-=q;q=n.position+q;r+=n.actual;q+r>p&&(r=p-q);0>=r||(p=a.rb,pi(a,b,n.background,!0,!1,h,g),c?b.fillRect(p.left, +function kn(a,b,c,d,e){for(var f=d.length,g=a.actualBounds,h=a.naturalBounds,k=mn(a,!0),l=mn(a,!1),m=0;mp)){var r=n.Mc(),q=n.separatorStrokeWidth;isNaN(q)&&(q=c?a.Ng:a.Mg);var u=n.separatorStroke;null===u&&(u=c?a.fi:a.Lg);if(null===u||n.index===(c?k:l))q=0;r-=q;q=n.position+q;r+=n.actual;q+r>p&&(r=p-q);0>=r||(p=a.rb,pi(a,b,n.background,!0,!1,h,g),c?b.fillRect(p.left, q+p.top,g.width-(p.left+p.right),r):b.fillRect(q+p.left,p.top,r,g.height-(p.top+p.bottom)))}}}}function mn(a,b){for(var c=b?a.Ib.length:a.Db.length,d=0;dd&&e.set(q),K.free(q));K.free(m);f&&e.transform(g);return l}; @@ -1227,7 +1227,7 @@ t.yl=function(){if(0!==(this.H&2048)===!1){Ll(this,!0);Ml(this,!0);for(var a=thi t.Em=function(a,b,c,d){var e=this.pg;e.h(0,0,0,0);var f=this.desiredSize,g=this.minSize;void 0===c&&(c=g.width,d=g.height);c=Math.max(c,g.width);d=Math.max(d,g.height);var h=this.maxSize;isNaN(f.width)||(a=Math.min(f.width,h.width));isNaN(f.height)||(b=Math.min(f.height,h.height));a=Math.max(c,a);b=Math.max(d,b);var k=this.rb;a=Math.max(a-k.left-k.right,0);b=Math.max(b-k.top-k.bottom,0);var l=this.W.m;0!==l.length&&this.oa.measure(this,a,b,l,e,c,d);a=e.width+k.left+k.right;k=e.height+k.top+k.bottom; isFinite(f.width)&&(a=f.width);isFinite(f.height)&&(k=f.height);a=Math.min(h.width,a);k=Math.min(h.height,k);a=Math.max(g.width,a);k=Math.max(g.height,k);a=Math.max(c,a);k=Math.max(d,k);dc(e,a,k);dc(this.naturalBounds,a,k);this.Fe(0,0,a,k)};t.sb=function(){if(null===this.wh){var a=this.W.m,b=a.length;if(0===b)return null;for(var c=0;cc||f>d)this.v(),this.measure(b>c?c:b,f>d?d:f,0,0);break;case Fd:this.v(!0);this.measure(c+h,d+g,0,0);break;case il:this.v(!0);this.measure(c+h,f+g,0,0);break;case jl:this.v(!0),this.measure(b+h,d+g,0,0)}}this.oa.arrange(this,e,this.pg)}}; -t.Ih=function(a){var b=this.naturalBounds,c=Hm(this);if(nc(0,0,b.width,b.height,a.x,a.y)){b=this.W.m;for(var d=b.length,e=K.allocAt(0,0);d--;){var f=b[d];if(f.visible||f===c)if(Lb(e.set(a),f.transform),f.ca(e))return K.free(e),!0}K.free(e);return null===this.Wb&&null===this.md?!1:!0}return!1};t.Os=function(a){if(this.Zk===a)return this;for(var b=this.W.m,c=b.length,d=0;dp.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof W?m:null;p=Kb.alloc();p.set(g); +t.Hf=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var g=f;void 0===f&&(g=Kb.alloc(),g.reset());g.multiply(this.transform);if(this.Hh(a,g))return tn(this,b,c,e),void 0===f&&Kb.free(g),!0;if(this.Pc(a,g)){if(!this.isAtomic)for(var h=Hm(this),k=this.W.m,l=k.length;l--;){var m=k[l];if(m.visible||m===h){var n=m.actualBounds,p=this.naturalBounds;if(!(n.x>p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof W?m:null;p=Kb.alloc();p.set(g); if(null!==m?m.Hf(a,b,c,d,e,p):ul(n,a,d,p))null!==b&&(n=b(n)),null===n||null!==c&&!c(n)||e.add(n);Kb.free(p)}}}void 0===f&&Kb.free(g);return d}void 0===f&&Kb.free(g);return!1};function tn(a,b,c,d){for(var e=a.W.m,f=e.length;f--;){var g=e[f];if(g.visible){var h=g.actualBounds,k=a.naturalBounds;h.x>k.width||h.y>k.height||0>h.x+h.width||0>h.y+h.height||(g instanceof W&&tn(g,b,c,d),null!==b&&(g=b(g)),null===g||null!==c&&!c(g)||d.add(g))}}} -t.wg=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===c&&(c=null);void 0===d&&(d=null);var g=this.naturalBounds,h=this.pe(),k=h?a:Lb(K.allocAt(a.x,a.y),this.transform),l=h?b:Lb(K.allocAt(b.x,b.y),this.transform),m=k.Ff(l),n=0w.width||u.y>w.height||0>u.x+u.width||0>u.y+u.height))if(q.pe()?(u=q.transform,Lb(k.set(a),u),Lb(l.set(b),u)):(k.set(a),l.set(b)),u=q,q=q instanceof W?q:null,null!==q?q.wg(k,l,c,d,e,f):u.ly(k,l,e))null!==c&&(u=c(u)),null===u||null!==d&&!d(u)||f.add(u)}}K.free(k);K.free(l)}return e?n:g}return!1}; function Nm(a){var b=null;a instanceof Hf&&(b=a.spot1,b===gd&&(b=null),a=a.geometry,null!==a&&null===b&&(b=a.spot1));null===b&&(b=Ec);return b}function Om(a){var b=null;a instanceof Hf&&(b=a.spot2,b===gd&&(b=null),a=a.geometry,null!==a&&null===b&&(b=a.spot2));null===b&&(b=Pc);return b}t.add=function(a){for(var b=[],c=0;ca&&Aa(a,">= 0",W,"remo t.lA=function(a){if(0>a||this.type!==W.Table)return-1;for(var b=0,c=this.Ib,d=c.length,e=this.Ii;ea||this.type!==W.Table)return-1;for(var b=0,c=this.Db,d=c.length,e=this.si;e=c.elements.count&&!(c instanceof U)){var d=!1;if(1===c.elements.count&&(d=null!==c.itemArray,!d))for(h=b.iterator;h.next();)if("itemArray"===h.value.targetProperty){d=!0;break}d||(Fa("Auto, Spot, or Graduated Panel should not have zero or one elements: "+c.toString()+" in "+a.toString()),xn=!0)}}))} t.Pz=function(a){void 0===a&&(a=!1);var b=this.copy();on(b,function(a){a instanceof W&&(a.$h=null,a.nb=null);var b=a.lb;null!==b&&(a.lb=null,b.each(function(b){a.bind(b.copy())}));b=a.Dg;null!==b&&(a.Dg=null,b.each(function(b){a.tw(b.value.copy())}))});a&&sg(b);return b}; t.Ia=function(a){var b=this.$h;if(null!==b)for(void 0===a&&(a=""),b=b.iterator;b.next();){var c=b.value,d=c.sourceProperty;if(""===a||""===d||d===a)if(d=c.targetProperty,null!==c.converter||""!==d){d=this.data;var e=c.sourceName;if(null!==e)if(""===e)d=this;else if("/"===e)d=this;else if("."===e)d=this;else if(".."===e)d=this;else{if(d=this.eb(e),null===d){G&&Fa("Binding error: missing GraphObject named "+e+" in "+this.toString());continue}}else if(c.isToModel)if(d=this.diagram,null!==d)d=d.model.modelData; -else continue;var f=this,g=c.kj;if(-1!==g){if(f=this.Os(g),null===f)continue}else null!==c.sd&&(f=c.sd);"/"===e?d=f.part:"."===e?d=f:".."===e&&(d=f.panel);e=c.Vp;if(0!==e){if(!(f instanceof W))continue;1===e?f=f.getColumnDefinition(c.jm):2===e&&(f=f.getRowDefinition(c.jm))}void 0!==f&&c.ww(f,d)}}};t.ky=function(a){if(void 0===a||null===a||null===this.ce)return null;A(a,"object",W,"findItemPanelForData");return this.ce.K(a)}; +else continue;var f=this,g=c.kj;if(-1!==g){if(f=this.Os(g),null===f)continue}else null!==c.td&&(f=c.td);"/"===e?d=f.part:"."===e?d=f:".."===e&&(d=f.panel);e=c.Vp;if(0!==e){if(!(f instanceof W))continue;1===e?f=f.getColumnDefinition(c.jm):2===e&&(f=f.getRowDefinition(c.jm))}void 0!==f&&c.ww(f,d)}}};t.ky=function(a){if(void 0===a||null===a||null===this.ce)return null;A(a,"object",W,"findItemPanelForData");return this.ce.K(a)}; function yn(a,b){a=a.W.m;for(var c=a.length,d=b.length,e=0,f=null;ea;)this.hc(this.W.length-1,!1);zn(this,this.itemArray)}; function zn(a,b){var c=rn(a);if(null===b||0===b.length)for(;a.W.length>c;)a.hc(a.W.length-1,!1);else if(a.W.length<=c){c=b.length;for(var d=0;da&&Aa(a,">= 0",bk,"height"),this.yc=a,this.actual=this.ma,null!== +t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new Fi(a,b,c,d):e=a;e.td=this;a=this.panel;null!==a&&(b=a.Jh(),null!==b&&Tl(b)&&v("Cannot add a Binding to a RowColumnDefinition that is already frozen: "+e+" on "+a));null===this.lb&&(this.lb=new H);this.lb.add(e);return this}; +oa.Object.defineProperties(bk.prototype,{panel:{configurable:!0,get:function(){return this.ig}},isRow:{configurable:!0,get:function(){return this.Or},set:function(a){this.Or=a}},index:{configurable:!0,get:function(){return this.Va},set:function(a){this.Va=a}},height:{configurable:!0,get:function(){return this.yc},set:function(a){var b=this.yc;b!==a&&(G&&A(a,"number",bk,"height"),0>a&&Aa(a,">= 0",bk,"height"),this.yc=a,this.actual=this.ma,null!== this.panel&&this.panel.v(),this.Hb("height",b,a))}},width:{configurable:!0,get:function(){return this.yc},set:function(a){var b=this.yc;b!==a&&(G&&A(a,"number",bk,"width"),0>a&&Aa(a,">= 0",bk,"width"),this.yc=a,this.actual=this.ma,null!==this.panel&&this.panel.v(),this.Hb("width",b,a))}},minimum:{configurable:!0,get:function(){return this.Vj},set:function(a){var b=this.Vj;b!==a&&(G&&A(a,"number",bk,"minimum"),(0>a||!isFinite(a))&&Aa(a,">= 0",bk,"minimum"),this.Vj=a,this.actual= this.ma,null!==this.panel&&this.panel.v(),this.Hb("minimum",b,a))}},maximum:{configurable:!0,get:function(){return this.Uj},set:function(a){var b=this.Uj;b!==a&&(G&&A(a,"number",bk,"maximum"),0>a&&Aa(a,">= 0",bk,"maximum"),this.Uj=a,this.actual=this.ma,null!==this.panel&&this.panel.v(),this.Hb("maximum",b,a))}},alignment:{configurable:!0,get:function(){return this.Bb},set:function(a){var b=this.Bb;b.B(a)||(G&&x(a,Ib,bk,"alignment"),this.Bb=a.L(),null!==this.panel&&this.panel.v(), this.Hb("alignment",b,a))}},stretch:{configurable:!0,get:function(){return this.Ne},set:function(a){var b=this.Ne;b!==a&&(G&&cb(a,O,bk,"stretch"),this.Ne=a,null!==this.panel&&this.panel.v(),this.Hb("stretch",b,a))}},separatorPadding:{configurable:!0,get:function(){return this.lg},set:function(a){"number"===typeof a?a=new ic(a):null!==a&&G&&x(a,ic,bk,"separatorPadding");var b=this.lg;null!==a&&null!==b&&b.B(a)||(null!==a&&(a=a.L()),this.lg=a,null!==this.panel&&this.panel.v(), @@ -1306,13 +1306,13 @@ this.Hb("separatorPadding",b,a))}},separatorStroke:{configurable:!0,get:function b,a))}},separatorDashArray:{configurable:!0,get:function(){return this.fk},set:function(a){var b=this.fk;if(b!==a){null===a||Array.isArray(a)||za(a,"Array",bk,"separatorDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;ee)){var f=d.measuredBounds,g=Math.max(1,f.width);f=f.height;for(var h=c[0],k=c[1],l,m,n,p,r,q,u=0,w=Ma(),y=2;yn&&(n=1);e=c=n;l=g/2;m=0===l?!1:!0;y=0;q=w[y];n=q[0];r=q[1];p=q[2];q=q[3];for(var z=0;.1<=u;){0===z&&(m?(e=c,e-=l,u-=l,m=!1):e=c,0===e&&(e=1)); if(e>u){Pa(w);return}e>q?(z=e-q,e=q):z=0;var B=Math.sqrt(e*e/(1+p*p));0>n&&(B=-B);h+=B;k+=p*B;a.translate(h,k);a.rotate(r);a.translate(-(g/2),-(f/2));0===z&&d.Ri(a,b);a.translate(g/2,f/2);a.rotate(-r);a.translate(-h,-k);u-=e;q-=e;if(0!==z){y++;if(y===w.length){Pa(w);return}q=w[y];n=q[0];r=q[1];p=q[2];q=q[3];e=z}}Pa(w)}} -t.Ri=function(a,b){var c=this.Jc,d=this.pl;if(null!==c||null!==d){var e=this.sa;if(null!==e){a.Hd();var f=this.actualBounds,g=this.naturalBounds;null!==d&&pi(this,a,d,!0,!1,g,f);var h=this.part,k=this.og;null===c||0!==k||null===h||!this.isPanelMain&&h.sb()!==this||(k=h.type===W.Link&&h instanceof Je&&"Selection"===h.category&&h.adornedObject instanceof Hf&&h.adornedPart.sb()===h.adornedObject?h.adornedObject.strokeWidth:0);0===k&&(c=null);null!==c&&0!==k&&(pi(this,a,c,!1,!1,g,f),a.lineWidth=k,a.lineJoin= +t.Ri=function(a,b){var c=this.Jc,d=this.pl;if(null!==c||null!==d){var e=this.sa;if(null!==e){a.Lc();var f=this.actualBounds,g=this.naturalBounds;null!==d&&pi(this,a,d,!0,!1,g,f);var h=this.part,k=this.og;null===c||0!==k||null===h||!this.isPanelMain&&h.sb()!==this||(k=h.type===W.Link&&h instanceof Je&&"Selection"===h.category&&h.adornedObject instanceof Hf&&h.adornedPart.sb()===h.adornedObject?h.adornedObject.strokeWidth:0);0===k&&(c=null);null!==c&&0!==k&&(pi(this,a,c,!1,!1,g,f),a.lineWidth=k,a.lineJoin= this.gm,a.lineCap=this.fm,a.miterLimit=this.gk);f=!1;h&&b.Se("drawShadows")&&(f=h.isShadowed);h=!0;null===c||null!==d&&"transparent"!==d||(h=!1);g=!1;k=this.strokeDashArray;null!==k&&(g=!0,a.Ns(k,this.uh));if(e.type===N.j)a.beginPath(),a.moveTo(e.startX,e.startY),a.lineTo(e.endX,e.endY),null!==c&&a.jj();else if(e.type===N.F){var l=e.startX;k=e.startY;var m=e.endX,n=e.endY;e=Math.min(l,m);var p=Math.min(k,n);l=Math.abs(m-l);k=Math.abs(n-k);a.beginPath();a.rect(e,p,l,k);null!==d&&a.Gf(d);if(null!== c){h&&f&&El(a);if(0===l||0===k)a.beginPath(),a.rect(e,p,Math.max(l,.1),Math.max(k,.1));a.jj();h&&f&&Dl(a)}}else if(e.type===N.P)l=e.startX,k=e.startY,m=e.endX,n=e.endY,e=Math.abs(m-l)/2,p=Math.abs(n-k)/2,l=Math.min(l,m)+e,k=Math.min(k,n)+p,a.beginPath(),a.moveTo(l,k-p),a.bezierCurveTo(l+L.Cg*e,k-p,l+e,k-L.Cg*p,l+e,k),a.bezierCurveTo(l+e,k+L.Cg*p,l+L.Cg*e,k+p,l,k+p),a.bezierCurveTo(l-L.Cg*e,k+p,l-e,k+L.Cg*p,l-e,k),a.bezierCurveTo(l-e,k-L.Cg*p,l-L.Cg*e,k-p,l,k-p),a.closePath(),null!==d&&a.Gf(d),null!== c&&(h&&f?(El(a),a.jj(),Dl(a)):a.jj());else if(e.type===N.o)for(e=e.figures,k=e.length,p=0;p(c.startX-c.endX)*(a.x-c.endX)+(c.startY-c.endY)*(a.y-c.endY)||0>d)return!1;M.free(f);return L.Rb(c.startX,c.startY,c.endX,c.endY,e,a.x,a.y)}if(c.type=== -N.F){b=c.startX;var g=c.startY,h=c.endX;c=c.endY;f.x=Math.min(b,h);f.y=Math.min(g,c);f.width=Math.abs(h-b);f.height=Math.abs(c-g);if(null===this.fill){f.Mc(-d,-d);if(f.ca(a))return M.free(f),!1;f.Mc(d,d)}null!==this.stroke&&f.Mc(e,e);a=f.ca(a);M.free(f);return a}if(c.type===N.P){g=c.startX;e=c.startY;h=c.endX;var k=c.endY;c=Math.min(g,h);b=Math.min(e,k);g=Math.abs(h-g)/2;e=Math.abs(k-e)/2;c=a.x-(c+g);b=a.y-(b+e);if(null===this.fill){g-=d;e-=d;if(0>=g||0>=e||1>=c*c/(g*g)+b*b/(e*e))return M.free(f), +t.Yi=function(a){void 0===a&&(a=new M);var b=this.naturalBounds,c=this.le;b=M.allocAt(b.x,b.y,b.width,b.height);var d=this.strokeWidth;b.Nc(d/2,d/2);d=K.allocAt(b.x,b.y).transform(c);a.h(d.x,d.y,0,0);d.h(b.right,b.y).transform(c);mc(a,d.x,d.y,0,0);d.h(b.right,b.bottom).transform(c);mc(a,d.x,d.y,0,0);d.h(b.x,b.bottom).transform(c);mc(a,d.x,d.y,0,0);M.free(b);K.free(d);return a}; +t.Ih=function(a,b){var c=this.geometry;if(null===c||null===this.fill&&null===this.stroke)return!1;var d=c.bounds,e=this.strokeWidth/2;c.type!==N.j||b||(e+=2);var f=M.alloc();f.assign(d);f.Nc(e+2,e+2);if(!f.ca(a))return M.free(f),!1;d=e+1E-4;if(c.type===N.j){if(null===this.stroke)return!1;d=(c.endX-c.startX)*(a.x-c.startX)+(c.endY-c.startY)*(a.y-c.startY);if(0>(c.startX-c.endX)*(a.x-c.endX)+(c.startY-c.endY)*(a.y-c.endY)||0>d)return!1;M.free(f);return L.Rb(c.startX,c.startY,c.endX,c.endY,e,a.x,a.y)}if(c.type=== +N.F){b=c.startX;var g=c.startY,h=c.endX;c=c.endY;f.x=Math.min(b,h);f.y=Math.min(g,c);f.width=Math.abs(h-b);f.height=Math.abs(c-g);if(null===this.fill){f.Nc(-d,-d);if(f.ca(a))return M.free(f),!1;f.Nc(d,d)}null!==this.stroke&&f.Nc(e,e);a=f.ca(a);M.free(f);return a}if(c.type===N.P){g=c.startX;e=c.startY;h=c.endX;var k=c.endY;c=Math.min(g,h);b=Math.min(e,k);g=Math.abs(h-g)/2;e=Math.abs(k-e)/2;c=a.x-(c+g);b=a.y-(b+e);if(null===this.fill){g-=d;e-=d;if(0>=g||0>=e||1>=c*c/(g*g)+b*b/(e*e))return M.free(f), !1;g+=d;e+=d}null!==this.stroke&&(g+=d,e+=d);M.free(f);return 0>=g||0>=e?!1:1>=c*c/(g*g)+b*b/(e*e)}if(c.type===N.o)return M.free(f),null===this.fill?ge(c,a.x,a.y,e):ee(c,a,e,1=this.strokeWidth)m=L.Ve(l.startX,l.startY,l.endX,l.endY,f,g,h,k,e);else{l.startX===l.endX?(d=n,m=0):(b=(l.endY-l.startY)/(l.endX-l.startX),m=n/Math.sqrt(1+b*b), d=m*b);b=Ma();a=new K;L.Ve(l.startX+d,l.startY+m,l.endX+d,l.endY+m,f,g,h,k,a)&&b.push(a);a=new K;L.Ve(l.startX-d,l.startY-m,l.endX-d,l.endY-m,f,g,h,k,a)&&b.push(a);a=new K;L.Ve(l.startX+d,l.startY+m,l.startX-d,l.startY-m,f,g,h,k,a)&&b.push(a);a=new K;L.Ve(l.endX+d,l.endY+m,l.endX-d,l.endY-m,f,g,h,k,a)&&b.push(a);h=b.length;if(0===h)return Pa(b),!1;m=!0;k=Infinity;for(d=0;dMath.abs(c)){k=g-m-c*(f-d);if(0>a*a*c*c+l*l-k*k){e.x=NaN;e.y=NaN;m=!1;break a}n=Math.sqrt(a*a*c*c+l*l-k*k);h=(-(a*a*c*k)+a*l*n)/(l*l+a*a*c*c)+d;a=(-(a*a*c*k)-a*l*n)/(l*l+a*a*c*c)+d;l=c*(h-d)+k+m;k=c* +n,r.y+r.height+n,f,g,h,k,e);else if(l.type===N.P){b=M.allocAt(r.x,r.y,r.width,r.height).Nc(n,n);a:if(0===b.width)m=L.Ve(b.x,b.y,b.x,b.y+b.height,f,g,h,k,e);else if(0===b.height)m=L.Ve(b.x,b.y,b.x+b.width,b.y,f,g,h,k,e);else{a=b.width/2;l=b.height/2;d=b.x+a;m=b.y+l;c=9999;f!==h&&(c=(g-k)/(f-h));if(9999>Math.abs(c)){k=g-m-c*(f-d);if(0>a*a*c*c+l*l-k*k){e.x=NaN;e.y=NaN;m=!1;break a}n=Math.sqrt(a*a*c*c+l*l-k*k);h=(-(a*a*c*k)+a*l*n)/(l*l+a*a*c*c)+d;a=(-(a*a*c*k)-a*l*n)/(l*l+a*a*c*c)+d;l=c*(h-d)+k+m;k=c* (a-d)+k+m;Math.abs((f-h)*(f-h))+Math.abs((g-l)*(g-l))h){e.x=NaN;e.y=NaN;m=!1;break a}k=Math.sqrt(h);h=m+k;k=m-k;Math.abs(h-g)Math.abs(q)?(u*=.5/q,q=.5):0!==u&&.5>Math.abs(u)&&(q*=.5/u,u=.5),y-=q,z-= u;r.contains(y,z);)y-=q,z-=u;e.x=h;e.y=k;for(u=0;uc?a-c:c-a)<(b>d?b-d:d-b)?(a=ba||L.da(k.y,a))&&(k.yb||L.da(k.x,b))&&(k.x=a&&d<=b;a=d&&c<=a} -t.ly=function(a,b,c){function d(a,b){for(var c=a.length,d=0;de)return!0;return!1}if(c&&null!==this.fill&&this.Ih(a,!0))return!0;var e=a.Ff(b),f=e;1.5e)return!0;return!1}if(c&&null!==this.fill&&this.Ih(a,!0))return!0;var e=a.Ff(b),f=e;1.5=e||Nb(b,f,0,-n)>= -e||Nb(b,f,0,n)>=e||Nb(b,f,m,0)>=e?!1:!0}else if(b.type===N.o){l=b.bounds;f=l.x;h=l.y;k=l.x+l.width;l=l.y+l.height;if(a.x>k&&a.xl&&a.ye&&Mb(a.x,a.y,f,h,k,h)>e&&Mb(a.x,a.y,k,l,f,l)>e&&Mb(a.x,a.y,k,l,k,h)>e)return!1;f=Math.sqrt(e);if(c){if(null===this.fill?ge(b,a.x,a.y,f):ee(b,a,f,!0,!1))return!0}else{c=b.figures;for(b=0;be)return!1;h=f.segments.m;k=h.length;for(l=0;le)return!1;break;case Td:var p=Ma();L.Pe(g,m,n.point1X,n.point1Y,n.point2X,n.point2Y,n.endX,n.endY,.8,p);g=d(p,a);Pa(p);if(g)return!1;g=n.endX;m=n.endY;if(a.td(g,m)>e)return!1;break;case Ud:p=Ma();L.Kq(g,m,n.point1X,n.point1Y,n.endX,n.endY,.8,p);g=d(p,a);Pa(p);if(g)return!1;g=n.endX;m=n.endY;if(a.td(g,m)>e)return!1;break;case Vd:case be:p=n.type===Vd?ce(n,f):de(n,f,g,m);var r=p.length;if(0===r){g=n.type===Vd?n.centerX:n.endX;m=n.type===Vd?n.centerY:n.endY;if(a.td(g,m)> +e||Nb(b,f,0,n)>=e||Nb(b,f,m,0)>=e?!1:!0}else if(b.type===N.o){l=b.bounds;f=l.x;h=l.y;k=l.x+l.width;l=l.y+l.height;if(a.x>k&&a.xl&&a.ye&&Mb(a.x,a.y,f,h,k,h)>e&&Mb(a.x,a.y,k,l,f,l)>e&&Mb(a.x,a.y,k,l,k,h)>e)return!1;f=Math.sqrt(e);if(c){if(null===this.fill?ge(b,a.x,a.y,f):ee(b,a,f,!0,!1))return!0}else{c=b.figures;for(b=0;be)return!1;h=f.segments.m;k=h.length;for(l=0;le)return!1;break;case Td:var p=Ma();L.Pe(g,m,n.point1X,n.point1Y,n.point2X,n.point2Y,n.endX,n.endY,.8,p);g=d(p,a);Pa(p);if(g)return!1;g=n.endX;m=n.endY;if(a.ud(g,m)>e)return!1;break;case Ud:p=Ma();L.Kq(g,m,n.point1X,n.point1Y,n.endX,n.endY,.8,p);g=d(p,a);Pa(p);if(g)return!1;g=n.endX;m=n.endY;if(a.ud(g,m)>e)return!1;break;case Vd:case be:p=n.type===Vd?ce(n,f):de(n,f,g,m);var r=p.length;if(0===r){g=n.type===Vd?n.centerX:n.endX;m=n.type===Vd?n.centerY:n.endY;if(a.ud(g,m)> e)return!1;break}n=null;for(var q=Ma(),u=0;ub+1E-5||d.bounds.height>c+1E-5)&&v('Geometry made with figure "'+a.figure+'" has bounds '+d.bounds.toString()+" that are too large for the given size ("+b+","+c+"). See documentation for Shape.defineFigureGenerator."); return d};function Qn(a){var b=Pn[a];if(void 0===b){var c=a.toLowerCase();if("none"===c)return"None";b=Pn[c];if(void 0===b){var d=null,e;for(e in L.cn)if(e.toLowerCase()===c){d=e;break}if(null!==d)return a=N.parse(L.cn[d],!1),Pn[d]=a,c!==d&&(Pn[c]=d),d}}return"string"===typeof b?b:b instanceof N?a:null} -oa.Object.defineProperties(Hf.prototype,{geometry:{configurable:!0,get:function(){return null!==this.sa?this.sa:this.Gd},set:function(a){var b=this.sa,c=this.Gd;if(b!==a){null!==a?(G&&x(a,N,Hf,"geometry"),this.Gd=this.sa=a.freeze()):this.Gd=this.sa=null;var d=this.part;null!==d&&(d.dg=NaN);this.v();this.g("geometry",b||c,a);rl(this)&&(a=this.part,null!==a&&sl(this,a,"geometryString"))}}},geometryString:{configurable:!0,get:function(){return null===this.geometry?"":this.geometry.toString()}, +oa.Object.defineProperties(Hf.prototype,{geometry:{configurable:!0,get:function(){return null!==this.sa?this.sa:this.Hd},set:function(a){var b=this.sa,c=this.Hd;if(b!==a){null!==a?(G&&x(a,N,Hf,"geometry"),this.Hd=this.sa=a.freeze()):this.Hd=this.sa=null;var d=this.part;null!==d&&(d.dg=NaN);this.v();this.g("geometry",b||c,a);rl(this)&&(a=this.part,null!==a&&sl(this,a,"geometryString"))}}},geometryString:{configurable:!0,get:function(){return null===this.geometry?"":this.geometry.toString()}, set:function(a){a=N.parse(a);var b=a.normalize();this.geometry=a;this.position=a=K.allocAt(-b.x,-b.y);K.free(a)}},isGeometryPositioned:{configurable:!0,get:function(){return this.ro},set:function(a){G&&A(a,"boolean",Hf,"isGeometryPositioned");var b=this.ro;b!==a&&(this.ro=a,this.v(),this.g("isGeometryPositioned",b,a))}},fill:{configurable:!0,get:function(){return this.pl},set:function(a){var b=this.pl;b!==a&&(null!==a&&am(a,"Shape.fill"),a instanceof Al&&a.freeze(),this.pl= a,this.R(),this.g("fill",b,a))}},stroke:{configurable:!0,get:function(){return this.Jc},set:function(a){var b=this.Jc;b!==a&&(null!==a&&am(a,"Shape.stroke"),a instanceof Al&&a.freeze(),this.Jc=a,this.R(),this.g("stroke",b,a))}},strokeWidth:{configurable:!0,get:function(){return this.og},set:function(a){var b=this.og;if(b!==a)if(G&&D(a,Hf,"strokeWidth"),0<=a){this.og=a;this.v();var c=this.part;null!==c&&(c.dg=NaN);this.g("strokeWidth",b,a)}else Aa(a,"value >= 0",Hf,"strokeWidth:value")}}, strokeCap:{configurable:!0,get:function(){return this.fm},set:function(a){var b=this.fm;b!==a&&("string"!==typeof a||"butt"!==a&&"round"!==a&&"square"!==a?Aa(a,'"butt", "round", or "square"',Hf,"strokeCap"):(this.fm=a,this.R(),this.g("strokeCap",b,a)))}},strokeJoin:{configurable:!0,get:function(){return this.gm},set:function(a){var b=this.gm;b!==a&&("string"!==typeof a||"miter"!==a&&"bevel"!==a&&"round"!==a?Aa(a,'"miter", "bevel", or "round"',Hf,"strokeJoin"):(this.gm= a,this.R(),this.g("strokeJoin",b,a)))}},strokeMiterLimit:{configurable:!0,get:function(){return this.gk},set:function(a){var b=this.gk;if(b!==a)if(G&&D(a,Hf,"strokeMiterLimit"),1<=a){this.gk=a;this.R();var c=this.part;null!==c&&(c.dg=NaN);this.g("strokeMiterLimit",b,a)}else G&&Aa(a,"value >= 1",Hf,"strokeWidth:value")}},strokeDashArray:{configurable:!0,get:function(){return this.th},set:function(a){var b=this.th;if(b!==a){null===a||Array.isArray(a)||za(a,"Array",Hf,"strokeDashArray:value"); if(null!==a){for(var c=a.length,d=0,e=0;ea?a=0:1a?a=0:1(n*n+m*m)*p*p&&(c=!0);b.Xb!==a&&(c=!1);!1===b.Se("textGreeking")&&(c=!1);b=this.tf;n= -this.uf;switch(this.flip){case ml:a.translate(e,0);a.scale(-1,1);break;case ll:a.translate(0,f);a.scale(1,-1);break;case nl:a.translate(e,f),a.scale(-1,-1)}a.Hd();m=this.bd;p=(b+g+n)*m;f>p&&(d=this.Ni,d=d.y*f-d.y*p+d.offsetY);if(1===m&&null!==this.we)n=this.vb,n>e&&(n=e),this.Qi(this.we,a,0,d+b,e,g,n,c,h,k,l);else if(null!==this.Fc&&null!==this.Ub)for(p=0;pe&&(r=e);d+=b;this.Qi(this.Ub[p],a,0,d,e,g,r,c,h,k,l);d+=g+n}switch(this.flip){case ml:a.scale(-1,1);a.translate(-e, +this.uf;switch(this.flip){case ml:a.translate(e,0);a.scale(-1,1);break;case ll:a.translate(0,f);a.scale(1,-1);break;case nl:a.translate(e,f),a.scale(-1,-1)}a.Lc();m=this.cd;p=(b+g+n)*m;f>p&&(d=this.Ni,d=d.y*f-d.y*p+d.offsetY);if(1===m&&null!==this.we)n=this.vb,n>e&&(n=e),this.Qi(this.we,a,0,d+b,e,g,n,c,h,k,l);else if(null!==this.Fc&&null!==this.Ub)for(p=0;pe&&(r=e);d+=b;this.Qi(this.Ub[p],a,0,d,e,g,r,c,h,k,l);d+=g+n}switch(this.flip){case ml:a.scale(-1,1);a.translate(-e, 0);break;case ll:a.scale(1,-1);a.translate(0,-f);break;case nl:a.scale(-1,-1),a.translate(-e,-f)}}}; t.Qi=function(a,b,c,d,e,f,g,h,k,l,m){var n=0;h?("left"===k?n=0:"right"===k?n=e-g:"center"===k&&(n=(e-g)/2),b.fillRect(c+n,d+.25*f,g,1)):("left"===k?n=0:"right"===k?n=e:"center"===k&&(n=e/2),e=null!==fo?fo(this,f):.75*f,b.fillText(a,c+n,d+e),a=f/20|0,0===a&&(a=1),"right"===k?n-=g:"center"===k&&(n-=g/2),l&&(k=null!==go?go(this,f):.8*f,b.beginPath(),b.lineWidth=a,b.moveTo(c+n,d+k),b.lineTo(c+n+g,d+k),b.stroke()),m&&(b.beginPath(),b.lineWidth=a,d=d+f-f/2.2|0,0!==a%2&&(d+=.5),b.moveTo(c+n,d),b.lineTo(c+ n+g,d),b.stroke()))}; t.Em=function(a,b,c,d){this.pi=a;var e=this.xe;null!==Zn&&ho!==e&&(ho=Zn.font=e);this.vb=this.Ke=0;this.we=this.Ub=this.Fc=this.ye=null;var f;if(isNaN(this.desiredSize.width)){e=this.Zb.replace(/\r\n/g,"\n").replace(/\r/g,"\n");if(0===e.length)e=0;else if(this.isMultiline){for(var g=f=0,h=!1;!h;){var k=e.indexOf("\n",g);-1===k&&(k=e.length,h=!0);g=e.substr(g,k-g);this.ii===bo&&(g=g.trim());f=Math.max(f,io(g));g=k+1}e=f}else f=e.indexOf("\n",0),0<=f&&(e=e.substr(0,f)),e=io(e);e=Math.min(e,a/this.scale); e=Math.max(8,e)}else e=this.desiredSize.width;null!==this.panel&&(e=Math.min(e,this.panel.maxSize.width));f=jo(this,e);isNaN(this.desiredSize.height)?f=Math.min(f,b/this.scale):f=this.desiredSize.height;h=f;if(0!==this.vb&&null!==this.Fc&&null!==this.Ub&&this.gg===ko&&(b=this.xe,b=this.gg===ko?lo(b):0,k=this.tf+this.uf,k=Math.max(0,eo(this)+k),h=Math.min(this.maxLines-1,Math.max(Math.floor(h/k+.01)-1,0)),!(h+1>=this.Ub.length))){k=this.Ub[h];for(b=Math.max(1,a-b);io(k)>b&&1=a.Ee)null!==d&&d.h(0,h);else if(g=b,a.sg===qo){a.Ke=1;var l=io(b);if(0===k||l<=c)a.vb=Math.max(a.vb,l),oo(a,b,a.vb),null!==d&&d.h(l,h);else{f=ro(a,g);g=g.substr(f.length);b=ro(a,g);for(l=io(f+b);0c&&1c;){var n=1;l=io(b.substr(0,n));for(m=0;l<=c;)n++,m=l,l=io(b.substr(0,n));if(1===n){var p=l;f=Math.max(f,l)}else p=m,f=Math.max(f,m);n--;1>n&&(n=1);oo(a,b.substr(0,n),p);k++;b=b.substr(n);if(a.bd+k>a.Ee)break}m=ro(a,g);for(l=io(b+m);0a.Ee))break}a.Ke=Math.min(a.Ee,k);a.vb=Math.max(a.vb,f);null!==d&&d.h(a.vb,h*a.Ke)}}function ro(a,b){if(a.sg===so)return b.substr(0,1);for(var c=b.length,d=0,e=to;d=b.length?b:b.substr(0,d)}function io(a){return null===Zn?8*a.length:Zn.measureText(a).width} +function po(a,b,c,d){var e=a.ii===bo;e&&(b=b.trim());var f=0,g=a.xe,h=a.tf+a.uf;h=Math.max(0,eo(a)+h);var k=a.gg===ko?lo(g):0;if(a.cd>=a.Ee)null!==d&&d.h(0,h);else if(g=b,a.sg===qo){a.Ke=1;var l=io(b);if(0===k||l<=c)a.vb=Math.max(a.vb,l),oo(a,b,a.vb),null!==d&&d.h(l,h);else{f=ro(a,g);g=g.substr(f.length);b=ro(a,g);for(l=io(f+b);0c&&1c;){var n=1;l=io(b.substr(0,n));for(m=0;l<=c;)n++,m=l,l=io(b.substr(0,n));if(1===n){var p=l;f=Math.max(f,l)}else p=m,f=Math.max(f,m);n--;1>n&&(n=1);oo(a,b.substr(0,n),p);k++;b=b.substr(n);if(a.cd+k>a.Ee)break}m=ro(a,g);for(l=io(b+m);0a.Ee))break}a.Ke=Math.min(a.Ee,k);a.vb=Math.max(a.vb,f);null!==d&&d.h(a.vb,h*a.Ke)}}function ro(a,b){if(a.sg===so)return b.substr(0,1);for(var c=b.length,d=0,e=to;d=b.length?b:b.substr(0,d)}function io(a){return null===Zn?8*a.length:Zn.measureText(a).width} function eo(a){if(null!==a.ye)return a.ye;var b=a.xe;if(null===Zn){var c=16;return a.ye=c}void 0!==vo[b]&&5E3>wo?c=vo[b]:(c=1.3*Zn.measureText("M").width,vo[b]=c,wo++);return a.ye=c}function lo(a){if(null===Zn)return 6;if(void 0!==xo[a]&&5E3>yo)var b=xo[a];else b=Zn.measureText(mo).width,xo[a]=b,yo++;return b} -function jo(a,b){var c=a.Zb.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),d=a.tf+a.uf;d=Math.max(0,eo(a)+d);if(0===c.length)return a.vb=0,a.bd=1,d;if(!a.isMultiline){var e=c.indexOf("\n",0);0<=e&&(c=c.substr(0,e))}e=0;for(var f=a.bd=0,g,h=!1;!h;){g=c.indexOf("\n",f);-1===g&&(g=c.length,h=!0);if(f<=g){f=c.substr(f,g-f);if(a.sg!==qo){a.Ke=0;var k=Hb.alloc();po(a,f,b,k);e+=k.height;Hb.free(k);a.bd+=a.Ke}else po(a,f,b,null),e+=d,a.bd++;a.bd===a.Ee&&(h=!0)}f=g+1}return a.Vr=e} +function jo(a,b){var c=a.Zb.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),d=a.tf+a.uf;d=Math.max(0,eo(a)+d);if(0===c.length)return a.vb=0,a.cd=1,d;if(!a.isMultiline){var e=c.indexOf("\n",0);0<=e&&(c=c.substr(0,e))}e=0;for(var f=a.cd=0,g,h=!1;!h;){g=c.indexOf("\n",f);-1===g&&(g=c.length,h=!0);if(f<=g){f=c.substr(f,g-f);if(a.sg!==qo){a.Ke=0;var k=Hb.alloc();po(a,f,b,k);e+=k.height;Hb.free(k);a.cd+=a.Ke}else po(a,f,b,null),e+=d,a.cd++;a.cd===a.Ee&&(h=!0)}f=g+1}return a.Vr=e} oa.Object.defineProperties(Yg.prototype,{font:{configurable:!0,get:function(){return this.xe},set:function(a){var b=this.xe;b!==a&&(G&&(A(a,"string",Yg,"font"),co(a)||v('Not a valid font: "'+a+'"')),this.xe=a,this.ye=null,this.v(),this.g("font",b,a))}},text:{configurable:!0,get:function(){return this.Zb},set:function(a){var b=this.Zb;null!==a&&void 0!==a?a=a.toString():a="";b!==a&&(this.Zb=a,this.v(),this.g("text",b,a))}},textAlign:{configurable:!0,get:function(){return this.Gi}, set:function(a){var b=this.Gi;b!==a&&(G&&A(a,"string",Yg,"textAlign"),"start"===a||"end"===a||"left"===a||"right"===a||"center"===a?(this.Gi=a,this.R(),this.g("textAlign",b,a)):G&&Aa(a,'"start", "end", "left", "right", or "center"',Yg,"textAlign"))}},flip:{configurable:!0,get:function(){return this.Xd},set:function(a){var b=this.Xd;b!==a&&(cb(a,O,Yg,"flip"),this.Xd=a,this.R(),this.g("flip",b,a))}},verticalAlignment:{configurable:!0,get:function(){return this.Ni},set:function(a){var b= this.Ni;b.B(a)||(G&&(x(a,Ib,Yg,"verticalAlignment"),a.bc()&&v("TextBlock.verticalAlignment for "+this+" must be a real Spot, not:"+a)),this.Ni=a=a.L(),Nl(this),this.g("verticalAlignment",b,a))}},naturalBounds:{configurable:!0,get:function(){if(!this.wc.s()){var a=Hb.alloc();po(this,this.Zb,999999,a);var b=a.width;Hb.free(a);a=jo(this,b);var c=this.desiredSize;isNaN(c.width)||(b=c.width);isNaN(c.height)||(a=c.height);dc(this.wc,b,a)}return this.wc}},isMultiline:{configurable:!0, get:function(){return this.Nj},set:function(a){var b=this.Nj;b!==a&&(G&&A(a,"boolean",Yg,"isMultiline"),this.Nj=a,this.v(),this.g("isMultiline",b,a))}},isUnderline:{configurable:!0,get:function(){return this.mi},set:function(a){var b=this.mi;b!==a&&(G&&A(a,"boolean",Yg,"isUnderline"),this.mi=a,this.R(),this.g("isUnderline",b,a))}},isStrikethrough:{configurable:!0,get:function(){return this.li},set:function(a){var b=this.li;b!==a&&(G&&A(a,"boolean",Yg,"isStrikethrough"), this.li=a,this.R(),this.g("isStrikethrough",b,a))}},wrap:{configurable:!0,get:function(){return this.sg},set:function(a){var b=this.sg;b!==a&&(G&&cb(a,Yg,Yg,"wrap"),this.sg=a,this.v(),this.g("wrap",b,a))}},overflow:{configurable:!0,get:function(){return this.gg},set:function(a){var b=this.gg;b!==a&&(G&&cb(a,Yg,Yg,"overflow"),this.gg=a,this.v(),this.g("overflow",b,a))}},stroke:{configurable:!0,get:function(){return this.Jc},set:function(a){var b=this.Jc;b!== -a&&(null!==a&&am(a,"TextBlock.stroke"),a instanceof Al&&a.freeze(),this.Jc=a,this.R(),this.g("stroke",b,a))}},lineCount:{configurable:!0,get:function(){return this.bd}},lineHeight:{configurable:!0,get:function(){return eo(this)}},editable:{configurable:!0,get:function(){return this.Rn},set:function(a){var b=this.Rn;b!==a&&(G&&A(a,"boolean",Yg,"editable"),this.Rn=a,this.g("editable",b,a))}},textEditor:{configurable:!0,get:function(){return this.Xp}, -set:function(a){var b=this.Xp;b!==a&&(!G||a instanceof Oe||v("TextBlock.textEditor must be an HTMLInfo."),this.Xp=a,this.g("textEditor",b,a))}},errorFunction:{configurable:!0,get:function(){return this.qd},set:function(a){var b=this.qd;b!==a&&(null!==a&&A(a,"function",Yg,"errorFunction"),this.qd=a,this.g("errorFunction",b,a))}},interval:{configurable:!0,get:function(){return this.be},set:function(a){var b=this.be;G&&D(a,Yg,"interval");a=Math.round(a);if(b!==a&&0!==a&&isFinite(a)){this.be= +a&&(null!==a&&am(a,"TextBlock.stroke"),a instanceof Al&&a.freeze(),this.Jc=a,this.R(),this.g("stroke",b,a))}},lineCount:{configurable:!0,get:function(){return this.cd}},lineHeight:{configurable:!0,get:function(){return eo(this)}},editable:{configurable:!0,get:function(){return this.Rn},set:function(a){var b=this.Rn;b!==a&&(G&&A(a,"boolean",Yg,"editable"),this.Rn=a,this.g("editable",b,a))}},textEditor:{configurable:!0,get:function(){return this.Xp}, +set:function(a){var b=this.Xp;b!==a&&(!G||a instanceof Oe||v("TextBlock.textEditor must be an HTMLInfo."),this.Xp=a,this.g("textEditor",b,a))}},errorFunction:{configurable:!0,get:function(){return this.rd},set:function(a){var b=this.rd;b!==a&&(null!==a&&A(a,"function",Yg,"errorFunction"),this.rd=a,this.g("errorFunction",b,a))}},interval:{configurable:!0,get:function(){return this.be},set:function(a){var b=this.be;G&&D(a,Yg,"interval");a=Math.round(a);if(b!==a&&0!==a&&isFinite(a)){this.be= a;this.v();var c=this.panel;null!==c&&(c.Zf=null);this.g("interval",b,a)}}},graduatedStart:{configurable:!0,get:function(){return this.$d},set:function(a){var b=this.$d;G&&D(a,Yg,"graduatedStart");b!==a&&(0>a?a=0:1a?a=0:1=a&&Aa(a,"> 0",Yg,"maxLines"),this.Ee=a,this.v(),this.g("maxLines",b,a))}},metrics:{configurable:!0,get:function(){return{arrSize:null!==this.Fc?this.Fc:[this.vb],arrText:null!==this.Ub?this.Ub:[this.we],maxLineWidth:this.vb,fontHeight:this.ye}}},choices:{configurable:!0,get:function(){return this.un},set:function(a){var b=this.un;b!==a&&(G&&null!==a&&!Array.isArray(a)&&za(a,"Array",Yg,"choices:value"),this.un=a,this.g("choices",b,a))}}}); var fo=null,go=null,qo=new F(Yg,"None",0),no=new F(Yg,"WrapFit",1),ao=new F(Yg,"WrapDesiredSize",2),so=new F(Yg,"WrapBreakAll",3),$n=new F(Yg,"OverflowClip",0),ko=new F(Yg,"OverflowEllipsis",1),bo=new F(Yg,"FormatTrim",0),uo=new F(Yg,"FormatNone",0),to=/[ \u200b\u00ad]/,vo=new eb,wo=0,xo=new eb,yo=0,mo="...",ho="",Zn=null,Yn=!1;Yg.className="TextBlock";Yg.getEllipsis=function(){return mo};Yg.setEllipsis=function(a){mo=a;xo=new eb;yo=0};Yg.getBaseline=function(){return fo}; Yg.setBaseline=function(a){fo=a};Yg.getUnderline=function(){return go};Yg.setUnderline=function(a){go=a};Yg.isValidFont=co;Yg.FormatNone=uo;Yg.FormatTrim=bo;Yg.None=qo;Yg.OverflowClip=$n;Yg.OverflowEllipsis=ko;Yg.WrapBreakAll=so;Yg.WrapDesiredSize=ao;Yg.WrapFit=no; -function jk(a,b){O.call(this);this.Sg=null;this.Qp="";this.sh=uc;this.sl=Fd;this.vh=this.qd=null;this.rl=Kc;this.Xd=tg;this.im=null;this.qo=!1;this.hi=!0;this.Hl=!1;this.bm=null;"string"===typeof a?this.source=a:a&&Object.assign(this,a);b&&Object.assign(this,b)}var zo;na(jk,O);jk.prototype.cloneProtected=function(a){O.prototype.cloneProtected.call(this,a);a.element=this.Sg;a.Qp=this.Qp;a.sh=this.sh.L();a.sl=this.sl;a.Xd=this.Xd;a.qd=this.qd;a.vh=this.vh;a.rl=this.rl.L();a.hi=this.hi;a.bm=this.bm}; +function jk(a,b){O.call(this);this.Sg=null;this.Qp="";this.sh=uc;this.sl=Fd;this.vh=this.rd=null;this.rl=Kc;this.Xd=tg;this.im=null;this.qo=!1;this.hi=!0;this.Hl=!1;this.bm=null;"string"===typeof a?this.source=a:a&&Object.assign(this,a);b&&Object.assign(this,b)}var zo;na(jk,O);jk.prototype.cloneProtected=function(a){O.prototype.cloneProtected.call(this,a);a.element=this.Sg;a.Qp=this.Qp;a.sh=this.sh.L();a.sl=this.sl;a.Xd=this.Xd;a.rd=this.rd;a.vh=this.vh;a.rl=this.rl.L();a.hi=this.hi;a.bm=this.bm}; jk.prototype.mb=function(a){a===tg||a===vg||a===kl?this.imageStretch=a:O.prototype.mb.call(this,a)};jk.prototype.toString=function(){return"Picture("+this.source+")#"+kb(this)};function Ki(a){void 0===a&&(a="");A(a,"string",jk,"clearCache:url");""!==a?zo[a]&&(delete zo[a],Ao--):(zo=new eb,Ao=0)} function Bo(a,b){b.kz||(b.Ur=function(c){b.Mr=!0;b.ko=!1;var d=b.Og.copy();if(null!==d&&void 0!==d){for(d=d.iterator;d.next();){var e=d.value;var f=b.getAttribute("src")||"";var g=e.lh.K(f);if(null!==g)for(var h=g.length,k=0;k=d.width&&(e=e+r.offsetX+(m*r.x-d.width*r.x));n>=d.height&&(f=f+r.offsetY+(n*r.y-d.height*r.y));h=Math.min(d.width,m);g=Math.min(d.height,n);break;case Fd:m=d.width;n=d.height;break;case vg:case kl:p===vg?(p=Math.min(d.height/n,d.width/m),m*=p,n*=p):p===kl&&(p=Math.max(d.height/n,d.width/m),m*=p,n*=p,m>=d.width&&(e=(e+r.offsetX+(m*r.x-d.width*r.x)/m)*h),n>=d.height&&(f=(f+r.offsetY+(n*r.y-d.height*r.y)/n)*g),h*=1/(m/ d.width),g*=1/(n/d.height),m=d.width,n=d.height)}p=this.If()*b.scale;var q=m*p*n*p,u=h*g/q,w=c.__goCache;p=null;var y=Co;if(c.Mr&&void 0!==w&&4y*y)for(null===w.Pi&&(Do(w,4,k,l,c),Do(w,16,k,l,c)),k=w.Pi,l=k.length,q=0;qe.x&&a.y>e.y&&a.righte.x&&b.y>e.y&&b.righte.x&&a.y>e.y&&a.righte.x&&b.y>e.y&&b.right=c.maxSelectionCount)){this.G^=4096;var d=!1;if(null!==c){d=c.skipsUndoManager;c.skipsUndoManager=!0;var e=c.selection; e.ka();a?e.add(this):e.remove(this);e.freeze()}this.g("isSelected",b,a);this.Qb();a=this.selectionChanged;null!==a&&a(this);null!==c&&(c.Lb(),c.skipsUndoManager=d)}}}},isHighlighted:{configurable:!0,get:function(){return 0!==(this.G&524288)},set:function(a){var b=0!==(this.G&524288);if(b!==a){G&&A(a,"boolean",U,"isHighlighted");this.G^=524288;var c=this.diagram;null!==c&&(c=c.highlighteds,c.ka(),a?c.add(this):c.remove(this),c.freeze());this.g("isHighlighted",b,a);this.R();a=this.highlightedChanged; @@ -1496,7 +1496,7 @@ this.Gp=a,this.g("selectionAdornmentTemplate",b,a))}},selectionObject:{configura b,a))}},resizeAdornmentTemplate:{configurable:!0,get:function(){return this.sp},set:function(a){var b=this.sp;b!==a&&(G&&x(a,Je,U,"resizeAdornmentTemplate"),this.sp=a,this.g("resizeAdornmentTemplate",b,a))}},resizeObjectName:{configurable:!0,get:function(){return this.vp},set:function(a){var b=this.vp;b!==a&&(G&&A(a,"string",U,"resizeObjectName"),this.vp=a,this.g("resizeObjectName",b,a))}},resizeObject:{configurable:!0,get:function(){var a=this.resizeObjectName; return""!==a&&(a=this.eb(a),null!==a)?a:this}},resizeCellSize:{configurable:!0,get:function(){return this.tp},set:function(a){var b=this.tp;b.B(a)||(G&&x(a,Hb,U,"resizeCellSize"),this.tp=a=a.L(),this.g("resizeCellSize",b,a))}},rotateAdornmentTemplate:{configurable:!0,get:function(){return this.xp},set:function(a){var b=this.xp;b!==a&&(G&&x(a,Je,U,"rotateAdornmentTemplate"),this.xp=a,this.g("rotateAdornmentTemplate",b,a))}},rotateObjectName:{configurable:!0, get:function(){return this.yp},set:function(a){var b=this.yp;b!==a&&(G&&A(a,"string",U,"rotateObjectName"),this.yp=a,this.g("rotateObjectName",b,a))}},rotateObject:{configurable:!0,get:function(){var a=this.rotateObjectName;return""!==a&&(a=this.eb(a),null!==a)?a:this}},rotationSpot:{configurable:!0,get:function(){return this.zp},set:function(a){var b=this.zp;b.B(a)||(G&&(x(a,Ib,U,"rotationSpot"),a===gd||a.fb()||v("Part.rotationSpot must be a specific Spot value or Spot.Default, not: "+ -a)),this.zp=a=a.L(),this.g("rotationSpot",b,a))}},text:{configurable:!0,get:function(){return this.Zb},set:function(a){var b=this.Zb;b!==a&&(G&&A(a,"string",U,"text"),this.Zb=a,this.g("text",b,a))}},containingGroup:{configurable:!0,get:function(){return this.ai},set:function(a){if(this.Pc()){var b=this.ai;if(b!==a){G&&null!==a&&x(a,vf,U,"containingGroup");null===a||this!==a&&!a.Md(this)||(this===a&&v("Cannot make a Group a member of itself: "+this.toString()),v("Cannot make a Group indirectly contain itself: "+ +a)),this.zp=a=a.L(),this.g("rotationSpot",b,a))}},text:{configurable:!0,get:function(){return this.Zb},set:function(a){var b=this.Zb;b!==a&&(G&&A(a,"string",U,"text"),this.Zb=a,this.g("text",b,a))}},containingGroup:{configurable:!0,get:function(){return this.ai},set:function(a){if(this.Qc()){var b=this.ai;if(b!==a){G&&null!==a&&x(a,vf,U,"containingGroup");null===a||this!==a&&!a.Md(this)||(this===a&&v("Cannot make a Group a member of itself: "+this.toString()),v("Cannot make a Group indirectly contain itself: "+ this.toString()+" already contains "+a.toString()));this.C(2);var c=this.diagram;null!==b?Vo(b,this):this instanceof vf&&null!==c&&c.Ji.remove(this);this.ai=a;null!==a?Uo(a,this):this instanceof vf&&null!==c&&c.Ji.add(this);this.C(1);if(null!==c&&c.ba){var d=this.data,e=c.model;if(null!==d&&e.aj()){var f=e.va(null!==a?a.data:null);e.Tq(d,f)}}d=this.containingGroupChanged;null!==d&&(e=!0,null!==c&&(e=c.ba,c.ba=!0),d(this,b,a),null!==c&&(c.ba=e));if(this instanceof vf)for(c=new I,el(c,this,!0,0,!0), c=c.iterator;c.next();)if(d=c.value,d instanceof V)for(d=d.linksConnected;d.next();)$o(d.value);if(this instanceof V){for(c=this.linksConnected;c.next();)$o(c.value);c=this.labeledLink;null!==c&&$o(c)}this.g("containingGroup",b,a);null!==a&&(b=a.layer,null!==b&&qi(b,-1,a))}}else v("cannot set the Part.containingGroup of a Link or Adornment")}},containingGroupChanged:{configurable:!0,get:function(){return this.xn},set:function(a){var b=this.xn;b!==a&&(null!==a&&A(a,"function",U,"containingGroupChanged"), this.xn=a,this.g("containingGroupChanged",b,a))}},isTopLevel:{configurable:!0,get:function(){return null!==this.containingGroup||this instanceof V&&null!==this.labeledLink?!1:!0}},layoutConditions:{configurable:!0,get:function(){return this.Eo},set:function(a){var b=this.Eo;b!==a&&(G&&A(a,"number",U,"layoutConditions"),this.Eo=a,this.g("layoutConditions",b,a))}},dragComputation:{configurable:!0,get:function(){return this.Nn},set:function(a){var b=this.Nn; @@ -1504,14 +1504,14 @@ b!==a&&(null!==a&&A(a,"function",U,"dragComputation"),this.Nn=a,this.g("dragComp enumerable:!0,get:function(){return this.ng},set:function(a){var b=this.ng;b!==a&&(G&&A(a,"number",U,"shadowBlur"),this.ng=a,this.R(),this.g("shadowBlur",b,a))}}});U.prototype.invalidateLayout=U.prototype.C;U.prototype.findCommonContainingGroup=U.prototype.iy;U.prototype.isMemberOf=U.prototype.Md;U.prototype.findTopLevelPart=U.prototype.qA;U.prototype.findSubGraphLevel=U.prototype.mA;U.prototype.ensureBounds=U.prototype.Xa;U.prototype.getDocumentBounds=U.prototype.Yi;U.prototype.findObject=U.prototype.eb; U.prototype.moveTo=U.prototype.moveTo;U.prototype.invalidateAdornments=U.prototype.Qb;U.prototype.clearAdornments=U.prototype.mk;U.prototype.removeAdornment=U.prototype.Of;U.prototype.addAdornment=U.prototype.Eh;U.prototype.findAdornment=U.prototype.vk;U.prototype.updateTargetBindings=U.prototype.Ia;var So=!1;U.className="Part";U.LayoutNone=0;U.LayoutAdded=1;U.LayoutRemoved=2;U.LayoutShown=4;U.LayoutHidden=8;U.LayoutNodeSized=16;U.LayoutGroupLayout=32;U.LayoutNodeReplaced=64;U.LayoutStandard=127; U.LayoutAll=16777215;function Je(a,b){void 0===a||a instanceof Yl||"string"===typeof a?U.call(this,a):(U.call(this),a&&(b=a));this.G&=-257;this.$g="Adornment";this.re=null;this.sx=0;this.Mx=!1;this.j=this.Ra=null;b&&Object.assign(this,b)}na(Je,U);Je.prototype.toString=function(){var a=this.adornedPart;return"Adornment("+this.category+")"+(null!==a?a.toString():"")};Je.prototype.updateRelationshipsFromData=function(){}; -Je.prototype.Ek=function(a){var b=this.adornedObject,c=null===b||void 0===b?void 0:b.part;if(c instanceof R&&b instanceof Hf){b=c.path;c.Ek(a);a=b.geometry;c=this.W.m;b=c.length;for(var d=0;da&&(a=2);var b=this.diagram;if(null!==b&&!b.Ue){b.Ue=!0;var c=new I;c.add(this);mp(this,c,b.isTreePathToChildren,a,b,this,b.treeCollapsePolicy===Ei);b.Ue=!1}}; -function mp(a,b,c,d,e,f,g){for(var h=f===a?!1:a.isTreeExpanded,k=c?a.uq():a.Kd();k.next();){var l=k.value;l.isTreeLink&&(h||l.xd||l.Za(),l=l.zq(a),null!==l&&l!==a&&!b.contains(l)&&(b.add(l),h||(l.Sb(!0),l.Nh(),g&&e.kk(l,f)),2e&&(e=h.right);h.bottom>f&&(f=h.bottom)}}isFinite(c)&&isFinite(d)?a.h(c,d,e-c,f-d):(b=b.location, a.h(b.x,b.y,0,0));return a};oa.Object.defineProperties(rg.prototype,{padding:{configurable:!0,get:function(){return this.rb},set:function(a){"number"===typeof a?a=new ic(a):x(a,ic,rg,"padding");var b=this.rb;b.B(a)||(this.rb=a=a.L(),this.g("padding",b,a),this.v())}}});rg.className="Placeholder"; -function R(a){U.call(this,W.Link);this.Na=8;this.df=null;this.ef="";this.xf=this.$n=null;this.yf="";this.$p=null;this.Rk=hg;this.En=0;this.Gn=hg;this.Hn=NaN;this.ak=rp;this.Pp=.5;this.rd=null;this.Gb=(new H).freeze();this.qf=this.Ic=null;this.Tl=new M;this.sa=new N;this.F=this.o=this.Uf=this.Yf=null;this.dv=new K;this.Dr=this.Fx=this.Ex=null;this.du=NaN;this.T=null;this.j=[];a&&Object.assign(this,a)}na(R,U); +function R(a){U.call(this,W.Link);this.Na=8;this.df=null;this.ef="";this.xf=this.$n=null;this.yf="";this.$p=null;this.Rk=hg;this.En=0;this.Gn=hg;this.Hn=NaN;this.ak=rp;this.Pp=.5;this.sd=null;this.Gb=(new H).freeze();this.qf=this.Ic=null;this.Tl=new M;this.sa=new N;this.F=this.o=this.Uf=this.Yf=null;this.dv=new K;this.Dr=this.Fx=this.Ex=null;this.du=NaN;this.T=null;this.j=[];a&&Object.assign(this,a)}na(R,U); R.prototype.cloneProtected=function(a){U.prototype.cloneProtected.call(this,a);a.Na=this.Na&-113;a.ef=this.ef;a.$n=this.$n;a.yf=this.yf;a.$p=this.$p;a.Rk=this.Rk;a.En=this.En;a.Gn=this.Gn;a.Hn=this.Hn;a.ak=this.ak;a.Pp=this.Pp;null!==this.T&&(a.T=this.T.copy())};t=R.prototype;t.Ef=function(a){U.prototype.Ef.call(this,a);this.ef=a.ef;this.yf=a.yf;a.Ic=null;a.Za();a.Uf=this.Uf;var b=a.fromPort;null!==b&&dp(b);a=a.toPort;null!==a&&dp(a)}; -t.mb=function(a){a.classType===R?2===(a.value&2)?this.routing=a:a===kg||a===gg||a===fg?this.curve=a:a===sp||a===tp||a===up?this.adjusting=a:a!==rp&&a!==hg&&v("Unknown Link enum value for a Link property: "+a):U.prototype.mb.call(this,a)};t.Nc=function(){null===this.T&&(this.T=new ql)};t.ej=function(){var a=this.fromNode;if(null!==a){var b=a.findVisibleNode();null!==b&&(a=b);if(Bj(a)||Cj(a))return!1}a=this.toNode;return null!==a&&(b=a.findVisibleNode(),null!==b&&(a=b),Bj(a)||Cj(a))?!1:!0};t.mw=function(){return!1}; -t.tt=function(){};t.Pc=function(){return!1};R.prototype.computeAngle=function(a,b,c){return R.computeAngle(b,c)};R.computeAngle=function(a,b){switch(a){default:case hg:a=0;break;case fn:a=b;break;case Zm:a=b+90;break;case an:a=b-90;break;case vp:a=b+180;break;case gn:a=L.Iq(b);90a&&(a-=180);break;case $m:a=L.Iq(b+90);90a&&(a-=180);break;case bn:a=L.Iq(b-90);90a&&(a-=180);break;case cn:a=L.Iq(b);if(45a||225a)return 0;90a&&(a-=180)}return L.Iq(a)}; -function $o(a){var b=a.fromNode,c=a.toNode,d=null;null!==b?d=null!==c?b.iy(c):b.containingGroup:null!==c?d=c.containingGroup:d=null;b=d;c=a.ai;if(c!==b){null!==c&&Vo(c,a);a.ai=b;null!==b&&Uo(b,a);var e=a.containingGroupChanged;if(null!==e){var f=!0,g=a.diagram;null!==g&&(f=g.ba,g.ba=!0);e(a,c,b);null!==g&&(g.ba=f)}!a.xd||a.Ex!==c&&a.Fx!==c||a.Za()}if(a.isLabeledLink)for(a=a.labelNodes;a.next();)a.value.containingGroup=d}t=R.prototype; -t.Nh=function(){var a=this.containingGroup;null!==a&&this.fromNode!==a&&this.toNode!==a&&a.computesBoundsIncludingLinks&&U.prototype.Nh.call(this)};t.zq=function(a){G&&x(a,V,R,"getOtherNode:node");var b=this.fromNode;return a===b?this.toNode:b};t.zA=function(a){G&&x(a,O,R,"getOtherPort:port");var b=this.fromPort;return a===b?this.toPort:b};function hp(a,b){null===a.rd&&(a.rd=new I);a.rd.add(b);a.v()} +t.mb=function(a){a.classType===R?2===(a.value&2)?this.routing=a:a===kg||a===gg||a===fg?this.curve=a:a===sp||a===tp||a===up?this.adjusting=a:a!==rp&&a!==hg&&v("Unknown Link enum value for a Link property: "+a):U.prototype.mb.call(this,a)};t.Oc=function(){null===this.T&&(this.T=new ql)};t.ej=function(){var a=this.fromNode;if(null!==a){var b=a.findVisibleNode();null!==b&&(a=b);if(Bj(a)||Cj(a))return!1}a=this.toNode;return null!==a&&(b=a.findVisibleNode(),null!==b&&(a=b),Bj(a)||Cj(a))?!1:!0};t.mw=function(){return!1}; +t.tt=function(){};t.Qc=function(){return!1};R.prototype.computeAngle=function(a,b,c){return R.computeAngle(b,c)};R.computeAngle=function(a,b){switch(a){default:case hg:a=0;break;case fn:a=b;break;case Zm:a=b+90;break;case an:a=b-90;break;case vp:a=b+180;break;case gn:a=L.Iq(b);90a&&(a-=180);break;case $m:a=L.Iq(b+90);90a&&(a-=180);break;case bn:a=L.Iq(b-90);90a&&(a-=180);break;case cn:a=L.Iq(b);if(45a||225a)return 0;90a&&(a-=180)}return L.Iq(a)}; +function $o(a){var b=a.fromNode,c=a.toNode,d=null;null!==b?d=null!==c?b.iy(c):b.containingGroup:null!==c?d=c.containingGroup:d=null;b=d;c=a.ai;if(c!==b){null!==c&&Vo(c,a);a.ai=b;null!==b&&Uo(b,a);var e=a.containingGroupChanged;if(null!==e){var f=!0,g=a.diagram;null!==g&&(f=g.ba,g.ba=!0);e(a,c,b);null!==g&&(g.ba=f)}!a.yd||a.Ex!==c&&a.Fx!==c||a.Za()}if(a.isLabeledLink)for(a=a.labelNodes;a.next();)a.value.containingGroup=d}t=R.prototype; +t.Nh=function(){var a=this.containingGroup;null!==a&&this.fromNode!==a&&this.toNode!==a&&a.computesBoundsIncludingLinks&&U.prototype.Nh.call(this)};t.zq=function(a){G&&x(a,V,R,"getOtherNode:node");var b=this.fromNode;return a===b?this.toNode:b};t.zA=function(a){G&&x(a,O,R,"getOtherPort:port");var b=this.fromPort;return a===b?this.toPort:b};function hp(a,b){null===a.sd&&(a.sd=new I);a.sd.add(b);a.v()} t.Bq=function(a){U.prototype.Bq.call(this,a);wp(this)&&this.Dq(this.actualBounds);if(!a){a=this.df;var b=null;null!==a&&(b=this.fromPort,fp(a,this,b));var c=this.xf;if(null!==c){var d=this.toPort;c===a&&d===b||fp(c,this,d)}xp(this)}};t.Cq=function(a){U.prototype.Cq.call(this,a);wp(this)&&this.Dq(this.actualBounds);if(!a){a=this.df;var b=null;null!==a&&(b=this.fromPort,gp(a,this,b));var c=this.xf;if(null!==c){var d=this.toPort;c===a&&d===b||gp(c,this,d)}yp(this)}}; -t.tk=function(){this.xd=!0;if(null!==this.rd){var a=this.diagram;if(null!==a)for(var b=this.rd.copy().iterator;b.next();)a.remove(b.value)}null!==this.data&&(a=this.diagram,null!==a&&a.partManager.removeDataForLink(this))};R.prototype.updateRelationshipsFromData=function(){if(null!==this.data){var a=this.diagram;null!==a&&a.partManager.updateRelationshipsFromData(this)}}; +t.tk=function(){this.yd=!0;if(null!==this.sd){var a=this.diagram;if(null!==a)for(var b=this.sd.copy().iterator;b.next();)a.remove(b.value)}null!==this.data&&(a=this.diagram,null!==a&&a.partManager.removeDataForLink(this))};R.prototype.updateRelationshipsFromData=function(){if(null!==this.data){var a=this.diagram;null!==a&&a.partManager.updateRelationshipsFromData(this)}}; R.prototype.move=function(a,b){var c=b?this.location:this.position,d=c.x;isNaN(d)&&(d=0);var e=c.y;isNaN(e)&&(e=0);d=a.x-d;e=a.y-e;!0===b?U.prototype.move.call(this,a,!1):(a=K.allocAt(c.x+d,c.y+e),U.prototype.move.call(this,a,!1),K.free(a));lf(this,d,e);for(a=this.labelNodes;a.next();)b=a.value,c=b.position,b.moveTo(c.x+d,c.y+e)}; R.prototype.canRelinkFrom=function(){if(!this.relinkableFrom)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowRelink)return!1;a=a.diagram;return null===a||a.allowRelink?!0:!1};R.prototype.canRelinkTo=function(){if(!this.relinkableTo)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowRelink)return!1;a=a.diagram;return null===a||a.allowRelink?!0:!1}; R.prototype.computeMidPoint=function(a){var b=this.pointsCount;if(0===b)return a.assign(Cb),a;if(1===b)return a.assign(this.i(0)),a;if(2===b){var c=this.i(0),d=this.i(1);a.h((c.x+d.x)/2,(c.y+d.y)/2);return a}if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===kg))return this.sa.Jv(.5,a),a.add(this.i(0)),c=this.sa.figures.first(),a.offset(-c.startX,-c.startY),a;if(this.computeCurve()===kg){if(3===b)return this.i(1);d=(b-1)/3|0;c=3*(d/2|0);if(1===d%2){d=this.i(c);var e=this.i(c+1), f=this.i(c+2);c=this.i(c+3);L.Hz(d.x,d.y,e.x,e.y,f.x,f.y,c.x,c.y,a)}else a.assign(this.i(c));return a}var g=this.flattenedLengths;c=this.flattenedTotalLength;for(e=f=d=0;dc/2)break;d+=e;f++}b=this.i(f);f=this.i(f+1);1>Math.abs(b.x-f.x)?b.y>f.y?a.h(b.x,b.y-(c/2-d)):a.h(b.x,b.y+(c/2-d)):1>Math.abs(b.y-f.y)?b.x>f.x?a.h(b.x-(c/2-d),b.y):a.h(b.x+(c/2-d),b.y):(c=(c/2-d)/e,a.h(b.x+c*(f.x-b.x),b.y+c*(f.y-b.y)));return a}; -R.prototype.computeMidAngle=function(){var a=this.pointsCount;if(2>a)return NaN;if(2===a)return this.i(0).Ua(this.i(1));if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===kg))return this.sa.oy(.5);if(this.computeCurve()===kg&&4<=a){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){c=Math.floor(c);a=this.i(c);b=this.i(c+1);var d=this.i(c+2);c=this.i(c+3);return L.Gz(a.x,a.y,b.x,b.y,d.x,d.y,c.x,c.y)}if(0d/2)break;e+=f;c++}b=this.i(c);d=this.i(c+1);if(1>Math.abs(b.x-d.x)&&1>Math.abs(b.y-d.y)){if(0Math.abs(b.x-d.x))return b.y>d.y?270:90;if(1>Math.abs(b.y-d.y))return b.x>d.x?180:0}return b.Ua(d)};t=R.prototype;t.i=function(a){return this.Gb.m[a]}; -t.Sc=function(a,b){G&&(x(b,K,R,"setPoint"),b.s()||v("Link.setPoint called with a Point that does not have real numbers: "+b.toString()));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.Rc(a,b)};t.O=function(a,b,c){G&&(D(b,R,"setPointAt:x"),D(c,R,"setPointAt:y"));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.Rc(a,new K(b,c))}; +R.prototype.computeMidAngle=function(){var a=this.pointsCount;if(2>a)return NaN;if(2===a)return this.i(0).Wa(this.i(1));if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===kg))return this.sa.oy(.5);if(this.computeCurve()===kg&&4<=a){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){c=Math.floor(c);a=this.i(c);b=this.i(c+1);var d=this.i(c+2);c=this.i(c+3);return L.Gz(a.x,a.y,b.x,b.y,d.x,d.y,c.x,c.y)}if(0d/2)break;e+=f;c++}b=this.i(c);d=this.i(c+1);if(1>Math.abs(b.x-d.x)&&1>Math.abs(b.y-d.y)){if(0Math.abs(b.x-d.x))return b.y>d.y?270:90;if(1>Math.abs(b.y-d.y))return b.x>d.x?180:0}return b.Wa(d)};t=R.prototype;t.i=function(a){return this.Gb.m[a]}; +t.Tc=function(a,b){G&&(x(b,K,R,"setPoint"),b.s()||v("Link.setPoint called with a Point that does not have real numbers: "+b.toString()));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.Sc(a,b)};t.O=function(a,b,c){G&&(D(b,R,"setPointAt:x"),D(c,R,"setPointAt:y"));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.Sc(a,new K(b,c))}; t.IA=function(a,b){G&&(x(b,K,R,"insertPoint"),b.s()||v("Link.insertPoint called with a Point that does not have real numbers: "+b.toString()));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.zb(a,b)};t.l=function(a,b,c){G&&(D(b,R,"insertPointAt:x"),D(c,R,"insertPointAt:y"));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.zb(a,new K(b,c))}; t.ke=function(a){G&&(x(a,K,R,"addPoint"),a.s()||v("Link.addPoint called with a Point that does not have real numbers: "+a.toString()));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.add(a)};t.Bf=function(a,b){G&&(D(a,R,"insertPointAt:x"),D(b,R,"insertPointAt:y"));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.add(new K(a,b))}; t.ew=function(a){G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.kb(a)};t.nk=function(){G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.clear()}; -function lf(a,b,c){if(0!==b||0!==c)if(0===a.pointsCount)a.defaultFromPoint&&a.defaultFromPoint.offset(b,c),a.defaultToPoint&&a.defaultToPoint.offset(b,c);else{for(var d=a.xd,e=new H,f=a.Gb.iterator;f.next();){var g=f.value;e.add((new K(g.x+b,g.y+c)).freeze())}e.freeze();f=a.Gb;a.Gb=e;g=a.diagram;isNaN(b)||isNaN(c)||null!==g&&g.animationManager.wb?a.v():(a.ge.h(a.ge.x+b,a.ge.y+c),a.qa.h(a.qa.x+b,a.qa.y+c),Nl(a));d?zp(a):(a.defaultFromPoint&&(a.defaultFromPoint=a.i(0)),a.defaultToPoint&&(a.defaultToPoint= +function lf(a,b,c){if(0!==b||0!==c)if(0===a.pointsCount)a.defaultFromPoint&&a.defaultFromPoint.offset(b,c),a.defaultToPoint&&a.defaultToPoint.offset(b,c);else{for(var d=a.yd,e=new H,f=a.Gb.iterator;f.next();){var g=f.value;e.add((new K(g.x+b,g.y+c)).freeze())}e.freeze();f=a.Gb;a.Gb=e;g=a.diagram;isNaN(b)||isNaN(c)||null!==g&&g.animationManager.wb?a.v():(a.ge.h(a.ge.x+b,a.ge.y+c),a.qa.h(a.qa.x+b,a.qa.y+c),Nl(a));d?zp(a):(a.defaultFromPoint&&(a.defaultFromPoint=a.i(0)),a.defaultToPoint&&(a.defaultToPoint= a.i(a.pointsCount-1)));null!==g&&g.animationManager.wb&&(b=g.animationManager,a.qf=e,b.Vl.add(a));a.g("points",f,e)}}t.Sh=function(){null===this.Ic&&(this.Ic=this.Gb,this.Gb=this.Gb.copy())}; t.Df=function(){if(null!==this.Ic){for(var a=this.Ic,b=this.Gb,c=Infinity,d=Infinity,e=a.m,f=e.length,g=0;gl&&(n=-n),u= -(0>k?-1:1)*n+r,w=m*(u-r)+q);r=f.x+2*h/3;q=f.y+2*k/3;var y=r,z=q;L.A(k,0)?z=0k?-1:1)*n+r,z=m*(y-r)+q);this.nk();this.ke(f);this.Bf(u,w);this.Bf(y,z);this.ke(p);this.Sc(0,this.getLinkPoint(a,b,g,!0,!1,d,e));this.Sc(3,this.getLinkPoint(d,e,c,!1,!1,a,b))}else if(f=d,p=e,d=this.getLinkPoint(a,b,g,!0,!1,f,p),e=this.getLinkPoint(f,p,c,!1,!1,a,b),this.hasCurviness())p=e.x-d.x,c=e.y-d.y,g=this.computeCurviness(),a=d.x+p/2,b=d.y+c/2,f=a,h=b,L.A(c,0)?h=0g&&(f=-f),f=(0>c?-1:1)*f+a,h=p*(f-a)+b),this.ke(d),this.Bf(f,h),this.ke(e);else{this.ke(d);this.ke(e);h=M.alloc();b.Yi(h);k=h.ca(e);p.Yi(h);l=h.ca(d);if(k||l)g=b.ja(Ep(g),new K),this.Sc(0,this.getLinkPointFromPoint(a,b,g,e,!0,g)),c=p.ja(Ep(c),new K),this.Sc(1,this.getLinkPointFromPoint(f,p,c,d,!1,c));M.free(h)}}else{n=this.isAvoiding;p&&(m&&n||l)&&this.nk();var B=l?this.computeCurviness():0;n=this.getLinkPoint(a,b,g,!0,m,d,e);r=u=q=0;if(m||!h||l)w=this.computeEndSegmentLength(a,b,g,!0),r= +(0>k?-1:1)*n+r,w=m*(u-r)+q);r=f.x+2*h/3;q=f.y+2*k/3;var y=r,z=q;L.A(k,0)?z=0k?-1:1)*n+r,z=m*(y-r)+q);this.nk();this.ke(f);this.Bf(u,w);this.Bf(y,z);this.ke(p);this.Tc(0,this.getLinkPoint(a,b,g,!0,!1,d,e));this.Tc(3,this.getLinkPoint(d,e,c,!1,!1,a,b))}else if(f=d,p=e,d=this.getLinkPoint(a,b,g,!0,!1,f,p),e=this.getLinkPoint(f,p,c,!1,!1,a,b),this.hasCurviness())p=e.x-d.x,c=e.y-d.y,g=this.computeCurviness(),a=d.x+p/2,b=d.y+c/2,f=a,h=b,L.A(c,0)?h=0g&&(f=-f),f=(0>c?-1:1)*f+a,h=p*(f-a)+b),this.ke(d),this.Bf(f,h),this.ke(e);else{this.ke(d);this.ke(e);h=M.alloc();b.Yi(h);k=h.ca(e);p.Yi(h);l=h.ca(d);if(k||l)g=b.ja(Ep(g),new K),this.Tc(0,this.getLinkPointFromPoint(a,b,g,e,!0,g)),c=p.ja(Ep(c),new K),this.Tc(1,this.getLinkPointFromPoint(f,p,c,d,!1,c));M.free(h)}}else{n=this.isAvoiding;p&&(m&&n||l)&&this.nk();var B=l?this.computeCurviness():0;n=this.getLinkPoint(a,b,g,!0,m,d,e);r=u=q=0;if(m||!h||l)w=this.computeEndSegmentLength(a,b,g,!0),r= this.getLinkDirection(a,b,n,g,!0,m,d,e),l&&(h||g.B(c)||!m&&1===g.x+c.x&&1===g.y+c.y)&&(r-=m?90:30,0>B&&(r-=180)),0>r?r+=360:360<=r&&(r-=360),l&&(w+=Math.abs(B)*(m?1:2)),0===r?q=w:90===r?u=w:180===r?q=-w:270===r?u=-w:(q=w*Math.cos(r*Math.PI/180),u=w*Math.sin(r*Math.PI/180)),g.bc()&&l&&(w=b.ja(Kc,K.alloc()),y=K.allocAt(w.x+1E3*q,w.y+1E3*u),this.getLinkPointFromPoint(a,b,w,y,!0,n),K.free(w),K.free(y));w=this.getLinkPoint(d,e,c,!1,m,a,b);var C=z=y=0;if(m||!k||l){var E=this.computeEndSegmentLength(d,e, c,!1);C=this.getLinkDirection(d,e,w,c,!1,m,a,b);l&&(k||g.B(c)||!m&&1===g.x+c.x&&1===g.y+c.y)&&(C+=m?0:30,0>B&&(C+=180));0>C?C+=360:360<=C&&(C-=360);l&&(E+=Math.abs(B)*(m?1:2));0===C?y=E:90===C?z=E:180===C?y=-E:270===C?z=-E:(y=E*Math.cos(C*Math.PI/180),z=E*Math.sin(C*Math.PI/180));c.bc()&&l&&(c=e.ja(Kc,K.alloc()),g=K.allocAt(c.x+1E3*y,c.y+1E3*z),this.getLinkPointFromPoint(d,e,c,g,!1,w),K.free(c),K.free(g))}c=n;if(m||!h||l)c=new K(n.x+q,n.y+u);g=w;if(m||!k||l)g=new K(w.x+y,w.y+z);!p&&!m&&h&&3Math.abs(b.y-a.y)?(b.x>=a.x?b.x=a.x+9E9:b.x=a.x-9E9,b.y=a.y):(b.y>=a.y?b.y=a.y+9E9:b.y=a.y-9E9,b.x=a.x);return b} +n,f-2,g)?this.Tc(f-1,w):!p&&!m&&k&&3Math.abs(b.y-a.y)?(b.x>=a.x?b.x=a.x+9E9:b.x=a.x-9E9,b.y=a.y):(b.y>=a.y?b.y=a.y+9E9:b.y=a.y-9E9,b.x=a.x);return b} R.prototype.getLinkPointFromPoint=function(a,b,c,d,e,f){void 0===f&&(f=new K);if(null===a||null===b)return f.assign(c),f;a.isVisible()||(e=a.findVisibleNode(),null!==e&&e!==a&&(b=e.port));a=null;e=b.panel;null===e||e.pe()||(e=e.panel);if(null===e){e=d.x;d=d.y;var g=c.x;c=c.y}else{a=e.le;e=1/(a.m11*a.m22-a.m12*a.m21);g=a.m22*e;var h=-a.m12*e,k=-a.m21*e,l=a.m11*e,m=e*(a.m21*a.dy-a.m22*a.dx),n=e*(a.m12*a.dx-a.m11*a.dy);e=d.x*g+d.y*k+m;d=d.x*h+d.y*l+n;g=c.x*g+c.y*k+m;c=c.x*h+c.y*l+n}b.yk(e,d,g,c,f);null!== a&&f.transform(a);return f};function Gp(a,b){var c=b.op;null===c&&(c=new Hp,c.port=b,c.node=b.part,b.op=c);return Ip(c,a)} -R.prototype.getLinkPoint=function(a,b,c,d,e,f,g,h){void 0===h&&(h=new K);if(c.fb()&&!Dp(c))return b.ja(c,h),h;if(c.Qc()){var k=Gp(this,b);if(null!==k){h.assign(k.Gq);if(e&&this.routing===Jp){var l=Gp(this,g);if(null!==l&&k.tm=m.y&&a.y<=m.y+m.height?h.y=a.y:(c.Lf(Qc)||c.Lf(Tc))&&a.x>=m.x&&a.x<=m.x+m.width&&(h.x=a.x);K.free(k);K.free(l)}}return h}}c= +R.prototype.getLinkPoint=function(a,b,c,d,e,f,g,h){void 0===h&&(h=new K);if(c.fb()&&!Dp(c))return b.ja(c,h),h;if(c.Rc()){var k=Gp(this,b);if(null!==k){h.assign(k.Gq);if(e&&this.routing===Jp){var l=Gp(this,g);if(null!==l&&k.tm=m.y&&a.y<=m.y+m.height?h.y=a.y:(c.Lf(Qc)||c.Lf(Tc))&&a.x>=m.x&&a.x<=m.x+m.width&&(h.x=a.x);K.free(k);K.free(l)}}return h}}c= b.ja(Ep(c),K.alloc());this.pointsCount>(e?6:2)?(g=d?this.i(1):this.i(this.pointsCount-2),e&&(g=Fp(c,g.copy()))):(k=this.computeSpot(!d,g),f=K.alloc(),g=g.ja(Ep(k),f),e&&(g=Fp(c,g)),K.free(f));this.getLinkPointFromPoint(a,b,c,g,d,h);K.free(c);return h}; -R.prototype.getLinkDirection=function(a,b,c,d,e,f,g,h){a:if(d.fb())var k=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x1-d.y?90:d.x<1-d.y?180:135:.5>d.x?225:.5(f?6:2)?(h=e?this.i(1):this.i(this.pointsCount-2),h=f?Fp(k,h.copy()):c):(c=K.alloc(),h=h.ja(Kc,c),K.free(c));c=Math.abs(h.x-k.x)>Math.abs(h.y-k.y)?h.x>= -k.x?0:180:h.y>=k.y?90:270;K.free(k);k=c}d.bc()&&g.Md(a)&&(k+=180,360<=k&&(k-=360));if(Dp(d))return k;a=b.Xi();if(0===a)return k;45<=a&&135>a?k+=90:135<=a&&225>a?k+=180:225<=a&&315>a&&(k+=270);360<=k&&(k-=360);return k};R.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.Qc()&&(a=Gp(this,b),null!==a))return a.Bv;a=d?this.fromEndSegmentLength:this.toEndSegmentLength;null!==b&&isNaN(a)&&(a=d?b.fromEndSegmentLength:b.toEndSegmentLength);isNaN(a)&&(a=10);return a}; +R.prototype.getLinkDirection=function(a,b,c,d,e,f,g,h){a:if(d.fb())var k=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x1-d.y?90:d.x<1-d.y?180:135:.5>d.x?225:.5(f?6:2)?(h=e?this.i(1):this.i(this.pointsCount-2),h=f?Fp(k,h.copy()):c):(c=K.alloc(),h=h.ja(Kc,c),K.free(c));c=Math.abs(h.x-k.x)>Math.abs(h.y-k.y)?h.x>= +k.x?0:180:h.y>=k.y?90:270;K.free(k);k=c}d.bc()&&g.Md(a)&&(k+=180,360<=k&&(k-=360));if(Dp(d))return k;a=b.Xi();if(0===a)return k;45<=a&&135>a?k+=90:135<=a&&225>a?k+=180:225<=a&&315>a&&(k+=270);360<=k&&(k-=360);return k};R.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.Rc()&&(a=Gp(this,b),null!==a))return a.Bv;a=d?this.fromEndSegmentLength:this.toEndSegmentLength;null!==b&&isNaN(a)&&(a=d?b.fromEndSegmentLength:b.toEndSegmentLength);isNaN(a)&&(a=10);return a}; R.prototype.computeSpot=function(a,b){void 0===b&&(b=null);a?(a=b?b:this.fromPort,null===a?a=Kc:(b=this.fromSpot,b.Kb()&&(b=a.fromSpot),a=b===gd?Dc:b)):(a=b?b:this.toPort,null===a?a=Kc:(b=this.toSpot,b.Kb()&&(b=a.toSpot),a=b===gd?Dc:b));return a};function Dp(a){return a===Dc||.5===a.x&&.5===a.y}function Ep(a){return.5===a.x&&.5===a.y?a:Kc} R.prototype.computeOtherPoint=function(a,b){if(this.computeAdjusting()!==hg&&4p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=Kb.alloc();n.set(g); +R.prototype.Hf=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var g=f;void 0===f&&(g=Kb.alloc(),g.reset());g.multiply(this.transform);if(this.Hh(a,g))return tn(this,b,c,e),void 0===f&&Kb.free(g),!0;if(this.Pc(a,g)){var h=!1;if(!this.isAtomic)for(var k=this.W.m,l=k.length;l--;){var m=k[l];if(m.visible||m===this.locationObject){var n=m.actualBounds,p=this.naturalBounds;if(!(n.x>p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=Kb.alloc();n.set(g); if(m instanceof W)h=m.Hf(a,b,c,d,e,n);else if(this.path===m){if(m instanceof Hf)if(h=a,p=d,!1===m.pickable)h=!1;else if(n.multiply(m.transform),p)b:{var r=h,q=n;if(m.Hh(r,q))h=!0;else{if(void 0===q&&(q=m.transform,r.Qe(m.actualBounds))){h=!0;break b}h=r.left;p=r.right;var u=r.top;r=r.bottom;var w=K.alloc(),y=K.alloc(),z=K.alloc(),B=Kb.alloc();B.set(q);B.Vv(m.transform);B.$s();y.x=p;y.y=u;y.transform(B);w.x=h;w.y=u;w.transform(B);q=!1;Nn(m,w,y,z)?q=!0:(w.x=p,w.y=r,w.transform(B),Nn(m,w,y,z)?q=!0:(y.x= h,y.y=r,y.transform(B),Nn(m,w,y,z)?q=!0:(w.x=h,w.y=u,w.transform(B),Nn(m,w,y,z)&&(q=!0))));Kb.free(B);K.free(w);K.free(y);K.free(z);h=q}}else h=m.Hh(h,n)}else h=ul(m,a,d,n);h&&(p=m,null!==b&&(p=b(m)),p&&(null===c||c(p))&&e.add(p));Kb.free(n)}}}void 0===f&&Kb.free(g);return h||null!==this.background||null!==this.areaBackground}void 0===f&&Kb.free(g);return!1}; R.prototype.computeCurve=function(){if(null===this.Yf){var a=this.fromPort,b=this.isOrthogonal;this.Yf=null!==a&&a===this.toPort&&!b}return this.Yf?kg:this.curve};R.prototype.computeCorner=function(){if(this.curve===kg)return 0;var a=this.corner;if(isNaN(a)||0>a)a=10;return a}; R.prototype.findMidLabel=function(){for(var a=this.path,b=this.W.m,c=b.length,d=0;dk?-Math.PI/2:Math.PI/2;else m=Math.atan(k/Math.abs(h)),0>h&&(m=Math.PI-m);g=b.x;var n=b.y;h=d.x-g;var p=d.y-n;k=Math.sqrt(h*h+p*p);L.da(h,0)?p=0>p?-Math.PI/2:Math.PI/2:(p=Math.atan(p/Math.abs(h)),0>h&&(p=Math.PI-p)); -l=k/l;m=p-m;this.Sc(a,b);for(a+=1;ak?-Math.PI/2:Math.PI/2:(k=Math.atan(k/Math.abs(h)),0>h&&(k=Math.PI-k)),h=k+m,b*=l,this.O(a,g+b*Math.cos(h),n+b*Math.sin(h)));this.Sc(c,d)}}return!0;case up:f=this.i(a);n=this.i(c);if(!f.Ya(b)||!n.Ya(d)){e=f.x;f=f.y;g=n.x;n=n.y;l=(g-e)*(g-e)+(n-f)*(n-f);h=b.x;m=b.y;k=d.x;p=d.y;var r=1;if(0!==k-h){var q=(p-m)/(k-h);r=Math.sqrt(1+1/(q*q))}else q=9E9;this.Sc(a,b);for(a+=1;ab?b+=360:360<=b&&(b-=360);0>d?d+=360:360<=d&&(d-=360);var g=d;b=315<=b||45>b?0:45<=b&&135>b?90:135<=b&&225>b?180:270;d=315<=d||45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.actualBounds.copy(),k=f.actualBounds.copy();if(h.s()&&k.s()){h.Mc(Mp,Mp);k.Mc(Mp,Mp);h.Ye(a);k.Ye(c);var l=K.alloc(),m=K.alloc();if(0===b)if(c.x>a.x||270===d&&c.ya.x||90===d&&c.y>a.y&&k.right>a.x)l.h(c.x,a.y),m.h(c.x,(a.y+c.y)/2),180===d?(l.x=this.computeMidOrthoPosition(a.x, +l=k/l;m=p-m;this.Tc(a,b);for(a+=1;ak?-Math.PI/2:Math.PI/2:(k=Math.atan(k/Math.abs(h)),0>h&&(k=Math.PI-k)),h=k+m,b*=l,this.O(a,g+b*Math.cos(h),n+b*Math.sin(h)));this.Tc(c,d)}}return!0;case up:f=this.i(a);n=this.i(c);if(!f.Ya(b)||!n.Ya(d)){e=f.x;f=f.y;g=n.x;n=n.y;l=(g-e)*(g-e)+(n-f)*(n-f);h=b.x;m=b.y;k=d.x;p=d.y;var r=1;if(0!==k-h){var q=(p-m)/(k-h);r=Math.sqrt(1+1/(q*q))}else q=9E9;this.Tc(a,b);for(a+=1;ab?b+=360:360<=b&&(b-=360);0>d?d+=360:360<=d&&(d-=360);var g=d;b=315<=b||45>b?0:45<=b&&135>b?90:135<=b&&225>b?180:270;d=315<=d||45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.actualBounds.copy(),k=f.actualBounds.copy();if(h.s()&&k.s()){h.Nc(Mp,Mp);k.Nc(Mp,Mp);h.Ye(a);k.Ye(c);var l=K.alloc(),m=K.alloc();if(0===b)if(c.x>a.x||270===d&&c.ya.x||90===d&&c.y>a.y&&k.right>a.x)l.h(c.x,a.y),m.h(c.x,(a.y+c.y)/2),180===d?(l.x=this.computeMidOrthoPosition(a.x, a.y,c.x,c.y,!1),m.x=l.x,m.y=c.y):270===d&&c.ya.y?(l.x=a.xk.bottom)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):k.right,m.x=l.x,m.y=c.y):0===d&&a.xk.top&&a.yh.bottom)180===d&&(k.ca(a)||h.ca(c))? l.y=this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!0):c.ya.y&&(180===d||270===d)&&(l.y=this.computeMidOrthoPosition(a.x,h.bottom,c.x,Math.min(c.y,k.top),!0)),m.x=c.x,m.y=l.y;if(l.y>h.top&&l.y=h.left&&c.x<=a.x||a.x<=k.right&&a.x>=c.x){if(90===d||270===d)l.h(Math.max((a.x+c.x)/2,a.x),a.y),m.h(l.x,c.y)}else l.y=270===d||(0===d||180===d)&&c.ya.y&&k.lefta.y?(l.x=a.x>k.right?this.computeMidOrthoPosition(a.x,a.y,k.right,c.y,!1):a.x>k.left&&(270===d&&a.yk.bottom)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):k.left,m.x=l.x, @@ -1649,16 +1649,16 @@ a.y,c.x,c.y,!1):c.xa.x&&k.top=a.x?(l.y=a.y>k.bottom?this.computeMidOrthoPosition(a.x,a.y,c.x,k.bottom,!0):a.y>k.top&&(180===d&&a.xk.right)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!0):k.top,m.x=c.x,m.y=l.y):270===d&&a.y>k.bottom&&a.x>k.left&&a.xh.right)90===d&&(k.ca(a)||h.ca(c))?l.x=this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):c.xa.x&&(90===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right,a.y,Math.min(c.x,k.left),c.y,!1)),m.x=l.x,m.y=c.y;if(l.x>h.left&&l.x=a.y||a.y>=k.top&&a.y<=c.y){if(0===d||180===d)l.h(a.x,Math.min((a.y+c.y)/2,a.y)),m.h(c.x,l.y)}else l.x=180===d||(90===d||270===d)&&c.x=Pp&&(Fk(r),h.Mc(r.oq*r.Cy,r.nq*r.Dy),Np(r,a,b,n,d,h,!1),k=Op(r, +Math.min(a.y,l.y),Math.abs(a.x-l.x),Math.abs(a.y-l.y))&&r.Ck(Math.min(l.x,m.x),Math.min(l.y,m.y),Math.abs(l.x-m.x),Math.abs(l.y-m.y))&&r.Ck(Math.min(m.x,n.x),Math.min(m.y,n.y),Math.abs(m.x-n.x),Math.abs(m.y-n.y)))b=!1;else{e=a;f=n;var q=c=null;if(p.isVirtualized){p=r.bounds.copy();p.Nc(-r.oq,-r.nq);var u=K.alloc();Gk(r,a.x,a.y)||(L.Kf(p.x,p.y,p.x+p.width,p.y+p.height,a.x,a.y,l.x,l.y,u)?(c=a=u.copy(),b=u.Wa(l)):L.Kf(p.x,p.y,p.x+p.width,p.y+p.height,l.x,l.y,m.x,m.y,u)?(c=a=u.copy(),b=u.Wa(m)):L.Kf(p.x, +p.y,p.x+p.width,p.y+p.height,m.x,m.y,n.x,n.y,u)&&(c=a=u.copy(),b=u.Wa(n)));Gk(r,n.x,n.y)||(L.Kf(p.x,p.y,p.x+p.width,p.y+p.height,n.x,n.y,m.x,m.y,u)?(q=n=u.copy(),d=m.Wa(u)):L.Kf(p.x,p.y,p.x+p.width,p.y+p.height,m.x,m.y,l.x,l.y,u)?(q=n=u.copy(),d=l.Wa(u)):L.Kf(p.x,p.y,p.x+p.width,p.y+p.height,l.x,l.y,a.x,a.y,u)&&(q=n=u.copy(),d=a.Wa(u)));K.free(u)}h=h.copy().Uc(k);h.Nc(r.oq*r.vt,r.nq*r.vt);Np(r,a,b,n,d,h,!0);k=Op(r,n.x,n.y);!r.abort&&k>=Pp&&(Fk(r),h.Nc(r.oq*r.Cy,r.nq*r.Dy),Np(r,a,b,n,d,h,!1),k=Op(r, n.x,n.y));if(!r.abort&&kthis.pointsCount)0===b||180===b?(h.x=a.x,h.y=n.y):(h.x=n.x,h.y=a.y),this.O(2,h.x,h.y),this.l(3,h.x,h.y);else if(g=this.i(3),0===b||180===b)L.A(h.x,g.x)?(h=0===b?Math.max(h.x,a.x):Math.min(h.x,a.x),this.O(2,h,a.y),this.O(3,h,g.y)):L.A(h.y,g.y)?(Math.abs(a.y-h.y)<=r.nq/2&&(this.O(2,h.x,a.y),this.O(3,g.x,a.y)),this.l(2,h.x,a.y)):this.O(2,a.x,h.y);else if(90===b||270===b)L.A(h.y,g.y)?(h=90===b?Math.max(h.y,a.y): Math.min(h.y,a.y),this.O(2,a.x,h),this.O(3,g.x,h)):L.A(h.x,g.x)?(Math.abs(a.x-h.x)<=r.oq/2&&(this.O(2,a.x,h.y),this.O(3,a.x,g.y)),this.l(2,a.x,h.y)):this.O(2,h.x,a.y);null!==c&&(a=this.i(1),g=this.i(2),a.x!==g.x&&a.y!==g.y?0===b||180===b?this.l(2,a.x,g.y):this.l(2,g.x,a.y):0===b||180===b?this.l(2,e.x,c.y):this.l(2,c.x,e.y));null!==q&&(0===d||180===d?this.Bf(f.x,q.y):this.Bf(q.x,f.y));b=!0}else b=!1}}}else b=!1;b||(this.ke(l.copy()),this.ke(m.copy()));K.free(l);K.free(m)}}; -R.prototype.computeMidOrthoPosition=function(a,b,c,d,e){var f=0;!this.hasCurviness()||this.computeSpot(!0,this.fromPort).Qc()||this.computeSpot(!1,this.toPort).Qc()||(f=this.computeCurviness());return e?(b+d)/2+f:(a+c)/2+f}; +R.prototype.computeMidOrthoPosition=function(a,b,c,d,e){var f=0;!this.hasCurviness()||this.computeSpot(!0,this.fromPort).Rc()||this.computeSpot(!1,this.toPort).Rc()||(f=this.computeCurviness());return e?(b+d)/2+f:(a+c)/2+f}; function Yj(a){if(null===a.diagram||!a.isAvoiding||!qk(a.diagram))return!1;var b=a.points.m,c=b.length;if(4>c)return!1;a=rk(a.diagram,!0,a.containingGroup,null);for(var d=1;dRp&&Op(b,m,n)!==l-1&&(Op(b,c-h,d)===l-1?(e=180,m=c-h,n=d):Op(b,c+h,d)===l-1?(e=0,m=c+h,n=d):Op(b,c,d-k)===l-1?(e=270,m=c,n=d-k):Op(b,c,d+k)===l-1&&(e=90,m=c,n=d+k));for(;l>Rp&&Op(b,m,n)===l-1;)c=m,d=n,0===e?m+=h:90===e?n+=k:180===e?m-=h:n-=k,--l;if(f){if(l>Rp)if(180===e||0===e)c=Math.floor(c/h)*h+h/2;else if(90===e||270===e)d=Math.floor(d/k)*k+k/2}else c=Math.floor(c/h)*h+h/2,d=Math.floor(d/ k)*k+k/2;l>Rp&&(f=e,g=c,m=d,0===e?(f=90,m+=k):90===e?(f=180,g-=h):180===e?(f=270,m-=k):270===e&&(f=0,g+=h),Op(b,g,m)===l-1?Qp(a,b,g,m,f,!1,f):(g=c,m=d,0===e?(f=270,m-=k):90===e?(f=0,g+=h):180===e?(f=90,m+=k):270===e&&(f=180,g-=h),Op(b,g,m)===l-1&&Qp(a,b,g,m,f,!1,f)));a.Bf(c,d)} R.prototype.cA=function(a){G&&x(a,K,R,"findClosestSegment:p");var b=a.x;a=a.y;for(var c=this.i(0),d=this.i(1),e=Mb(b,a,c.x,c.y,d.x,d.y),f=0,g=1;gb)return a.type=N.j,this.Zm=!0,a;var c=!1,d=this.diagram;null!==d&&wp(this)&&d.gi.contains(this)&&(0!==this.Tl.width||0!==this.Tl.height)&&(c=!0);var e=this.i(0).copy(),f=e.copy();d=this.Gb.m;var g=this.computeCurve();if(g===kg&&3<=b&&!L.da(this.smoothness,0))if(3===b){var h=this.i(1);d=Math.min(e.x,h.x);var k=Math.min(e.y,h.y);h=this.i(2);d=Math.min(d,h.x);k=Math.min(k,h.y)}else{if(this.isOrthogonal)for(k=0;k=b&&(d=b-1),k=this.i(d),f.x=Math.min(k.x,f.x),f.y=Math.min(k.y,f.y);d=f.x;k=f.y}else{for(k=0;kw?q>r?(f.x= @@ -1672,13 +1672,13 @@ function Tp(a,b,c,d){for(var e=a.pointsCount,f=b;L.da(b.x,f.x)&&L.da(b.y,f.y);){ function Vp(a,b,c,d,e,f,g){if(!g&&wp(a)){g=a.computeJumpLength();var h=g/2,k=[],l=0;a.isVisible()&&(l=Wp(a,e,f,k));if(0n-g)l--,n=Math.max(m-h,f.x);else break;m=f.y-g+d;n+=c;r=f.y+d;a.curve===gg?Jd(b,n,r,!1):Kd(b,p,m,n,m,n,r)}else if(L.A(e.x,f.x))if(e.ym-g)l--,m=Math.max(n-h,f.y);else break;n=f.x-g+c;r=f.x+c;m+=d;a.curve===gg?Jd(b,r,m,!1):Kd(b,n,p,n,m,r,m)}}b.lineTo(f.x+c,f.y+d)} -function Wp(a,b,c,d){var e=a.diagram;if(null===e||b.B(c))return 0;for(e=e.layers;e.next();){var f=e.value;if(null!==f&&f.visible){f=f.Ka.m;for(var g=f.length,h=0;hg.x&&m.x>=l.x||l.xg.y&&m.y>=l.y||l.yq&&Math.min(g,w)n&&!L.A(g,w)){h.x=q;h.y=n;m=!0;break a}}else if(!L.A(n,r)&& L.A(g,w)&&Math.min(n,r)g&&Math.min(q,u)m&&!L.A(q,u)){h.x=m;h.y=g;m=!0;break a}h.x=0;h.y=0;m=!1}m&&(e?c.push(h.x):c.push(h.y));g=l}K.free(h)}function wp(a){a=a.curve;return a===fg||a===gg}function Ap(a,b){if(b||wp(a))b=a.diagram,null===b||b.animationManager.isTicking||b.gi.contains(a)||0===a.Tl.width&&0===a.Tl.height||b.gi.add(a,a.Tl.copy())} R.prototype.Dq=function(a){var b=this.layer;if(null!==b&&b.visible&&!b.isTemporary){var c=b.diagram;if(null!==c&&!c.animationManager.isTicking){var d=!1;for(c=c.layers;c.next();){var e=c.value;if(e.visible)if(e===b){d=!0;var f=!1;e=e.Ka.m;for(var g=e.length,h=0;ha&&Aa(a,">= 0",R,"fromEndSegmentLength"),this.T.Tg=a,this.g("fromEndSegmentLength",b,a),this.Za())}},fromShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.Ug:NaN},set:function(a){this.Nc();var b=this.T.Ug;b!==a&&(G&&A(a,"number",R,"fromShortLength"),this.T.Ug= -a,this.ic(!0),this.g("fromShortLength",b,a))}},toSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Ah:gd},set:function(a){this.Nc();var b=this.T.Ah;b.B(a)||(G&&x(a,Ib,R,"toSpot"),a=a.L(),this.T.Ah=a,this.g("toSpot",b,a),(b.Qc()||a.Qc())&&null!==this.toNode&&dp(this.toPort),this.Za())}},toEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.yh:NaN},set:function(a){this.Nc();var b=this.T.yh;b!==a&&(G&&A(a,"number",R,"toEndSegmentLength"), -0>a&&Aa(a,">= 0",R,"toEndSegmentLength"),this.T.yh=a,this.g("toEndSegmentLength",b,a),this.Za())}},toShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.zh:NaN},set:function(a){this.Nc();var b=this.T.zh;b!==a&&(G&&A(a,"number",R,"toShortLength"),this.T.zh=a,this.ic(!0),this.g("toShortLength",b,a))}},isLabeledLink:{configurable:!0,get:function(){return null===this.rd?!1:0a&&Aa(a,">= 0",R,"fromEndSegmentLength"),this.T.Tg=a,this.g("fromEndSegmentLength",b,a),this.Za())}},fromShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.Ug:NaN},set:function(a){this.Oc();var b=this.T.Ug;b!==a&&(G&&A(a,"number",R,"fromShortLength"),this.T.Ug= +a,this.ic(!0),this.g("fromShortLength",b,a))}},toSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Ah:gd},set:function(a){this.Oc();var b=this.T.Ah;b.B(a)||(G&&x(a,Ib,R,"toSpot"),a=a.L(),this.T.Ah=a,this.g("toSpot",b,a),(b.Rc()||a.Rc())&&null!==this.toNode&&dp(this.toPort),this.Za())}},toEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.yh:NaN},set:function(a){this.Oc();var b=this.T.yh;b!==a&&(G&&A(a,"number",R,"toEndSegmentLength"), +0>a&&Aa(a,">= 0",R,"toEndSegmentLength"),this.T.yh=a,this.g("toEndSegmentLength",b,a),this.Za())}},toShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.zh:NaN},set:function(a){this.Oc();var b=this.T.zh;b!==a&&(G&&A(a,"number",R,"toShortLength"),this.T.zh=a,this.ic(!0),this.g("toShortLength",b,a))}},isLabeledLink:{configurable:!0,get:function(){return null===this.sd?!1:0=d&&(f=d-1);var h=this.i(f-1),k=this.i(f);L.pm(e.x,e.y,g.x,g.y,h.x,h.y,k.x,k.y,.5,a);b=Math.min(k.x,b);c=Math.min(k.y,c);e=k}else for(e=this.i(0),f=this.i(1),b=Math.min(e.x,f.x),c=Math.min(e.y,f.y),a.h(e.x,e.y,0,0),a.Ye(f),e=2;ed&&(d=-d)):L.da(d.y,e.y)?(d=e.x-d.x,0>d&&(d=-d)):d=Math.sqrt(d.Ff(e));a.push(d)}}return this.Dr}},flattenedTotalLength:{configurable:!0, +enumerable:!0,get:function(){this.Bg();return this.computeMidPoint(new K)}},midAngle:{configurable:!0,get:function(){this.Bg();return this.computeMidAngle()}},flattenedLengths:{configurable:!0,get:function(){if(null===this.Dr){this.yd||zp(this);for(var a=this.Dr=[],b=this.pointsCount,c=0;cd&&(d=-d)):L.da(d.y,e.y)?(d=e.x-d.x,0>d&&(d=-d)):d=Math.sqrt(d.Ff(e));a.push(d)}}return this.Dr}},flattenedTotalLength:{configurable:!0, enumerable:!0,get:function(){var a=this.du;if(isNaN(a)){for(var b=this.flattenedLengths,c=b.length,d=a=0;d=this.pointsCount?0:this.isOrthogonal||!Dp(this.computeSpot(!0))?1:0}},lastPickIndex:{configurable:!0,get:function(){var a=this.pointsCount;return 0=== a?0:2>=a?a-1:this.isOrthogonal||!Dp(this.computeSpot(!1))?a-2:a-1}},adjusting:{configurable:!0,get:function(){return this.Rk},set:function(a){var b=this.Rk;b!==a&&(G&&a!==hg&&a!==sp&&a!==tp&&a!==up&&v("Link.adjusting can only be set to Link.None, Link.End, LInk.Scale, or Link.Stretch, not: "+a),this.Rk=a,this.g("adjusting",b,a))}},corner:{configurable:!0,get:function(){return this.En},set:function(a){var b=this.En;b!==a&&(G&&A(a,"number",R,"corner"),this.En=a,this.ic(!0), this.g("corner",b,a))}},curve:{configurable:!0,get:function(){return this.Gn},set:function(a){var b=this.Gn;b!==a&&(G&&a!==hg&&a!==kg&&a!==gg&&a!==fg&&v("Link.curve can only be set to Link.None, Link.Bezier, LInk.JumpGap, or Link.JumpOver, not: "+a),this.Gn=a,this.Za(),this.ic(!0),Ap(this,b===gg||b===fg||a===gg||a===fg),this.g("curve",b,a))}},curviness:{configurable:!0,get:function(){return this.Hn},set:function(a){var b=this.Hn;b!==a&&(G&&A(a,"number",R,"curviness"),this.Hn= a,this.Za(),this.ic(!1),this.g("curviness",b,a))}},routing:{configurable:!0,get:function(){return this.ak},set:function(a){var b=this.ak;b!==a&&(G&&a!==rp&&a!==$p&&a!==aq&&a!==Jp&&v("Link.routing can only be set to Link.Normal, Link.Orthogonal, LInk.AvoidsNodes, not: "+a),this.ak=a,this.Yf=null,this.Za(),Ap(this,2===(b.value&2)||2===(a.value&2)),this.g("routing",b,a))}},smoothness:{configurable:!0,get:function(){return this.Pp},set:function(a){var b=this.Pp;b!==a&&(G&& A(a,"number",R,"smoothness"),this.Pp=a,this.ic(!0),this.g("smoothness",b,a))}},key:{configurable:!0,get:function(){var a=this.diagram;if(null!==a&&a.model.cj())return a.model.sc(this.data)}}});R.prototype.invalidateOtherJumpOvers=R.prototype.Dq;R.prototype.findClosestSegment=R.prototype.cA;R.prototype.updateRoute=R.prototype.Bg;R.prototype.invalidateRoute=R.prototype.Za;R.prototype.rollbackRoute=R.prototype.gw;R.prototype.commitRoute=R.prototype.Df;R.prototype.startRoute=R.prototype.Sh; -R.prototype.clearPoints=R.prototype.nk;R.prototype.removePoint=R.prototype.ew;R.prototype.addPointAt=R.prototype.Bf;R.prototype.addPoint=R.prototype.ke;R.prototype.insertPointAt=R.prototype.l;R.prototype.insertPoint=R.prototype.IA;R.prototype.setPointAt=R.prototype.O;R.prototype.setPoint=R.prototype.Sc;R.prototype.getPoint=R.prototype.i;R.prototype.getOtherPort=R.prototype.zA;R.prototype.getOtherNode=R.prototype.zq; +R.prototype.clearPoints=R.prototype.nk;R.prototype.removePoint=R.prototype.ew;R.prototype.addPointAt=R.prototype.Bf;R.prototype.addPoint=R.prototype.ke;R.prototype.insertPointAt=R.prototype.l;R.prototype.insertPoint=R.prototype.IA;R.prototype.setPointAt=R.prototype.O;R.prototype.setPoint=R.prototype.Tc;R.prototype.getPoint=R.prototype.i;R.prototype.getOtherPort=R.prototype.zA;R.prototype.getOtherNode=R.prototype.zq; var Bp=null,Cp=null,rp=new F(R,"Normal",1),$p=new F(R,"Orthogonal",2),aq=new F(R,"AvoidsNodes",6),Jp=new F(R,"AvoidsNodesStraight",7),hg=new F(R,"None",0),kg=new F(R,"Bezier",9),gg=new F(R,"JumpGap",10),fg=new F(R,"JumpOver",11),sp=new F(R,"End",17),tp=new F(R,"Scale",18),up=new F(R,"Stretch",19),fn=new F(R,"OrientAlong",21),Zm=new F(R,"OrientPlus90",22),an=new F(R,"OrientMinus90",23),vp=new F(R,"OrientOpposite",24),gn=new F(R,"OrientUpright",25),$m=new F(R,"OrientPlus90Upright",26),bn=new F(R,"OrientMinus90Upright", 27),cn=new F(R,"OrientUpright45",28),Lp=16,Kp=14,Mp=8;R.className="Link";R.Normal=rp;R.Orthogonal=$p;R.AvoidsNodes=aq;R.AvoidsNodesStraight=Jp;R.None=hg;R.Bezier=kg;R.JumpGap=gg;R.JumpOver=fg;R.End=sp;R.Scale=tp;R.Stretch=up;R.OrientAlong=fn;R.OrientPlus90=Zm;R.OrientMinus90=an;R.OrientOpposite=vp;R.OrientUpright=gn;R.OrientPlus90Upright=$m;R.OrientMinus90Upright=bn;R.OrientUpright45=cn;R.EndSegmentStep=8;R.CurvinessStart=Lp;R.SpacingMin=Kp;R.OrthoShortCut=Mp; function Zp(a,b,c,d){ab(this);this.Be=this.Jr=!1;this.it=a;this.Ky=b;this.Wv=c;this.Ly=d;this.links=[]}Zp.prototype.Am=function(){if(!this.Jr){var a=this.links;0=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.Cd=Math.floor((a.x-this.jc)/this.jc)*this.jc;this.Dd=Math.floor((b-this.kc)/this.kc)*this.kc;this.Mo=Math.ceil((c+2*this.jc)/this.jc)*this.jc;this.No=Math.ceil((d+2*this.kc)/this.kc)*this.kc;a=1+(Math.ceil((this.Mo-this.Cd)/this.jc)|0);b=1+(Math.ceil((this.No-this.Dd)/this.kc)|0);if(null===this.Vb||this.Li=Rp&&(c[d]=bq)} -sk.prototype.Ck=function(a,b,c,d){if(a>this.Mo||a+cthis.No||b+da&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e)return!0;d=Math.min(a+c-1,this.Li)|0;for(c=Math.min(b+e-1,this.Mi)|0;a<=d;a++){e=this.Vb[a];for(var f=b;f<=c;f++)if(e[f]===Hk)return!1}return!0}; +function sk(a){ab(this);this.Vy=this.group=null;this.Zs=!0;this.abort=!1;this.Ed=this.Dd=1;this.No=this.Mo=-1;this.jc=a.width;this.kc=a.height;this.Vb=null;this.Mi=this.Li=0;this.vt=11;this.Dy=this.Cy=22} +sk.prototype.initialize=function(a){if(!(0>=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.Dd=Math.floor((a.x-this.jc)/this.jc)*this.jc;this.Ed=Math.floor((b-this.kc)/this.kc)*this.kc;this.Mo=Math.ceil((c+2*this.jc)/this.jc)*this.jc;this.No=Math.ceil((d+2*this.kc)/this.kc)*this.kc;a=1+(Math.ceil((this.Mo-this.Dd)/this.jc)|0);b=1+(Math.ceil((this.No-this.Ed)/this.kc)|0);if(null===this.Vb||this.Li=Rp&&(c[d]=bq)} +sk.prototype.Ck=function(a,b,c,d){if(a>this.Mo||a+cthis.No||b+da&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e)return!0;d=Math.min(a+c-1,this.Li)|0;for(c=Math.min(b+e-1,this.Mi)|0;a<=d;a++){e=this.Vb[a];for(var f=b;f<=c;f++)if(e[f]===Hk)return!1}return!0}; function cq(a,b,c,d,e,f,g,h,k){if(!(bg||ck)){var l=b|0;var m=c|0;var n=a.Vb[l][m];if(n>=Rp&&n=a.Vb[l][m]);)a.Vb[l][m]=n,n+=1,e?m+=d:l+=d;l=e?m:l;if(e)if(0l;c+=d)cq(a,b,c,1,!e,f,g,h,k),cq(a,b,c,-1,!e,f,g,h,k);else if(0l;b+=d)cq(a,b,c,1,!e,f,g,h,k),cq(a,b,c,-1,!e,f,g,h, k)}}function dq(a,b,c,d,e,f,g,h,k){b|=0;c|=0;var l=Hk,m=Rp;for(a.Vb[b][c]=m;l===Hk&&b>f&&bh&&cf&&bh&&c=Math.abs(h-l)&&1>=Math.abs(k-m))a.abort=!0;else{var n=f.x;d=f.y;b=f.x+f.width;var p=f.y+f.height;n-=a.Cd;n/=a.jc;d-=a.Dd;d/=a.kc;b-=a.Cd;b/=a.jc;p-=a.Dd;p/=a.kc;f=Math.max(0,Math.min(a.Li,n|0));b=Math.min(a.Li,Math.max(0,b|0));n=Math.max(0,Math.min(a.Mi,d|0));p=Math.min(a.Mi,Math.max(0,p|0));d=a.Vb;h|=0;k|=0;l|=0;m|= +function Np(a,b,c,d,e,f,g){if(null!==a.Vb){a.abort=!1;var h=b.x,k=b.y;if(Gk(a,h,k)){h-=a.Dd;h/=a.jc;k-=a.Ed;k/=a.kc;var l=d.x,m=d.y;if(Gk(a,l,m))if(l-=a.Dd,l/=a.jc,m-=a.Ed,m/=a.kc,1>=Math.abs(h-l)&&1>=Math.abs(k-m))a.abort=!0;else{var n=f.x;d=f.y;b=f.x+f.width;var p=f.y+f.height;n-=a.Dd;n/=a.jc;d-=a.Ed;d/=a.kc;b-=a.Dd;b/=a.jc;p-=a.Ed;p/=a.kc;f=Math.max(0,Math.min(a.Li,n|0));b=Math.min(a.Li,Math.max(0,b|0));n=Math.max(0,Math.min(a.Mi,d|0));p=Math.min(a.Mi,Math.max(0,p|0));d=a.Vb;h|=0;k|=0;l|=0;m|= 0;var r=0===c||90===c?1:-1;c=90===c||270===c;d[h][k]===Hk?(dq(a,h,k,r,c,f,b,n,p),dq(a,h,k,1,!c,f,b,n,p),dq(a,h,k,-1,!c,f,b,n,p)):dq(a,h,k,r,c,h,k,h,k);d[l][m]===Hk?(eq(a,l,m,0===e||90===e?1:-1,90===e||270===e,f,b,n,p),eq(a,l,m,1,!(90===e||270===e),f,b,n,p),eq(a,l,m,-1,!(90===e||270===e),f,b,n,p)):eq(a,l,m,r,c,l,m,l,m);c=Ma();if(g&&fq(a,l,m,e,h,k,c)){if(c[0]!==l||c[1]!==m)c.unshift(m),c.unshift(l);if(c[c.length-2]!==h||c[c.length-1]!==k)c.push(h),c.push(k);a=Rp;e=c[c.length-2];g=c[c.length-1];d[e][g]= a++;for(f=c.length-4;0<=f;f-=2)for(e=c[f+2],g=c[f+3],b=c[f],l=c[f+1];b>e?e++:bg?g++:le)m--;else break;else if(n>f)n--;else break;var p=h[m][n];if(0===p||p===gq)break;k=m;l=n}for(;;){m=d;n=k;p=l;0===d?pf&&(m=270,p--):90===d?ne&&(m=180,n--):180===d?pf&&(m=270,p--):ne&&(m=180,n--);n=h[n][p];if(m!==d&&0!==n&&n!==gq){g.push(k);g.push(l);if(fq(a,k,l, m,e,f,g))return!0;g.pop();g.pop()}h[k][l]=gq;if(0===d){if(k===b)return!1;k--}else if(90===d){if(l===c)return!1;l--}else if(180===d){if(k===b)return!1;k++}else{if(l===c)return!1;l++}}} -oa.Object.defineProperties(sk.prototype,{bounds:{configurable:!0,get:function(){return new M(this.Cd,this.Dd,this.Mo-this.Cd,this.No-this.Dd)}},oq:{configurable:!0,get:function(){return this.jc},set:function(a){0=c?180:0}a=180*Math.atan2(a.height,a.width)/Math.PI;switch(b){case 3:return c>a&&c<=180+a?180:270;case 5:return c>180-a&&c<=360-a?270:0;case 12:return c>a&&c<=180+a?90:0;case 10:return c>180-a&&c<=360-a?180:90;case 7:return 90180+a&&c<=360-a?270:0;case 13:return 180a&&180>=c?90:0;case 14:return c> a&&c<=180-a?90:c>180-a&&270>=c?180:0;case 11:return c>180-a&&c<=180+a?180:c>180+a?270:90}d&&15!==b&&(c-=15,0>c&&(c+=360));return c>a&&c<180-a?90:c>=180-a&&c<=180+a?180:c>180+a&&c<360-a?270:0}Hp.prototype.Am=function(){this.me.length=0}; function Ip(a,b){var c=a.me;if(0===c.length){a:if(!a.Hq){c=a.Hq;a.Hq=!0;var d=null,e=a.node,f=e instanceof vf?e:null;if(null===f||f.isSubGraphExpanded)var g=e.isTreeExpanded?e.findLinksConnected(a.port.portId):e.jy();else{if(!f.actualBounds.s()){a.Hq=c;break a}d=f;g=d.Dv()}f=a.me.length=0;var h=a.port.ja(Ec,K.alloc()),k=a.port.ja(Pc,K.alloc());e=M.allocAt(h.x,h.y,0,0);e.Ye(k);K.free(h);K.free(k);h=K.allocAt(e.x+e.width/2,e.y+e.height/2);k=a.port.Xi();for(g=g.iterator;g.next();){var l=g.value;if(l.isVisible()&& -l.fromPort!==l.toPort){var m=l.fromPort===a.port||null!==l.fromNode&&l.fromNode.Md(d),n=l.computeSpot(m,a.port);if(n.Qc()){var p=m?l.toPort:l.fromPort;if(null!==p&&(m=p.part,null!==m)){var r=m.findVisibleNode();null!==r&&r!==m&&(m=r,p=m.port);m=l.computeOtherPoint(m,p);p=h.Ua(p.ja(Kc));r=h.Ua(m);p+=(r-p)/360;p-=k;0>p?p+=360:360<=p&&(p-=360);n=hq(e,n,p,l.isOrthogonal);0===n?(n=4,180p&&(p+=360));r=a.me[f];void 0===r?(r=new iq(l,p,n),a.me[f]= -r):(r.link=l,r.angle=p,r.Dc=n);r.Yv.set(m);f++}}}}K.free(h);a.me.sort(Hp.prototype.j);k=a.me.length;d=-1;for(f=h=0;fMath.abs(u)?(z=Math.abs(u)/p,p=Math.abs(u)):z=1;break;case 2:r>Math.abs(B)?(z=Math.abs(B)/r,r=Math.abs(B)):z=1;break;case 1:n>Math.abs(u)?(z=Math.abs(u)/n,n=Math.abs(u)):z=1;break;default:case 4:m> -Math.abs(B)?(z=Math.abs(B)/m,m=Math.abs(B)):z=1}y=0}var J=C.Gq;if(d===op){C=C.link.computeThickness();C*=z;J.set(E);switch(q){case 8:J.x=E.x+u/2+p/2-y-C/2;break;case 2:J.y=E.y+B/2+r/2-y-C/2;break;case 1:J.x=E.x+u/2-n/2+y+C/2;break;default:case 4:J.y=E.y+B/2-m/2+y+C/2}y+=C}else{var S=.5;d===ap&&(S=(C.Aq+1)/(C.tm+1));J.x=E.x+u*S;J.y=E.y+B*S}}}K.free(h);K.free(k);K.free(g);K.free(l);E=a.me;for(f=0;fb.Dc?1:a.angleb.angle?1:0}; +l.fromPort!==l.toPort){var m=l.fromPort===a.port||null!==l.fromNode&&l.fromNode.Md(d),n=l.computeSpot(m,a.port);if(n.Rc()&&(m=m?l.toPort:l.fromPort,null!==m)){var p=m.part;if(null!==p){var r=p.findVisibleNode();null!==r&&r!==p&&(p=r,m=p.port);m=l.computeOtherPoint(p,m);p=h.Wa(m);p-=k;0>p?p+=360:360<=p&&(p-=360);n=hq(e,n,p,l.isOrthogonal);0===n?(n=4,180p&&(p+=360));r=a.me[f];void 0===r?(r=new iq(l,p,n),a.me[f]=r):(r.link=l,r.angle=p,r.Dc= +n);r.Yv.set(m);f++}}}}K.free(h);a.me.sort(Hp.prototype.j);k=a.me.length;d=-1;for(f=h=0;fMath.abs(u)?(z=Math.abs(u)/p,p=Math.abs(u)):z=1;break;case 2:r>Math.abs(B)?(z=Math.abs(B)/r,r=Math.abs(B)):z=1;break;case 1:n>Math.abs(u)?(z=Math.abs(u)/n,n=Math.abs(u)):z=1;break;default:case 4:m>Math.abs(B)?(z=Math.abs(B)/ +m,m=Math.abs(B)):z=1}y=0}var J=C.Gq;if(d===op){C=C.link.computeThickness();C*=z;J.set(E);switch(q){case 8:J.x=E.x+u/2+p/2-y-C/2;break;case 2:J.y=E.y+B/2+r/2-y-C/2;break;case 1:J.x=E.x+u/2-n/2+y+C/2;break;default:case 4:J.y=E.y+B/2-m/2+y+C/2}y+=C}else{var S=.5;d===ap&&(S=(C.Aq+1)/(C.tm+1));J.x=E.x+u*S;J.y=E.y+B*S}}}K.free(h);K.free(k);K.free(g);K.free(l);E=a.me;for(f=0;fb.Dc?1:a.angleb.angle?1:0}; Hp.prototype.computeEndSegmentLength=function(a){var b=a.link,c=b.computeEndSegmentLength(this.node,this.port,Dc,b.fromPort===this.port),d=a.Aq;if(0>d)return c;var e=a.tm;if(1>=e||!b.isOrthogonal)return c;b=a.Yv;var f=a.Gq;if(2===a.Dc||8===a.Dc)d=e-1-d;return((a=2===a.Dc||4===a.Dc)?b.y=b-1?(f=0,d=c,e+=g+20,g=0):f++}}; zi.prototype.doMinimalNetworkLayout=function(){var a=Math.ceil(Math.sqrt(this.network.vertexes.count));this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin);for(var b=this.arrangementOrigin.x,c=b,d=this.arrangementOrigin.y,e=0,f=0,g=this.network.vertexes.iterator;g.next();){var h=g.value.node;if(!(null===h||h instanceof R)&&(lq(h),this.Qh(h))){var k=h.measuredBounds,l=k.width;k=k.height;h.moveTo(c,d);h instanceof vf&&(h.Qh=!1);c+=Math.max(l,50)+20;f=Math.max(f,Math.max(k,50));e>=a-1?(e= -0,c=b,d+=f+20,f=0):e++}}};zi.prototype.Qh=function(a){return!a.location.s()||a instanceof vf&&a.Qh?!0:!1};function kq(a,b,c,d,e,f,g,h){for(c=c.iterator;c.next();){var k=c.value;d&&!k.isTopLevel||null!==e&&!e(k)||!k.canLayout()||(f&&k instanceof V?k.isLinkLabel||(k instanceof vf?null===k.layout?kq(a,b,k.memberParts,!1,e,f,g,h):(lq(k),b.add(k)):(lq(k),b.add(k))):g&&k instanceof R?b.add(k):!h||!k.Pc()||k instanceof V||(lq(k),b.add(k)))}} +0,c=b,d+=f+20,f=0):e++}}};zi.prototype.Qh=function(a){return!a.location.s()||a instanceof vf&&a.Qh?!0:!1};function kq(a,b,c,d,e,f,g,h){for(c=c.iterator;c.next();){var k=c.value;d&&!k.isTopLevel||null!==e&&!e(k)||!k.canLayout()||(f&&k instanceof V?k.isLinkLabel||(k instanceof vf?null===k.layout?kq(a,b,k.memberParts,!1,e,f,g,h):(lq(k),b.add(k)):(lq(k),b.add(k))):g&&k instanceof R?b.add(k):!h||!k.Qc()||k instanceof V||(lq(k),b.add(k)))}} function lq(a){var b=a.actualBounds;(0===b.width||0===b.height||isNaN(b.width)||isNaN(b.height))&&a.Xa()}zi.prototype.Zi=function(a,b){var c=this.boundsComputation;if(null!==c)return b||(b=new M),c(a,this,b);if(!b)return a.actualBounds;b.set(a.actualBounds);return b}; zi.prototype.Vx=function(a){var b=new I;a instanceof Q?(kq(this,b,a.nodes,!0,null,!0,!0,!0),kq(this,b,a.links,!0,null,!0,!0,!0),kq(this,b,a.parts,!0,null,!0,!0,!0)):a instanceof vf?kq(this,b,a.memberParts,!1,null,!0,!0,!0):kq(this,b,a.iterator,!1,null,!0,!0,!0);return b}; zi.prototype.initialOrigin=function(a){var b=this.group;if(null!==b){var c=b.position.copy();(isNaN(c.x)||isNaN(c.y))&&c.set(a);b=b.placeholder;null!==b&&(c=b.ja(Ec),(isNaN(c.x)||isNaN(c.y))&&c.set(a),a=b.padding,c.x+=a.left,c.y+=a.top);return c}return a};zi.prototype.mayUseWorker=function(){return this.mayUseWorkerFunction?this.mayUseWorkerFunction(this):!1};zi.prototype.workerLayout=function(){return!1}; @@ -1765,39 +1765,39 @@ jq.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutNetwork"+(null! jq.prototype.tg=function(a,b,c){if(null!==a){void 0===b&&(b=!1);A(b,"boolean",jq,"addParts:toplevelonly");void 0===c&&(c=null);null===c&&(c=function(a){if(a instanceof V)return!a.isLinkLabel;if(a instanceof R){var b=a.fromNode;if(null===b||b.isLinkLabel)return!1;a=a.toNode;return null===a||a.isLinkLabel?!1:!0}return!1});for(a=a.iterator;a.next();){var d=a.value;if(d instanceof V&&(!b||d.isTopLevel)&&d.canLayout()&&c(d))if(d instanceof vf&&null===d.layout)this.tg(d.memberParts,!1);else if(null===this.Wi(d)){var e= this.createVertex();e.node=d;this.ug(e)}}for(a.reset();a.next();)if(d=a.value,d instanceof R&&(!b||d.isTopLevel)&&d.canLayout()&&c(d)&&null===this.tq(d)){var f=d.fromNode;e=d.toNode;null!==f&&null!==e&&f!==e&&(f=this.findGroupVertex(f),e=this.findGroupVertex(e),null!==f&&null!==e&&this.Dk(f,e,d))}}}; jq.prototype.findGroupVertex=function(a){if(null===a)return null;var b=a.findVisibleNode();if(null===b)return null;a=this.Wi(b);if(null!==a)return a;for(b=b.containingGroup;null!==b;){a=this.Wi(b);if(null!==a)return a;b=b.containingGroup}return null};t=jq.prototype;t.ug=function(a){if(null!==a){G&&x(a,xq,jq,"addVertex:vertex");this.zf.add(a);var b=a.node;null!==b&&this.jt.add(b,a);a.network=this}}; -t.lk=function(a){if(null===a)return null;G&&x(a,V,jq,"addNode:node");var b=this.Wi(a);null===b&&(b=this.createVertex(),b.node=a,this.ug(b));return b};t.yv=function(a){if(null!==a&&(G&&x(a,xq,jq,"deleteVertex:vertex"),zq(this,a))){for(var b=a.wd,c=b.count-1;0<=c;c--){var d=b.M(c);this.uk(d)}b=a.Jd;for(a=b.count-1;0<=a;a--)c=b.M(a),this.uk(c)}};function zq(a,b){if(null===b)return!1;var c=a.zf.remove(b);c&&(b=b.node,null!==b&&a.jt.remove(b));return c} +t.lk=function(a){if(null===a)return null;G&&x(a,V,jq,"addNode:node");var b=this.Wi(a);null===b&&(b=this.createVertex(),b.node=a,this.ug(b));return b};t.yv=function(a){if(null!==a&&(G&&x(a,xq,jq,"deleteVertex:vertex"),zq(this,a))){for(var b=a.xd,c=b.count-1;0<=c;c--){var d=b.M(c);this.uk(d)}b=a.Jd;for(a=b.count-1;0<=a;a--)c=b.M(a),this.uk(c)}};function zq(a,b){if(null===b)return!1;var c=a.zf.remove(b);c&&(b=b.node,null!==b&&a.jt.remove(b));return c} t.Uz=function(a){null!==a&&(G&&x(a,V,jq,"deleteNode:node"),a=this.Wi(a),null!==a&&this.yv(a))};t.Wi=function(a){if(null===a)return null;G&&x(a,V,jq,"findVertex:node");return this.jt.K(a)};t.nm=function(a){if(null!==a){G&&x(a,yq,jq,"addEdge:edge");Aq(this,a);var b=a.toVertex;null!==b&&b.ov(a);b=a.fromVertex;null!==b&&b.mv(a)}};function Aq(a,b){if(null!==b){a.ve.add(b);var c=b.link;null!==c&&null===a.tq(c)&&a.et.add(c,b);b.network=a}} t.xz=function(a){if(null===a)return null;G&&x(a,R,jq,"addLink:link");var b=a.fromNode,c=a.toNode,d=this.tq(a);null===d?(d=this.createEdge(),d.link=a,null!==b&&(d.fromVertex=this.lk(b)),null!==c&&(d.toVertex=this.lk(c)),this.nm(d)):(null!==b?d.fromVertex=this.lk(b):d.fromVertex=null,null!==c?d.toVertex=this.lk(c):d.toVertex=null);return d};t.uk=function(a){if(null!==a){G&&x(a,yq,jq,"deleteEdge:edge");var b=a.toVertex;null!==b&&b.xv(a);b=a.fromVertex;null!==b&&b.wv(a);Bq(this,a)}}; function Bq(a,b){null!==b&&a.ve.remove(b)&&(b=b.link,null!==b&&a.et.remove(b))}t.Tz=function(a){null!==a&&(G&&x(a,R,jq,"deleteLink:link"),a=this.tq(a),null!==a&&this.uk(a))};t.tq=function(a){if(null===a)return null;G&&x(a,R,jq,"findEdge:link");return this.et.K(a)}; t.Dk=function(a,b,c){if(null===a||null===b)return null;G&&(x(a,xq,jq,"linkVertexes:fromVertex"),x(b,xq,jq,"linkVertexes:toVertex"),null!==c&&x(c,R,jq,"linkVertexes:link"));if(a.network===this&&b.network===this){var d=this.createEdge();d.link=c;d.fromVertex=a;d.toVertex=b;this.nm(d);return d}return null};t.Om=function(a){if(null!==a){G&&x(a,yq,jq,"reverseEdge:edge");var b=a.fromVertex,c=a.toVertex;null!==b&&null!==c&&(b.wv(a),c.xv(a),a.Om(),b.ov(a),c.mv(a))}}; t.rq=function(){for(var a=Ma(),b=this.ve.iterator;b.next();){var c=b.value;c.fromVertex===c.toVertex&&a.push(c)}b=a.length;for(c=0;cb?1:0):1:null!==b?-1:0} -oa.Object.defineProperties(xq.prototype,{sourceEdgesArrayAccess:{configurable:!0,get:function(){return this.wd._dataArray}},destinationEdgesArrayAccess:{configurable:!0,get:function(){return this.Jd._dataArray}},data:{configurable:!0,get:function(){return this.nb},set:function(a){this.nb=a;if(null!==a&&a.bounds){var b=a.bounds;a=b.x;var c=b.y,d=b.width;b=b.height;this.o.h(d/2,b/2);this.j.h(a,c,d,b)}}},node:{configurable:!0,get:function(){return this.zi}, +oa.Object.defineProperties(xq.prototype,{sourceEdgesArrayAccess:{configurable:!0,get:function(){return this.xd._dataArray}},destinationEdgesArrayAccess:{configurable:!0,get:function(){return this.Jd._dataArray}},data:{configurable:!0,get:function(){return this.nb},set:function(a){this.nb=a;if(null!==a&&a.bounds){var b=a.bounds;a=b.x;var c=b.y,d=b.width;b=b.height;this.o.h(d/2,b/2);this.j.h(a,c,d,b)}}},node:{configurable:!0,get:function(){return this.zi}, set:function(a){if(this.zi!==a){G&&null!==a&&x(a,V,xq,"node");this.zi=a;a.Xa();var b=this.network.layout,c=M.alloc(),d=b.Zi(a,c);b=d.x;var e=d.y,f=d.width;d=d.height;isNaN(b)&&(b=0);isNaN(e)&&(e=0);this.j.h(b,e,f,d);M.free(c);if(!(a instanceof vf)&&(a=a.locationObject.ja(Kc),a.s())){this.o.h(a.x-b,a.y-e);return}this.o.h(f/2,d/2)}}},bounds:{configurable:!0,get:function(){return this.j},set:function(a){this.j.B(a)||(G&&x(a,M,xq,"bounds"),this.j.assign(a))}},focus:{configurable:!0, get:function(){return this.o},set:function(a){this.o.B(a)||(G&&x(a,K,xq,"focus"),this.o.assign(a))}},centerX:{configurable:!0,get:function(){return this.j.x+this.o.x},set:function(a){var b=this.j;b.x+this.o.x!==a&&(G&&D(a,xq,"centerX"),b.ka(),b.x=a-this.o.x,b.freeze())}},centerY:{configurable:!0,get:function(){return this.j.y+this.o.y},set:function(a){var b=this.j;b.y+this.o.y!==a&&(G&&D(a,xq,"centerY"),b.ka(),b.y=a-this.o.y,b.freeze())}},focusX:{configurable:!0, get:function(){return this.o.x},set:function(a){var b=this.o;b.x!==a&&(b.ka(),b.x=a,b.freeze())}},focusY:{configurable:!0,get:function(){return this.o.y},set:function(a){var b=this.o;b.y!==a&&(b.ka(),b.y=a,b.freeze())}},x:{configurable:!0,get:function(){return this.j.x},set:function(a){var b=this.j;b.x!==a&&(b.ka(),b.x=a,b.freeze())}},y:{configurable:!0,get:function(){return this.j.y},set:function(a){var b=this.j;b.y!==a&&(b.ka(),b.y=a,b.freeze())}},width:{configurable:!0, -enumerable:!0,get:function(){return this.j.width},set:function(a){var b=this.j;b.width!==a&&(b.ka(),b.width=a,b.freeze())}},height:{configurable:!0,get:function(){return this.j.height},set:function(a){var b=this.j;b.height!==a&&(b.ka(),b.height=a,b.freeze())}},network:{configurable:!0,get:function(){return this.Vc},set:function(a){G&&x(a,jq,xq,"network");this.Vc=a}},sourceVertexes:{configurable:!0,get:function(){for(var a=new I,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex); -return a.iterator}},destinationVertexes:{configurable:!0,get:function(){for(var a=new I,b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},vertexes:{configurable:!0,get:function(){for(var a=new I,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);for(b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},sourceEdges:{configurable:!0,get:function(){return this.wd.iterator}},destinationEdges:{configurable:!0, -enumerable:!0,get:function(){return this.Jd.iterator}},edges:{configurable:!0,get:function(){for(var a=new H,b=this.sourceEdges;b.next();)a.add(b.value);for(b=this.destinationEdges;b.next();)a.add(b.value);return a.iterator}},edgesCount:{configurable:!0,get:function(){return this.wd.count+this.Jd.count}}});xq.prototype.deleteDestinationEdge=xq.prototype.wv;xq.prototype.addDestinationEdge=xq.prototype.mv;xq.prototype.deleteSourceEdge=xq.prototype.xv; +enumerable:!0,get:function(){return this.j.width},set:function(a){var b=this.j;b.width!==a&&(b.ka(),b.width=a,b.freeze())}},height:{configurable:!0,get:function(){return this.j.height},set:function(a){var b=this.j;b.height!==a&&(b.ka(),b.height=a,b.freeze())}},network:{configurable:!0,get:function(){return this.Wc},set:function(a){G&&x(a,jq,xq,"network");this.Wc=a}},sourceVertexes:{configurable:!0,get:function(){for(var a=new I,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex); +return a.iterator}},destinationVertexes:{configurable:!0,get:function(){for(var a=new I,b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},vertexes:{configurable:!0,get:function(){for(var a=new I,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);for(b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},sourceEdges:{configurable:!0,get:function(){return this.xd.iterator}},destinationEdges:{configurable:!0, +enumerable:!0,get:function(){return this.Jd.iterator}},edges:{configurable:!0,get:function(){for(var a=new H,b=this.sourceEdges;b.next();)a.add(b.value);for(b=this.destinationEdges;b.next();)a.add(b.value);return a.iterator}},edgesCount:{configurable:!0,get:function(){return this.xd.count+this.Jd.count}}});xq.prototype.deleteDestinationEdge=xq.prototype.wv;xq.prototype.addDestinationEdge=xq.prototype.mv;xq.prototype.deleteSourceEdge=xq.prototype.xv; xq.prototype.addSourceEdge=xq.prototype.ov;xq.className="LayoutVertex";xq.standardComparer=Eq; xq.smartComparer=function(a,b){G&&x(a,xq,xq,"smartComparer:m");G&&x(b,xq,xq,"smartComparer:n");if(null!==a){if(null!==b){a=a.zi;var c=b.zi;if(null!==a){if(null!==c){b=a.text.toLocaleLowerCase().split(/([+-]?[.]?\d+(?:\.\d*)?(?:e[+-]?\d+)?)/);a=c.text.toLocaleLowerCase().split(/([+-]?[.]?\d+(?:\.\d*)?(?:e[+-]?\d+)?)/);for(c=0;c=f&&0>=g&&(f=1);b=this.spacing.width;isFinite(b)||(b=0);c=this.spacing.height;isFinite(c)||(c=0);null!==a&&a.Da("Layout");d=[];switch(this.alignment){case Nq:var h=b,k=c,l=M.alloc(),m=Math.max(this.cellSize.width,1);if(!isFinite(m))for(var n= @@ -1809,13 +1809,13 @@ aa=aa*r+y}else switch(q){case Mq:B=aa+P.x+T.width;break;default:B=aa-P.x}switch( d[h],e=Math.min(e,k.x),g=Math.min(g,k.y),f=Math.max(f,k.x+k.width);this.arrangement===Mq?this.commitLayers(d,new K(e+b/2-(f+e),g-c/2)):this.commitLayers(d,new K(e-b/2,g-c/2));null!==a&&a.cb("Layout");this.isValidLayout=!0}};Zk.prototype.commitLayers=function(){};function Iq(a,b){G&&x(a,U,Zk,"standardComparer:a");G&&x(b,U,Zk,"standardComparer:b");a=a.text;b=b.text;return ab?1:0} oa.Object.defineProperties(Zk.prototype,{wrappingWidth:{configurable:!0,get:function(){return this.hq},set:function(a){this.hq!==a&&(A(a,"number",Zk,"wrappingWidth"),0d.indexOf(a.newValue)&&d.splice(c,0,a.newValue));return}}else if(a.change===se){c=a.oldParam;if("linkDataArray"===a.modelChange){a=a.oldValue;Ga(a)&&"number"===typeof c&&(d=this.sc(a),b?(this.cg.add(a),this.cd[c]!==a&&this.cd.splice(c,0,a),void 0!==d&&this.ob.add(d,a)):(this.cg.remove(a),this.cd[c]=== -a&&this.cd.splice(c,1),void 0!==d&&this.ob.remove(d)));return}if("linkLabelKeys"===a.modelChange){d=this.Jf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue):(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)));return}}X.prototype.changeState.call(this,a,b)}};t=Gr.prototype;t.Dm=function(a){if(void 0!==a){var b=this.zj;if(null!==b){var c=this.$b(a);null===c&&(c=this.copyNodeData(b),ak(c,this.nodeKeyProperty,a),this.Af(c))}return a}}; +Gr.prototype.changeState=function(a,b){if(null!==a&&a.model===this){if(a.change===pe){var c=a.object,d=a.propertyName;if(d===this.linkKeyProperty&&this.Ac(c)){var e=a.K(b);b=a.K(!b);void 0!==b&&this.ob.remove(b);void 0!==e&&this.ob.add(e,c);ak(c,d,e);return}}else if(a.change===re){c=a.newParam;if("linkDataArray"===a.modelChange){a=a.newValue;Ga(a)&&"number"===typeof c&&(d=this.sc(a),b?(this.cg.remove(a),this.dd[c]===a&&this.dd.splice(c,1),void 0!==d&&this.ob.remove(d)):(this.cg.add(a),this.dd[c]!== +a&&this.dd.splice(c,0,a),void 0!==d&&this.ob.add(d,a)));return}if("linkLabelKeys"===a.modelChange){d=this.Jf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)):0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue));return}}else if(a.change===se){c=a.oldParam;if("linkDataArray"===a.modelChange){a=a.oldValue;Ga(a)&&"number"===typeof c&&(d=this.sc(a),b?(this.cg.add(a),this.dd[c]!==a&&this.dd.splice(c,0,a),void 0!==d&&this.ob.add(d,a)):(this.cg.remove(a),this.dd[c]=== +a&&this.dd.splice(c,1),void 0!==d&&this.ob.remove(d)));return}if("linkLabelKeys"===a.modelChange){d=this.Jf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue):(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)));return}}X.prototype.changeState.call(this,a,b)}};t=Gr.prototype;t.Dm=function(a){if(void 0!==a){var b=this.zj;if(null!==b){var c=this.$b(a);null===c&&(c=this.copyNodeData(b),ak(c,this.nodeKeyProperty,a),this.Af(c))}return a}}; t.qy=function(a){return ar(this,a,!0)};t.jw=function(a,b){ir(this,a,b,!0)};t.uy=function(a){return ar(this,a,!1)};t.nw=function(a,b){ir(this,a,b,!1)};function ar(a,b,c){if(null!==b&&(a=c?a.jf:a.kf,""!==a&&(a=En(b,a),void 0!==a))){if(cr(a))return a;v((c?"FromKey":"ToKey")+" value for link data "+b+" is not a number or a string: "+a)}} function ir(a,b,c,d){null===c&&(c=void 0);void 0===c||cr(c)||za(c,"number or string",Gr,d?"setFromKeyForLinkData:key":"setToKeyForLinkData:key");if(null!==b){var e=d?a.jf:a.kf;if(""!==e)if(c=a.Dm(c),a.Ac(b)){var f=En(b,e);f!==c&&(gr(a,f,b),ak(b,e,c),null===a.$b(c)&&hr(a,c,b),Ar(a,d?"linkFromKey":"linkToKey",pe,e,b,f,c),"string"===typeof e&&a.Ia(b,e))}else ak(b,e,c)}}t.sy=function(a){return $q(this,a,!0)};t.kw=function(a,b){jr(this,a,b,!0)};t.vy=function(a){return $q(this,a,!1)}; t.ow=function(a,b){jr(this,a,b,!1)};function $q(a,b,c){if(null===b)return"";a=c?a.Sj:a.Tj;if(""===a)return"";b=En(b,a);return void 0===b?"":b}function jr(a,b,c,d){A(c,"string",Gr,d?"setFromPortIdForLinkData:portname":"setToPortIdForLinkData:portname");if(null!==b){var e=d?a.Sj:a.Tj;if(""!==e)if(a.Ac(b)){var f=En(b,e);void 0===f&&(f="");f!==c&&(ak(b,e,c),Ar(a,d?"linkFromPortId":"linkToPortId",pe,e,b,f,c),"string"===typeof e&&a.Ia(b,e))}else ak(b,e,c)}} @@ -1982,8 +1982,8 @@ t.My=function(a,b){if(null!==b&&void 0!==b&&(cr(b)||za(b,"number or string",Gr," t.sc=function(a){if(null!==a){var b=this.ti;if(""!==b&&(b=En(a,b),void 0!==b)){if(cr(b))return b;v("Key value for link data "+a+" is not a number or a string: "+b)}}};t.qt=function(a,b){void 0!==b&&null!==b&&cr(b)||za(b,"number or string",Gr,"setKeyForLinkData:key");if(null!==a){var c=this.ti;if(""!==c)if(this.Ac(a)){var d=En(a,c);d!==b&&null===this.Kh(b)&&(ak(a,c,b),void 0!==d&&this.ob.remove(d),this.ob.add(b,a),Ar(this,"linkKey",pe,c,a,d,b),"string"===typeof c&&this.Ia(a,c))}else ak(a,c,b)}}; t.Kh=function(a){null===a&&v("GraphLinksModel.findLinkDataForKey:key must not be null");return void 0!==a&&cr(a)?this.ob.K(a):null}; t.gt=function(a){if(null!==a){var b=this.ti;if(""!==b){var c=this.sc(a);if(void 0===c||this.ob.contains(c)){var d=this.Jl;if(null!==d&&(c=d(this,a),void 0!==c&&null!==c&&!this.ob.contains(c))){ak(a,b,c);return}if("string"===typeof c){for(d=2;this.ob.contains(c+d);)d++;ak(a,b,c+d)}else if(void 0===c||"number"===typeof c){for(c=-this.ob.count-1;this.ob.contains(c);)c--;ak(a,b,c)}else G&&v("GraphLinksModel.getKeyForLinkData returned something other than a string or a number: "+c)}}}}; -t.Ac=function(a){return null===a?!1:this.cg.contains(a)};t.Oi=function(a){null!==a&&(mb(a),this.Ac(a)||er(this,a,!0))};function er(a,b,c){if(""!==a.linkKeyProperty){var d=a.sc(b);if(void 0!==d&&a.ob.K(d)===b)return;a.gt(b);d=a.sc(b);void 0===d&&v("GraphLinksModel.makeLinkDataKeyUnique failed on "+b+". Data not added to model.");a.ob.add(d,b)}a.cg.add(b);d=null;c&&(d=a.cd.length,a.cd.splice(d,0,b));Ar(a,"linkDataArray",re,"linkDataArray",a,null,b,null,d);Kr(a,b)} -t.yz=function(a){if(Array.isArray(a))for(var b=a.length,c=0;cd)return;a.cd.splice(d,1)}Ar(a,"linkDataArray",se,"linkDataArray",a,b,null,d,null);c=ar(a,b,!0);gr(a,c,b);c=ar(a,b,!1);gr(a,c,b);d=a.Jf(b);if(Array.isArray(d))for(var e=d.length,f=0;fd)return;a.dd.splice(d,1)}Ar(a,"linkDataArray",se,"linkDataArray",a,b,null,d,null);c=ar(a,b,!0);gr(a,c,b);c=ar(a,b,!1);gr(a,c,b);d=a.Jf(b);if(Array.isArray(d))for(var e=d.length,f=0;f=a.count)1===a.count&&(a=a.first(),a.centerX=0,a.centerY=0);else{var b=new H;b.addAll(a.iterator);a=new H;var c=new H;var d=this.sort(b);var e,f,g=this.mr;var h=this.arrangement;var k=this.nodeDiameterFormula; var l=this.radius;if(!isFinite(l)||0>=l)l=NaN;var m=this.aspectRatio;if(!isFinite(m)||0>=m)m=1;var n=this.startAngle;isFinite(n)||(n=0);var p=this.sweepAngle;if(!isFinite(p)||360p)p=360;b=this.spacing;isFinite(b)||(b=NaN);h===as&&k===bs?h=Nr:h===as&&k!==bs&&(h=this.arrangement);if((this.direction===Wr||this.direction===Xr)&&this.sorting!==Qr){for(k=0;!(k>=d.length);k+=2){a.add(d.M(k));if(k+1>=d.length)break;c.add(d.M(k+1))}this.direction===Wr?(this.arrangement===as&&a.reverse(),d=new H,d.addAll(a), @@ -2055,7 +2055,7 @@ c.indexOf(b[l][z]),0<=E&&(E=Math.abs(u-(E>=u?E+1:E)),y+=Er||r===m||(q=r>m?r-m:m-r,n+=rg-q?1:-1);c.splice(0>n?m:m+1,0,k);d.splice(h,1);h--}else f=!1;if(f)break;else c.push(d[0]),d.splice(0,1)}for(b=0;b=a?this.hm=a:this.hm=360,this.C())}},arrangement:{configurable:!0,get:function(){return this.Mb},set:function(a){this.Mb!==a&&(cb(a,Mr,Mr,"arrangement"),a===as||a===Nr||a===$r||a===Zr)&&(this.Mb=a,this.C())}},direction:{configurable:!0,get:function(){return this.N},set:function(a){this.N!==a&&(cb(a,Mr,Mr,"direction"), -a===Pr||a===Yr||a===Wr||a===Xr)&&(this.N=a,this.C())}},sorting:{configurable:!0,get:function(){return this.dd},set:function(a){this.dd!==a&&(cb(a,Mr,Mr,"sorting"),a===Ur||a===Vr||a===Sr||Tr||a===Qr)&&(this.dd=a,this.C())}},comparer:{configurable:!0,get:function(){return this.Xc},set:function(a){this.Xc!==a&&(A(a,"function",Mr,"comparer"),this.Xc=a,this.C())}},spacing:{configurable:!0,get:function(){return this.sf},set:function(a){this.sf!==a&&(A(a,"number", +a===Pr||a===Yr||a===Wr||a===Xr)&&(this.N=a,this.C())}},sorting:{configurable:!0,get:function(){return this.ed},set:function(a){this.ed!==a&&(cb(a,Mr,Mr,"sorting"),a===Ur||a===Vr||a===Sr||Tr||a===Qr)&&(this.ed=a,this.C())}},comparer:{configurable:!0,get:function(){return this.Yc},set:function(a){this.Yc!==a&&(A(a,"function",Mr,"comparer"),this.Yc=a,this.C())}},spacing:{configurable:!0,get:function(){return this.sf},set:function(a){this.sf!==a&&(A(a,"number", Mr,"spacing"),this.sf=a,this.C())}},nodeDiameterFormula:{configurable:!0,get:function(){return this.$o},set:function(a){this.$o!==a&&(cb(a,Mr,Mr,"nodeDiameterFormula"),a===Rr||a===bs)&&(this.$o=a,this.C())}},actualXRadius:{configurable:!0,get:function(){return this.ec}},actualYRadius:{configurable:!0,get:function(){return this.je}},actualSpacing:{configurable:!0,get:function(){return this.Dj}},actualCenter:{configurable:!0,get:function(){return this.Nw}}}); var Nr=new F(Mr,"ConstantSpacing",0),$r=new F(Mr,"ConstantDistance",1),Zr=new F(Mr,"ConstantAngle",2),as=new F(Mr,"Packed",3),Pr=new F(Mr,"Clockwise",4),Yr=new F(Mr,"Counterclockwise",5),Wr=new F(Mr,"BidirectionalLeft",6),Xr=new F(Mr,"BidirectionalRight",7),Ur=new F(Mr,"Forwards",8),Vr=new F(Mr,"Reverse",9),Sr=new F(Mr,"Ascending",10),Tr=new F(Mr,"Descending",11),Qr=new F(Mr,"Optimized",12),Rr=new F(Mr,"Pythagorean",13),bs=new F(Mr,"Circular",14);Mr.className="CircularLayout";Mr.ConstantSpacing=Nr; Mr.ConstantDistance=$r;Mr.ConstantAngle=Zr;Mr.Packed=as;Mr.Clockwise=Pr;Mr.Counterclockwise=Yr;Mr.BidirectionalLeft=Wr;Mr.BidirectionalRight=Xr;Mr.Forwards=Ur;Mr.Reverse=Vr;Mr.Ascending=Sr;Mr.Descending=Tr;Mr.Optimized=Qr;Mr.Pythagorean=Rr;Mr.Circular=bs;function Or(){this.xm=-Infinity;this.bn=this.Pk=null} @@ -2063,8 +2063,8 @@ Or.prototype.compare=function(a,b){if(0this.xm||Math.abs(a)h?(e=p.x+p.width/2,f=p.y+ p.height/2,l[0]=new K(p.x+p.width+d.width,p.y),l[1]=new K(p.x,p.y+p.height+d.height),h=2):(k=vs(l,h,e,f,p.width,p.height,d),n=l[k],r=new K(n.x+p.width+d.width,n.y),p=new K(n.x,n.y+p.height+d.height),k+1this.network.vertexes.count)return!1;for(var a=0,b=0,c=this.network.vertexes.first().bounds,d=this.network.vertexes.iterator;d.next();){if(d.value.bounds.Oc(c)&&(a++,2this.network.vertexes.count)return!1;for(var a=0,b=0,c=this.network.vertexes.first().bounds,d=this.network.vertexes.iterator;d.next();){if(d.value.bounds.Pc(c)&&(a++,2a.network.vertexes.count)return!1;a.Dh=a.network.vertexes.Ea();a=a.Dh;a.sort(function(a,b){return null===a||null===b||a===b?0:b.Nd-a.Nd});for(b=a.length-1;0<=b&&1>=a[b].Nd;)b--;return 1u&&0u&&0a[this.vc]&&(this.wi=a[c]-1,this.vc=c),a[c]c)for(g=a.Ha;0c)for(d.reset();d.next();)c=d.value,e[c.component]&&(c.column+=1)} Is.prototype.commitLayout=function(){if(this.setsPortSpots)for(var a=Ps(this,!0),b=Ps(this,!1),c=this.network.edges.iterator;c.next();){var d=c.value.link;null!==d&&(d.fromSpot=a,d.toSpot=b)}this.commitNodes();this.tv();this.isRouting&&this.commitLinks()};function Ps(a,b){return 270===a.N?b?od:rd:90===a.N?b?rd:od:180===a.N?b?pd:qd:b?qd:pd} -Is.prototype.commitNodes=function(){this.de=[];this.Bd=[];this.Ad=[];this.Pa=[];for(var a=0;a<=this.xa;a++)this.de[a]=0,this.Bd[a]=0,this.Ad[a]=0,this.Pa[a]=0;for(a=this.network.vertexes.iterator;a.next();){var b=a.value,c=b.layer;this.de[c]=Math.max(this.de[c],this.nodeMinLayerSpace(b,!0));this.Bd[c]=Math.max(this.Bd[c],this.nodeMinLayerSpace(b,!1))}b=0;c=this.ee;for(var d=0;d<=this.xa;d++){var e=c;0>=this.de[d]+this.Bd[d]&&(e=0);0=this.de[d]+this.Cd[d]&&(e=0);0=n.bounds.bottom?(n=n.bounds.y+n.bounds.height,b.l(q++,C,n+J),b.l(q++,C,n),b.l(q++,C,n-B)):(b.l(q++,C,E+J),b.l(q++,C,E),b.l(q++,C,E-B)):270===this.N?E<=n.bounds.y?(n=n.bounds.y,b.l(q++,C,n-B),b.l(q++,C,n),b.l(q++,C,n+J)):(b.l(q++,C,E-B),b.l(q++,C,E),b.l(q++,C,E+J)):0===this.N&&(C>=n.bounds.right?(n=n.bounds.x+n.bounds.width,b.l(q++,n+J,E),b.l(q++,n,E),b.l(q++,n-B,E)):(b.l(q++,C+J,E),b.l(q++,C,E),b.l(q++,C-B,E)));else{b.l(q++,y,z);var S=0;if(180===this.N||0===this.N){if(180===this.N?C>=n.bounds.right: -C<=n.bounds.x)S=(0===this.N?-B:J)/2;b.l(q++,y+S,E)}else{if(270===this.N?E>=n.bounds.bottom:E<=n.bounds.y)S=(90===this.N?-B:J)/2;b.l(q++,C,z+S)}b.l(q++,C,E)}}else B=Math.max(10,this.de[w.layer]),J=Math.max(10,this.Bd[w.layer]),r?180===this.N?(b.l(q++,C-B-u,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C+J+u,E)):90===this.N?(b.l(q++,C,E+J+u),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E-B-u)): -270===this.N?(b.l(q++,C,E-B-u),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E+J+u)):(b.l(q++,C+J+u,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C-B-u,E)):b.l(q++,C,E)}n=w}if(null===h||l!==Dc||p)if(y=b.i(q-1).x,z=b.i(q-1).y,C=b.i(q).x,E=b.i(q).y,p)u=this.Bd[m.layer],180===this.N||0===this.N?(p=z,p>=m.bounds.y&&p<=m.bounds.bottom&&(180===this.N?C>=m.bounds.x:C<=m.bounds.right)&&(n=m.centerX+(180=== -this.N?-u:u),p=m.bounds.x&&p<=m.bounds.right&&(270===this.N?E>=m.bounds.y:E<=m.bounds.bottom)&&(n=m.centerY+(270===this.N?-u:u),p=m.bounds.x?(n=m.bounds.x+ -m.bounds.width,b.O(q-2,n,z),b.O(q-1,n+J,z)):90===this.N&&E<=m.bounds.bottom?(n=m.bounds.y,b.O(q-2,y,n),b.O(q-1,y,n-B)):270===this.N&&E>=m.bounds.y?(n=m.bounds.y+m.bounds.height,b.O(q-2,y,n),b.O(q-1,y,n+J)):0===this.N&&C<=m.bounds.right&&(n=m.bounds.x,b.O(q-2,n,z),b.O(q-1,n-B,z));else{B=Math.max(10,this.de[m.layer]);J=Math.max(10,this.Bd[m.layer]);p=0;if(180===this.N||0===this.N){if(180===this.N?C<=m.bounds.x:C>=m.bounds.right)p=(0===this.N?J:-B)/2;b.l(q++,C+p,z)}else{if(270===this.N?E<=m.bounds.y: -E>=m.bounds.bottom)p=(90===this.N?J:-B)/2;b.l(q++,y,E+p)}b.l(q++,C,E)}}else{for(;null!==m&&m!==n;){B=w=null;for(m=m.destinationEdges.iterator;m.next()&&(y=m.value,y.link!==c.link||(w=y.toVertex,B=y.fromVertex,null!==B.node&&(B=null),null!==w.node)););if(null===w)break;w!==n&&(y=b.i(q-1).x,z=b.i(q-1).y,C=w.centerX,E=w.centerY,p?180===this.N||0===this.N?(null!==B?B.centerY:z)!==E&&(B=this.Pa[w.layer]+this.Wc.x,q===b.firstPickIndex+1&&(B=0===this.N?Math.max(B,y):Math.min(B,y)),b.l(q++,B,z),b.l(q++,B, -E)):(null!==B?B.centerX:y)!==C&&(B=this.Pa[w.layer]+this.Wc.y,q===b.firstPickIndex+1&&(B=90===this.N?Math.max(B,z):Math.min(B,z)),b.l(q++,y,B),b.l(q++,C,B)):(B=Math.max(10,this.de[w.layer]),J=Math.max(10,this.Bd[w.layer]),r?180===this.N?(b.l(q++,C+J+u,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C-B-u,E)):90===this.N?(b.l(q++,C,E-B-u),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E+J+u)):270=== +C<=n.bounds.x)S=(0===this.N?-B:J)/2;b.l(q++,y+S,E)}else{if(270===this.N?E>=n.bounds.bottom:E<=n.bounds.y)S=(90===this.N?-B:J)/2;b.l(q++,C,z+S)}b.l(q++,C,E)}}else B=Math.max(10,this.de[w.layer]),J=Math.max(10,this.Cd[w.layer]),r?180===this.N?(b.l(q++,C-B-u,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C+J+u,E)):90===this.N?(b.l(q++,C,E+J+u),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E-B-u)): +270===this.N?(b.l(q++,C,E-B-u),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E+J+u)):(b.l(q++,C+J+u,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C-B-u,E)):b.l(q++,C,E)}n=w}if(null===h||l!==Dc||p)if(y=b.i(q-1).x,z=b.i(q-1).y,C=b.i(q).x,E=b.i(q).y,p)u=this.Cd[m.layer],180===this.N||0===this.N?(p=z,p>=m.bounds.y&&p<=m.bounds.bottom&&(180===this.N?C>=m.bounds.x:C<=m.bounds.right)&&(n=m.centerX+(180=== +this.N?-u:u),p=m.bounds.x&&p<=m.bounds.right&&(270===this.N?E>=m.bounds.y:E<=m.bounds.bottom)&&(n=m.centerY+(270===this.N?-u:u),p=m.bounds.x?(n=m.bounds.x+ +m.bounds.width,b.O(q-2,n,z),b.O(q-1,n+J,z)):90===this.N&&E<=m.bounds.bottom?(n=m.bounds.y,b.O(q-2,y,n),b.O(q-1,y,n-B)):270===this.N&&E>=m.bounds.y?(n=m.bounds.y+m.bounds.height,b.O(q-2,y,n),b.O(q-1,y,n+J)):0===this.N&&C<=m.bounds.right&&(n=m.bounds.x,b.O(q-2,n,z),b.O(q-1,n-B,z));else{B=Math.max(10,this.de[m.layer]);J=Math.max(10,this.Cd[m.layer]);p=0;if(180===this.N||0===this.N){if(180===this.N?C<=m.bounds.x:C>=m.bounds.right)p=(0===this.N?J:-B)/2;b.l(q++,C+p,z)}else{if(270===this.N?E<=m.bounds.y: +E>=m.bounds.bottom)p=(90===this.N?J:-B)/2;b.l(q++,y,E+p)}b.l(q++,C,E)}}else{for(;null!==m&&m!==n;){B=w=null;for(m=m.destinationEdges.iterator;m.next()&&(y=m.value,y.link!==c.link||(w=y.toVertex,B=y.fromVertex,null!==B.node&&(B=null),null!==w.node)););if(null===w)break;w!==n&&(y=b.i(q-1).x,z=b.i(q-1).y,C=w.centerX,E=w.centerY,p?180===this.N||0===this.N?(null!==B?B.centerY:z)!==E&&(B=this.Pa[w.layer]+this.Xc.x,q===b.firstPickIndex+1&&(B=0===this.N?Math.max(B,y):Math.min(B,y)),b.l(q++,B,z),b.l(q++,B, +E)):(null!==B?B.centerX:y)!==C&&(B=this.Pa[w.layer]+this.Xc.y,q===b.firstPickIndex+1&&(B=90===this.N?Math.max(B,z):Math.min(B,z)),b.l(q++,y,B),b.l(q++,C,B)):(B=Math.max(10,this.de[w.layer]),J=Math.max(10,this.Cd[w.layer]),r?180===this.N?(b.l(q++,C+J+u,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C-B-u,E)):90===this.N?(b.l(q++,C,E-B-u),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E+J+u)):270=== this.N?(b.l(q++,C,E+J+u),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E-B-u)):(b.l(q++,C-B-u,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C+J+u,E)):180===this.N?(b.l(q++,C+J,E),b.l(q++,C-B,E)):90===this.N?(b.l(q++,C,E-B),b.l(q++,C,E+J)):270===this.N?(b.l(q++,C,E+J),b.l(q++,C,E-B)):(b.l(q++,C-B,E),b.l(q++,C+J,E))));m=w}p&&(y=b.i(q-1).x,z=b.i(q-1).y,C=b.i(q).x,E=b.i(q).y,180===this.N||0===this.N? -z!==E&&(B=0===this.N?Math.min(Math.max((C+y)/2,this.Pa[n.layer]+this.Wc.x),C):Math.max(Math.min((C+y)/2,this.Pa[n.layer]+this.Wc.x),C),b.l(q++,B,z),b.l(q++,B,E)):y!==C&&(B=90===this.N?Math.min(Math.max((E+z)/2,this.Pa[n.layer]+this.Wc.y),E):Math.max(Math.min((E+z)/2,this.Pa[n.layer]+this.Wc.y),E),b.l(q++,y,B),b.l(q++,C,B)))}null!==d&&r&&(null!==g&&(l===Dc&&(l=b.i(0),d=b.i(2),l.B(d)||b.O(1,(l.x+d.x)/2,(l.y+d.y)/2)),l=b.getLinkPoint(e,g,Dc,!0,!1,f,h),l.s()||l.set(e.actualBounds.center),b.O(0,l.x,l.y)), +z!==E&&(B=0===this.N?Math.min(Math.max((C+y)/2,this.Pa[n.layer]+this.Xc.x),C):Math.max(Math.min((C+y)/2,this.Pa[n.layer]+this.Xc.x),C),b.l(q++,B,z),b.l(q++,B,E)):y!==C&&(B=90===this.N?Math.min(Math.max((E+z)/2,this.Pa[n.layer]+this.Xc.y),E):Math.max(Math.min((E+z)/2,this.Pa[n.layer]+this.Xc.y),E),b.l(q++,y,B),b.l(q++,C,B)))}null!==d&&r&&(null!==g&&(l===Dc&&(l=b.i(0),d=b.i(2),l.B(d)||b.O(1,(l.x+d.x)/2,(l.y+d.y)/2)),l=b.getLinkPoint(e,g,Dc,!0,!1,f,h),l.s()||l.set(e.actualBounds.center),b.O(0,l.x,l.y)), null!==h&&(k===Dc&&(k=b.i(b.pointsCount-1),l=b.i(b.pointsCount-3),k.B(l)||b.O(b.pointsCount-2,(k.x+l.x)/2,(k.y+l.y)/2)),e=b.getLinkPoint(f,h,Dc,!1,!1,e,g),e.s()||e.set(f.actualBounds.center),b.O(b.pointsCount-1,e.x,e.y)));b.Df();c.commit()}}}this.avoidOrthogonalOverlaps()}; Is.prototype.avoidOrthogonalOverlaps=function(){if(!(0>=this.linkSpacing)){for(var a=new H,b=this.network.edges.iterator;b.next();){var c=b.value.link;null!==c&&c.isOrthogonal&&!a.contains(c)&&a.add(c)}if(0f.y&&(m=l.y>f.y?0:g.xf.y&&(m=l.y>f.y?0:g.xf.x&&(m=l.x>f.x?0:g.yb.layer?1:a.jdb.jd?1:a.zcb.zc?1:0:0};t.Qy=function(a,b){return a instanceof Ct&&b instanceof Ct&&a!==b?a.firstb.first||a.jb.j||a.jdb.jd?1:a.zcb.zc?1:0:0}; -t.pt=function(a,b){return a instanceof Ct&&b instanceof Ct&&a!==b?a.ccb.cc||a.jb.j||a.jdb.jd?1:a.zcb.zc?1:0:0};t.A=function(a,b){G&&(D(a,Is,"isApprox:a"),D(b,Is,"isApprox:b"));a-=b;return-1a}; +a.value,null!==d&&d.isOrthogonal)for(e=2;ef.x&&(m=l.x>f.x?0:g.yb.layer?1:a.kdb.kd?1:a.zcb.zc?1:0:0};t.Qy=function(a,b){return a instanceof Ct&&b instanceof Ct&&a!==b?a.firstb.first||a.jb.j||a.kdb.kd?1:a.zcb.zc?1:0:0}; +t.pt=function(a,b){return a instanceof Ct&&b instanceof Ct&&a!==b?a.ccb.cc||a.jb.j||a.kdb.kd?1:a.zcb.zc?1:0:0};t.A=function(a,b){G&&(D(a,Is,"isApprox:a"),D(b,Is,"isApprox:b"));a-=b;return-1a}; t.ij=function(a,b,c,d){var e=a.length,f=d-c;if(!(1>=f))if((0>c||c>=e-1)&&v("not in range 0 <= from < length: "+c),2===f)d=a[c],e=a[c+1],0=e)a.sort(b);else for(c=a.slice(0,d),c.sort(b),b=0;b=e)for(d=a.slice(c),d.sort(b),b=c;b=a.Ge.length){var d=[];for(var e=0;ea&&(this.hg=a,this.C()))}},setsPortSpots:{configurable:!0,get:function(){return this.rf},set:function(a){this.rf!==a&&(A(a,"boolean",Is,"setsPortSpots"),this.rf=a,this.C())}},linkSpacing:{configurable:!0,get:function(){return this.Ho},set:function(a){this.Ho!==a&&(A(a,"number",Is,"linkSpacing"),0<=a&&(this.Ho=a,this.C()))}},maxLayer:{configurable:!0, get:function(){return this.xa}},maxIndex:{configurable:!0,get:function(){return this.wi}},maxColumn:{configurable:!0,get:function(){return this.Ha}},minIndexLayer:{configurable:!0,get:function(){return this.bh}},maxIndexLayer:{configurable:!0,get:function(){return this.vc}}}); var Js=new F(Is,"CycleDepthFirst",0),bt=new F(Is,"CycleGreedy",1),Os=new F(Is,"CycleFromLayers",2),Ks=new F(Is,"LayerOptimalLinkLength",0),gt=new F(Is,"LayerLongestPathSink",1),it=new F(Is,"LayerLongestPathSource",2),Ls=new F(Is,"InitDepthFirstOut",0),ot=new F(Is,"InitDepthFirstIn",1),mt=new F(Is,"InitNaive",2),st=new F(Is,"AggressiveNone",0),Ms=new F(Is,"AggressiveLess",1),tt=new F(Is,"AggressiveMore",2),ut=8;Is.className="LayeredDigraphLayout";Is.CycleDepthFirst=Js;Is.CycleGreedy=bt; -Is.CycleFromLayers=Os;Is.LayerOptimalLinkLength=Ks;Is.LayerLongestPathSink=gt;Is.LayerLongestPathSource=it;Is.InitDepthFirstOut=Ls;Is.InitDepthFirstIn=ot;Is.InitNaive=mt;Is.AggressiveNone=st;Is.AggressiveLess=Ms;Is.AggressiveMore=tt;Is.PackNone=0;Is.PackExpand=1;Is.PackStraighten=2;Is.PackMedian=4;Is.PackAll=15;function Ct(){this.index=this.zc=this.jd=this.cc=this.first=this.layer=0;this.link=null;this.j=0}Ct.className="SegInfo";function Ns(a){jq.call(this,a)}na(Ns,jq);Ns.prototype.createVertex=function(){return new Et(this)}; -Ns.prototype.createEdge=function(){return new Ft(this)};Ns.className="LayeredDigraphNetwork";function Et(a){xq.call(this,a);this.Wa=this.Ig=this.ri=-1;this.F=NaN;this.P=null;this.valid=!1;this.finish=this.vg=NaN;this.Cf=0;this.Gk=this.Hk=null}na(Et,xq); +Is.CycleFromLayers=Os;Is.LayerOptimalLinkLength=Ks;Is.LayerLongestPathSink=gt;Is.LayerLongestPathSource=it;Is.InitDepthFirstOut=Ls;Is.InitDepthFirstIn=ot;Is.InitNaive=mt;Is.AggressiveNone=st;Is.AggressiveLess=Ms;Is.AggressiveMore=tt;Is.PackNone=0;Is.PackExpand=1;Is.PackStraighten=2;Is.PackMedian=4;Is.PackAll=15;function Ct(){this.index=this.zc=this.kd=this.cc=this.first=this.layer=0;this.link=null;this.j=0}Ct.className="SegInfo";function Ns(a){jq.call(this,a)}na(Ns,jq);Ns.prototype.createVertex=function(){return new Et(this)}; +Ns.prototype.createEdge=function(){return new Ft(this)};Ns.className="LayeredDigraphNetwork";function Et(a){xq.call(this,a);this.Va=this.Ig=this.ri=-1;this.F=NaN;this.P=null;this.valid=!1;this.finish=this.vg=NaN;this.Cf=0;this.Gk=this.Hk=null}na(Et,xq); Et.prototype.serializeVertexProperties=function(a,b){xq.prototype.serializeVertexProperties.call(this,a,b);a.layer=this.layer;a.column=this.column;a.index=this.index;a.component=this.component;a.near=this.near?kb(this.near):null;a.valid=this.valid;a.vg=this.vg;a.finish=this.finish;a.Cf=this.Cf;a.Hk=this.Hk;a.Gk=this.Gk}; Et.prototype.deserializeVertexProperties=function(a,b,c,d){xq.prototype.deserializeVertexProperties.call(this,a,b,c,d);this.layer=a.layer;this.column=a.column;this.index=a.index;this.component=a.component;if(b=b.get(a.near))this.near=b;this.valid=a.valid;this.vg=a.vg;this.finish=a.finish;this.Cf=a.Cf;this.Hk=a.Hk;this.Gk=a.Gk}; -oa.Object.defineProperties(Et.prototype,{layer:{configurable:!0,get:function(){return this.ri},set:function(a){this.ri!==a&&(A(a,"number",Et,"layer"),this.ri=a)}},column:{configurable:!0,get:function(){return this.Ig},set:function(a){this.Ig!==a&&(A(a,"number",Et,"column"),this.Ig=a)}},index:{configurable:!0,get:function(){return this.Wa},set:function(a){this.Wa!==a&&(A(a,"number",Et,"index"),this.Wa=a)}},component:{configurable:!0,get:function(){return this.F}, +oa.Object.defineProperties(Et.prototype,{layer:{configurable:!0,get:function(){return this.ri},set:function(a){this.ri!==a&&(A(a,"number",Et,"layer"),this.ri=a)}},column:{configurable:!0,get:function(){return this.Ig},set:function(a){this.Ig!==a&&(A(a,"number",Et,"column"),this.Ig=a)}},index:{configurable:!0,get:function(){return this.Va},set:function(a){this.Va!==a&&(A(a,"number",Et,"index"),this.Va=a)}},component:{configurable:!0,get:function(){return this.F}, set:function(a){this.F!==a&&(A(a,"number",Et,"component"),this.F=a)}},near:{configurable:!0,get:function(){return this.P},set:function(a){this.P!==a&&(G&&null!==a&&x(a,Et,Et,"near"),this.P=a)}}});Et.className="LayeredDigraphVertex";function Ft(a){yq.call(this,a);this.j=this.Ma=this.bb=!1;this.La=this.F=NaN;this.P=this.o=0}na(Ft,yq); Ft.prototype.serializeEdgeProperties=function(a,b){yq.prototype.serializeEdgeProperties.call(this,a,b);a.valid=this.valid;a.rev=this.rev;a.forest=this.forest;a.portFromPos=this.portFromPos;a.portToPos=this.portToPos;a.portFromColOffset=this.portFromColOffset;a.portToColOffset=this.portToColOffset}; Ft.prototype.deserializeEdgeProperties=function(a,b,c,d){yq.prototype.deserializeEdgeProperties.call(this,a,b,c,d);this.valid=a.valid;this.rev=a.rev;this.forest=a.forest;this.portFromPos=a.portFromPos;this.portToPos=a.portToPos;this.portFromColOffset=a.portFromColOffset;this.portToColOffset=a.portToColOffset}; -oa.Object.defineProperties(Ft.prototype,{fromVertex:{configurable:!0,get:function(){return this.Zc},set:function(a){this.Zc!==a&&(G&&null!==a&&x(a,Et,Ft,"fromVertex"),this.Zc=a)}},toVertex:{configurable:!0,get:function(){return this.gd},set:function(a){this.gd!==a&&(G&&null!==a&&x(a,Et,Ft,"toVertex"),this.gd=a)}},valid:{configurable:!0,get:function(){return this.bb},set:function(a){this.bb!==a&&(A(a,"boolean",Ft,"valid"),this.bb=a)}},rev:{configurable:!0, +oa.Object.defineProperties(Ft.prototype,{fromVertex:{configurable:!0,get:function(){return this.$c},set:function(a){this.$c!==a&&(G&&null!==a&&x(a,Et,Ft,"fromVertex"),this.$c=a)}},toVertex:{configurable:!0,get:function(){return this.hd},set:function(a){this.hd!==a&&(G&&null!==a&&x(a,Et,Ft,"toVertex"),this.hd=a)}},valid:{configurable:!0,get:function(){return this.bb},set:function(a){this.bb!==a&&(A(a,"boolean",Ft,"valid"),this.bb=a)}},rev:{configurable:!0, enumerable:!0,get:function(){return this.Ma},set:function(a){this.Ma!==a&&(A(a,"boolean",Ft,"rev"),this.Ma=a)}},forest:{configurable:!0,get:function(){return this.j},set:function(a){this.j!==a&&(A(a,"boolean",Ft,"forest"),this.j=a)}},portFromPos:{configurable:!0,get:function(){return this.F},set:function(a){this.F!==a&&(A(a,"number",Ft,"portFromPos"),this.F=a)}},portToPos:{configurable:!0,get:function(){return this.La},set:function(a){this.La!==a&&(A(a,"number", Ft,"portToPos"),this.La=a)}},portFromColOffset:{configurable:!0,get:function(){return this.o},set:function(a){this.o!==a&&(A(a,"number",Ft,"portFromColOffset"),this.o=a)}},portToColOffset:{configurable:!0,get:function(){return this.P},set:function(a){this.P!==a&&(A(a,"number",Ft,"portToColOffset"),this.P=a)}}});Ft.className="LayeredDigraphEdge"; -function Z(a){zi.call(this);this.Pb=new I;this.kp=Gt;this.pd=Ht;this.bq=It;this.Tr=Jt;this.Ow=[];this.nd=!0;this.Mb=Kt;this.Td=(new Hb(10,10)).freeze();var b=new Lt(this);this.Z=new Mt(b);this.$=new Mt(b);this.cv=[];a&&Object.assign(this,a)}na(Z,zi);Z.prototype.cloneProtected=function(a){zi.prototype.cloneProtected.call(this,a);a.kp=this.kp;a.bq=this.bq;a.Tr=this.Tr;a.nd=this.nd;a.Mb=this.Mb;a.Td.assign(this.Td);a.Z.copyInheritedPropertiesFrom(this.Z);a.$.copyInheritedPropertiesFrom(this.$)}; +function Z(a){zi.call(this);this.Pb=new I;this.kp=Gt;this.qd=Ht;this.bq=It;this.Tr=Jt;this.Ow=[];this.od=!0;this.Mb=Kt;this.Td=(new Hb(10,10)).freeze();var b=new Lt(this);this.Z=new Mt(b);this.$=new Mt(b);this.cv=[];a&&Object.assign(this,a)}na(Z,zi);Z.prototype.cloneProtected=function(a){zi.prototype.cloneProtected.call(this,a);a.kp=this.kp;a.bq=this.bq;a.Tr=this.Tr;a.od=this.od;a.Mb=this.Mb;a.Td.assign(this.Td);a.Z.copyInheritedPropertiesFrom(this.Z);a.$.copyInheritedPropertiesFrom(this.$)}; Z.prototype.mb=function(a){a.classType===Z?0===a.name.indexOf("Alignment")?this.alignment=a:0===a.name.indexOf("Arrangement")?this.arrangement=a:0===a.name.indexOf("Compaction")?this.compaction=a:0===a.name.indexOf("Path")?this.path=a:0===a.name.indexOf("Sorting")?this.sorting=a:0===a.name.indexOf("Style")?this.treeStyle=a:v("Unknown enum value: "+a):zi.prototype.mb.call(this,a)};Z.prototype.createNetwork=function(){return new Lt(this)}; Z.prototype.makeNetwork=function(a){function b(a){if(a instanceof V)return!a.isLinkLabel&&"Comment"!==a.category;if(a instanceof R){var b=a.fromNode;if(null===b||b.isLinkLabel||"Comment"===b.category)return!1;a=a.toNode;return null===a||a.isLinkLabel||"Comment"===a.category?!1:!0}return!1}var c=this.createNetwork();a instanceof Q?(c.tg(a.nodes,!0,b),c.tg(a.links,!0,b)):a instanceof vf?c.tg(a.memberParts,!1,b):c.tg(a.iterator,!1,b);return c}; -Z.prototype.doLayout=function(a){G&&null===a&&v("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");null===this.network&&(this.network=this.makeNetwork(a));this.arrangement!==Nt&&(this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin));var b=this.diagram;null===b&&a instanceof Q&&(b=a);this.path===Gt&&null!==b?this.pd=b.isTreePathToChildren?Ht:Ot:this.pd=this.path===Gt?Ht:this.path;if(0b.level)return!1;a.removeChild(c.parent,c)}return!0} Z.prototype.removeChild=function(a,b){if(null!==a&&null!==b){G&&x(a,Mt,Z,"removeChild:p");G&&x(b,Mt,Z,"removeChild:c");for(var c=a.children,d=0,e=0;ee?wu(a,g,ia,y,z):xu(a,g,ia,y,z);ia=z.x;y=z.width;z=z.height;break;case iu:for(C=0;Cn&&(aasb&&(Cu(a,-sb,0,ma,Ba-1),Du(C,-sb,0),Du(E,-sb,0),sb=0)}Na.Y.h(sb,Y);y=Math.max(y,J);z=Math.max(z,B+(0===T?0:q)+rb.height);aa=J}else{0n&&(Ysb&&(Cu(a,0,-sb,ma,Ba-1),Du(C,0,-sb),Du(E,0,-sb),sb=0);Na.Y.h(aa,sb);z=Math.max(z,S);y=Math.max(y,B+(0===T?0:q)+rb.width);Y=S}P++}0n&&(aatb&&(Cu(a,-tb,0,ma,Ba-1),Du(C,-tb,0),Du(E,-tb,0),tb=0)}Na.Y.h(tb,Y);y=Math.max(y,J);z=Math.max(z,B+(0===T?0:q)+sb.height);aa=J}else{0n&&(Ytb&&(Cu(a,0,-tb,ma,Ba-1),Du(C,0,-tb),Du(E,0,-tb),tb=0);Na.Y.h(aa,tb);z=Math.max(z,S);y=Math.max(y,B+(0===T?0:q)+sb.width);Y=S}P++}0l&&(l=0),135u&&(u=0),k===ju&&(h+=p/2+a.focus.y),g+=d+c):b?(null===a.comments?d>y&&(y=Iu(k,d-y,0),g=y.x,h=y.y,y=d,l=0):y=Gu(a,y,l),0>l&&(g-=l,l=0),135z&&(z=Iu(k,0,w-z),g=z.x,h=z.y,z=w,u=0):z=Hu(a,z,u),0>u&&(h-=u,u=0),g+=d+c);if(0b&&(b=c+a.width),0>c&&(b-=c),b;case qu:return a.width>b?a.width:b;case ru:return 2*a.focus.x>b?a.width:b+a.width-2*a.focus.x;case hu:case Yt:return Math.max(a.width,Math.max(b,c+a.width)-Math.min(0,c));case iu:return a.width-a.focus.x+a.nodeSpacing/2+b;case ju:return Math.max(a.width,a.focus.x+a.nodeSpacing/2+b);default:return b}} function Hu(a,b,c){G&&x(a,Mt,Z,"calculateSubheight:v");switch(a.alignment){case Fu:case Eu:return c+a.height>b&&(b=c+a.height),0>c&&(b-=c),b;case qu:return a.height>b?a.height:b;case ru:return 2*a.focus.y>b?a.height:b+a.height-2*a.focus.y;case hu:case Yt:return Math.max(a.height,Math.max(b,c+a.height)-Math.min(0,c));case iu:return a.height-a.focus.y+a.nodeSpacing/2+b;case ju:return Math.max(a.height,a.focus.y+a.nodeSpacing/2+b);default:return b}} function Iu(a,b,c){G&&x(a,F,Z,"alignOffset:align");switch(a){case Eu:b/=2;c/=2;break;case Fu:b/=2;c/=2;break;case qu:c=b=0;break;case ru:break;default:v("Unhandled alignment value "+a.toString())}return new K(b,c)}function zu(a,b,c,d,e,f){G&&x(a,Mt,Z,"shiftRelPosAlign:v");G&&x(b,F,Z,"shiftRelPosAlign:align");b=Iu(b,c,d);Cu(a,b.x,b.y,e,f)}function Cu(a,b,c,d,e){G&&x(a,Mt,Z,"shiftRelPos:v");if(0!==b||0!==c)for(a=a.children;d<=e;d++){var f=a[d].Y;f.x+=b;f.y+=c}} -function Au(a,b,c,d){G&&(x(b,Mt,Z,"recordMidPoints:v"),A(c,"number",Z,"recordMidPoints:x"),A(d,"number",Z,"recordMidPoints:y"));var e=b.parent;switch(a.pd){case Ht:for(a=b.sourceEdges;a.next();)b=a.value,b.fromVertex===e&&b.relativePoint.h(c,d);break;case Ot:for(a=b.destinationEdges;a.next();)b=a.value,b.toVertex===e&&b.relativePoint.h(c,d);break;default:v("Unhandled path value "+a.pd.toString())}}function Du(a,b,c){for(var d=0;dn.length||null===r||2>r.length))for(e=c= 0;cl&&f.yf.y&&lb.length||null===c||2>c.length)d=null;else{m=yu(a,b.length+c.length);for(d=f=k=0;fk;)l=c[f++],m[d++].h(l.x+e,l.y);c=yu(a,d);for(k=0;kn.length||null===f||2>f.length)e=null;else{m=yu(a,n.length+f.length);for(e=l=c=0;cf;)k=n[c++],m[e++].h(k.x, @@ -2288,17 +2288,17 @@ function Ju(a,b){var c=b.length,d=a.cv[c];void 0===d&&(d=[],a.cv[c]=d);d.push(b) Z.prototype.arrangeTrees=function(){if(this.Mb===Nt)for(var a=this.Pb.iterator;a.next();){var b=a.value;if(b instanceof Mt){var c=b.node;if(null!==c){var d=c.position;c=d.x;d=d.y;isFinite(c)||(c=0);isFinite(d)||(d=0);Nu(this,b,c,d)}}}else{a=[];for(b=this.Pb.iterator;b.next();)c=b.value,c instanceof Mt&&a.push(c);switch(this.sorting){case cu:break;case du:a.reverse();break;case eu:a.sort(this.comparer);break;case fu:a.sort(this.comparer);a.reverse();break;default:v("Unhandled sorting value "+this.sorting.toString())}c= this.arrangementOrigin;b=c.x;c=c.y;for(d=0;d=a?0:135>=a?90:225>=a?180:315>=a?270:0}function uu(a){G&&x(a,Mt,Z,"computeLayerSpacing:v");var b=pu(a);b=90===b||270===b;var c=a.layerSpacing;if(0p.y+c.rowIndent&&(e=Math.min(e,Math.max(m.y,e-vu(c))))):c.alignment===qu?(e=d.top+b.y,0===b.y&&m.yp.x+c.rowIndent&&(e=Math.min(e,Math.max(m.x,e-vu(c))))):c.alignment===qu?(e=d.left+b.x,0===b.x&&m.xp.y+c.rowIndent&&(e=Math.min(e,Math.max(m.y,e-vu(c))))):c.alignment===qu?(e=d.top+b.y,0===b.y&&m.y * Definitions: https://github.com/NorthwoodsSoftware/GoJS @@ -13075,7 +13075,6 @@ export class Palette extends Diagram { */ constructor(div?: Element | string, init?: Partial); /** - * * @param {DiagramInitOptions=} init A JavaScript object specifying optional initialization properties object. * Can specify Palette properties, and Palette sub-properties such as `"undoManager.isEnabled": true` * Example: @@ -16092,7 +16091,7 @@ export abstract class GraphObject { * If you need to set properties without type checking, or attach new properties, use GraphObject#attach. * * - * ``` + * ```js * // Common init for use in many different shapes: * var shapeStyle = (() => { return { background: 'red', strokeWidth: 0 }; }) * @@ -16121,7 +16120,7 @@ export abstract class GraphObject { * unless you need to attach new properties that do not exist on the GraphObject, or to set sub-properties. * Calling this method is much less efficient than setting properties directly, and does not do compile-time type checking. * - * ``` + * ```js * new go.Shape() * .bind("fill", "color") * .bind("strokeWidth", "width") @@ -16147,7 +16146,7 @@ export abstract class GraphObject { * * For example: * - * ``` + * ```js * // This can be used by several node templates * // to set multiple properties and bindings on each * function nodeStyle(node) { diff --git a/release/go-debug.js b/release/go-debug.js index 58cb8e0cc..e02632223 100644 --- a/release/go-debug.js +++ b/release/go-debug.js @@ -1,8 +1,8 @@ /* - * GoJS v2.2.9 JavaScript Library for HTML Diagrams, https://gojs.net + * GoJS v2.2.10 JavaScript Library for HTML Diagrams, https://gojs.net * GoJS and Northwoods Software are registered trademarks of Northwoods Software Corporation, https://www.nwoods.com. * Copyright (C) 1998-2022 by Northwoods Software Corporation. All Rights Reserved. - * THIS SOFTWARE IS LICENSED. THE LICENSE AGREEMENT IS AT: https://gojs.net/2.2.9/license.html. + * THIS SOFTWARE IS LICENSED. THE LICENSE AGREEMENT IS AT: https://gojs.net/2.2.10/license.html. * DO NOT MODIFY THIS FILE. DO NOT DISTRIBUTE A MODIFIED COPY OF THE CONTENTS OF THIS FILE. */ (function() { var t;function ba(a){var b=0;return function(){return bc;c++)b["0123456789abcdef".charAt(c>>4)+"0123456789abcdef".charAt(c&15)]=String.fromCharCode(c);a.length%2&&(a="0"+a);c=[];for(var d=0,e=0;ec;c++)b[c]=c;for(c=d=0;256>c;c++)d=(d+b[c]+119)%256,e=b[c],b[c]=b[d],b[d]=e;d=c=0;for(var f="",g=0;gthis.key)return!1;Da(a)}a=a.m;var b=a.length,c=++this.Wa,d=this.nf;if(null!==d)for(;cthis.key)return!1;Da(a)}var b=--this.Wa;if(0<=b)return this.key=b,this.value=a.m[b],!0;this.Wd();return!1};jb.prototype.ud=function(){return this.next()}; -jb.prototype.first=function(){var a=this.ub;this.pa=a.w;var b=a.m;this.Wa=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null};jb.prototype.any=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Wa=e;for(--e;0<=e;e--){if(a(d[e]))return!0;b.w!==c&&Da(b)}return!1};jb.prototype.all=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Wa=e;for(--e;0<=e;e--){if(!a(d[e]))return!1;b.w!==c&&Da(b)}return!0}; -jb.prototype.each=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Wa=e;for(--e;0<=e;e--)a(d[e]),b.w!==c&&Da(b);return this};jb.prototype.map=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=[],e=b.m,f=e.length;this.Wa=f;for(--f;0<=f;f--)d.push(a(e[f])),b.w!==c&&Da(b);a=new H;a.m=d;a.pb();return a.iterator}; -jb.prototype.filter=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=[],e=b.m,f=e.length;this.Wa=f;for(--f;0<=f;f--){var g=e[f];a(g)&&d.push(g);b.w!==c&&Da(b)}a=new H;a.m=d;a.pb();return a.iterator};jb.prototype.Wd=function(){this.key=-1;this.value=null;this.pa=-1;this.ub.Zg=this};jb.prototype.toString=function(){return"ListIteratorBackwards("+this.Wa+"/"+this.ub.count+")"}; -oa.Object.defineProperties(jb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.ub.m.length}}});jb.prototype.first=jb.prototype.first;jb.prototype.hasNext=jb.prototype.ud;jb.prototype.next=jb.prototype.next;jb.prototype.reset=jb.prototype.reset;jb.className="ListIteratorBackwards"; +b.Gm[e.zk],{set:function(a,b){return function(){throw Error("Property "+a.Gm[b.zk]+" of "+a.x+" is read-only.");}}(b,e)})}}}b={Gm:b.Gm,x:b.x}}}};function fb(){}fb.prototype.reset=function(){};fb.prototype.next=function(){return!1};fb.prototype.vd=function(){return!1};fb.prototype.first=function(){return null};fb.prototype.any=function(){return!1};fb.prototype.all=function(){return!0};fb.prototype.each=function(){return this};fb.prototype.map=function(){return this};fb.prototype.filter=function(){return this}; +fb.prototype.Wd=function(){};fb.prototype.toString=function(){return"EmptyIterator"};oa.Object.defineProperties(fb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return 0}}});fb.prototype.first=fb.prototype.first;fb.prototype.hasNext=fb.prototype.vd;fb.prototype.next=fb.prototype.next;fb.prototype.reset=fb.prototype.reset;var gb=null;fb.className="EmptyIterator";gb=new fb;function hb(a){this.key=-1;this.value=a} +hb.prototype.reset=function(){this.key=-1};hb.prototype.next=function(){return-1===this.key?(this.key=0,!0):!1};hb.prototype.vd=function(){return this.next()};hb.prototype.first=function(){this.key=0;return this.value};hb.prototype.any=function(a){this.key=-1;return a(this.value)};hb.prototype.all=function(a){this.key=-1;return a(this.value)};hb.prototype.each=function(a){this.key=-1;a(this.value);return this};hb.prototype.map=function(a){return new hb(a(this.value))}; +hb.prototype.filter=function(a){return a(this.value)?new hb(this.value):gb};hb.prototype.Wd=function(){this.value=null};hb.prototype.toString=function(){return"SingletonIterator("+this.value+")"};oa.Object.defineProperties(hb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return 1}}});hb.prototype.first=hb.prototype.first;hb.prototype.hasNext=hb.prototype.vd;hb.prototype.next=hb.prototype.next; +hb.prototype.reset=hb.prototype.reset;hb.className="SingletonIterator";function ib(a){this.ub=a;this.nf=null;a.Oa=null;this.pa=a.w;this.Va=-1}ib.prototype.reset=function(){var a=this.ub;a.Oa=null;this.pa=a.w;this.Va=-1};ib.prototype.next=function(){var a=this.ub;if(a.w!==this.pa){if(0>this.key)return!1;Da(a)}a=a.m;var b=a.length,c=++this.Va,d=this.nf;if(null!==d)for(;cthis.key)return!1;Da(a)}var b=--this.Va;if(0<=b)return this.key=b,this.value=a.m[b],!0;this.Wd();return!1};jb.prototype.vd=function(){return this.next()}; +jb.prototype.first=function(){var a=this.ub;this.pa=a.w;var b=a.m;this.Va=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null};jb.prototype.any=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Va=e;for(--e;0<=e;e--){if(a(d[e]))return!0;b.w!==c&&Da(b)}return!1};jb.prototype.all=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Va=e;for(--e;0<=e;e--){if(!a(d[e]))return!1;b.w!==c&&Da(b)}return!0}; +jb.prototype.each=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Va=e;for(--e;0<=e;e--)a(d[e]),b.w!==c&&Da(b);return this};jb.prototype.map=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=[],e=b.m,f=e.length;this.Va=f;for(--f;0<=f;f--)d.push(a(e[f])),b.w!==c&&Da(b);a=new H;a.m=d;a.pb();return a.iterator}; +jb.prototype.filter=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=[],e=b.m,f=e.length;this.Va=f;for(--f;0<=f;f--){var g=e[f];a(g)&&d.push(g);b.w!==c&&Da(b)}a=new H;a.m=d;a.pb();return a.iterator};jb.prototype.Wd=function(){this.key=-1;this.value=null;this.pa=-1;this.ub.Zg=this};jb.prototype.toString=function(){return"ListIteratorBackwards("+this.Va+"/"+this.ub.count+")"}; +oa.Object.defineProperties(jb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.ub.m.length}}});jb.prototype.first=jb.prototype.first;jb.prototype.hasNext=jb.prototype.vd;jb.prototype.next=jb.prototype.next;jb.prototype.reset=jb.prototype.reset;jb.className="ListIteratorBackwards"; function H(a){ab(this);this.u=!1;this.m=[];this.w=0;this.Zg=this.Oa=null;(G&&"function"===typeof a||"string"===typeof a)&&v("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=H.prototype;t.pb=function(){var a=this.w;a++;999999999a||a>=b.length)&&Aa(a,"0 <= i < length",H,"elt:i");return b[a]};t.get=function(a){return this.M(a)};t.Rc=function(a,b){G&&D(a,H,"setElt:i");var c=this.m;(0>a||a>=c.length)&&Aa(a,"0 <= i < length",H,"setElt:i");this.u&&xa(this,a);c[a]=b};t.set=function(a,b){this.Rc(a,b)};t.first=function(){var a=this.m;return 0===a.length?null:a[0]}; +t.indexOf=function(a){return null===a?-1:this.m.indexOf(a)};t.M=function(a){G&&D(a,H,"elt:i");var b=this.m;(0>a||a>=b.length)&&Aa(a,"0 <= i < length",H,"elt:i");return b[a]};t.get=function(a){return this.M(a)};t.Sc=function(a,b){G&&D(a,H,"setElt:i");var c=this.m;(0>a||a>=c.length)&&Aa(a,"0 <= i < length",H,"setElt:i");this.u&&xa(this,a);c[a]=b};t.set=function(a,b){this.Sc(a,b)};t.first=function(){var a=this.m;return 0===a.length?null:a[0]}; t.cc=function(){var a=this.m,b=a.length;return 0a&&Aa(a,">= 0",H,"insertAt:i");this.u&&xa(this,a);var c=this.m;a>=c.length?c.push(b):c.splice(a,0,b);this.pb()};t.remove=function(a){if(null===a)return!1;this.u&&xa(this,a);var b=this.m;a=b.indexOf(a);if(-1===a)return!1;a===b.length-1?b.pop():b.splice(a,1);this.pb();return!0};t.delete=function(a){return this.remove(a)}; @@ -53,38 +53,38 @@ t.ij=function(a,b,c){var d=this.m,e=d.length;void 0===b&&(b=0);void 0===c&&(c=e) else for(e=d.slice(b,c),e.sort(a),a=b;a=this.m.length)return gb;var a=this.Oa;return null!==a?(a.reset(),a):new ib(this)}},iteratorBackwards:{configurable:!0, enumerable:!0,get:function(){if(0>=this.m.length)return gb;var a=this.Zg;return null!==a?(a.reset(),a):new jb(this)}}});H.prototype.reverse=H.prototype.reverse;H.prototype.sortRange=H.prototype.ij;H.prototype.sort=H.prototype.sort;H.prototype.toSet=H.prototype.sw;H.prototype.toArray=H.prototype.Ea;H.prototype.removeRange=H.prototype.removeRange;H.prototype.removeAt=H.prototype.kb;H.prototype["delete"]=H.prototype.delete;H.prototype.remove=H.prototype.remove;H.prototype.insertAt=H.prototype.zb; -H.prototype.pop=H.prototype.pop;H.prototype.last=H.prototype.cc;H.prototype.first=H.prototype.first;H.prototype.set=H.prototype.set;H.prototype.setElt=H.prototype.Rc;H.prototype.get=H.prototype.get;H.prototype.elt=H.prototype.M;H.prototype.indexOf=H.prototype.indexOf;H.prototype.has=H.prototype.has;H.prototype.contains=H.prototype.contains;H.prototype.clear=H.prototype.clear;H.prototype.addAll=H.prototype.addAll;H.prototype.push=H.prototype.push;H.prototype.add=H.prototype.add;H.prototype.thaw=H.prototype.ka; -H.prototype.freeze=H.prototype.freeze;H.className="List";function lb(a){this.mg=a;a.Oa=null;this.pa=a.w;this.ra=null}lb.prototype.reset=function(){var a=this.mg;a.Oa=null;this.pa=a.w;this.ra=null};lb.prototype.next=function(){var a=this.mg;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=b.value,this.key=b.key,!0;this.Wd();return!1};lb.prototype.ud=function(){return this.next()}; +H.prototype.pop=H.prototype.pop;H.prototype.last=H.prototype.cc;H.prototype.first=H.prototype.first;H.prototype.set=H.prototype.set;H.prototype.setElt=H.prototype.Sc;H.prototype.get=H.prototype.get;H.prototype.elt=H.prototype.M;H.prototype.indexOf=H.prototype.indexOf;H.prototype.has=H.prototype.has;H.prototype.contains=H.prototype.contains;H.prototype.clear=H.prototype.clear;H.prototype.addAll=H.prototype.addAll;H.prototype.push=H.prototype.push;H.prototype.add=H.prototype.add;H.prototype.thaw=H.prototype.ka; +H.prototype.freeze=H.prototype.freeze;H.className="List";function lb(a){this.mg=a;a.Oa=null;this.pa=a.w;this.ra=null}lb.prototype.reset=function(){var a=this.mg;a.Oa=null;this.pa=a.w;this.ra=null};lb.prototype.next=function(){var a=this.mg;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=b.value,this.key=b.key,!0;this.Wd();return!1};lb.prototype.vd=function(){return this.next()}; lb.prototype.first=function(){var a=this.mg;this.pa=a.w;a=a.ga;if(null!==a){this.ra=a;var b=a.value;this.key=a.key;return this.value=b}return null};lb.prototype.any=function(a){var b=this.mg;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(a(d.value))return!0;b.w!==c&&Da(b);d=d.ua}return!1};lb.prototype.all=function(a){var b=this.mg;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(!a(d.value))return!1;b.w!==c&&Da(b);d=d.ua}return!0}; lb.prototype.each=function(a){var b=this.mg;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;)a(d.value),b.w!==c&&Da(b),d=d.ua;return this};lb.prototype.map=function(a){var b=this.mg;b.Oa=null;for(var c=new H,d=b.w,e=b.ga;null!==e;)c.add(a(e.value)),b.w!==d&&Da(b),e=e.ua;return c.iterator};lb.prototype.filter=function(a){var b=this.mg;b.Oa=null;for(var c=new H,d=b.w,e=b.ga;null!==e;){var f=e.value;a(f)&&c.add(f);b.w!==d&&Da(b);e=e.ua}return c.iterator}; -lb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1;this.mg.Oa=this};lb.prototype.toString=function(){return null!==this.ra?"SetIterator@"+this.ra.value:"SetIterator"};oa.Object.defineProperties(lb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.mg.Nb}}});lb.prototype.first=lb.prototype.first;lb.prototype.hasNext=lb.prototype.ud;lb.prototype.next=lb.prototype.next;lb.prototype.reset=lb.prototype.reset; +lb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1;this.mg.Oa=this};lb.prototype.toString=function(){return null!==this.ra?"SetIterator@"+this.ra.value:"SetIterator"};oa.Object.defineProperties(lb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.mg.Nb}}});lb.prototype.first=lb.prototype.first;lb.prototype.hasNext=lb.prototype.vd;lb.prototype.next=lb.prototype.next;lb.prototype.reset=lb.prototype.reset; lb.className="SetIterator";function I(a){ab(this);this.u=!1;this.Ob={};this.Nb=0;this.Oa=null;this.w=0;this.hf=this.ga=null;(G&&"function"===typeof a||"string"===typeof a)&&v("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=I.prototype;t.pb=function(){var a=this.w;a++;999999999=this.Nb)return gb;var a=this.Oa;return null!==a?(a.reset(),a):new lb(this)}}});I.prototype.toList=I.prototype.rw;I.prototype.toArray=I.prototype.Ea;I.prototype.clear=I.prototype.clear;I.prototype.retainAll=I.prototype.kB;I.prototype.removeAll=I.prototype.Oq; -I.prototype["delete"]=I.prototype.delete;I.prototype.remove=I.prototype.remove;I.prototype.first=I.prototype.first;I.prototype.containsAny=I.prototype.Oz;I.prototype.containsAll=I.prototype.Nz;I.prototype.has=I.prototype.has;I.prototype.contains=I.prototype.contains;I.prototype.addAll=I.prototype.addAll;I.prototype.add=I.prototype.add;I.prototype.thaw=I.prototype.ka;I.prototype.freeze=I.prototype.freeze;var pb=1;I.className="Set";I.uniqueHash=ab;I.hashIdUnique=mb;I.hashId=kb; -function qb(a){this.na=a;this.pa=a.w;this.ra=null}qb.prototype.reset=function(){this.pa=this.na.w;this.ra=null};qb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=this.key=a=b.key,!0;this.Wd();return!1};qb.prototype.ud=function(){return this.next()};qb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;return null!==a?(this.ra=a,this.value=this.key=a=a.key):null}; -qb.prototype.any=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(a(d.key))return!0;b.w!==c&&Da(b);d=d.ua}return!1};qb.prototype.all=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(!a(d.key))return!1;b.w!==c&&Da(b);d=d.ua}return!0};qb.prototype.each=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;)a(d.key),b.w!==c&&Da(b),d=d.ua;return this}; -qb.prototype.map=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;)d.add(a(e.key)),b.w!==c&&Da(b),e=e.ua;return d.iterator};qb.prototype.filter=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;){var f=e.key;a(f)&&d.add(f);b.w!==c&&Da(b);e=e.ua}return d.iterator};qb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1};qb.prototype.toString=function(){return null!==this.ra?"MapKeySetIterator@"+this.ra.value:"MapKeySetIterator"}; -oa.Object.defineProperties(qb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});qb.prototype.first=qb.prototype.first;qb.prototype.hasNext=qb.prototype.ud;qb.prototype.next=qb.prototype.next;qb.prototype.reset=qb.prototype.reset;qb.className="MapKeySetIterator";function ub(a){I.call(this);ab(this);this.u=!0;this.na=a}na(ub,I);t=ub.prototype;t.freeze=function(){return this};t.ka=function(){return this}; +I.prototype["delete"]=I.prototype.delete;I.prototype.remove=I.prototype.remove;I.prototype.first=I.prototype.first;I.prototype.containsAny=I.prototype.Oz;I.prototype.containsAll=I.prototype.Nz;I.prototype.has=I.prototype.has;I.prototype.contains=I.prototype.contains;I.prototype.addAll=I.prototype.addAll;I.prototype.add=I.prototype.add;I.prototype.thaw=I.prototype.ka;I.prototype.freeze=I.prototype.freeze;var qb=1;I.className="Set";I.uniqueHash=ab;I.hashIdUnique=mb;I.hashId=kb; +function rb(a){this.na=a;this.pa=a.w;this.ra=null}rb.prototype.reset=function(){this.pa=this.na.w;this.ra=null};rb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=this.key=a=b.key,!0;this.Wd();return!1};rb.prototype.vd=function(){return this.next()};rb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;return null!==a?(this.ra=a,this.value=this.key=a=a.key):null}; +rb.prototype.any=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(a(d.key))return!0;b.w!==c&&Da(b);d=d.ua}return!1};rb.prototype.all=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(!a(d.key))return!1;b.w!==c&&Da(b);d=d.ua}return!0};rb.prototype.each=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;)a(d.key),b.w!==c&&Da(b),d=d.ua;return this}; +rb.prototype.map=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;)d.add(a(e.key)),b.w!==c&&Da(b),e=e.ua;return d.iterator};rb.prototype.filter=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;){var f=e.key;a(f)&&d.add(f);b.w!==c&&Da(b);e=e.ua}return d.iterator};rb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1};rb.prototype.toString=function(){return null!==this.ra?"MapKeySetIterator@"+this.ra.value:"MapKeySetIterator"}; +oa.Object.defineProperties(rb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});rb.prototype.first=rb.prototype.first;rb.prototype.hasNext=rb.prototype.vd;rb.prototype.next=rb.prototype.next;rb.prototype.reset=rb.prototype.reset;rb.className="MapKeySetIterator";function ub(a){I.call(this);ab(this);this.u=!0;this.na=a}na(ub,I);t=ub.prototype;t.freeze=function(){return this};t.ka=function(){return this}; t.toString=function(){return"MapKeySet("+this.na.toString()+")"};t.add=function(){v("This Set is read-only: "+this.toString())};t.contains=function(a){return this.na.contains(a)};t.has=function(a){return this.contains(a)};t.remove=function(){v("This Set is read-only: "+this.toString())};t.delete=function(a){return this.remove(a)};t.clear=function(){v("This Set is read-only: "+this.toString())};t.first=function(){var a=this.na.ga;return null!==a?a.key:null}; ub.prototype.any=function(a){for(var b=this.na.ga;null!==b;){if(a(b.key))return!0;b=b.ua}return!1};ub.prototype.all=function(a){for(var b=this.na.ga;null!==b;){if(!a(b.key))return!1;b=b.ua}return!0};ub.prototype.each=function(a){for(var b=this.na.ga;null!==b;)a(b.key),b=b.ua;return this};ub.prototype.map=function(a){for(var b=new I,c=this.na.ga;null!==c;)b.add(a(c.key)),c=c.ua;return b};ub.prototype.filter=function(a){for(var b=new I,c=this.na.ga;null!==c;){var d=c.key;a(d)&&b.add(d);c=c.ua}return b}; ub.prototype.copy=function(){return new ub(this.na)};ub.prototype.sw=function(){var a=new I,b=this.na.Ob,c;for(c in b)a.add(b[c].key);return a};ub.prototype.Ea=function(){var a=this.na.Ob,b=Array(this.na.Nb),c=0,d;for(d in a)b[c]=a[d].key,c++;return b};ub.prototype.rw=function(){var a=new H,b=this.na.Ob,c;for(c in b)a.add(b[c].key);return a}; -oa.Object.defineProperties(ub.prototype,{count:{configurable:!0,get:function(){return this.na.Nb}},size:{configurable:!0,get:function(){return this.na.Nb}},iterator:{configurable:!0,get:function(){return 0>=this.na.Nb?gb:new qb(this.na)}}});ub.prototype.toList=ub.prototype.rw;ub.prototype.toArray=ub.prototype.Ea;ub.prototype.toSet=ub.prototype.sw;ub.prototype.first=ub.prototype.first;ub.prototype.clear=ub.prototype.clear;ub.prototype["delete"]=ub.prototype.delete; +oa.Object.defineProperties(ub.prototype,{count:{configurable:!0,get:function(){return this.na.Nb}},size:{configurable:!0,get:function(){return this.na.Nb}},iterator:{configurable:!0,get:function(){return 0>=this.na.Nb?gb:new rb(this.na)}}});ub.prototype.toList=ub.prototype.rw;ub.prototype.toArray=ub.prototype.Ea;ub.prototype.toSet=ub.prototype.sw;ub.prototype.first=ub.prototype.first;ub.prototype.clear=ub.prototype.clear;ub.prototype["delete"]=ub.prototype.delete; ub.prototype.remove=ub.prototype.remove;ub.prototype.has=ub.prototype.has;ub.prototype.contains=ub.prototype.contains;ub.prototype.add=ub.prototype.add;ub.prototype.thaw=ub.prototype.ka;ub.prototype.freeze=ub.prototype.freeze;ub.className="MapKeySet";function vb(a){this.na=a;a.gf=null;this.pa=a.w;this.ra=null}vb.prototype.reset=function(){var a=this.na;a.gf=null;this.pa=a.w;this.ra=null}; -vb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=b.value,this.key=b.key,!0;this.Wd();return!1};vb.prototype.ud=function(){return this.next()};vb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;if(null!==a){this.ra=a;var b=a.value;this.key=a.key;return this.value=b}return null}; +vb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=b.value,this.key=b.key,!0;this.Wd();return!1};vb.prototype.vd=function(){return this.next()};vb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;if(null!==a){this.ra=a;var b=a.value;this.key=a.key;return this.value=b}return null}; vb.prototype.any=function(a){var b=this.na;b.gf=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(a(d.value))return!0;b.w!==c&&Da(b);d=d.ua}return!1};vb.prototype.all=function(a){var b=this.na;b.gf=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(!a(d.value))return!1;b.w!==c&&Da(b);d=d.ua}return!0};vb.prototype.each=function(a){var b=this.na;b.gf=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;)a(d.value),b.w!==c&&Da(b),d=d.ua;return this}; vb.prototype.map=function(a){var b=this.na;b.gf=null;var c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;)d.add(a(e.value)),b.w!==c&&Da(b),e=e.ua;return d.iterator};vb.prototype.filter=function(a){var b=this.na;b.gf=null;var c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;){var f=e.value;a(f)&&d.add(f);b.w!==c&&Da(b);e=e.ua}return d.iterator};vb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1;this.na.gf=this}; -vb.prototype.toString=function(){return null!==this.ra?"MapValueSetIterator@"+this.ra.value:"MapValueSetIterator"};oa.Object.defineProperties(vb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});vb.prototype.first=vb.prototype.first;vb.prototype.hasNext=vb.prototype.ud;vb.prototype.next=vb.prototype.next;vb.prototype.reset=vb.prototype.reset;vb.className="MapValueSetIterator"; +vb.prototype.toString=function(){return null!==this.ra?"MapValueSetIterator@"+this.ra.value:"MapValueSetIterator"};oa.Object.defineProperties(vb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});vb.prototype.first=vb.prototype.first;vb.prototype.hasNext=vb.prototype.vd;vb.prototype.next=vb.prototype.next;vb.prototype.reset=vb.prototype.reset;vb.className="MapValueSetIterator"; function nb(a,b){this.key=a;this.value=b;this.Sl=this.ua=null}nb.prototype.toString=function(){return"{"+this.key+":"+this.value+"}"};nb.className="KeyValuePair";function wb(a){this.na=a;a.Oa=null;this.pa=a.w;this.ra=null}wb.prototype.reset=function(){var a=this.na;a.Oa=null;this.pa=a.w;this.ra=null}; -wb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.key=b.key,this.value=b.value,!0;this.Wd();return!1};wb.prototype.ud=function(){return this.next()};wb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;return null!==a?(this.ra=a,this.key=a.key,this.value=a.value,a):null}; +wb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.key=b.key,this.value=b.value,!0;this.Wd();return!1};wb.prototype.vd=function(){return this.next()};wb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;return null!==a?(this.ra=a,this.key=a.key,this.value=a.value,a):null}; wb.prototype.any=function(a){var b=this.na;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(a(d))return!0;b.w!==c&&Da(b);d=d.ua}return!1};wb.prototype.all=function(a){var b=this.na;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(!a(d))return!1;b.w!==c&&Da(b);d=d.ua}return!0};wb.prototype.each=function(a){var b=this.na;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;)a(d),b.w!==c&&Da(b),d=d.ua;return this}; wb.prototype.map=function(a){var b=this.na;b.Oa=null;var c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;)d.add(a(e)),b.w!==c&&Da(b),e=e.ua;return d.iterator};wb.prototype.filter=function(a){var b=this.na;b.Oa=null;var c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;)a(e)&&d.add(e),b.w!==c&&Da(b),e=e.ua;return d.iterator};wb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1;this.na.Oa=this};wb.prototype.toString=function(){return null!==this.ra?"MapIterator@"+this.ra:"MapIterator"}; -oa.Object.defineProperties(wb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});wb.prototype.first=wb.prototype.first;wb.prototype.hasNext=wb.prototype.ud;wb.prototype.next=wb.prototype.next;wb.prototype.reset=wb.prototype.reset;wb.className="MapIterator"; +oa.Object.defineProperties(wb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});wb.prototype.first=wb.prototype.first;wb.prototype.hasNext=wb.prototype.vd;wb.prototype.next=wb.prototype.next;wb.prototype.reset=wb.prototype.reset;wb.className="MapIterator"; function xb(a){ab(this);this.u=!1;this.Ob={};this.Nb=0;this.gf=this.Oa=null;this.w=0;this.hf=this.ga=null;(G&&"function"===typeof a||"string"===typeof a)&&v("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=xb.prototype;t.pb=function(){var a=this.w;a++;999999999=this.count)return gb;var a=this.Oa;return null!==a?(a.reset(),a):new wb(this)}},iteratorKeys:{configurable:!0,get:function(){return 0>=this.count?gb:new qb(this)}},iteratorValues:{configurable:!0,get:function(){if(0>=this.count)return gb; +oa.Object.defineProperties(xb.prototype,{count:{configurable:!0,get:function(){return this.Nb}},size:{configurable:!0,get:function(){return this.Nb}},iterator:{configurable:!0,get:function(){if(0>=this.count)return gb;var a=this.Oa;return null!==a?(a.reset(),a):new wb(this)}},iteratorKeys:{configurable:!0,get:function(){return 0>=this.count?gb:new rb(this)}},iteratorValues:{configurable:!0,get:function(){if(0>=this.count)return gb; var a=this.gf;return null!==a?(a.reset(),a):new vb(this)}}});xb.prototype.toKeySet=xb.prototype.Qf;xb.prototype.toArray=xb.prototype.Ea;xb.prototype.clear=xb.prototype.clear;xb.prototype["delete"]=xb.prototype.delete;xb.prototype.remove=xb.prototype.remove;xb.prototype.get=xb.prototype.get;xb.prototype.getValue=xb.prototype.K;xb.prototype.has=xb.prototype.has;xb.prototype.contains=xb.prototype.contains;xb.prototype.first=xb.prototype.first;xb.prototype.addAll=xb.prototype.addAll; xb.prototype.set=xb.prototype.set;xb.prototype.add=xb.prototype.add;xb.prototype.thaw=xb.prototype.ka;xb.prototype.freeze=xb.prototype.freeze;xb.className="Map";function K(a,b){void 0===a?this.J=this.I=0:"number"===typeof a&&"number"===typeof b?(this.I=a,this.J=b):v("Invalid arguments to Point constructor: "+a+", "+b);this.u=!1}var yb,zb,Ab,Bb,Cb;K.prototype.assign=function(a){this.I=a.I;this.J=a.J;return this};K.prototype.h=function(a,b){this.I=a;this.J=b;return this}; K.prototype.zg=function(a,b){G&&(A(a,"number",K,"setTo:x"),A(b,"number",K,"setTo:y"),this.ha());this.I=a;this.J=b;return this};K.prototype.set=function(a){G&&(x(a,K,K,"set:p"),this.ha());this.I=a.I;this.J=a.J;return this};K.prototype.copy=function(){var a=new K;a.I=this.I;a.J=this.J;return a};t=K.prototype;t.ia=function(){this.u=!0;Object.freeze(this);return this};t.L=function(){return this.u||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.u=!0;return this}; t.ka=function(){Object.isFrozen(this)&&v("cannot thaw constant: "+this);this.u=!1;return this};t.ha=function(a){if(G&&this.u){var b="The Point is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);v(b)}};function Db(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));return new K(c,e)}return new K} function Eb(a){G&&x(a,K);return a.x.toString()+" "+a.y.toString()}t.toString=function(){return"Point("+this.x+","+this.y+")"};t.B=function(a){return a instanceof K?this.I===a.x&&this.J===a.y:!1};t.Si=function(a,b){return this.I===a&&this.J===b};t.Ya=function(a){return L.A(this.I,a.x)&&L.A(this.J,a.y)};t.add=function(a){G&&(x(a,K,K,"add:p"),this.ha());this.I+=a.x;this.J+=a.y;return this};t.oe=function(a){G&&(x(a,K,K,"subtract:p"),this.ha());this.I-=a.x;this.J-=a.y;return this}; t.offset=function(a,b){G&&(D(a,K,"offset:dx"),D(b,K,"offset:dy"),this.ha());this.I+=a;this.J+=b;return this};K.prototype.rotate=function(a){G&&(D(a,K,"rotate:angle"),this.ha());if(0===a)return this;var b=this.I,c=this.J;if(0===b&&0===c)return this;360<=a?a-=360:0>a&&(a+=360);if(90===a){a=0;var d=1}else 180===a?(a=-1,d=0):270===a?(a=0,d=-1):(d=a*Math.PI/180,a=Math.cos(d),d=Math.sin(d));this.I=a*b-d*c;this.J=d*b+a*c;return this};t=K.prototype; -t.scale=function(a,b){G&&(D(a,K,"scale:sx"),D(b,K,"scale:sy"),this.ha());this.I*=a;this.J*=b;return this};t.Ff=function(a){G&&x(a,K,K,"distanceSquaredPoint:p");var b=a.x-this.I;a=a.y-this.J;return b*b+a*a};t.td=function(a,b){G&&(D(a,K,"distanceSquared:px"),D(b,K,"distanceSquared:py"));a-=this.I;b-=this.J;return a*a+b*b};t.normalize=function(){G&&this.ha();var a=this.I,b=this.J,c=Math.sqrt(a*a+b*b);0b?270:0;if(0===b)return 0a?c=0>b?c+180:180-c:0>b&&(c=360-c);return c} +t.scale=function(a,b){G&&(D(a,K,"scale:sx"),D(b,K,"scale:sy"),this.ha());this.I*=a;this.J*=b;return this};t.Ff=function(a){G&&x(a,K,K,"distanceSquaredPoint:p");var b=a.x-this.I;a=a.y-this.J;return b*b+a*a};t.ud=function(a,b){G&&(D(a,K,"distanceSquared:px"),D(b,K,"distanceSquared:py"));a-=this.I;b-=this.J;return a*a+b*b};t.normalize=function(){G&&this.ha();var a=this.I,b=this.J,c=Math.sqrt(a*a+b*b);0b?270:0;if(0===b)return 0a?c=0>b?c+180:180-c:0>b&&(c=360-c);return c} t.Mz=function(a,b){G&&(x(a,K,K,"compareWithLineSegmentPoint:p"),x(b,K,K,"compareWithLineSegmentPoint:q"));return L.sm(a.x,a.y,b.x,b.y,this.x,this.y)};t.aB=function(a,b,c,d){G&&(D(a,K,"projectOntoLineSegment:px"),D(b,K,"projectOntoLineSegment:py"),D(c,K,"projectOntoLineSegment:qx"),D(d,K,"projectOntoLineSegment:qy"));L.Ph(a,b,c,d,this.I,this.J,this);return this}; t.bB=function(a,b){G&&(x(a,K,K,"projectOntoLineSegmentPoint:p"),x(b,K,K,"projectOntoLineSegmentPoint:q"));L.Ph(a.x,a.y,b.x,b.y,this.I,this.J,this);return this};t.pB=function(a,b,c,d){G&&(D(a,K,"snapToGrid:originx"),D(b,K,"snapToGrid:originy"),D(c,K,"snapToGrid:cellwidth"),D(d,K,"snapToGrid:cellheight"));L.vq(this.I,this.J,a,b,c,d,this);return this};t.qB=function(a,b){G&&(x(a,K,K,"snapToGridPoint:p"),x(b,Hb,K,"snapToGridPoint:q"));L.vq(this.I,this.J,a.x,a.y,b.width,b.height,this);return this}; t.gj=function(a,b){G&&(x(a,M,K,"setRectSpot:r"),x(b,Ib,K,"setRectSpot:spot"),this.ha());this.I=a.x+b.x*a.width+b.offsetX;this.J=a.y+b.y*a.height+b.offsetY;return this};t.hj=function(a,b,c,d,e){G&&(D(a,K,"setSpot:x"),D(b,K,"setSpot:y"),D(c,K,"setSpot:w"),D(d,K,"setSpot:h"),(0>c||0>d)&&v("Point.setSpot:Width and height cannot be negative"),x(e,Ib,K,"setSpot:spot"),this.ha());this.I=a+e.x*c+e.offsetX;this.J=b+e.y*d+e.offsetY;return this}; @@ -110,8 +110,8 @@ function Nb(a,b,c,d){G&&(D(a,K,"distanceSquared:px"),D(b,K,"distanceSquared:py") t.s=function(){return isFinite(this.x)&&isFinite(this.y)};K.alloc=function(){var a=Qb.pop();return void 0===a?new K:a};K.allocAt=function(a,b){var c=Qb.pop();if(void 0===c)return new K(a,b);c.x=a;c.y=b;return c};K.free=function(a){Qb.push(a)}; oa.Object.defineProperties(K.prototype,{x:{configurable:!0,get:function(){return this.I},set:function(a){G&&(A(a,"number",K,"x"),this.ha(a));this.I=a}},y:{configurable:!0,get:function(){return this.J},set:function(a){G&&(A(a,"number",K,"y"),this.ha(a));this.J=a}}});K.prototype.isReal=K.prototype.s;K.prototype.setSpot=K.prototype.hj;K.prototype.setRectSpot=K.prototype.gj;K.prototype.snapToGridPoint=K.prototype.qB;K.prototype.snapToGrid=K.prototype.pB; K.prototype.projectOntoLineSegmentPoint=K.prototype.bB;K.prototype.projectOntoLineSegment=K.prototype.aB;K.intersectingLineSegments=function(a,b,c,d,e,f,g,h){G&&(D(a,K,"intersectingLineSegments:a1x"),D(b,K,"intersectingLineSegments:a1y"),D(c,K,"intersectingLineSegments:a2x"),D(d,K,"intersectingLineSegments:a2y"),D(e,K,"intersectingLineSegments:b1x"),D(f,K,"intersectingLineSegments:b1y"),D(g,K,"intersectingLineSegments:b2x"),D(h,K,"intersectingLineSegments:b2y"));return L.zm(a,b,c,d,e,f,g,h)}; -K.prototype.compareWithLineSegmentPoint=K.prototype.Mz;K.compareWithLineSegment=function(a,b,c,d,e,f){G&&(D(a,K,"compareWithLineSegment:a1x"),D(b,K,"compareWithLineSegment:a1y"),D(c,K,"compareWithLineSegment:a2x"),D(d,K,"compareWithLineSegment:a2y"),D(e,K,"compareWithLineSegment:b1x"),D(f,K,"compareWithLineSegment:b1y"));return L.sm(a,b,c,d,e,f)};K.prototype.direction=K.prototype.direction;K.prototype.directionPoint=K.prototype.Ua;K.prototype.normalize=K.prototype.normalize; -K.prototype.distanceSquared=K.prototype.td;K.prototype.distanceSquaredPoint=K.prototype.Ff;K.prototype.scale=K.prototype.scale;K.prototype.rotate=K.prototype.rotate;K.prototype.offset=K.prototype.offset;K.prototype.subtract=K.prototype.oe;K.prototype.add=K.prototype.add;K.prototype.equalsApprox=K.prototype.Ya;K.prototype.equalTo=K.prototype.Si;K.prototype.equals=K.prototype.B;K.prototype.set=K.prototype.set;K.prototype.setTo=K.prototype.zg;var Qb=[];K.className="Point";K.parse=Db;K.stringify=Eb; +K.prototype.compareWithLineSegmentPoint=K.prototype.Mz;K.compareWithLineSegment=function(a,b,c,d,e,f){G&&(D(a,K,"compareWithLineSegment:a1x"),D(b,K,"compareWithLineSegment:a1y"),D(c,K,"compareWithLineSegment:a2x"),D(d,K,"compareWithLineSegment:a2y"),D(e,K,"compareWithLineSegment:b1x"),D(f,K,"compareWithLineSegment:b1y"));return L.sm(a,b,c,d,e,f)};K.prototype.direction=K.prototype.direction;K.prototype.directionPoint=K.prototype.Wa;K.prototype.normalize=K.prototype.normalize; +K.prototype.distanceSquared=K.prototype.ud;K.prototype.distanceSquaredPoint=K.prototype.Ff;K.prototype.scale=K.prototype.scale;K.prototype.rotate=K.prototype.rotate;K.prototype.offset=K.prototype.offset;K.prototype.subtract=K.prototype.oe;K.prototype.add=K.prototype.add;K.prototype.equalsApprox=K.prototype.Ya;K.prototype.equalTo=K.prototype.Si;K.prototype.equals=K.prototype.B;K.prototype.set=K.prototype.set;K.prototype.setTo=K.prototype.zg;var Qb=[];K.className="Point";K.parse=Db;K.stringify=Eb; K.distanceLineSegmentSquared=Mb;K.distanceSquared=Nb;K.direction=Ob;K.Origin=yb=(new K(0,0)).ia();K.InfiniteTopLeft=zb=(new K(-Infinity,-Infinity)).ia();K.InfiniteBottomRight=Ab=(new K(Infinity,Infinity)).ia();K.SixPoint=Bb=(new K(6,6)).ia();K.NoPoint=Cb=(new K(NaN,NaN)).ia();K.parse=Db;K.stringify=Eb;K.distanceLineSegmentSquared=Mb;K.distanceSquared=Nb;K.direction=Ob; function Hb(a,b){void 0===a?this.ea=this.fa=0:"number"===typeof a&&(0<=a||isNaN(a))&&"number"===typeof b&&(0<=b||isNaN(b))?(this.fa=a,this.ea=b):v("Invalid arguments to Size constructor: "+a+", "+b);this.u=!1}var Rb,Sb,Tb,Xb,Yb,Zb,$b;Hb.prototype.assign=function(a){this.fa=a.fa;this.ea=a.ea;return this};Hb.prototype.h=function(a,b){this.fa=a;this.ea=b;return this}; Hb.prototype.zg=function(a,b){G&&(A(a,"number",Hb,"setTo:w"),A(b,"number",Hb,"setTo:h"),0>a&&Aa(a,">= 0",Hb,"setTo:w"),0>b&&Aa(b,">= 0",Hb,"setTo:h"),this.ha());this.fa=a;this.ea=b;return this};Hb.prototype.set=function(a){G&&(x(a,Hb,Hb,"set:s"),this.ha());this.fa=a.fa;this.ea=a.ea;return this};Hb.prototype.copy=function(){var a=new Hb;a.fa=this.fa;a.ea=this.ea;return a};t=Hb.prototype;t.ia=function(){this.u=!0;Object.freeze(this);return this}; @@ -122,17 +122,17 @@ oa.Object.defineProperties(Hb.prototype,{width:{configurable:!0,get:function(){r Hb.prototype.equals=Hb.prototype.B;Hb.prototype.set=Hb.prototype.set;Hb.prototype.setTo=Hb.prototype.zg;var cc=[];Hb.className="Size";Hb.parse=ac;Hb.stringify=bc;Hb.ZeroSize=Rb=(new Hb(0,0)).ia();Hb.OneSize=Sb=(new Hb(1,1)).ia();Hb.SixSize=Tb=(new Hb(6,6)).ia();Hb.EightSize=Xb=(new Hb(8,8)).ia();Hb.TenSize=Yb=(new Hb(10,10)).ia();Hb.InfiniteSize=Zb=(new Hb(Infinity,Infinity)).ia();Hb.NoSize=$b=(new Hb(NaN,NaN)).ia();Hb.parse=ac;Hb.stringify=bc; function M(a,b,c,d){void 0===a?this.ea=this.fa=this.J=this.I=0:"number"===typeof a&&"number"===typeof b&&"number"===typeof c&&(0<=c||isNaN(c))&&"number"===typeof d&&(0<=d||isNaN(d))?(this.I=a,this.J=b,this.fa=c,this.ea=d):a instanceof K?(c=a.x,a=a.y,b instanceof K?(d=b.x,b=b.y,this.I=Math.min(c,d),this.J=Math.min(a,b),this.fa=Math.abs(c-d),this.ea=Math.abs(a-b)):b instanceof Hb?(this.I=c,this.J=a,this.fa=b.width,this.ea=b.height):v("Incorrect second argument supplied to Rect constructor "+b)):v("Invalid arguments to Rect constructor: "+ a+", "+b+", "+c+", "+d);this.u=!1}t=M.prototype;t.assign=function(a){this.I=a.I;this.J=a.J;this.fa=a.fa;this.ea=a.ea;return this};t.h=function(a,b,c,d){this.I=a;this.J=b;this.fa=c;this.ea=d;return this};function dc(a,b,c){a.fa=b;a.ea=c}t.zg=function(a,b,c,d){G&&(A(a,"number",M,"setTo:x"),A(b,"number",M,"setTo:y"),A(c,"number",M,"setTo:w"),A(d,"number",M,"setTo:h"),0>c&&Aa(c,">= 0",M,"setTo:w"),0>d&&Aa(d,">= 0",M,"setTo:h"),this.ha());this.I=a;this.J=b;this.fa=c;this.ea=d;return this}; -t.set=function(a){G&&(x(a,M,M,"set:r"),this.ha());this.I=a.I;this.J=a.J;this.fa=a.fa;this.ea=a.ea;return this};t.Sc=function(a){G&&(x(a,K,M,"setPoint:p"),this.ha());this.I=a.x;this.J=a.y;return this};t.oB=function(a){G&&(x(a,Hb,M,"setSize:s"),this.ha());this.fa=a.width;this.ea=a.height;return this};M.prototype.copy=function(){var a=new M;a.I=this.I;a.J=this.J;a.fa=this.fa;a.ea=this.ea;return a};t=M.prototype;t.ia=function(){this.u=!0;Object.freeze(this);return this}; +t.set=function(a){G&&(x(a,M,M,"set:r"),this.ha());this.I=a.I;this.J=a.J;this.fa=a.fa;this.ea=a.ea;return this};t.Tc=function(a){G&&(x(a,K,M,"setPoint:p"),this.ha());this.I=a.x;this.J=a.y;return this};t.oB=function(a){G&&(x(a,Hb,M,"setSize:s"),this.ha());this.fa=a.width;this.ea=a.height;return this};M.prototype.copy=function(){var a=new M;a.I=this.I;a.J=this.J;a.fa=this.fa;a.ea=this.ea;return a};t=M.prototype;t.ia=function(){this.u=!0;Object.freeze(this);return this}; t.L=function(){return this.u||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.u=!0;return this};t.ka=function(){Object.isFrozen(this)&&v("cannot thaw constant: "+this);this.u=!1;return this};t.ha=function(a){if(G&&this.u){var b="The Rect is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);v(b)}}; function ec(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));for(var f=0;""===a[b];)b++;(d=a[b++])&&(f=parseFloat(d));for(var g=0;""===a[b];)b++;(d=a[b++])&&(g=parseFloat(d));return new M(c,e,f,g)}return new M}function fc(a){G&&x(a,M);return a.x.toString()+" "+a.y.toString()+" "+a.width.toString()+" "+a.height.toString()} t.toString=function(){return"Rect("+this.x+","+this.y+","+this.width+","+this.height+")"};t.B=function(a){return a instanceof M?this.I===a.x&&this.J===a.y&&this.fa===a.width&&this.ea===a.height:!1};t.Si=function(a,b,c,d){return this.I===a&&this.J===b&&this.fa===c&&this.ea===d};t.Ya=function(a){return L.A(this.I,a.x)&&L.A(this.J,a.y)&&L.A(this.fa,a.width)&&L.A(this.ea,a.height)};function gc(a,b){return L.da(a.I,b.x)&&L.da(a.J,b.y)&&L.da(a.fa,b.width)&&L.da(a.ea,b.height)} t.ca=function(a){G&&x(a,K,M,"containsPoint:p");return this.I<=a.x&&this.I+this.fa>=a.x&&this.J<=a.y&&this.J+this.ea>=a.y};t.Qe=function(a){G&&x(a,M,M,"containsRect:r");return this.I<=a.x&&a.x+a.width<=this.I+this.fa&&this.J<=a.y&&a.y+a.height<=this.J+this.ea}; t.contains=function(a,b,c,d){G?(D(a,M,"contains:x"),D(b,M,"contains:y"),void 0===c?c=0:D(c,M,"contains:w"),void 0===d?d=0:D(d,M,"contains:h"),(0>c||0>d)&&v("Rect.contains:Width and height cannot be negative")):(void 0===c&&(c=0),void 0===d&&(d=0));return this.I<=a&&a+c<=this.I+this.fa&&this.J<=b&&b+d<=this.J+this.ea};t.offset=function(a,b){G&&(D(a,M,"offset:dx"),D(b,M,"offset:dy"),this.ha());this.I+=a;this.J+=b;return this}; -t.Mc=function(a,b){G&&(D(a,M,"inflate:w"),D(b,M,"inflate:h"));return hc(this,b,a,b,a)};t.jq=function(a){G&&x(a,ic,M,"addMargin:m");return hc(this,a.top,a.right,a.bottom,a.left)};t.qw=function(a){G&&x(a,ic,M,"subtractMargin:m");return hc(this,-a.top,-a.right,-a.bottom,-a.left)};t.EA=function(a,b,c,d){G&&(D(a,M,"grow:t"),D(b,M,"grow:r"),D(c,M,"grow:b"),D(d,M,"grow:l"));return hc(this,a,b,c,d)}; +t.Nc=function(a,b){G&&(D(a,M,"inflate:w"),D(b,M,"inflate:h"));return hc(this,b,a,b,a)};t.jq=function(a){G&&x(a,ic,M,"addMargin:m");return hc(this,a.top,a.right,a.bottom,a.left)};t.qw=function(a){G&&x(a,ic,M,"subtractMargin:m");return hc(this,-a.top,-a.right,-a.bottom,-a.left)};t.EA=function(a,b,c,d){G&&(D(a,M,"grow:t"),D(b,M,"grow:r"),D(c,M,"grow:b"),D(d,M,"grow:l"));return hc(this,a,b,c,d)}; function hc(a,b,c,d,e){G&&a.ha();var f=a.fa;c+e<=-f?(a.I+=f/2,a.fa=0):(a.I-=e,a.fa+=c+e);c=a.ea;b+d<=-c?(a.J+=c/2,a.ea=0):(a.J-=b,a.ea+=b+d);return a}t.yy=function(a){G&&x(a,M,M,"intersectRect:r");return kc(this,a.x,a.y,a.width,a.height)};t.Ov=function(a,b,c,d){G&&(D(a,M,"intersect:x"),D(b,M,"intersect:y"),D(c,M,"intersect:w"),D(d,M,"intersect:h"),(0>c||0>d)&&v("Rect.intersect:Width and height cannot be negative"));return kc(this,a,b,c,d)}; -function kc(a,b,c,d,e){G&&a.ha();var f=Math.max(a.I,b),g=Math.max(a.J,c);b=Math.min(a.I+a.fa,b+d);c=Math.min(a.J+a.ea,c+e);a.I=f;a.J=g;a.fa=Math.max(0,b-f);a.ea=Math.max(0,c-g);return a}t.Oc=function(a){G&&x(a,M,M,"intersectsRect:r");return this.Pv(a.x,a.y,a.width,a.height)}; +function kc(a,b,c,d,e){G&&a.ha();var f=Math.max(a.I,b),g=Math.max(a.J,c);b=Math.min(a.I+a.fa,b+d);c=Math.min(a.J+a.ea,c+e);a.I=f;a.J=g;a.fa=Math.max(0,b-f);a.ea=Math.max(0,c-g);return a}t.Pc=function(a){G&&x(a,M,M,"intersectsRect:r");return this.Pv(a.x,a.y,a.width,a.height)}; t.Pv=function(a,b,c,d){G&&(D(a,M,"intersects:x"),D(b,M,"intersects:y"),D(a,M,"intersects:w"),D(b,M,"intersects:h"),(0>c||0>d)&&v("Rect.intersects:Width and height cannot be negative"));var e=this.fa,f=this.I;if(Infinity!==e&&Infinity!==c&&(e+=f,c+=a,isNaN(c)||isNaN(e)||f>c||a>e))return!1;a=this.ea;c=this.J;return Infinity!==a&&Infinity!==d&&(a+=c,d+=b,isNaN(d)||isNaN(a)||c>d||b>a)?!1:!0}; -function lc(a,b){var c=a.fa,d=a.I,e=b.x-10;if(d>b.width+10+10+e||e>c+d)return!1;c=a.ea;a=a.J;d=b.y-10;return a>b.height+10+10+d||d>c+a?!1:!0}t.Ye=function(a){G&&x(a,K,M,"unionPoint:p");return mc(this,a.x,a.y,0,0)};t.Tc=function(a){G&&x(a,M,M,"unionRect:r");return mc(this,a.I,a.J,a.fa,a.ea)}; +function lc(a,b){var c=a.fa,d=a.I,e=b.x-10;if(d>b.width+10+10+e||e>c+d)return!1;c=a.ea;a=a.J;d=b.y-10;return a>b.height+10+10+d||d>c+a?!1:!0}t.Ye=function(a){G&&x(a,K,M,"unionPoint:p");return mc(this,a.x,a.y,0,0)};t.Uc=function(a){G&&x(a,M,M,"unionRect:r");return mc(this,a.I,a.J,a.fa,a.ea)}; t.uw=function(a,b,c,d){G?(D(a,M,"union:x"),D(b,M,"union:y"),void 0===c?c=0:D(c,M,"union:w"),void 0===d?d=0:D(d,M,"union:h"),(0>c||0>d)&&v("Rect.union:Width and height cannot be negative"),this.ha()):(void 0===c&&(c=0),void 0===d&&(d=0));return mc(this,a,b,c,d)};function mc(a,b,c,d,e){var f=Math.min(a.I,b),g=Math.min(a.J,c);b=Math.max(a.I+a.fa,b+d);c=Math.max(a.J+a.ea,c+e);a.I=f;a.J=g;a.fa=b-f;a.ea=c-g;return a} t.hj=function(a,b,c){G&&(D(a,M,"setSpot:x"),D(b,M,"setSpot:y"),x(c,Ib,M,"setSpot:spot"),this.ha());this.I=a-c.offsetX-c.x*this.fa;this.J=b-c.offsetY-c.y*this.ea;return this}; function nc(a,b,c,d,e,f,g,h){G?(D(a,M,"contains:rx"),D(b,M,"contains:ry"),D(c,M,"contains:rw"),D(d,M,"contains:rh"),D(e,M,"contains:x"),D(f,M,"contains:y"),void 0===g?g=0:D(g,M,"contains:w"),void 0===h?h=0:D(h,M,"contains:h"),(0>c||0>d||0>g||0>h)&&v("Rect.contains:Width and height cannot be negative")):(void 0===g&&(g=0),void 0===h&&(h=0));return a<=e&&e+g<=a+c&&b<=f&&f+h<=b+d} @@ -143,8 +143,8 @@ set:function(a){G&&(A(a,"number",M,"height"),this.ha(a));0>a&&Aa(a,">= 0",M,"hei bottom:{configurable:!0,get:function(){return this.J+this.ea},set:function(a){G&&(D(a,M,"top"),this.ha(a));this.J+=a-(this.J+this.ea)}},position:{configurable:!0,get:function(){return new K(this.I,this.J)},set:function(a){G&&(x(a,K,M,"position"),this.ha(a));this.I=a.x;this.J=a.y}},size:{configurable:!0,get:function(){return new Hb(this.fa,this.ea)},set:function(a){G&&(x(a,Hb,M,"size"),this.ha(a));this.fa=a.width;this.ea=a.height}},center:{configurable:!0, enumerable:!0,get:function(){return new K(this.I+this.fa/2,this.J+this.ea/2)},set:function(a){G&&(x(a,K,M,"center"),this.ha(a));this.I=a.x-this.fa/2;this.J=a.y-this.ea/2}},centerX:{configurable:!0,get:function(){return this.I+this.fa/2},set:function(a){G&&(D(a,M,"centerX"),this.ha(a));this.I=a-this.fa/2}},centerY:{configurable:!0,get:function(){return this.J+this.ea/2},set:function(a){G&&(D(a,M,"centerY"),this.ha(a));this.J=a-this.ea/2}}});M.prototype.isEmpty=M.prototype.KA; M.prototype.isReal=M.prototype.s;M.intersectsLineSegment=function(a,b,c,d,e,f,g,h){G&&(D(a,M,"intersectsLineSegment:x"),D(b,M,"intersectsLineSegment:y"),D(c,M,"intersectsLineSegment:w"),D(d,M,"intersectsLineSegment:h"),D(e,M,"intersectsLineSegment:p1x"),D(f,M,"intersectsLineSegment:p1y"),D(g,M,"intersectsLineSegment:p2x"),D(h,M,"intersectsLineSegment:p2y"),(0>c||0>d)&&v("Rect.intersectsLineSegment: width and height cannot be negative"));return L.zy(a,b,c,d,e,f,g,h)};M.prototype.setSpot=M.prototype.hj; -M.prototype.union=M.prototype.uw;M.prototype.unionRect=M.prototype.Tc;M.prototype.unionPoint=M.prototype.Ye;M.prototype.intersects=M.prototype.Pv;M.prototype.intersectsRect=M.prototype.Oc;M.prototype.intersect=M.prototype.Ov;M.prototype.intersectRect=M.prototype.yy;M.prototype.grow=M.prototype.EA;M.prototype.subtractMargin=M.prototype.qw;M.prototype.addMargin=M.prototype.jq;M.prototype.inflate=M.prototype.Mc;M.prototype.offset=M.prototype.offset;M.prototype.contains=M.prototype.contains; -M.prototype.containsRect=M.prototype.Qe;M.prototype.containsPoint=M.prototype.ca;M.prototype.equalsApprox=M.prototype.Ya;M.prototype.equalTo=M.prototype.Si;M.prototype.equals=M.prototype.B;M.prototype.setSize=M.prototype.oB;M.prototype.setPoint=M.prototype.Sc;M.prototype.set=M.prototype.set;M.prototype.setTo=M.prototype.zg;var qc=null,uc=null,pc=[];M.className="Rect";M.parse=ec;M.stringify=fc;M.contains=nc;M.intersects=oc;M.ZeroRect=qc=(new M(0,0,0,0)).ia();M.NoRect=uc=(new M(NaN,NaN,NaN,NaN)).ia(); +M.prototype.union=M.prototype.uw;M.prototype.unionRect=M.prototype.Uc;M.prototype.unionPoint=M.prototype.Ye;M.prototype.intersects=M.prototype.Pv;M.prototype.intersectsRect=M.prototype.Pc;M.prototype.intersect=M.prototype.Ov;M.prototype.intersectRect=M.prototype.yy;M.prototype.grow=M.prototype.EA;M.prototype.subtractMargin=M.prototype.qw;M.prototype.addMargin=M.prototype.jq;M.prototype.inflate=M.prototype.Nc;M.prototype.offset=M.prototype.offset;M.prototype.contains=M.prototype.contains; +M.prototype.containsRect=M.prototype.Qe;M.prototype.containsPoint=M.prototype.ca;M.prototype.equalsApprox=M.prototype.Ya;M.prototype.equalTo=M.prototype.Si;M.prototype.equals=M.prototype.B;M.prototype.setSize=M.prototype.oB;M.prototype.setPoint=M.prototype.Tc;M.prototype.set=M.prototype.set;M.prototype.setTo=M.prototype.zg;var qc=null,uc=null,pc=[];M.className="Rect";M.parse=ec;M.stringify=fc;M.contains=nc;M.intersects=oc;M.ZeroRect=qc=(new M(0,0,0,0)).ia();M.NoRect=uc=(new M(NaN,NaN,NaN,NaN)).ia(); M.parse=ec;M.stringify=fc;M.contains=nc;M.intersects=oc;function ic(a,b,c,d){void 0===a?this.De=this.se=this.Me=this.Oe=0:void 0===b?this.left=this.bottom=this.right=this.top=a:void 0===c?(this.top=a,this.right=b,this.bottom=a,this.left=b):void 0!==d?(this.top=a,this.right=b,this.bottom=c,this.left=d):v("Invalid arguments to Margin constructor: "+a+", "+b+", "+c+", "+d);this.u=!1}ic.prototype.assign=function(a){this.Oe=a.Oe;this.Me=a.Me;this.se=a.se;this.De=a.De;return this}; ic.prototype.zg=function(a,b,c,d){G&&(A(a,"number",ic,"setTo:t"),A(b,"number",ic,"setTo:r"),A(c,"number",ic,"setTo:b"),A(d,"number",ic,"setTo:l"),this.ha());this.Oe=a;this.Me=b;this.se=c;this.De=d;return this};ic.prototype.set=function(a){G&&(x(a,ic,ic,"assign:m"),this.ha());this.Oe=a.Oe;this.Me=a.Me;this.se=a.se;this.De=a.De;return this};ic.prototype.copy=function(){var a=new ic;a.Oe=this.Oe;a.Me=this.Me;a.se=this.se;a.De=this.De;return a};t=ic.prototype; t.ia=function(){this.u=!0;Object.freeze(this);return this};t.L=function(){return this.u||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.u=!0;return this};t.ka=function(){Object.isFrozen(this)&&v("cannot thaw constant: "+this);this.u=!1;return this};t.ha=function(a){if(G&&this.u){var b="The Margin is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);v(b)}}; @@ -162,10 +162,10 @@ a)return Rc;if("RightSide"===a)return Sc;if("BottomSide"===a)return Tc;if("TopBo var d=a[b++];void 0!==d&&0c,f=0>d;if(al;++l){b=.5*(h+k);if(b===h||b===k)break;var m=a/(b+e),n=g/(b+f);m=m*m+n*n-1;if(0m)k=b;else break}c=e*c/(b+e)-c;d=f*d/(b+f)-d;c=Math.sqrt(c*c+d*d)}else c=Math.abs(d-b);else d=a*a-b*b,f=a*c,fg&&(g+=360),q.startAngle+=g);0>a&&(q.startAngle=180-q.startAngle,q.sweepAngle=-q.sweepAngle); 0>d&&(q.startAngle=-q.startAngle,q.sweepAngle=-q.sweepAngle);q.radiusX*=Math.sqrt(a*a+c*c);void 0!==q.radiusY&&(q.radiusY*=Math.sqrt(b*b+d*d));break;case be:g=q.endX;h=q.endY;q.endX=g*a+h*c+e;q.endY=g*b+h*d+f;if(0===q.radiusX||0===q.radiusY)break;0!==b&&(g=180*Math.atan2(b,a)/Math.PI,0>g&&(g+=360),q.xAxisRotation+=g);0>a&&(q.xAxisRotation=180-q.xAxisRotation,q.isClockwiseArc=!q.isClockwiseArc);0>d&&(q.xAxisRotation=-q.xAxisRotation,q.isClockwiseArc=!q.isClockwiseArc);q.radiusX*=Math.sqrt(a*a+c*c); q.radiusY*=Math.sqrt(b*b+d*d);break;default:v("Unknown Segment type: "+q.type)}}}}this.wa=!0;return this}; -t.ca=function(a,b){void 0===b&&(b=0);var c=this.ed,d=this.fd,e=this.lc,f=this.uc;switch(this.type){case N.j:return L.Rb(c,d,e,f,b,a.x,a.y);case N.F:var g=M.allocAt(Math.min(c,e)-b,Math.min(d,f)-b,Math.abs(e-c)+2*b,Math.abs(f-d)+2*b);a=g.ca(a);M.free(g);return a;case N.P:g=Math.min(c,e)-b;var h=Math.min(d,f)-b;c=(Math.abs(e-c)+2*b)/2;b=(Math.abs(f-d)+2*b)/2;if(0>=c||0>=b)return!1;g=a.x-(g+c);h=a.y-(h+b);return 1>=g*g/(c*c)+h*h/(b*b);case N.o:return ee(this,a,b,!0,!1);default:return!1}}; +t.ca=function(a,b){void 0===b&&(b=0);var c=this.fd,d=this.gd,e=this.lc,f=this.uc;switch(this.type){case N.j:return L.Rb(c,d,e,f,b,a.x,a.y);case N.F:var g=M.allocAt(Math.min(c,e)-b,Math.min(d,f)-b,Math.abs(e-c)+2*b,Math.abs(f-d)+2*b);a=g.ca(a);M.free(g);return a;case N.P:g=Math.min(c,e)-b;var h=Math.min(d,f)-b;c=(Math.abs(e-c)+2*b)/2;b=(Math.abs(f-d)+2*b)/2;if(0>=c||0>=b)return!1;g=a.x-(g+c);h=a.y-(h+b);return 1>=g*g/(c*c)+h*h/(b*b);case N.o:return ee(this,a,b,!0,!1);default:return!1}}; function ee(a,b,c,d,e){var f=b.x;b=b.y;for(var g=a.bounds.x-20,h=0,k,l,m,n,p=a.figures.m,r=p.length,q=0;qa?"M"+this.startX.toString()+" "+this.startY.toString():"M"+this.startX.toFixed(a)+" "+this.startY.toFixed(a);for(var c=this.segments.m,d=c.length,e=0;ea&&(a+=360),this.Le=a,this.Ci=0,G&&D(d,je,"x1"),this.Di=Math.max(d,0),G&&D(e,je,"y1"),this.mh=Math.max(e,0),this.El="boolean"===typeof g?g:"number"===typeof g?!!g:!1,this.$k=!!h):(G&&D(d,je,"x1"),this.Le=d, G&&D(e,je,"y1"),this.Ci=e,G&&D(f,je,"x2"),a===Vd&&(f=Math.max(f,0)),this.Di=f,"number"===typeof g?(a===Vd&&(g=Math.max(g,0)),this.mh=g):this.mh=0,this.$k=this.El=!1);this.Lj=!1;this.wa=!0;this.Ud=null}je.prototype.copy=function(){var a=new je;a.oa=this.oa;a.lc=this.lc;a.uc=this.uc;a.Le=this.Le;a.Ci=this.Ci;a.Di=this.Di;a.mh=this.mh;a.El=this.El;a.$k=this.$k;a.Lj=this.Lj;a.wa=this.wa;return a};t=je.prototype; t.Ya=function(a){if(!(a instanceof je)||this.type!==a.type||this.isClosed!==a.isClosed)return!1;switch(this.type){case Sd:case Hd:return L.A(this.endX,a.endX)&&L.A(this.endY,a.endY);case Td:return L.A(this.endX,a.endX)&&L.A(this.endY,a.endY)&&L.A(this.point1X,a.point1X)&&L.A(this.point1Y,a.point1Y)&&L.A(this.point2X,a.point2X)&&L.A(this.point2Y,a.point2Y);case Ud:return L.A(this.endX,a.endX)&&L.A(this.endY,a.endY)&&L.A(this.point1X,a.point1X)&&L.A(this.point1Y,a.point1Y);case Vd:return L.A(this.startAngle, @@ -269,15 +269,15 @@ a;this.wa=!0}},point2Y:{configurable:!0,get:function(){return this.mh},set:funct get:function(){return this.Di},set:function(a){G&&D(a,je,"radiusX");0>a&&Aa(a,">= zero",je,"radiusX");this.u&&xa(this,a);this.Di=a;this.wa=!0}},radiusY:{configurable:!0,get:function(){return this.mh},set:function(a){G&&D(a,je,"radiusY");0>a&&Aa(a,">= zero",je,"radiusY");this.u&&xa(this,a);this.mh=a;this.wa=!0}},startAngle:{configurable:!0,get:function(){return this.lc},set:function(a){this.lc!==a&&(this.u&&xa(this,a),G&&D(a,je,"startAngle"),a%=360,0>a&&(a+=360),this.lc= a,this.wa=!0)}},sweepAngle:{configurable:!0,get:function(){return this.uc},set:function(a){G&&D(a,je,"sweepAngle");this.u&&xa(this,a);360a&&(a=-360);this.uc=a;this.wa=!0}},isClockwiseArc:{configurable:!0,get:function(){return this.$k},set:function(a){this.u&&xa(this,a);this.$k=a;this.wa=!0}},isLargeArc:{configurable:!0,get:function(){return this.El},set:function(a){this.u&&xa(this,a);this.El=a;this.wa=!0}},xAxisRotation:{configurable:!0, get:function(){return this.Le},set:function(a){G&&D(a,je,"xAxisRotation");a%=360;0>a&&(a+=360);this.u&&xa(this,a);this.Le=a;this.wa=!0}}});je.prototype.equalsApprox=je.prototype.Ya;var Sd=new F(je,"Move",0),Hd=new F(je,"Line",1),Td=new F(je,"Bezier",2),Ud=new F(je,"QuadraticBezier",3),Vd=new F(je,"Arc",4),be=new F(je,"SvgArc",4);je.className="PathSegment";je.Move=Sd;je.Line=Hd;je.Bezier=Td;je.QuadraticBezier=Ud;je.Arc=Vd;je.SvgArc=be; -function le(){this.D=null;this.iv=(new K(0,0)).freeze();this.Ut=(new K(0,0)).freeze();this.er=this.Yr=0;this.fr=1;this.oi="";this.Es=this.vr=!1;this.tr=this.hr=0;this.Eg=this.Hr=this.Nr=!1;this.zr=null;this.Cs=0;this.sd=this.Bs=null}le.prototype.copy=function(){var a=new le;return this.clone(a)}; -le.prototype.clone=function(a){a.D=this.D;a.iv.assign(this.viewPoint);a.Ut.assign(this.documentPoint);a.Yr=this.Yr;a.er=this.er;a.fr=this.fr;a.oi=this.oi;a.vr=this.vr;a.Es=this.Es;a.hr=this.hr;a.tr=this.tr;a.Nr=this.Nr;a.Hr=this.Hr;a.Eg=this.Eg;a.zr=this.zr;a.Cs=this.Cs;a.Bs=this.Bs;a.sd=this.sd;return a}; +function le(){this.D=null;this.iv=(new K(0,0)).freeze();this.Ut=(new K(0,0)).freeze();this.er=this.Yr=0;this.fr=1;this.oi="";this.Es=this.vr=!1;this.tr=this.hr=0;this.Eg=this.Hr=this.Nr=!1;this.zr=null;this.Cs=0;this.td=this.Bs=null}le.prototype.copy=function(){var a=new le;return this.clone(a)}; +le.prototype.clone=function(a){a.D=this.D;a.iv.assign(this.viewPoint);a.Ut.assign(this.documentPoint);a.Yr=this.Yr;a.er=this.er;a.fr=this.fr;a.oi=this.oi;a.vr=this.vr;a.Es=this.Es;a.hr=this.hr;a.tr=this.tr;a.Nr=this.Nr;a.Hr=this.Hr;a.Eg=this.Eg;a.zr=this.zr;a.Cs=this.Cs;a.Bs=this.Bs;a.td=this.td;return a}; le.prototype.toString=function(){var a="^";0!==this.modifiers&&(a+="M:"+this.modifiers);0!==this.button&&(a+="B:"+this.button);""!==this.key&&(a+="K:"+this.key);0!==this.clickCount&&(a+="C:"+this.clickCount);0!==this.delta&&(a+="D:"+this.delta);this.handled&&(a+="h");this.bubbles&&(a+="b");null!==this.documentPoint&&(a+="@"+this.documentPoint.toString());return a};le.prototype.yq=function(a,b){var c=this.diagram;if(null===c)return b;me(c,this.event,a,b);return b}; le.prototype.yA=function(a,b){var c=this.diagram;if(null===c)return b;me(c,this.event,a,b);b.assign(c.xt(b));return b}; oa.Object.defineProperties(le.prototype,{diagram:{configurable:!0,get:function(){return this.D},set:function(a){this.D=a}},viewPoint:{configurable:!0,get:function(){return this.iv},set:function(a){x(a,K,le,"viewPoint");this.iv.assign(a)}},documentPoint:{configurable:!0,get:function(){return this.Ut},set:function(a){x(a,K,le,"documentPoint");this.Ut.assign(a)}},modifiers:{configurable:!0,get:function(){return this.Yr},set:function(a){this.Yr= a}},button:{configurable:!0,get:function(){return this.er},set:function(a){this.er=a;if(null===this.event)switch(a){case 0:this.buttons=1;break;case 1:this.buttons=4;break;case 2:this.buttons=2}}},buttons:{configurable:!0,get:function(){return this.fr},set:function(a){this.fr=a}},key:{configurable:!0,get:function(){return this.oi},set:function(a){this.oi=a}},down:{configurable:!0,get:function(){return this.vr},set:function(a){this.vr=a}},up:{configurable:!0, enumerable:!0,get:function(){return this.Es},set:function(a){this.Es=a}},clickCount:{configurable:!0,get:function(){return this.hr},set:function(a){this.hr=a}},delta:{configurable:!0,get:function(){return this.tr},set:function(a){this.tr=a}},isMultiTouch:{configurable:!0,get:function(){return this.Nr},set:function(a){this.Nr=a}},handled:{configurable:!0,get:function(){return this.Hr},set:function(a){this.Hr=a}},bubbles:{configurable:!0, get:function(){return this.Eg},set:function(a){this.Eg=a}},event:{configurable:!0,get:function(){return this.zr},set:function(a){this.zr=a}},isTouchEvent:{configurable:!0,get:function(){var a=sa.TouchEvent,b=this.event;return a&&b instanceof a?!0:(a=sa.PointerEvent)&&b instanceof a&&("touch"===b.pointerType||"pen"===b.pointerType)}},timestamp:{configurable:!0,get:function(){return this.Cs},set:function(a){this.Cs=a}},targetDiagram:{configurable:!0, -get:function(){return this.Bs},set:function(a){this.Bs=a}},targetObject:{configurable:!0,get:function(){return this.sd},set:function(a){this.sd=a}},control:{configurable:!0,get:function(){return 0!==(this.modifiers&1)},set:function(a){this.modifiers=a?this.modifiers|1:this.modifiers&-2}},shift:{configurable:!0,get:function(){return 0!==(this.modifiers&4)},set:function(a){this.modifiers=a?this.modifiers|4:this.modifiers&-5}},alt:{configurable:!0, +get:function(){return this.Bs},set:function(a){this.Bs=a}},targetObject:{configurable:!0,get:function(){return this.td},set:function(a){this.td=a}},control:{configurable:!0,get:function(){return 0!==(this.modifiers&1)},set:function(a){this.modifiers=a?this.modifiers|1:this.modifiers&-2}},shift:{configurable:!0,get:function(){return 0!==(this.modifiers&4)},set:function(a){this.modifiers=a?this.modifiers|4:this.modifiers&-5}},alt:{configurable:!0, get:function(){return 0!==(this.modifiers&2)},set:function(a){this.modifiers=a?this.modifiers|2:this.modifiers&-3}},meta:{configurable:!0,get:function(){return 0!==(this.modifiers&8)},set:function(a){this.modifiers=a?this.modifiers|8:this.modifiers&-9}},left:{configurable:!0,get:function(){var a=this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons&1):0===this.button},set:function(a){this.buttons= a?this.buttons|1:this.buttons&-2}},right:{configurable:!0,get:function(){var a=this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons&2):2===this.button},set:function(a){this.buttons=a?this.buttons|2:this.buttons&-3}},middle:{configurable:!0,get:function(){var a=this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons& 4):1===this.button},set:function(a){this.buttons=a?this.buttons|4:this.buttons&-5}}});le.prototype.getMultiTouchDocumentPoint=le.prototype.yA;le.prototype.getMultiTouchViewPoint=le.prototype.yq;le.className="InputEvent";function ne(){this.D=null;this.ta="";this.gs=this.xs=null}ne.prototype.copy=function(){var a=new ne;a.D=this.D;a.ta=this.ta;a.xs=this.xs;a.gs=this.gs;return a}; @@ -294,9 +294,9 @@ a}},oldParam:{configurable:!0,get:function(){return this.ep},set:function(a){thi oe.prototype.getValue=oe.prototype.K;oe.prototype.clear=oe.prototype.clear;var qe=new F(oe,"Transaction",-1),pe=new F(oe,"Property",0),re=new F(oe,"Insert",1),se=new F(oe,"Remove",2);oe.className="ChangedEvent";oe.Transaction=qe;oe.Property=pe;oe.Insert=re;oe.Remove=se;function te(){this.o=(new H).freeze();this.ta="";this.j=!1} te.prototype.toString=function(a){var b="Transaction: "+this.name+" "+this.changes.count.toString()+(this.isComplete?"":", incomplete");if(void 0!==a&&0b&&a.Rc(b,d),b++);for(;a.length>b;)a.pop();a.freeze()}}; +te.prototype.lt=function(){if(this.isComplete){var a=this.changes;a.ka();for(var b=new xb,c=0;cb&&a.Sc(b,d),b++);for(;a.length>b;)a.pop();a.freeze()}}; oa.Object.defineProperties(te.prototype,{changes:{configurable:!0,get:function(){return this.o}},name:{configurable:!0,get:function(){return this.ta},set:function(a){this.ta=a}},isComplete:{configurable:!0,get:function(){return this.j},set:function(a){this.j=a}}});te.prototype.optimize=te.prototype.lt;te.prototype.redo=te.prototype.redo;te.prototype.canRedo=te.prototype.canRedo;te.prototype.undo=te.prototype.undo;te.prototype.canUndo=te.prototype.canUndo; -te.prototype.clear=te.prototype.clear;te.className="Transaction";function ue(){this.Au=new I;this.zd=!1;this.F=(new H).freeze();this.ze=-1;this.o=999;this.Be=!1;this.qr=null;this.Ki=0;this.j=!1;G&&(this.j=!0);this.He=(new H).freeze();this.Nl=new H;this.bu=!0;this.lu=this.Lr=this.ou=this.nu=!1} +te.prototype.clear=te.prototype.clear;te.className="Transaction";function ue(){this.Au=new I;this.Ad=!1;this.F=(new H).freeze();this.ze=-1;this.o=999;this.Be=!1;this.qr=null;this.Ki=0;this.j=!1;G&&(this.j=!0);this.He=(new H).freeze();this.Nl=new H;this.bu=!0;this.lu=this.Lr=this.ou=this.nu=!1} ue.prototype.toString=function(a){var b="UndoManager "+this.historyIndex+"<"+this.history.count+"<="+this.maxHistoryLength;b+="[";for(var c=this.nestedTransactionNames.count,d=0;d=this.transactionLevel&&!this.bu&&(a=a.diagram,null!==a&&!1===a.bj||Fa("Change not within a transaction: "+c.toString()))}}; ue.prototype.skipsEvent=function(a){if(null===a||0>a.change.value)return!0;a=a.object;if(null===a)return!1;if(void 0!==a.layer){if(a=a.layer,null!==a&&a.isTemporary)return!0}else if(a.isTemporary)return!0;return!1}; -oa.Object.defineProperties(ue.prototype,{models:{configurable:!0,get:function(){return this.Au.iterator}},isEnabled:{configurable:!0,get:function(){return this.zd},set:function(a){this.zd=a}},transactionToUndo:{configurable:!0,get:function(){return 0<=this.historyIndex&&this.historyIndex<=this.history.count-1?this.history.M(this.historyIndex):null}},transactionToRedo:{configurable:!0,get:function(){return this.historyIndexe&&(e=-3),0g&&(g=-3);if(void 0===h||void (e*=a.scrollHorizontalLineChange/16,0e||Math.abs(b.y-a.y)>d}; -oa.Object.defineProperties(we.prototype,{diagram:{configurable:!0,get:function(){return this.D},set:function(a){a instanceof Q&&(this.D=a)}},name:{configurable:!0,get:function(){return this.ta},set:function(a){A(a,"string",we,"name");this.ta=a}},isEnabled:{configurable:!0,get:function(){return this.zd},set:function(a){A(a,"boolean",we,"isEnabled");this.zd=a}},isActive:{configurable:!0,get:function(){return this.Uc},set:function(a){A(a,"boolean", -we,"isActive");this.Uc=a}},transactionResult:{configurable:!0,get:function(){return this.Hw},set:function(a){null!==a&&A(a,"string",we,"transactionResult");this.Hw=a}}});we.prototype.startTransaction=we.prototype.Da;we.className="Tool";function Ua(){we.call(this);this.name="ToolManager";this.Ec=new H;this.Vc=new H;this.Qd=new H;this.P=this.La=850;this.o=(new Hb(2,2)).ia();this.bb=5E3;this.Ma=Ie;this.F=Ke;this.pr=this.j=null;this.hk=-1}na(Ua,we);Ua.prototype.initializeStandardTools=function(){}; +oa.Object.defineProperties(we.prototype,{diagram:{configurable:!0,get:function(){return this.D},set:function(a){a instanceof Q&&(this.D=a)}},name:{configurable:!0,get:function(){return this.ta},set:function(a){A(a,"string",we,"name");this.ta=a}},isEnabled:{configurable:!0,get:function(){return this.Ad},set:function(a){A(a,"boolean",we,"isEnabled");this.Ad=a}},isActive:{configurable:!0,get:function(){return this.Vc},set:function(a){A(a,"boolean", +we,"isActive");this.Vc=a}},transactionResult:{configurable:!0,get:function(){return this.Hw},set:function(a){null!==a&&A(a,"string",we,"transactionResult");this.Hw=a}}});we.prototype.startTransaction=we.prototype.Da;we.className="Tool";function Ua(){we.call(this);this.name="ToolManager";this.Ec=new H;this.Wc=new H;this.Qd=new H;this.P=this.La=850;this.o=(new Hb(2,2)).ia();this.bb=5E3;this.Ma=Ie;this.F=Ke;this.pr=this.j=null;this.hk=-1}na(Ua,we);Ua.prototype.initializeStandardTools=function(){}; Ua.prototype.updateAdornments=function(a){var b=this.currentToolTip;if(b instanceof Je&&this.pr===a){var c=b.adornedObject;(null!==a?c.part===a:null===c)?this.showToolTip(b,c):this.hideToolTip()}}; Ua.prototype.doMouseDown=function(){var a=this.diagram,b=a.lastInput;b.isTouchEvent&&this.gestureBehavior===Le&&(b.bubbles=!1);if(b.isMultiTouch){this.cancelWaitAfter();if(this.gestureBehavior===Me){b.bubbles=!0;return}if(this.gestureBehavior===Le)return;if(a.currentTool.canStartMultiTouch()){a.currentTool.standardPinchZoomStart();return}}var c=a.undoManager;G&&c.checksTransactionLevel&&0!==c.transactionLevel&&Fa("WARNING: In ToolManager.doMouseDown: UndoManager.transactionLevel is not zero");c=this.mouseDownTools.length; for(var d=0;dg&&(g=l),m>h&&(h=m))}}Infinity===d?f.h(0,0,0,0):f.h(d,e,g-d,h-e);d=f.x+f.width/2;e=f.y+f.height/2;M.free(f); -f=a.vs;g=new xb;h=K.alloc();for(k=b.iterator;k.next();)l=k.value,l instanceof R&&l.canCopy()&&(m=c.K(l),null!==m&&(m.points=l.points,lf(m,f.x-d,f.y-e),m.suspendsRouting=!0,g.add(m,a.Ed())));for(b=b.iterator;b.next();)l=b.value,l.Pc()&&l.canCopy()&&(k=c.K(l),null!==k&&(l=l.location,h.h(f.x-(d-l.x),f.y-(e-l.y)),k.location=h,k.Xa(),g.add(k,a.Ed(h))));K.free(h);a.copiedParts=g;We(a,g.Qf());null!==a.draggedLink&&(c=a.draggedLink,b=c.routeBounds,lf(c,a.startPoint.x-(b.x+b.width/2),a.startPoint.y-(b.y+b.height/ +f=a.vs;g=new xb;h=K.alloc();for(k=b.iterator;k.next();)l=k.value,l instanceof R&&l.canCopy()&&(m=c.K(l),null!==m&&(m.points=l.points,lf(m,f.x-d,f.y-e),m.suspendsRouting=!0,g.add(m,a.Fd())));for(b=b.iterator;b.next();)l=b.value,l.Qc()&&l.canCopy()&&(k=c.K(l),null!==k&&(l=l.location,h.h(f.x-(d-l.x),f.y-(e-l.y)),k.location=h,k.Xa(),g.add(k,a.Fd(h))));K.free(h);a.copiedParts=g;We(a,g.Qf());null!==a.draggedLink&&(c=a.draggedLink,b=c.routeBounds,lf(c,a.startPoint.x-(b.x+b.width/2),a.startPoint.y-(b.y+b.height/ 2)));a.doUpdateCursor(null,!0)}}}Qe.prototype.doSimulatedDragOut=function(){var a=this.diagram;a.ut=!1;this.mayCopy()||this.mayMove()?a.currentCursor="":a.currentCursor=this.nodropCursor;this.Co=null};Qe.prototype.computeMove=function(a,b,c,d){c=this.diagram;return null!==c?c.computeMove(a,b,this.dragOptions,d):new K}; -oa.Object.defineProperties(Qe.prototype,{isCopyEnabled:{configurable:!0,get:function(){return this.Vc},set:function(a){A(a,"boolean",Qe,"isCopyEnabled");this.Vc=a}},copiesEffectiveCollection:{configurable:!0,get:function(){return this.F},set:function(a){A(a,"boolean",Qe,"copiesEffectiveCollection");this.F=a}},dragOptions:{configurable:!0,get:function(){return this.Ma},set:function(a){x(a,Re,Qe,"dragOptions");this.Ma=a}},isGridSnapEnabled:{configurable:!0, +oa.Object.defineProperties(Qe.prototype,{isCopyEnabled:{configurable:!0,get:function(){return this.Wc},set:function(a){A(a,"boolean",Qe,"isCopyEnabled");this.Wc=a}},copiesEffectiveCollection:{configurable:!0,get:function(){return this.F},set:function(a){A(a,"boolean",Qe,"copiesEffectiveCollection");this.F=a}},dragOptions:{configurable:!0,get:function(){return this.Ma},set:function(a){x(a,Re,Qe,"dragOptions");this.Ma=a}},isGridSnapEnabled:{configurable:!0, enumerable:!0,get:function(){return this.dragOptions.isGridSnapEnabled},set:function(a){A(a,"boolean",Qe,"isGridSnapEnabled");this.dragOptions.isGridSnapEnabled=a}},isComplexRoutingRealtime:{configurable:!0,get:function(){return this.Ec},set:function(a){A(a,"boolean",Qe,"isComplexRoutingRealtime");this.Ec=a}},isGridSnapRealtime:{configurable:!0,get:function(){return this.dragOptions.isGridSnapRealtime},set:function(a){A(a,"boolean",Qe,"isGridSnapRealtime");this.dragOptions.isGridSnapRealtime= a}},gridSnapCellSize:{configurable:!0,get:function(){return this.dragOptions.gridSnapCellSize},set:function(a){x(a,Hb,Qe,"gridSnapCellSize");this.dragOptions.gridSnapCellSize.B(a)||(a=a.L(),this.dragOptions.gridSnapCellSize=a)}},gridSnapCellSpot:{configurable:!0,get:function(){return this.dragOptions.gridSnapCellSpot},set:function(a){x(a,Ib,Qe,"gridSnapCellSpot");this.dragOptions.gridSnapCellSpot.B(a)||(a=a.L(),this.dragOptions.gridSnapCellSpot=a)}},gridSnapOrigin:{configurable:!0, enumerable:!0,get:function(){return this.dragOptions.gridSnapOrigin},set:function(a){x(a,K,Qe,"gridSnapOrigin");this.dragOptions.gridSnapOrigin.B(a)||(a=a.L(),this.dragOptions.gridSnapOrigin=a)}},dragsLink:{configurable:!0,get:function(){return this.dragOptions.dragsLink},set:function(a){A(a,"boolean",Qe,"dragsLink");this.dragOptions.dragsLink=a}},dragsTree:{configurable:!0,get:function(){return this.dragOptions.dragsTree},set:function(a){A(a,"boolean",Qe,"dragsTree"); @@ -401,7 +401,7 @@ get:function(){return this.o},set:function(a){this.o=a}},draggedParts:{configura isDragOutStarted:{configurable:!0,get:function(){return this.Qd},set:function(a){this.Qd=a}},startPoint:{configurable:!0,get:function(){return this.vs},set:function(a){x(a,K,Qe,"startPoint");this.vs.B(a)||this.vs.assign(a)}},delay:{configurable:!0,get:function(){return this.ll},set:function(a){A(a,"number",Qe,"delay");this.ll=a}}});Qe.prototype.getDraggingSource=Qe.prototype.xA;var Te=null,Ze=null;Qe.className="DraggingTool";Se=new H; Ta("draggingTool",function(){return this.findTool("Dragging")},function(a){this.gb("Dragging",a,this.mouseMoveTools)});Ua.prototype.doCancel=function(){null!==Te&&Te.doCancel();we.prototype.doCancel.call(this)}; function Gf(){0b.firstPickIndex+1&&c=n&&(n=1);0>=p&&(p=1);n=p/n}p=K.alloc();L.vq(a.x,a.y,h,k,e.width,e.height,p);a=g.copy();0>=b.x?0>=b.y?(a.x=Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=Math.max(l-a.x,c.width),a.y=Math.max(p.y,m-d.height),a.y=Math.min(a.y,m-c.height),a.height=Math.max(m-a.y,c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n* a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width),a.x=l-a.width,a.y=m-a.height)):1<=b.y?(a.x=Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=Math.max(l-a.x,c.width),a.height=Math.max(Math.min(p.y-k,d.height),c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width),a.x=l-a.width)):(a.x= Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=l-a.x,f||(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n,a.y=k+.5*(m-k-a.height))):1<=b.x?0>=b.y?(a.width=Math.max(Math.min(p.x-h,d.width),c.width),a.y=Math.max(p.y,m-d.height),a.y=Math.min(a.y,m-c.height),a.height=Math.max(m-a.y,c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width), @@ -501,9 +501,9 @@ wg.prototype.doActivate=function(){var a=this.diagram;if(null===this.adornedObje wg.prototype.computeRotationPoint=function(a){var b=a.part,c=b.locationObject;return b.rotationSpot.fb()?a.ja(b.rotationSpot):a===b||a===c?c.ja(b.locationSpot):a.ja(Kc)}; wg.prototype.computeAdornmentLocation=function(a){var b=this.rotationPoint;b.s()||(b=this.computeRotationPoint(a));b=a.Us(b);var c=this.handleAngle;0>c?c+=360:360<=c&&(c-=360);c=Math.round(45*Math.round(c/45));var d=this.handleDistance;0===c?b.x=a.naturalBounds.width+d:45===c?(b.x=a.naturalBounds.width+d,b.y=a.naturalBounds.height+d):90===c?b.y=a.naturalBounds.height+d:135===c?(b.x=-d,b.y=a.naturalBounds.height+d):180===c?b.x=-d:225===c?(b.x=-d,b.y=-d):270===c?b.y=-d:315===c&&(b.x=a.naturalBounds.width+ d,b.y=-d);return a.ja(b)};wg.prototype.doDeactivate=function(){var a=this.diagram;this.stopTransaction();this.re=this.handle=null;this.ls=new K(NaN,NaN);this.isActive=a.isMouseCaptured=!1};wg.prototype.doCancel=function(){this.diagram.delaysLayout=!1;this.rotate(this.originalAngle);this.stopTool()};wg.prototype.doMouseMove=function(){var a=this.diagram;this.isActive&&(a=this.computeRotate(a.lastInput.documentPoint),this.rotate(a))}; -wg.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){a.delaysLayout=!1;var b=this.computeRotate(a.lastInput.documentPoint);this.rotate(b);a.Va();this.transactionResult=this.name;a.V("PartRotated",this.adornedObject,this.originalAngle)}this.stopTool()}; -wg.prototype.rotate=function(a){G&&D(a,wg,"rotate:newangle");var b=this.adornedObject;if(null!==b){b.angle=a;b=b.part;b.Xa();var c=b.locationObject,d=b.rotateObject;if(c===d||c.yg(d))c=this.gp.copy(),b.location=c.oe(this.rotationPoint).rotate(a-this.originalAngle).add(this.rotationPoint);this.diagram.ld()}}; -wg.prototype.computeRotate=function(a){a=this.rotationPoint.Ua(a)-this.handleAngle;var b=this.adornedObject.panel;null!==b&&(a-=b.Xi());360<=a?a-=360:0>a&&(a+=360);b=Math.min(Math.abs(this.snapAngleMultiple),180);var c=Math.min(Math.abs(this.snapAngleEpsilon),b/2);!this.diagram.lastInput.shift&&0b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a}; +wg.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){a.delaysLayout=!1;var b=this.computeRotate(a.lastInput.documentPoint);this.rotate(b);a.Ua();this.transactionResult=this.name;a.V("PartRotated",this.adornedObject,this.originalAngle)}this.stopTool()}; +wg.prototype.rotate=function(a){G&&D(a,wg,"rotate:newangle");var b=this.adornedObject;if(null!==b){b.angle=a;b=b.part;b.Xa();var c=b.locationObject,d=b.rotateObject;if(c===d||c.yg(d))c=this.gp.copy(),b.location=c.oe(this.rotationPoint).rotate(a-this.originalAngle).add(this.rotationPoint);this.diagram.md()}}; +wg.prototype.computeRotate=function(a){a=this.rotationPoint.Wa(a)-this.handleAngle;var b=this.adornedObject.panel;null!==b&&(a-=b.Xi());360<=a?a-=360:0>a&&(a+=360);b=Math.min(Math.abs(this.snapAngleMultiple),180);var c=Math.min(Math.abs(this.snapAngleEpsilon),b/2);!this.diagram.lastInput.shift&&0b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a}; oa.Object.defineProperties(wg.prototype,{handleArchetype:{configurable:!0,get:function(){return this.o},set:function(a){null!==a&&x(a,O,wg,"handleArchetype");this.o=a}},handle:{configurable:!0,get:function(){return this.j},set:function(a){if(null!==a&&(x(a,O,wg,"handle"),!(a.part instanceof Je)))throw Error("new handle is not in an Adornment: "+a);this.j=a}},adornedObject:{configurable:!0,get:function(){return this.re},set:function(a){if(null!==a&&(x(a,O, wg,"handle"),a.part instanceof Je))throw Error("new handle must not be in an Adornment: "+a);this.re=a}},snapAngleMultiple:{configurable:!0,get:function(){return this.Ma},set:function(a){A(a,"number",wg,"snapAngleMultiple");this.Ma=a}},snapAngleEpsilon:{configurable:!0,get:function(){return this.La},set:function(a){A(a,"number",wg,"snapAngleEpsilon");this.La=a}},originalAngle:{configurable:!0,get:function(){return this.ux}},rotationPoint:{configurable:!0, enumerable:!0,get:function(){return this.ls},set:function(a){this.ls=a.copy()}},handleAngle:{configurable:!0,get:function(){return this.F},set:function(a){A(a,"number",wg,"handleAngle");this.F=a}},handleDistance:{configurable:!0,get:function(){return this.P},set:function(a){A(a,"number",wg,"handleDistance");this.P=a}}});wg.className="RotatingTool";Ta("rotatingTool",function(){return this.findTool("Rotating")},function(a){this.gb("Rotating",a,this.mouseDownTools)}); @@ -513,7 +513,7 @@ Gg.prototype.doMouseMove=function(){if(this.isActive){var a=this.diagram.lastInp Gg.prototype.doCancel=function(){var a=this.diagram.lastInput,b=this.Qk;null!==b&&(a.targetObject=b,null!==b.actionCancel&&b.actionCancel(a,b),this.stopTool())};Gg.prototype.doStop=function(){this.Qk=null};Gg.className="ActionTool";function Hg(){we.call(this);0a&&Aa(a,">= 1",oh,"duration");this.Rg=a}},isAnimating:{configurable:!0, +oa.Object.defineProperties(oh.prototype,{animationReasons:{configurable:!0,get:function(){return this.Sd}},isEnabled:{configurable:!0,get:function(){return this.Ad},set:function(a){A(a,"boolean",oh,"isEnabled");(this.Ad=a)&&this.mj.each(function(a){a.isAnimating||Infinity!==a.runCount||a.start()})}},duration:{configurable:!0,get:function(){return this.Rg},set:function(a){A(a,"number",oh,"duration");1>a&&Aa(a,">= 1",oh,"duration");this.Rg=a}},isAnimating:{configurable:!0, enumerable:!0,get:function(){return this.nc}},isTicking:{configurable:!0,get:function(){return this.Qr}},isInitial:{configurable:!0,get:function(){return this.ki},set:function(a){A(a,"boolean",oh,"isInitial");this.ki=a}},defaultAnimation:{configurable:!0,get:function(){return this.Vd}},activeAnimations:{configurable:!0,get:function(){return this.mj}},initialAnimationStyle:{configurable:!0,get:function(){return this.ul},set:function(a){G&& cb(a,oh,oh,"initialAnimationStyle");this.ul=a}}});oh.prototype.stopAnimation=oh.prototype.tc;var Yh=null,ph=!1,rh=new F(oh,"Default",1),xh=new F(oh,"AnimateLocations",2),wh=new F(oh,"None",3);oh.className="AnimationManager";oh.defineAnimationEffect=function(a,b){ph||(qh(),ph=!0);Yh.add(a,b)};oh.Default=rh;oh.AnimateLocations=xh;oh.None=wh; -function sh(a){this.gv=this.Gx=this.Rd=this.D=null;this.Bl=this.nc=this.j=!1;this.Vn=this.Fd=0;this.nr=this.Xt=Zh;this.Al=this.wp=!1;this.Ou=1;this.Mu=0;this.yd=this.Rg=NaN;this.Vw=0;this.Wn=null;this.o=yb;this.pc=new xb;this.Eu=new xb;this.lm=new I;this.Fu=new I;this.Sw=$h;a&&Object.assign(this,a)}sh.prototype.suspend=function(){this.Bl=!0};sh.prototype.advanceTo=function(a,b){b&&(this.Bl=!1);this.wp&&a>=this.yd&&(this.Al=!0,a-=this.yd);this.Vw=a;Sh(this,!0);Bh(this.Rd);Ef(this.D);Dh(this.Rd);this.D.redraw()}; -function yh(a,b){a.Eu.clear();a.Al=!1;a.Mu=0;a.yd=NaN;0=this.zd&&(this.Al=!0,a-=this.zd);this.Vw=a;Sh(this,!0);Bh(this.Rd);Ef(this.D);Dh(this.Rd);this.D.redraw()}; +function yh(a,b){a.Eu.clear();a.Al=!1;a.Mu=0;a.zd=NaN;0a.Vn?a.yd:d-a.Fd;b&&(e=a.Vw,ea.Vn&&(a.wp&&!a.Al?(a.Fd=+new Date,a.Vn=a.Fd+a.yd,a.Al=!0):a.um(!1))}}} -function Ch(a,b){for(var c=a.yd,d=a.pc.iterator,e=a.Al;d.next();){var f=d.key;if(!(f instanceof O&&null===f.diagram)){var g=d.value,h=e?g.end:g.start;g=e?g.start:g.end;var k=Yh,l;for(l in g)"position"===l&&(g["position:placeholder"]||g["position:nodeCollapse"])||null===k.get(l)||k.get(l)(f,h[l],g[l],a.nr,b,c,a)}}}t.stop=function(){if(!this.nc)return this;this.um(!0);return this}; +function Sh(a,b){if(!a.Bl||b){var c=a.Rd;if(!1!==a.nc){var d=+new Date,e=d>a.Vn?a.zd:d-a.Gd;b&&(e=a.Vw,ea.Vn&&(a.wp&&!a.Al?(a.Gd=+new Date,a.Vn=a.Gd+a.zd,a.Al=!0):a.um(!1))}}} +function Ch(a,b){for(var c=a.zd,d=a.pc.iterator,e=a.Al;d.next();){var f=d.key;if(!(f instanceof O&&null===f.diagram)){var g=d.value,h=e?g.end:g.start;g=e?g.start:g.end;var k=Yh,l;for(l in g)"position"===l&&(g["position:placeholder"]||g["position:nodeCollapse"])||null===k.get(l)||k.get(l)(f,h[l],g[l],a.nr,b,c,a)}}}t.stop=function(){if(!this.nc)return this;this.um(!0);return this}; t.um=function(a){null!==this.gv&&this.gv.Dp.remove(this.Gx);if(this.nc){var b=this.D,c=this.Rd;this.Bl=this.nc=c.tl=!1;Bh(c);for(var d=this.pc,e=this.lm.iterator;e.next();)b.remove(e.value);for(e=this.Fu.iterator;e.next();)e.value.v();e=this.wp;d=d.iterator;for(var f=Yh;d.next();){var g=d.key,h=d.value,k=e?h.end:h.start,l=e?h.start:h.end,m=h.Cv,n;for(n in l)if(null!==f.get(n)){var p=n;!h.uv||"position:nodeCollapse"!==p&&"position:placeholder"!==p||(p="position");f.get(p)(g,k[n],void 0!==m[n]?m[n]: -h.uv?k[n]:l[n],this.nr,this.yd,this.yd,this)}h.uv&&void 0!==m.location&&g instanceof U&&(g.location=m.location);h.cw&&g instanceof U&&g.Sb(!1)}b.ft.clear();ff(b,!1);b.Va();b.R();Ef(b,!0);if(c.defaultAnimation===this){for(n=c.Vl.iterator;n.next();)e=n.value,null!==e.qf&&(e.points=e.qf,e.qf=null);c.Vl.clear()}this.isViewportUnconstrained&&(b.scrollMode=this.Sw);Dh(c);this.Mu++;!a&&this.Ou>this.Mu?(this.Al=!1,this.start()):(this.Wn&&this.Wn(this),yh(this,null),c.um(this),b.Lb())}}; +h.uv?k[n]:l[n],this.nr,this.zd,this.zd,this)}h.uv&&void 0!==m.location&&g instanceof U&&(g.location=m.location);h.cw&&g instanceof U&&g.Sb(!1)}b.ft.clear();ff(b,!1);b.Ua();b.R();Ef(b,!0);if(c.defaultAnimation===this){for(n=c.Vl.iterator;n.next();)e=n.value,null!==e.qf&&(e.points=e.qf,e.qf=null);c.Vl.clear()}this.isViewportUnconstrained&&(b.scrollMode=this.Sw);Dh(c);this.Mu++;!a&&this.Ou>this.Mu?(this.Al=!1,this.start()):(this.Wn&&this.Wn(this),yh(this,null),c.um(this),b.Lb())}}; t.kk=function(a,b){var c=b.actualBounds,d=null;b instanceof vf&&(d=b.placeholder);null!==d?(c=d.ja(Ec),d=d.padding,c.x+=d.left,c.y+=d.top,this.add(a,"position",c,a.position,!1)):this.add(a,"position",new K(c.x+c.width/2,c.y+c.height/2),a.position,!1);this.add(a,"scale",.01,a.scale,!1);if(a instanceof vf)for(a=a.memberParts;a.next();)d=a.value,d instanceof V&&this.kk(d,b)}; t.ik=function(a,b){if(a.isVisible()){var c=null;b instanceof vf&&(c=b.placeholder);null!==c?this.add(a,"position:placeholder",a.position,c,!0):this.add(a,"position:nodeCollapse",a.position,b,!0);this.add(a,"scale",a.scale,.01,!0);c=this.pc;c.contains(a)&&(c.K(a).cw=!0);if(a instanceof vf)for(a=a.memberParts;a.next();)c=a.value,c instanceof V&&this.ik(c,b)}};t.BA=function(a){var b=this.Eu.get(a);null===b&&(b={},this.Eu.add(a,b));return b}; oa.Object.defineProperties(sh.prototype,{duration:{configurable:!0,get:function(){return this.Rg},set:function(a){A(a,"number",sh,"duration");1>a&&Aa(a,">= 1",sh,"duration");this.Rg=a}},reversible:{configurable:!0,get:function(){return this.wp},set:function(a){this.wp=a}},runCount:{configurable:!0,get:function(){return this.Ou},set:function(a){0a?c/2*a*a+b:-c/2*(--a*(a-2)-1)+b}function ai(a,b,c,d){return a===d?b+c:c*(-Math.pow(2,-10*a/d)+1)+b}sh.className="Animation";sh.EaseLinear=function(a,b,c,d){return c*a/d+b};sh.EaseInOutQuad=Zh;sh.EaseInQuad=function(a,b,c,d){return c*(a/=d)*a+b};sh.EaseOutQuad=function(a,b,c,d){return-c*(a/=d)*(a-2)+b};sh.EaseInExpo=function(a,b,c,d){return 0===a?b:c*Math.pow(2,10*(a/d-1))+b};sh.EaseOutExpo=ai; -function gi(a,b,c){this.start=a;this.end=b;this.Cv={};this.uv=c;this.cw=!1}gi.className="AnimationState";function hi(a,b,c){this.sd=null;this.pf=a;this.Tp=c||ii;this.Vk=null;void 0!==b&&(this.Vk=b,void 0===c&&(this.Tp=ji))}hi.prototype.copy=function(){var a=new hi(this.pf);a.Tp=this.Tp;var b=this.Vk;if(null!==b){var c={};void 0!==b.duration&&(c.duration=b.duration);void 0!==b.finished&&(c.finished=b.finished);void 0!==b.easing&&(c.easing=b.easing);a.Vk=c}return a}; +function gi(a,b,c){this.start=a;this.end=b;this.Cv={};this.uv=c;this.cw=!1}gi.className="AnimationState";function hi(a,b,c){this.td=null;this.pf=a;this.Tp=c||ii;this.Vk=null;void 0!==b&&(this.Vk=b,void 0===c&&(this.Tp=ji))}hi.prototype.copy=function(){var a=new hi(this.pf);a.Tp=this.Tp;var b=this.Vk;if(null!==b){var c={};void 0!==b.duration&&(c.duration=b.duration);void 0!==b.finished&&(c.finished=b.finished);void 0!==b.easing&&(c.easing=b.easing);a.Vk=c}return a}; function ki(a,b){a=a.Vk;null!==a&&(a.duration&&(b.duration=a.duration),a.finished&&(b.finished=a.finished),a.easing&&(b.easing=a.easing))} oa.Object.defineProperties(hi.prototype,{propertyName:{configurable:!0,get:function(){return this.pf},set:function(a){this.pf=a}},animationSettings:{configurable:!0,get:function(){return this.Vk},set:function(a){this.Vk=a}},startCondition:{configurable:!0,get:function(){return this.Tp},set:function(a){G&&cb(a,hi,hi,"startCondition");this.Tp=a}}});var ii=new F(hi,"Default",1),ji=new F(hi,"Immediate",2),li=new F(hi,"Bundled",3);hi.className="AnimationTrigger"; hi.Default=ii;hi.Immediate=ji;hi.Bundled=li;function mi(a){ab(this);this.D=null;this.Ka=new H;this.ta="";this.qb=1;this.o=!1;this.j=this.Bi=this.F=this.wj=this.vj=this.uj=this.tj=this.rj=this.sj=this.qj=this.yj=this.pj=this.xj=this.oj=this.nj=!0;this.hp=[];a&&Object.assign(this,a)}t=mi.prototype;t.clear=function(){this.Ka.clear();this.hp.length=0};t.Xe=function(a){this.D=a}; @@ -611,9 +611,9 @@ t.Hf=function(a,b,c,d,e){void 0===b&&(b=null);void 0===c&&(c=null);void 0===d&&( t.Hv=function(a,b,c,d,e,f,g){if(!1===this.Bi)return e;for(var h=this.Ka.m,k=h.length;k--;){var l=h[k];if((!0!==g||!1!==qg(l))&&f(l)&&l.isVisible()){var m=l;l.Hf(a,b,c,d,e)&&(null!==b&&(m=b(m)),null===m||null!==c&&!c(m)||e.add(m))}}return e}; t.wg=function(a,b,c,d,e,f){void 0===c&&(c=null);void 0===d&&(d=null);void 0===e&&(e=!0);if(!1!==e&&!0!==e){if(e instanceof H||e instanceof I)f=e;e=!0}f instanceof H||f instanceof I||(f=new I);if(!1===this.Bi)return f;G&&!a.s()&&v("findObjectsNear: Point must have a real value, not: "+a.toString());var g=!1;null!==this.diagram&&this.diagram.viewportBounds.ca(a)&&(g=!0);for(var h=K.alloc(),k=K.alloc(),l=this.Ka.m,m=l.length;m--;){var n=l[m];if((!0!==g||!1!==qg(n))&&n.isVisible()){h.assign(a);Lb(h,n.le); k.h(a.x+b,a.y);Lb(k,n.le);var p=n;n.wg(h,k,c,d,e,f)&&(null!==c&&(p=c(p)),null===p||null!==d&&!d(p)||f.add(p))}}K.free(h);K.free(k);return f}; -t.Pd=function(a,b){if(this.visible){var c=this.Ka.m,d=c.length;if(0!==d){a=Ma();for(var e=Ma(),f=0;fc.Wr||h.height*e>c.Wr?b.rc(a,c):(e=b.actualBounds,f=b.naturalBounds,0===e.width||0===e.height||isNaN(e.x)|| +t.Qi=function(a,b,c,d,e,f,g){if(!g||qg(b)){if(null!==d&&b instanceof R&&(b.isOrthogonal&&d.push(b),!1===b.yd))return;g=!1;for(d=b.containingGroup;null!==d;)g?null!==d.hb&&f.yy(d.hb):null!==d.hb&&(g=!0,f.assign(d.hb)),d=d.containingGroup;var h=b.actualBounds;d=!1;if(g&&b.isVisible()){if(!f.Pc(h))return;d=!f.Qe(h)}d&&(a.save(),a.beginPath(),a.rect(f.x,f.y,f.width,f.height),a.clip());h.width*e>c.Wr||h.height*e>c.Wr?b.rc(a,c):(e=b.actualBounds,f=b.naturalBounds,0===e.width||0===e.height||isNaN(e.x)|| isNaN(e.y)||!b.isVisible()||(c=b.transform,null!==b.areaBackground&&(pi(b,a,b.areaBackground,!0,!0,f,e),a.fillRect(e.x,e.y,e.width,e.height)),null===b.areaBackground&&null===b.background&&(pi(b,a,"rgba(0,0,0,0.3)",!0,!1,f,e),a.fillRect(e.x,e.y,e.width,e.height)),null!==b.background&&(a.transform(c.m11,c.m12,c.m21,c.m22,c.dx,c.dy),pi(b,a,b.background,!0,!1,f,e),a.fillRect(0,0,f.width/2,f.height/2),c.bt()||(b=1/(c.m11*c.m22-c.m12*c.m21),a.transform(c.m22*b,-c.m12*b,-c.m21*b,c.m11*b,b*(c.m21*c.dy-c.m22* c.dx),b*(c.m12*c.dx-c.m11*c.dy))))));d&&(a.restore(),a.Kc(!0))}};t.g=function(a,b,c,d,e){var f=this.diagram;null!==f&&f.ab(pe,a,this,b,c,d,e)};t.$i=function(a,b,c){var d=this.Ka;b.ri=this;if(a>=d.count)a=d.count;else if(d.M(a)===b)return-1;d.zb(a,b);b.Bq(c);d=this.diagram;null!==d&&(c?d.R():d.$i(b));qi(this,a,b);return a}; t.hc=function(a,b,c){if(!c&&b.layer!==this&&null!==b.layer)return b.layer.hc(a,b,c);var d=this.Ka;if(0>a||a>=d.length){if(a=d.indexOf(b),0>a)return-1}else if(d.M(a)!==b&&(a=d.indexOf(b),0>a))return-1;b.Cq(c);d.kb(a);d=this.diagram;null!==d&&(c?d.R():d.hc(b));b.ri=null;return a}; @@ -623,7 +623,7 @@ e&&(k=a.M(h).zOrder,isNaN(k)););}return b} oa.Object.defineProperties(mi.prototype,{parts:{configurable:!0,get:function(){return this.Ka.iterator}},partsBackwards:{configurable:!0,get:function(){return this.Ka.iteratorBackwards}},diagram:{configurable:!0,get:function(){return this.D}},name:{configurable:!0,get:function(){return this.ta},set:function(a){A(a,"string",mi,"name");var b=this.ta;if(b!==a){var c=this.diagram;if(null!==c)for(""===b&&v("Cannot rename default Layer to: "+a),c= c.layers;c.next();)c.value.name===a&&v("Layer.name is already present in this diagram: "+a);this.ta=a;this.g("name",b,a);for(a=this.Ka.iterator;a.next();)a.value.layerName=this.ta}}},opacity:{configurable:!0,get:function(){return this.qb},set:function(a){var b=this.qb;b!==a&&(A(a,"number",mi,"opacity"),(0>a||1q&&(this.position=w.h(-(b.scrollWidth-this.Ba)+y-this.Ba/e+m,this.position.y))),a.pz&&this.allowVerticalScroll&&(hu&&(this.position= w.h(this.position.x,-(b.scrollHeight-this.Aa)+a.scrollTop-this.Aa/e+f))),K.free(w),dj(this),this.Jj=this.os=!1,d=this.documentBounds,e=this.viewportBounds,m=d.right,q=e.right,f=d.bottom,u=e.bottom,g=d.x,n=e.x,h=d.y,d=e.y,p>=k&&g>=n&&m<=q&&(c.style.width="1px"),r>=l&&h>=d&&f<=u&&(c.style.height="1px"))}};Q.prototype.computeBounds=function(a){void 0===a&&(a=new M);uh(this);return ej(this,a)}; -function ej(a,b){if(a.fixedBounds.s())return b.assign(a.fixedBounds),b.jq(a.rb),b;for(var c=!0,d=a.Ta.m,e=d.length,f=0;fc&&(b=c),ba.maxScale&&(b=a.maxScale),b):b===lj?(b=k>h?(g-a.xb)/d:(f-a.xb)/e,b>c&&(b=c),ba.maxScale&&(b=a.maxScale),b):a.scale} @@ -682,62 +682,62 @@ Q.prototype.OA=function(a){var b=this.D;if(!b.isEnabled)return!1;var c=pj(b,a,!1 Q.prototype.Xz=function(a){var b=this.D;if(!b.isEnabled)return!1;var c=pj(b,a,!0);null!==b.mouseEnter&&b.mouseEnter(c);return tj(b,c,a)};Q.prototype.Yz=function(a){var b=this.D;if(!b.isEnabled)return!1;var c=pj(b,a,!0);null!==b.mouseLeave&&b.mouseLeave(c);return tj(b,c,a)}; Q.prototype.getMouse=function(a){var b=this.Ga;if(null===b)return new K(0,0);var c=b.getBoundingClientRect();b=a.clientX-this.Ba/c.width*c.left;a=a.clientY-this.Aa/c.height*c.top;return null!==this.yb?Lb(new K(b,a),this.yb):new K(b,a)}; function qj(a,b,c){var d=a.Ga,e=a.Ba,f=a.Aa,g=0,h=0;null!==d&&(d=d.getBoundingClientRect(),g=b.clientX-e/d.width*d.left,h=b.clientY-f/d.height*d.top);c.viewPoint.h(g,h);null!==a.yb?(b=K.allocAt(g,h),a.yb.Ld(b),c.documentPoint.assign(b),K.free(b)):c.documentPoint.h(g,h)} -function me(a,b,c,d){if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;b=b.targetTouches[c]}else if(null!==a.Rl[0])b=a.Rl[c];else return;c=a.Ga;null!==c&&(c=c.getBoundingClientRect(),d.h(b.clientX-a.Ba/c.width*c.left,b.clientY-a.Aa/c.height*c.top))}Q.prototype.Va=function(){this.Ij||(this.Ij=!0,this.Lb(!0))};function uj(a){a.ad||uh(a);a.Xa()}Q.prototype.redraw=function(){this.tb||this.ad||(this.R(),ij(this),this.ld())};t=Q.prototype;t.MA=function(){return this.qg}; -t.Sz=function(a){void 0===a&&(a=null);var b=this.animationManager,c=b.isEnabled;b.tc();b.isEnabled=!1;Ef(this);this.bg=!1;this.Pu=new K(NaN,NaN);b.isEnabled=c;this.ad=!0;var d=this;null!==a&&va(function(){d.ad=!1;th(b,"Model");a(d)},1)};t.Lb=function(a){void 0===a&&(a=!1);if(!0!==this.qg&&!(this.tb||!1===a&&this.ad)){this.qg=!0;var b=this;sa.requestAnimationFrame(function(){b.qg&&b.ld()})}};t.ld=function(){if(!this.Xn||this.qg)this.Xn&&(this.Xn=!1),Ef(this)}; +function me(a,b,c,d){if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;b=b.targetTouches[c]}else if(null!==a.Rl[0])b=a.Rl[c];else return;c=a.Ga;null!==c&&(c=c.getBoundingClientRect(),d.h(b.clientX-a.Ba/c.width*c.left,b.clientY-a.Aa/c.height*c.top))}Q.prototype.Ua=function(){this.Ij||(this.Ij=!0,this.Lb(!0))};function uj(a){a.bd||uh(a);a.Xa()}Q.prototype.redraw=function(){this.tb||this.bd||(this.R(),ij(this),this.md())};t=Q.prototype;t.MA=function(){return this.qg}; +t.Sz=function(a){void 0===a&&(a=null);var b=this.animationManager,c=b.isEnabled;b.tc();b.isEnabled=!1;Ef(this);this.bg=!1;this.Pu=new K(NaN,NaN);b.isEnabled=c;this.bd=!0;var d=this;null!==a&&va(function(){d.bd=!1;th(b,"Model");a(d)},1)};t.Lb=function(a){void 0===a&&(a=!1);if(!0!==this.qg&&!(this.tb||!1===a&&this.bd)){this.qg=!0;var b=this;sa.requestAnimationFrame(function(){b.qg&&b.md()})}};t.md=function(){if(!this.Xn||this.qg)this.Xn&&(this.Xn=!1),Ef(this)}; function jj(a,b,c){a.animationManager.defaultAnimation.isAnimating||a.tb||!a.Jj||bj(a)||(b&&uh(a),c&&fj(a,!1))} -function Ef(a,b){if(!a.ad&&(a.qg=!1,null!==a.Ja||a.cq.s())){a.ad=!0;var c=a.animationManager,d=a.mp;if(!c.isAnimating&&0!==d.length){for(var e=d.m,f=e.length,g=0;gb;b++){var c=a.Ae.iterator;if(null===c||0===a.Ae.count)break;a.Ae=new I;a.yw(c,a.Ae);G&&22===b&&Fa("failure to validate parts")}a.nodes.each(function(a){a instanceof vf&&0!==(a.U&65536)!==!1&&(a.U=a.U^65536)})}} -t.yw=function(a,b){for(a.reset();a.next();){var c=a.value;!c.Pc()||c instanceof vf||(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}for(a.reset();a.next();)c=a.value,c instanceof vf&&c.isVisible()&&zj(this,c);for(a.reset();a.next();)c=a.value,c instanceof R&&c.isVisible()&&(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c));for(a.reset();a.next();)c=a.value,c instanceof Je&&c.isVisible()&&(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}; +b||a.rc(a.Xb);e&&(a.skipsUndoManager=d);a.bd=!1}}function yj(a){var b=a.ya;if(a.Xg!==zh)a.scale=gj(a,a.Xg);else if(a.Zh!==zh)a.scale=gj(a,a.Zh);else{var c=a.initialScale;isFinite(c)&&0b;b++){var c=a.Ae.iterator;if(null===c||0===a.Ae.count)break;a.Ae=new I;a.yw(c,a.Ae);G&&22===b&&Fa("failure to validate parts")}a.nodes.each(function(a){a instanceof vf&&0!==(a.U&65536)!==!1&&(a.U=a.U^65536)})}} +t.yw=function(a,b){for(a.reset();a.next();){var c=a.value;!c.Qc()||c instanceof vf||(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}for(a.reset();a.next();)c=a.value,c instanceof vf&&c.isVisible()&&zj(this,c);for(a.reset();a.next();)c=a.value,c instanceof R&&c.isVisible()&&(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c));for(a.reset();a.next();)c=a.value,c instanceof Je&&c.isVisible()&&(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}; function zj(a,b){for(var c=Ma(),d=Ma(),e=b.memberParts;e.next();){var f=e.value;f.isVisible()&&(f instanceof vf?(Aj(f)||Bj(f)||Cj(f))&&zj(a,f):f instanceof R?f.fromNode===b||f.toNode===b?d.push(f):c.push(f):(f.measure(Infinity,Infinity),f.arrange()))}a=c.length;for(e=0;en&&(z=S.left,B= S.right),y.height>J&&(C=S.top,E=S.bottom)):(z=S.left,B=S.right,C=S.top,E=S.bottom);S=y.width+z+B;var aa=y.height+C+E;z=y.x-z;var Y=e.x;B=y.right+B;var T=e.right+r;C=y.y-C;var P=e.y;y=y.bottom+E;E=e.bottom+q;var ma="1px",ia="1px";e=a.scale;u=S>u/e;w=aa>w/e;a.scrollMode===$h&&(u||w)&&(u&&a.hasHorizontalScrollbar&&a.allowHorizontalScroll&&(u=1,z+1T+1&&(u=Math.max((B-T)*e+a.Ba,u)),n+r+1E+1&&(u=Math.max((y-E)*e+a.Aa,u)),J+q+1T+1&&(r=Math.max((B-T)*e+a.Ba,r)),n+1E+1&&(q=Math.max((y-E)*e+r,q)),J+1E+1&&(q=Math.max((y-E)*e+r,q)),J+1T+1&&(b=a.position.x*e));if(a.uo)switch(a.Nu){case "negative":b=-(l.scrollWidth-b-l.clientWidth);break;case "reverse":b=l.scrollWidth-b-l.clientWidth}l.scrollLeft=b;a.hasVerticalScrollbar&&a.allowVerticalScroll&&(J+1E+1&&(l.scrollTop=a.position.y*e));u=a.Ba;w=a.Aa;l.style.width=u+(a.$f?a.xb:0)+"px";l.style.height=w+(a.ff?a.xb:0)+"px";return c!==u||d!==w||a.animationManager.wb?(c=M.allocAt(f,g,h,k),a.onViewportBoundsChanged(c,a.viewportBounds,e,p),M.free(c),!1):!0}t=Q.prototype; -t.add=function(a){x(a,U,Q,"add:part");var b=a.diagram;if(b!==this&&(null!==b&&v("Cannot add part "+a.toString()+" to "+this.toString()+". It is already a part of "+b.toString()),b=this.wk(a.layerName),null===b&&(b=this.wk("")),null===b&&v('Cannot add a Part when unable find a Layer named "'+a.layerName+'" and there is no default Layer'),a.layer!==b)){var c=b.$i(99999999,a,a.diagram===this);0<=c&&this.ab(re,"parts",b,null,a,null,c);b.isTemporary||this.Va();a.C(1);c=a.layerChanged;null!==c&&c(a,null, -b)}};t.$i=function(a){this.partManager.$i(a);var b=this;Nj(a,function(a){Oj(b,a)});(a instanceof Je||a instanceof vf&&null!==a.placeholder)&&a.v();null!==a.data&&Nj(a,function(a){Pj(b.partManager,a)});!0!==Bj(a)&&!0!==Cj(a)||this.Ae.add(a);Qj(a,!0,this);Rj(a)?(a.actualBounds.s()&&this.R(Lj(a,a.actualBounds)),this.Va()):a.isVisible()&&a.actualBounds.s()&&this.R(Lj(a,a.actualBounds));this.Lb()}; -t.hc=function(a){a.mk();this.partManager.hc(a);var b=this;null!==a.data&&Nj(a,function(a){Sj(b.partManager,a,b)});this.Ae.remove(a);Rj(a)?(a.actualBounds.s()&&this.R(Lj(a,a.actualBounds)),this.Va()):a.isVisible()&&a.actualBounds.s()&&this.R(Lj(a,a.actualBounds));this.Lb()};t.remove=function(a){x(a,U,Q,"remove:part");Tj(this,a,!0)}; +t.add=function(a){x(a,U,Q,"add:part");var b=a.diagram;if(b!==this&&(null!==b&&v("Cannot add part "+a.toString()+" to "+this.toString()+". It is already a part of "+b.toString()),b=this.wk(a.layerName),null===b&&(b=this.wk("")),null===b&&v('Cannot add a Part when unable find a Layer named "'+a.layerName+'" and there is no default Layer'),a.layer!==b)){var c=b.$i(99999999,a,a.diagram===this);0<=c&&this.ab(re,"parts",b,null,a,null,c);b.isTemporary||this.Ua();a.C(1);c=a.layerChanged;null!==c&&c(a,null, +b)}};t.$i=function(a){this.partManager.$i(a);var b=this;Nj(a,function(a){Oj(b,a)});(a instanceof Je||a instanceof vf&&null!==a.placeholder)&&a.v();null!==a.data&&Nj(a,function(a){Pj(b.partManager,a)});!0!==Bj(a)&&!0!==Cj(a)||this.Ae.add(a);Qj(a,!0,this);Rj(a)?(a.actualBounds.s()&&this.R(Lj(a,a.actualBounds)),this.Ua()):a.isVisible()&&a.actualBounds.s()&&this.R(Lj(a,a.actualBounds));this.Lb()}; +t.hc=function(a){a.mk();this.partManager.hc(a);var b=this;null!==a.data&&Nj(a,function(a){Sj(b.partManager,a,b)});this.Ae.remove(a);Rj(a)?(a.actualBounds.s()&&this.R(Lj(a,a.actualBounds)),this.Ua()):a.isVisible()&&a.actualBounds.s()&&this.R(Lj(a,a.actualBounds));this.Lb()};t.remove=function(a){x(a,U,Q,"remove:part");Tj(this,a,!0)}; function Tj(a,b,c){var d=b.layer;null!==d&&d.diagram===a&&(b.isSelected=!1,b.isHighlighted=!1,b.C(2),c&&b.tk(),c=d.hc(-1,b,!1),0<=c&&a.ab(se,"parts",d,b,null,c,null),a=b.layerChanged,null!==a&&a(b,d,null))}t.ot=function(a,b){void 0===b&&(b=!1);if(Ha(a))for(var c=a.length,d=0;dd&&this.Va();return this}; -t.wz=function(a,b){Zj(this,a,b);a.Xe(this);var c=this.Ta,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Yb&&this.ab(se,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Va();return this}; -t.fB=function(a){x(a,mi,Q,"removeLayer:layer");a.diagram!==this&&v("Cannot remove a Layer from another Diagram: "+a+" of "+a.diagram);if(""!==a.name){var b=this.Ta,c=b.indexOf(a);if(b.remove(a)){for(b=a.Ka.copy().iterator;b.next();){var d=b.value,e=d.layerName;e!==a.name?d.layerName=e:d.layerName=""}null!==this.Yb&&this.ab(se,"layers",this,a,null,c,null);this.R();this.Va()}}};t.wk=function(a){for(var b=this.layers;b.next();){var c=b.value;if(c.name===a)return c}return null}; +b+"'; a Layer with the same name is already present in this Diagram.")}}t.om=function(a){Zj(this,a,null);a.Xe(this);var b=this.Ta,c=b.count-1;if(!a.isTemporary)for(;0<=c&&b.M(c).isTemporary;)c--;b.zb(c+1,a);null!==this.Yb&&this.ab(re,"layers",this,null,a,null,c+1);this.R();this.Ua();return this}; +t.Ox=function(a,b){Zj(this,a,b);a.Xe(this);var c=this.Ta,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Yb&&this.ab(se,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Ua();return this}; +t.wz=function(a,b){Zj(this,a,b);a.Xe(this);var c=this.Ta,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Yb&&this.ab(se,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Ua();return this}; +t.fB=function(a){x(a,mi,Q,"removeLayer:layer");a.diagram!==this&&v("Cannot remove a Layer from another Diagram: "+a+" of "+a.diagram);if(""!==a.name){var b=this.Ta,c=b.indexOf(a);if(b.remove(a)){for(b=a.Ka.copy().iterator;b.next();){var d=b.value,e=d.layerName;e!==a.name?d.layerName=e:d.layerName=""}null!==this.Yb&&this.ab(se,"layers",this,a,null,c,null);this.R();this.Ua()}}};t.wk=function(a){for(var b=this.layers;b.next();){var c=b.value;if(c.name===a)return c}return null}; t.Qx=function(a){A(a,"function",Q,"addModelChangedListener:listener");null===this.mf&&(this.mf=new H);this.mf.add(a);this.model.Fh(a);return this};t.hB=function(a){A(a,"function",Q,"removeModelChangedListener:listener");null!==this.mf&&(this.mf.remove(a),0===this.mf.count&&(this.mf=null));this.model.Nk(a)};t.Fh=function(a){A(a,"function",Q,"addChangedListener:listener");null===this.Gg&&(this.Gg=new H);this.Gg.add(a);return this}; t.Nk=function(a){A(a,"function",Q,"removeChangedListener:listener");null!==this.Gg&&(this.Gg.remove(a),0===this.Gg.count&&(this.Gg=null))};t.Js=function(a){this.skipsUndoManager||this.model.skipsUndoManager||this.model.undoManager.Nv(a);a.change!==qe&&(this.isModified=!0);if(null!==this.Gg)for(var b=this.Gg,c=b.length,d=0;dn.Ka.indexOf(r)&&n.$i(p,r,q):(r.isSelected=!1,r.isHighlighted=!1,r.Qb(),n.hc(q?p:-1,r,q)))}else n instanceof Q?"number"===typeof p&&r instanceof mi&&(b?(r.Xe(this),this.Ta.zb(p,r)):this.Ta.kb(p)):v("unknown ChangedEvent.Remove object: "+a.toString());this.isModified=!0}else d!==qe&&v("unknown ChangedEvent: "+a.toString())}finally{this.skipsModelSourceBindings= c}}};Q.prototype.Da=function(a){return this.undoManager.Da(a)};Q.prototype.cb=function(a){return this.undoManager.cb(a)};Q.prototype.Pf=function(){return this.undoManager.Pf()};Q.prototype.commit=function(a,b){void 0===b&&(b="");var c=this.skipsUndoManager;null===b&&(this.skipsUndoManager=!0,b="");this.undoManager.Da(b);var d=!1;try{a(this),d=!0}finally{d?this.undoManager.cb(b):this.undoManager.Pf(),this.skipsUndoManager=c}};Q.prototype.updateAllTargetBindings=function(a){this.partManager.updateAllTargetBindings(a)}; Q.prototype.Yq=function(){this.partManager.Yq()}; -function ek(a,b,c){var d=a.animationManager;if(a.tb||a.ad)a.ya=c,Li(a),a=a.ya,d.wb&&(Eh(d)||d.Vd.add(d.D,"scale",b,a));else if(null===a.Ga)a.ya=c,Li(a);else{a.tb=!0;var e=a.viewportBounds.copy(),f=a.Ba,g=a.Aa;e.width=a.Ba/b;e.height=a.Aa/b;var h=a.zoomPoint.x,k=a.zoomPoint.y,l=a.contentAlignment;isNaN(h)&&(l.Qc()?l.Lf(Rc)?h=0:l.Lf(Sc)&&(h=f-1):h=l.fb()?l.x*(f-1):f/2);isNaN(k)&&(l.Qc()?l.Lf(Qc)?k=0:l.Lf(Tc)&&(k=g-1):k=l.fb()?l.y*(g-1):g/2);null===a.scaleComputation||a.animationManager.defaultAnimation.isAnimating|| +function ek(a,b,c){var d=a.animationManager;if(a.tb||a.bd)a.ya=c,Li(a),a=a.ya,d.wb&&(Eh(d)||d.Vd.add(d.D,"scale",b,a));else if(null===a.Ga)a.ya=c,Li(a);else{a.tb=!0;var e=a.viewportBounds.copy(),f=a.Ba,g=a.Aa;e.width=a.Ba/b;e.height=a.Aa/b;var h=a.zoomPoint.x,k=a.zoomPoint.y,l=a.contentAlignment;isNaN(h)&&(l.Rc()?l.Lf(Rc)?h=0:l.Lf(Sc)&&(h=f-1):h=l.fb()?l.x*(f-1):f/2);isNaN(k)&&(l.Rc()?l.Lf(Qc)?k=0:l.Lf(Tc)&&(k=g-1):k=l.fb()?l.y*(g-1):g/2);null===a.scaleComputation||a.animationManager.defaultAnimation.isAnimating|| (c=a.scaleComputation(a,c));ca.maxScale&&(c=a.maxScale);f=K.allocAt(a.qa.x+h/b-h/c,a.qa.y+k/b-k/c);a.position=f;K.free(f);a.ya=c;Li(a);a.onViewportBoundsChanged(e,a.viewportBounds,b,!1);a.tb=!1;fj(a,!1);c=a.ya;d.wb&&(Eh(d)||d.Vd.add(d.D,"scale",b,c));a.R();ij(a)}} -Q.prototype.onViewportBoundsChanged=function(a,b,c,d){if(!a.B(b)){void 0===d&&(d=!1);d||ij(this);dj(this);var e=this.layout;null===e||!e.isViewportSized||this.autoScale!==zh||d||a.width===b.width&&a.height===b.height||e.C();e=this.currentTool;!0===this.zl&&e instanceof Ua&&(this.lastInput.documentPoint=this.xt(this.lastInput.viewPoint),Ne(e,this));this.tb||this.invalidateViewport(a,b);wj(this);this.hd.scale=c;this.hd.position.x=a.x;this.hd.position.y=a.y;this.hd.bounds.assign(a);this.hd.Ux.width= -Math.round(a.width*c);this.hd.Ux.height=Math.round(a.height*c);this.hd.Hy.width=this.Ba;this.hd.Hy.height=this.Aa;this.hd.By=d;this.V("ViewportBoundsChanged",this.hd,a);this.isVirtualized&&this.links.each(function(a){a.isAvoiding&&a.actualBounds.Oc(b)&&a.Za()})}}; +Q.prototype.onViewportBoundsChanged=function(a,b,c,d){if(!a.B(b)){void 0===d&&(d=!1);d||ij(this);dj(this);var e=this.layout;null===e||!e.isViewportSized||this.autoScale!==zh||d||a.width===b.width&&a.height===b.height||e.C();e=this.currentTool;!0===this.zl&&e instanceof Ua&&(this.lastInput.documentPoint=this.xt(this.lastInput.viewPoint),Ne(e,this));this.tb||this.invalidateViewport(a,b);wj(this);this.jd.scale=c;this.jd.position.x=a.x;this.jd.position.y=a.y;this.jd.bounds.assign(a);this.jd.Ux.width= +Math.round(a.width*c);this.jd.Ux.height=Math.round(a.height*c);this.jd.Hy.width=this.Ba;this.jd.Hy.height=this.Aa;this.jd.By=d;this.V("ViewportBoundsChanged",this.jd,a);this.isVirtualized&&this.links.each(function(a){a.isAvoiding&&a.actualBounds.Pc(b)&&a.Za()})}}; function wj(a,b){var c=a.ae;if(null!==c&&c.visible){for(var d=Hb.alloc(),e=1,f=1,g=c.W.m,h=g.length,k=0;km||(fk(l.figure)?f=f*m/L.ny(f,m):e=e*m/L.ny(e,m))}g=c.gridCellSize;d.h(f*g.width,e*g.height);if(void 0!==b)e=b.width,f=b.height,a=b.x,g=b.y;else{b=M.alloc();a=a.viewportBounds;b.h(a.x,a.y,a.width,a.height);if(!b.s()){M.free(b);return}e=b.width;f=b.height;a=b.x;g=b.y;M.free(b)}c.width=e+2*d.width;c.height=f+2*d.height;b=K.alloc();L.vq(a,g,0,0,d.width, d.height,b);b.offset(-d.width,-d.height);Hb.free(d);c.part.location=b;K.free(b)}}Q.prototype.clearSelection=function(a){void 0===a&&(a=!1);var b=this.selection;if(0!==b.count){a||this.V("ChangingSelection",b);for(var c=b.Ea(),d=c.length,e=0;e=d&&!f.defaultAnimation.isAnimating&&!f.wb&&(b||th(f,"Layout"));a.Yh=!1;for(var g=a.Ji.iterator;g.next();)ok(a,g.value,b,d);e.isValidLayout||(!b||e.isRealtime||null===e.isRealtime||0===d?(e.doLayout(a),uh(a),e.isValidLayout=!0):a.Yh=!0)}finally{b=a.undoManager.isInternalTransaction,0===d&&(a.cb("Layout"),a.undoManager.isInternalTransaction= !1),!b||0!==d&&1!==d||vh(f),a.ba=c}}}function ok(a,b,c,d){if(null!==b){for(var e=b.Ml.iterator;e.next();)ok(a,e.value,c,d);e=b.layout;null===e||e.isValidLayout||(!c||e.isRealtime||0===d?(b.Qh=!b.location.s(),e.doLayout(b),b.C(32),zj(a,b),e.isValidLayout=!0):a.Yh=!0)}}t.vA=function(){for(var a=new H,b=this.nodes;b.next();){var c=b.value;c.isTopLevel&&null===c.Vi()&&a.add(c)}return a.iterator}; @@ -777,11 +777,11 @@ b("LostFocus");b("Modified");b("ObjectSingleClicked");b("ObjectDoubleClicked");b function Ij(a,b){var c=a.Ww.K(b);return null!==c?c:a.Ww.K(b.toLowerCase())}function pk(a,b){var c=a.Xw.K(b);if(null!==c)return c;c=a.Xw.K(b.toLowerCase());if(null!==c)return c;v("Unknown DiagramEvent name: "+b)}t.jk=function(a,b){A(a,"string",Q,"addDiagramListener:name");A(b,"function",Q,"addDiagramListener:listener");a=pk(this,a);null!==a&&a.add(b);return this};t.Im=function(a,b){A(a,"string",Q,"removeDiagramListener:name");A(b,"function",Q,"addDiagramListener:listener");a=pk(this,a);null!==a&&a.remove(b)}; t.V=function(a,b,c){G&&A(a,"string",Q,"raiseDiagramEvent:name");var d=pk(this,a),e=new ne;e.diagram=this;a=Ij(this,a);null!==a&&(e.name=a);void 0!==b&&(e.subject=b);void 0!==c&&(e.parameter=c);b=d.length;if(1===b)d.M(0)(e);else if(0!==b)for(d=d.Ea(),c=0;c=c.top&&0>=c.left&&0>=c.right&&0>=c.bottom)return b;var d=this.viewportBounds,e=this.scale;d=M.allocAt(0,0,d.width*e,d.height*e);var f=K.allocAt(0,0);if(a.x>=d.x&&a.xd.x+d.width-c.right&&this.allowHorizontalScroll&&(g=Math.max(this.scrollHorizontalLineChange, 1),g|=0,f.x+=g,a.x>d.x+d.width-c.right/2&&(f.x+=g),a.x>d.x+d.width-c.right/4&&(f.x+=4*g));a.y>=d.y&&a.yd.y+d.height-c.bottom&&this.allowVerticalScroll&&(g=Math.max(this.scrollVerticalLineChange,1),g|=0,f.y+=g,a.y>d.y+d.height-c.bottom/2&&(f.y+=g),a.y>d.y+d.height-c.bottom/4&&(f.y+=4*g));f.Ya(yb)||(b=new K(b.x+f.x/e,b.y+f.y/e)); M.free(d);K.free(f);return b};t=Q.prototype;t.ht=function(){return null};t.Uv=function(){return null};t.Az=function(a,b){this.mz.add(a,b)};t.rv=function(a){(this.Ix=a)||this.nodes.each(function(a){a instanceof vf&&(a.Ar=null)})}; @@ -789,10 +789,10 @@ function Kk(a,b,c){function d(){var a=+new Date;f=!0;for(g.reset();g.next();)if( t.Ey=function(a){void 0===a&&(a={});return Kk(this,this.TA,a)}; t.TA=function(a,b,c){var d=Lk(c,a,"canvas",null);if(null===d)return null;c=d.aa.canvas;var e=null;if(null!==c)switch(e=a.returnType,void 0===e?e="string":e=e.toLowerCase(),e){case Mk+"data":e=d.getImageData(0,0,c.width,c.height);break;case Mk:d=(a.document||document).createElement("img");d.src=c.toDataURL(a.type,a.details);e=d;break;case "blob":"function"!==typeof b&&v('Error: Diagram.makeImageData called with "returnType: toBlob", but no required "callback" function property defined.');if("function"=== typeof c.toBlob)return c.toBlob(b,a.type,a.details),"toBlob";if("function"===typeof c.msToBlob)return b(c.msToBlob()),"msToBlob";b(null);return null;default:e=c.toDataURL(a.type,a.details)}return"function"===typeof b?(b(e),null):e}; -function Lk(a,b,c,d){a.animationManager.tc();a.ld();if(null===a.Ga)return null;"object"!==typeof b&&v("properties argument must be an Object.");var e=!1,f=b.size||null,g=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(g="NaN");var h=b.maxSize;void 0===b.maxSize&&(e=!0,h="SVG"===c?new Hb(Infinity,Infinity):new Hb(2E3,2E3));var k=b.position||null,l=b.parts||null,m=void 0===b.padding?1:b.padding,n=b.background||null,p=b.omitTemporary;void 0===p&&(p=!0);var r=b.document||document,q=b.elementFinished|| +function Lk(a,b,c,d){a.animationManager.tc();a.md();if(null===a.Ga)return null;"object"!==typeof b&&v("properties argument must be an Object.");var e=!1,f=b.size||null,g=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(g="NaN");var h=b.maxSize;void 0===b.maxSize&&(e=!0,h="SVG"===c?new Hb(Infinity,Infinity):new Hb(2E3,2E3));var k=b.position||null,l=b.parts||null,m=void 0===b.padding?1:b.padding,n=b.background||null,p=b.omitTemporary;void 0===p&&(p=!0);var r=b.document||document,q=b.elementFinished|| null,u=b.showTemporary;void 0===u&&(u=!p);b=b.showGrid;void 0===b&&(b=u);null!==f&&isNaN(f.width)&&isNaN(f.height)&&(f=null);"number"===typeof m?m=new ic(m):m instanceof ic||v("MakeImage padding must be a Margin or a number.");m.left=Math.max(m.left,0);m.right=Math.max(m.right,0);m.top=Math.max(m.top,0);m.bottom=Math.max(m.bottom,0);a.Xb.Kc(!0);p=new Nk(null,r);var w=p.context;if(!(f||g||l||k)){p.width=a.Ba+Math.ceil(m.left+m.right);p.height=a.Aa+Math.ceil(m.top+m.bottom);if("SVG"===c){if(null=== -d)return null;d.resize(p.width,p.height,p.width,p.height);d.ownerDocument=r;d.sq=q;Gj(a,d.context,m,new Hb(p.width,p.height),a.ya,a.qa,l,n,u,b);return d.context}a.On=!1;Gj(a,w,m,new Hb(p.width,p.height),a.ya,a.qa,l,n,u,b);a.On=!0;return p.context}var y=a.sr,z=a.documentBounds.copy();z.qw(a.rb);if(u)for(var B=a.Ta.m,C=B.length,E=0;Ey?(g=y,f=z.width,z=z.height):(f=h.width,z=h.height)):(f=z.width*g,z=z.height*g):(g=y,f=z.width,z=z.height);null!==m?(f+=k,z+=C):m=new ic(0);null!==h&&(y=h.width,h=h.height,"SVG"!==c&&e&&!Ok&&G&&(f>y|| z>h)&&(Fa("Diagram.makeImage(data): Diagram width or height is larger than the default max size. ("+Math.ceil(f)+"x"+Math.ceil(z)+" vs 2000x2000) Consider increasing the max size."),Ok=!0),isNaN(y)&&(y=2E3),isNaN(h)&&(h=2E3),isFinite(y)&&(f=Math.min(f,y)),isFinite(h)&&(z=Math.min(z,h)));p.width=Math.ceil(f);p.height=Math.ceil(z);if("SVG"===c){if(null===d)return null;d.resize(p.width,p.height,p.width,p.height);d.ownerDocument=r;d.sq=q;Gj(a,d.context,m,new Hb(Math.ceil(f),Math.ceil(z)),g,B,l,n,u,b); return d.context}a.On=!1;Gj(a,w,m,new Hb(Math.ceil(f),Math.ceil(z)),g,B,l,n,u,b);a.On=!0;return p.context} @@ -801,7 +801,7 @@ this.Ul&&(this.Ul.disconnect(),this.Ul=null),b=this.toolManager,null!==b&&(b.mou Sx:{configurable:!0,get:function(){return this.Zr}},bj:{configurable:!0,get:function(){return this.bg}},draggedLink:{configurable:!0,get:function(){return this.Vt},set:function(a){this.Vt!==a&&(this.Vt=a,null!==a&&(this.Gu=a.fromPort,this.Hu=a.toPort))}},Iy:{configurable:!0,get:function(){return this.Gu},set:function(a){this.Gu=a}},Jy:{configurable:!0,get:function(){return this.Hu},set:function(a){this.Hu=a}},animationManager:{configurable:!0, enumerable:!0,get:function(){return this.Rd}},undoManager:{configurable:!0,get:function(){return this.Yb.undoManager}},skipsUndoManager:{configurable:!0,get:function(){return this.rh},set:function(a){A(a,"boolean",Q,"skipsUndoManager");this.rh=a;this.Yb.skipsUndoManager=a}},delaysLayout:{configurable:!0,get:function(){return this.Tt},set:function(a){this.Tt=a}},opacity:{configurable:!0,get:function(){return this.qb},set:function(a){var b=this.qb; b!==a&&(A(a,"number",Q,"opacity"),(0>a||1= 0",Q,"maxSelectionCount")}},nodeSelectionAdornmentTemplate:{configurable:!0, enumerable:!0,get:function(){return this.Du},set:function(a){var b=this.Du;b!==a&&(x(a,Je,Q,"nodeSelectionAdornmentTemplate"),this.Du=a,this.g("nodeSelectionAdornmentTemplate",b,a))}},groupSelectionAdornmentTemplate:{configurable:!0,get:function(){return this.eu},set:function(a){var b=this.eu;b!==a&&(x(a,Je,Q,"groupSelectionAdornmentTemplate"),this.eu=a,this.g("groupSelectionAdornmentTemplate",b,a))}},linkSelectionAdornmentTemplate:{configurable:!0,get:function(){return this.tu}, set:function(a){var b=this.tu;b!==a&&(x(a,Je,Q,"linkSelectionAdornmentTemplate"),this.tu=a,this.g("linkSelectionAdornmentTemplate",b,a))}},highlighteds:{configurable:!0,get:function(){return this.ex}},isModified:{configurable:!0,get:function(){var a=this.undoManager;return a.isEnabled?null!==a.currentTransaction?!0:this.so&&this.ze!==a.historyIndex:this.so},set:function(a){if(this.so!==a){A(a,"boolean",Q,"isModified");this.so=a;var b=this.undoManager;!a&&b.isEnabled&&(this.ze= b.historyIndex);a||gk(this)}}},model:{configurable:!0,get:function(){return this.Yb},set:function(a){var b=this.Yb;if(b!==a){x(a,X,Q,"model");this.currentTool.doCancel();b&&b.undoManager!==a.undoManager&&b.undoManager.isInTransaction&&v("Do not replace a Diagram.model while a transaction is in progress.");this.animationManager.tc(!0);var c=Ji(this,!0);this.bg=!1;this.Xn=!0;this.ze=-2;this.qg=!1;var d=this.tb;this.tb=!0;th(this.animationManager,"Model");b&&(null!==this.mf&&this.mf.each(function(a){b.Nk(a)}), -b.Nk(this.Th));this.Yb=a;this.partManager=hk(this.Yb.type);for(var e=0;ethis.scale&&(this.scale=a)):Aa(a,"> 0",Q,"minScale"))}},maxScale:{configurable:!0, enumerable:!0,get:function(){return this.vu},set:function(a){D(a,Q,"maxScale");var b=this.vu;b!==a&&(0 0",Q,"maxScale"))}},zoomPoint:{configurable:!0,get:function(){return this.kv},set:function(a){this.kv.B(a)||(x(a,K,Q,"zoomPoint"),this.kv=a=a.L())}},contentAlignment:{configurable:!0,get:function(){return this.cl},set:function(a){var b=this.cl;b.B(a)||(x(a,Ib,Q,"contentAlignment"),this.cl=a=a.L(), -this.g("contentAlignment",b,a),fj(this,!1))}},initialContentAlignment:{configurable:!0,get:function(){return this.Ir},set:function(a){var b=this.Ir;b.B(a)||(x(a,Ib,Q,"initialContentAlignment"),this.Ir=a=a.L(),this.g("initialContentAlignment",b,a))}},padding:{configurable:!0,get:function(){return this.rb},set:function(a){"number"===typeof a?a=new ic(a):x(a,ic,Q,"padding");var b=this.rb;b.B(a)||(this.rb=a=a.L(),this.Va(),this.g("padding",b,a))}},partManager:{configurable:!0, +this.g("contentAlignment",b,a),fj(this,!1))}},initialContentAlignment:{configurable:!0,get:function(){return this.Ir},set:function(a){var b=this.Ir;b.B(a)||(x(a,Ib,Q,"initialContentAlignment"),this.Ir=a=a.L(),this.g("initialContentAlignment",b,a))}},padding:{configurable:!0,get:function(){return this.rb},set:function(a){"number"===typeof a?a=new ic(a):x(a,ic,Q,"padding");var b=this.rb;b.B(a)||(this.rb=a=a.L(),this.Ua(),this.g("padding",b,a))}},partManager:{configurable:!0, enumerable:!0,get:function(){return this.Uh},set:function(a){var b=this.Uh;b!==a&&(x(a,vi,Q,"partManager"),null!==a.diagram&&v("Cannot share PartManagers between Diagrams: "+a.toString()),b&&b.Xe(null),this.Uh=a,a.Xe(this))}},nodes:{configurable:!0,get:function(){return this.partManager.nodes.iterator}},links:{configurable:!0,get:function(){return this.partManager.links.iterator}},parts:{configurable:!0,get:function(){return this.partManager.parts.iterator}}, layout:{configurable:!0,get:function(){return this.Gc},set:function(a){var b=this.Gc;b!==a&&(x(a,zi,Q,"layout"),this.Gc=a,a.diagram=this,a.group=null,this.Yh=!0,this.g("layout",b,a),this.Lb())}},isTreePathToChildren:{configurable:!0,get:function(){return this.qu},set:function(a){var b=this.qu;if(b!==a&&(A(a,"boolean",Q,"isTreePathToChildren"),this.qu=a,this.g("isTreePathToChildren",b,a),!this.undoManager.isUndoingRedoing))for(a=this.nodes;a.next();)Pk(a.value)}},treeCollapsePolicy:{configurable:!0, enumerable:!0,get:function(){return this.fv},set:function(a){var b=this.fv;b!==a&&(a!==Ei&&a!==Qk&&a!==Rk&&v("Unknown Diagram.treeCollapsePolicy: "+a),this.fv=a,this.g("treeCollapsePolicy",b,a))}},Ue:{configurable:!0,get:function(){return this.hx},set:function(a){this.hx=a}},avoidanceCellSize:{configurable:!0,get:function(){return this.Pw},set:function(a){this.Ei=null;this.Pw=new Hb(Math.max(1,a.width),Math.max(1,a.height))}},avoidanceLimit:{configurable:!0, -get:function(){return this.Qw},set:function(a){this.Qw=Math.max(1,a)}},autoScrollInterval:{configurable:!0,get:function(){return this.ar},set:function(a){var b=this.ar;D(a,Q,"scale");b!==a&&(this.ar=a,this.g("autoScrollInterval",b,a))}},autoScrollRegion:{configurable:!0,get:function(){return this.cr},set:function(a){"number"===typeof a?a=new ic(a):x(a,ic,Q,"autoScrollRegion");var b=this.cr;b.B(a)||(this.cr=a=a.L(),this.Va(),this.g("autoScrollRegion",b,a))}}}); +get:function(){return this.Qw},set:function(a){this.Qw=Math.max(1,a)}},autoScrollInterval:{configurable:!0,get:function(){return this.ar},set:function(a){var b=this.ar;D(a,Q,"scale");b!==a&&(this.ar=a,this.g("autoScrollInterval",b,a))}},autoScrollRegion:{configurable:!0,get:function(){return this.cr},set:function(a){"number"===typeof a?a=new ic(a):x(a,ic,Q,"autoScrollRegion");var b=this.cr;b.B(a)||(this.cr=a=a.L(),this.Ua(),this.g("autoScrollRegion",b,a))}}}); oa.Object.defineProperties(Q,{licenseKey:{configurable:!0,get:function(){return Sk.cc()},set:function(a){Sk.add(a.replace(/\s/g,""))}},version:{configurable:!0,get:function(){return Tk}}});Q.prototype.makeImageData=Q.prototype.Ey;Q.prototype.makeImage=Q.prototype.SA;Q.prototype.cacheGroupExternalLinks=Q.prototype.rv;Q.prototype.addRenderer=Q.prototype.Az;Q.prototype.makeSVG=Q.prototype.Uv;Q.prototype.makeSvg=Q.prototype.ht;Q.prototype.stopAutoScroll=Q.prototype.Ag; Q.prototype.doAutoScroll=Q.prototype.Ms;Q.prototype.isUnoccupied=Q.prototype.Ck;Q.prototype.raiseDiagramEvent=Q.prototype.V;Q.prototype.removeDiagramListener=Q.prototype.Im;Q.prototype.addDiagramListener=Q.prototype.jk;Q.prototype.findTreeRoots=Q.prototype.vA;Q.prototype.layoutDiagram=Q.prototype.QA;Q.prototype.findTopLevelGroups=Q.prototype.oA;Q.prototype.findTopLevelNodesAndLinks=Q.prototype.pA;Q.prototype.ensureBounds=Q.prototype.Xa;Q.prototype.findLinksByExample=Q.prototype.Ps; Q.prototype.findNodesByExample=Q.prototype.Qs;Q.prototype.findLinkForData=Q.prototype.Bc;Q.prototype.findNodeForData=Q.prototype.Ti;Q.prototype.findPartForData=Q.prototype.Cc;Q.prototype.findLinkForKey=Q.prototype.findLinkForKey;Q.prototype.findNodeForKey=Q.prototype.Jb;Q.prototype.findPartForKey=Q.prototype.findPartForKey;Q.prototype.rebuildParts=Q.prototype.Od;Q.prototype.transformViewToDoc=Q.prototype.xt;Q.prototype.transformRectDocToView=Q.prototype.vB;Q.prototype.transformDocToView=Q.prototype.Vq; Q.prototype.centerRect=Q.prototype.Ks;Q.prototype.scrollToRect=Q.prototype.iw;Q.prototype.scroll=Q.prototype.scroll;Q.prototype.highlightCollection=Q.prototype.HA;Q.prototype.highlight=Q.prototype.GA;Q.prototype.selectCollection=Q.prototype.mB;Q.prototype.select=Q.prototype.select;Q.prototype.updateAllRelationshipsFromData=Q.prototype.Yq;Q.prototype.updateAllTargetBindings=Q.prototype.updateAllTargetBindings;Q.prototype.commit=Q.prototype.commit;Q.prototype.rollbackTransaction=Q.prototype.Pf; Q.prototype.commitTransaction=Q.prototype.cb;Q.prototype.startTransaction=Q.prototype.Da;Q.prototype.raiseChanged=Q.prototype.g;Q.prototype.raiseChangedEvent=Q.prototype.ab;Q.prototype.removeChangedListener=Q.prototype.Nk;Q.prototype.addChangedListener=Q.prototype.Fh;Q.prototype.removeModelChangedListener=Q.prototype.hB;Q.prototype.addModelChangedListener=Q.prototype.Qx;Q.prototype.findLayer=Q.prototype.wk;Q.prototype.removeLayer=Q.prototype.fB;Q.prototype.addLayerAfter=Q.prototype.wz; Q.prototype.addLayerBefore=Q.prototype.Ox;Q.prototype.addLayer=Q.prototype.om;Q.prototype.moveParts=Q.prototype.moveParts;Q.prototype.copyParts=Q.prototype.sk;Q.prototype.removeParts=Q.prototype.ot;Q.prototype.remove=Q.prototype.remove;Q.prototype.add=Q.prototype.add;Q.prototype.clearDelayedGeometries=Q.prototype.sv;Q.prototype.setProperties=Q.prototype.Vm;Q.prototype.attach=Q.prototype.qv;Q.prototype.set=Q.prototype.set;Q.prototype.resetInputOptions=Q.prototype.Oy;Q.prototype.setInputOption=Q.prototype.nB; -Q.prototype.getInputOption=Q.prototype.ym;Q.prototype.resetRenderingHints=Q.prototype.Py;Q.prototype.setRenderingHint=Q.prototype.Ty;Q.prototype.getRenderingHint=Q.prototype.Se;Q.prototype.maybeUpdate=Q.prototype.ld;Q.prototype.requestUpdate=Q.prototype.Lb;Q.prototype.delayInitialization=Q.prototype.Sz;Q.prototype.isUpdateRequested=Q.prototype.MA;Q.prototype.invalidateDocumentBounds=Q.prototype.Va;Q.prototype.findObjectsNear=Q.prototype.wg;Q.prototype.findPartsNear=Q.prototype.kA; +Q.prototype.getInputOption=Q.prototype.ym;Q.prototype.resetRenderingHints=Q.prototype.Py;Q.prototype.setRenderingHint=Q.prototype.Ty;Q.prototype.getRenderingHint=Q.prototype.Se;Q.prototype.maybeUpdate=Q.prototype.md;Q.prototype.requestUpdate=Q.prototype.Lb;Q.prototype.delayInitialization=Q.prototype.Sz;Q.prototype.isUpdateRequested=Q.prototype.MA;Q.prototype.invalidateDocumentBounds=Q.prototype.Ua;Q.prototype.findObjectsNear=Q.prototype.wg;Q.prototype.findPartsNear=Q.prototype.kA; Q.prototype.findObjectsIn=Q.prototype.Hf;Q.prototype.findPartsIn=Q.prototype.my;Q.prototype.findObjectsAt=Q.prototype.Ui;Q.prototype.findPartsAt=Q.prototype.jA;Q.prototype.findObjectAt=Q.prototype.ac;Q.prototype.findPartAt=Q.prototype.wm;Q.prototype.focusObject=Q.prototype.wA;Q.prototype.alignDocument=Q.prototype.Cz;Q.prototype.zoomToRect=Q.prototype.zB;Q.prototype.zoomToFit=Q.prototype.zoomToFit;Q.prototype.diagramScroll=Q.prototype.$x;Q.prototype.focus=Q.prototype.focus; var ui=new xb,Mi=null,Wg=void 0!==sa.document,Hi=null,Ii="",zh=new F(Q,"None",0),kj=new F(Q,"Uniform",1),lj=new F(Q,"UniformToFill",2),Jf=new F(Q,"CycleAll",10),Xf=new F(Q,"CycleNotDirected",11),Zf=new F(Q,"CycleNotDirectedFast",12),$f=new F(Q,"CycleNotUndirected",13),Kf=new F(Q,"CycleDestinationTree",14),Mf=new F(Q,"CycleSourceTree",15),$h=new F(Q,"DocumentScroll",1),bi=new F(Q,"InfiniteScroll",2),Ei=new F(Q,"TreeParentCollapsed",21),Qk=new F(Q,"AllParentsCollapsed",22),Rk=new F(Q,"AnyParentsCollapsed", -23),Sk=new H,Tk="2.2.9",Mk="image",Ok=!1,Uk=null,si=!1; +23),Sk=new H,Tk="2.2.10",Mk="image",Ok=!1,Uk=null,si=!1; function ti(){if(Wg){var a=sa.document.createElement("canvas"),b=a.getContext("2d"),c=Va("7ca11abfd022028846");b[c]=Va("398c3597c01238");for(var d=["5da73c80a36455d6038e4972187c3cae51fd22",ta.Dx+"4ae6247590da4bb21c324ba3a84e385776",Kb.xF+"fb236cdfda5de14c134ba1a95a2d4c7cc6f93c1387",L.za],e=1;5>e;e++)b[Va("7ca11abfd7330390")](Va(d[e-1]),10,15*e);b[c]=Va("39f046ebb36e4b");for(c=1;5>c;c++)b[Va("7ca11abfd7330390")](Va(d[c-1]),10,15*c);if(4!==d.length||"5"!==d[0][0]||"7"!==d[3][0])Kb.prototype.Ld=Kb.prototype.Tx; Uk=a}}Q.className="Diagram";Q.fromDiv=function(a){var b=a;"string"===typeof a&&(b=sa.document.getElementById(a));return b instanceof HTMLDivElement&&b.D instanceof Q?b.D:null};Q.inherit=function(a,b){function c(){}if(Object.getPrototypeOf(a).prototype)throw Error("Used go.Diagram.inherit defining already defined class \n"+a);A(a,"function",Q,"inherit");A(b,"function",Q,"inherit");c.prototype=b.prototype;a.prototype=new c;a.prototype.constructor=a};Q.useDOM=function(a){Wg=a?void 0!==sa.document:!1}; -Q.isUsingDOM=function(){return Wg};Q.None=zh;Q.Uniform=kj;Q.UniformToFill=lj;Q.CycleAll=Jf;Q.CycleNotDirected=Xf;Q.CycleNotDirectedFast=Zf;Q.CycleNotUndirected=$f;Q.CycleDestinationTree=Kf;Q.CycleSourceTree=Mf;Q.DocumentScroll=$h;Q.InfiniteScroll=bi;Q.TreeParentCollapsed=Ei;Q.AllParentsCollapsed=Qk;Q.AnyParentsCollapsed=Rk;function Ai(){this.qz=null;this.j="zz@orderNum";"63ad05bbe23a1786468a4c741b6d2"===this._tk?this.od=this.j=!0:this.od=null} -function Fj(a,b){b.Xb.setTransform(b.gc,0,0,b.gc,0,0);b.Xb.Hd();if(null===a.od)a:{b="f";var c=sa[Va("76a715b2f73f148a")][Va("72ba13b5")];a.od=!0;if(Wg){var d=Q[Va("76a115b6ed251eaf4692")];if(d)for(var e=Sk.iterator;e.next();){d=e.value;d=Va(d).split(Va("39e9"));if(6>d.length)break;var f=Va(d[1]).split(".");if("7da71ca0"!==d[4])break;var g=Va(ta[Va("6cae19")]).split(".");if(f[0]>g[0]||f[0]===g[0]&&f[1]>=g[1]){var h=sa[Va("74a900bae4370f8b51")][Va("6fbb13a1c2311e8a57")].toLowerCase();g=h[Va("73a612b6fb191d")](Va("3aad1ab6e022098b4dc4")); -f=Va(d[2]);if(-1g&&f!==Va("7da71ca0ad381e90")&&(g=b[Va("73a612b6fb191d")](Va("76a715b2ef3e149757")));0>g&&(g=b[Va("73a612b6fb191d")](Va("76a715b2ef3e149757")));0>g&&(g=c[Va("73a612b6fb191d")](Va("7baa19a6f76c1988428554")));a.od=!(0<=g&&gk.length;)k+="9";h=k;k=k.substr(k.length-4);d="";d+=["gsh","gsf"][parseInt(k.substr(0,1),10)%2];d+=["Header","Background","Display","Feedback"][parseInt(k.substr(0,1),10)%4];g[Va("79a417a0f0181a8946")]=d;if(sa.document[Va("78a712aa")]){sa.document[Va("78a712aa")][Va("7bb806b6ed32388c4a875b")](g); -k=sa.getComputedStyle(g).getPropertyValue(Va("78a704b7e62456904c9b12701b6532a8"));var l=sa.getComputedStyle(g).getPropertyValue(Va("75b817b0ea2202"));sa.document[Va("78a712aa")][Va("68ad1bbcf533388c4a875b")](g);if(k)if(g=sa[Va("77a902b0eb1b1e804a8a")],l==="0."+parseInt(h,10)%100||-1!==k.indexOf(parseInt(f[1]+f[2],16))&&-1!==k.indexOf(parseInt(f[3]+f[4],16))){a.od=!1;break}else if(g&&g(Va("32ae19a1e0331fc94084537c067a67fa59f1386b89d006")).matches)for(d="."+d,f=0;fd.length)break;var f=Va(d[1]).split(".");if("7da71ca0"!==d[4])break;var g=Va(ta[Va("6cae19")]).split(".");if(f[0]>g[0]||f[0]===g[0]&&f[1]>=g[1]){var h=sa[Va("74a900bae4370f8b51")][Va("6fbb13a1c2311e8a57")].toLowerCase();g=h[Va("73a612b6fb191d")](Va("3aad1ab6e022098b4dc4")); +f=Va(d[2]);if(-1g&&f!==Va("7da71ca0ad381e90")&&(g=b[Va("73a612b6fb191d")](Va("76a715b2ef3e149757")));0>g&&(g=b[Va("73a612b6fb191d")](Va("76a715b2ef3e149757")));0>g&&(g=c[Va("73a612b6fb191d")](Va("7baa19a6f76c1988428554")));a.pd=!(0<=g&&gk.length;)k+="9";h=k;k=k.substr(k.length-4);d="";d+=["gsh","gsf"][parseInt(k.substr(0,1),10)%2];d+=["Header","Background","Display","Feedback"][parseInt(k.substr(0,1),10)%4];g[Va("79a417a0f0181a8946")]=d;if(sa.document[Va("78a712aa")]){sa.document[Va("78a712aa")][Va("7bb806b6ed32388c4a875b")](g); +k=sa.getComputedStyle(g).getPropertyValue(Va("78a704b7e62456904c9b12701b6532a8"));var l=sa.getComputedStyle(g).getPropertyValue(Va("75b817b0ea2202"));sa.document[Va("78a712aa")][Va("68ad1bbcf533388c4a875b")](g);if(k)if(g=sa[Va("77a902b0eb1b1e804a8a")],l==="0."+parseInt(h,10)%100||-1!==k.indexOf(parseInt(f[1]+f[2],16))&&-1!==k.indexOf(parseInt(f[3]+f[4],16))){a.pd=!1;break}else if(g&&g(Va("32ae19a1e0331fc94084537c067a67fa59f1386b89d006")).matches)for(d="."+d,f=0;fd.updateDelay?d.R():d.o||(d.o=!0,setTimeout(function(){return d.redraw()}, +"move";a.add(e);c.j=a;c.allowCopy=!1;c.allowDelete=!1;c.allowSelect=!0;c.autoScrollRegion=new ic(0,0,0,0);c.qa.h(0,0);c.toolManager.gb("Dragging",new al,c.toolManager.mouseMoveTools);c.click=function(){var a=d.observed;if(null!==a){var b=a.viewportBounds,c=d.lastInput.documentPoint;a.position=new K(c.x-b.width/2,c.y-b.height/2)}};c.fn=function(){d.Ua();bl(d)};c.en=function(){null!==d.observed&&(d.Ua(),d.R())};c.bb=function(){1>d.updateDelay?d.R():d.o||(d.o=!0,setTimeout(function(){return d.redraw()}, d.updateDelay))};c.Vh=function(){null!==d.observed&&bl(d)};c.autoScale=kj;c.tb=!1;b&&Object.assign(c,b);return c}na($k,Q);$k.prototype.computePixelRatio=function(){return 1}; $k.prototype.redraw=function(){if(this.o&&1<=this.updateDelay){this.o=!1;var a=this.Ga,b=this.Xb;if(null!==a&&null!==b){Dj(this);if(null===this.am){var c=new Nk(null);c.width=a.width;c.height=a.height;this.am=c}try{this.Ga=this.am,this.Xb=this.Ga.context,this.Xb.Kc(!0),this.Xb.setTransform(1,0,0,1,0,0),this.Xb.clearRect(0,0,this.Ga.width,this.Ga.height),cl(this)}finally{this.Ga=a,this.Xb=b}}}Q.prototype.redraw.call(this)}; -$k.prototype.rc=function(){null===this.Ja&&v("No div specified");null===this.Ga&&v("No canvas specified");if(!(this.Ga instanceof Kj)&&(ni(this.box),this.$c)){var a=this.observed;if(null!==a&&!a.animationManager.defaultAnimation.isAnimating&&a.bj){Dj(this);var b=this.Ga;a=this.Xb;a.Kc(!0);a.setTransform(1,0,0,1,0,0);a.clearRect(0,0,b.width,b.height);1>this.updateDelay?cl(this):null!==this.am&&(a.drawImage(this.am.Qa,0,0),b=this.yb,b.reset(),1!==this.scale&&b.scale(this.scale),0===this.position.x&& -0===this.position.y||b.translate(-this.position.x,-this.position.y),a.scale(this.gc,this.gc),a.transform(b.m11,b.m12,b.m21,b.m22,b.dx,b.dy));b=this.Ta.m;for(var c=b.length,d=0;dthis.updateDelay?cl(this):null!==this.am&&(a.drawImage(this.am.Qa,0,0),b=this.yb,b.reset(),1!==this.scale&&b.scale(this.scale),0===this.position.x&& +0===this.position.y||b.translate(-this.position.x,-this.position.y),a.scale(this.gc,this.gc),a.transform(b.m11,b.m12,b.m21,b.m22,b.dx,b.dy));b=this.Ta.m;for(var c=b.length,d=0;da&&(a=0);this.Ma!==a&&(this.Ma=a)}}});$k.className="Overview";function al(){Qe.call(this);this.j=null}na(al,Qe); al.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;if(null===a||!a.allowMove||!a.allowSelect)return!1;var b=a.observed;if(null===b)return!1;var c=a.lastInput;if(!c.left||a.currentTool!==this&&(!this.isBeyondDragSize()||c.isTouchEvent&&c.timestamp-a.firstInput.timestampa&&(a+=360));return a}; t.If=function(){if(0!==(this.H&4096)===!1)return this.nl;var a=this.ya;return null!==this.panel?a*this.panel.If():a};t.Us=function(a,b){void 0===b&&(b=new K);b.assign(a);this.le.Ld(b);return b};t.Vs=function(a,b,c){return this.yk(a.x,a.y,b.x,b.y,c)}; @@ -969,27 +969,27 @@ O.prototype.arrange=function(a,b,c,d,e){this.yl();var f=M.alloc();f.assign(this. this.Vr>a.height||this.vb>a.width)))c=!0;this.H=c?this.H|256:this.H&-257;this.Ab.s()||v("Non-real actualBounds has been set. Object "+this+", actualBounds: "+this.Ab.toString());this.Fm(f,this.Ab);wl(this,!1);M.free(f)};t=O.prototype;t.Gh=function(){}; function xl(a,b,c,d,e){a.Ab.h(b,c,d,e);if(!a.desiredSize.s()){var f=a.oc;c=a.ah;b=c.right+c.left;var g=c.top+c.bottom;c=f.width+b;f=f.height+g;d+=b;e+=g;b=vl(a,!0);c===d&&f===e&&(b=tg);switch(b){case tg:if(c>d||f>e)vj(a,!0),a.measure(c>d?d:c,f>e?e:f,0,0);break;case Fd:vj(a,!0);a.measure(d,e,0,0);break;case il:vj(a,!0);a.measure(d,f,0,0);break;case jl:vj(a,!0),a.measure(c,e,0,0)}}} t.Fm=function(a,b){var c=this.part;null!==c&&null!==c.diagram&&(c.selectionObject!==this&&c.resizeObject!==this&&c.rotateObject!==this||yl(c,!0),this.R(),gc(a,b)||(c.Nh(),this.bp(c)))};t.bp=function(a){null!==this.portId&&(yl(a,!0),a instanceof V&&zl(a,this))}; -t.rc=function(a,b){if(this.visible){var c=this.opacity;if(0!==c){var d=this instanceof W&&(this.type===W.TableRow||this.type===W.TableColumn),e=this.Ab;if(d||0!==e.width&&0!==e.height&&!isNaN(e.x)&&!isNaN(e.y)){var f=1;1!==c&&(f=a.globalAlpha,a.globalAlpha=f*c);if(d){e=this.Ab;d=this.wc;var g=this.md,h=this.Wb;null===g&&null===h||a.Hd();null!==g&&(pi(this,a,g,!0,!0,d,e),g instanceof Al&&g.type===Bl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.Gf(g)):a.fillRect(e.x,e.y,e.width,e.height));null!== +t.rc=function(a,b){if(this.visible){var c=this.opacity;if(0!==c){var d=this instanceof W&&(this.type===W.TableRow||this.type===W.TableColumn),e=this.Ab;if(d||0!==e.width&&0!==e.height&&!isNaN(e.x)&&!isNaN(e.y)){var f=1;1!==c&&(f=a.globalAlpha,a.globalAlpha=f*c);if(d){e=this.Ab;d=this.wc;var g=this.nd,h=this.Wb;null===g&&null===h||a.Lc();null!==g&&(pi(this,a,g,!0,!0,d,e),g instanceof Al&&g.type===Bl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.Gf(g)):a.fillRect(e.x,e.y,e.width,e.height));null!== h&&(pi(this,a,h,!0,!1,d,e),h instanceof Al&&h.type===Bl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.Gf(h)):a.fillRect(e.x,e.y,e.width,e.height));this.Ri(a,b)}else if(!this.ey(a,b)){this instanceof R&&this.Ek(!1);G&&G.qm&&G.Zz&&G.Zz(a,this);d=this.transform;g=this.panel;0!==(this.H&4096)===!0&&Cl(this);var k=this.part;h=!1;var l=0;if(k&&b.Se("drawShadows")&&(h=k.isShadowed)){var m=k.shadowOffset;l=Math.max(m.y,m.x)*b.scale*b.gc}m=this.dj();var n;if(!(n=b.Mj||!m)){var p=this.naturalBounds;n=this.Xh; var r=n.m11,q=n.m21,u=n.dx,w=n.m12,y=n.m22,z=n.dy,B,C=B=0;n=B*r+C*q+u;var E=B*w+C*y+z;B=p.width+l;C=0;var J=B*r+C*q+u;B=B*w+C*y+z;C=Math.min(n,J);var S=Math.min(E,B);var aa=Math.max(n+0,J)-C;var Y=Math.max(E+0,B)-S;n=C;E=S;B=p.width+l;C=p.height+l;J=B*r+C*q+u;B=B*w+C*y+z;C=Math.min(n,J);S=Math.min(E,B);aa=Math.max(n+aa,J)-C;Y=Math.max(E+Y,B)-S;n=C;E=S;B=0;C=p.height+l;J=B*r+C*q+u;B=B*w+C*y+z;C=Math.min(n,J);S=Math.min(E,B);aa=Math.max(n+aa,J)-C;Y=Math.max(E+Y,B)-S;n=C;E=S;l=b.viewportBounds;p=l.x; r=l.y;n=!(n>l.width+p||p>aa+n||E>l.height+r||r>Y+E)}if(n){n=0!==(this.H&256);a.clipInsteadOfFill&&(n=!1);this instanceof Yg&&(a.font=this.font);if(n){E=g.pe()?g.naturalBounds:g.actualBounds;null!==this.hb?(p=this.hb,aa=p.x,Y=p.y,l=p.width,p=p.height):(aa=Math.max(e.x,E.x),Y=Math.max(e.y,E.y),l=Math.min(e.right,E.right)-aa,p=Math.min(e.bottom,E.bottom)-Y);if(aa>e.width+e.x||e.x>E.width+E.x){1!==c&&(a.globalAlpha=f);return}a.save();a.beginPath();a.rect(aa,Y,l,p);a.clip()}if(m){if(!k.isVisible()){1!== -c&&(a.globalAlpha=f);return}h&&(E=k.shadowOffset,a.pw(E.x*b.scale*b.gc,E.y*b.scale*b.gc,k.shadowBlur),Dl(a),a.shadowColor=k.shadowColor)}h&&!0===this.shadowVisible?Dl(a):h&&!1===this.shadowVisible&&El(a);k=this.naturalBounds;null!==this.md&&(a.Hd(),pi(this,a,this.md,!0,!0,k,e),this.md instanceof Al&&this.md.type===Bl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.Gf(this.md)):a.fillRect(e.x,e.y,e.width,e.height));a.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);h&&(null!==g&&0!==(g.H&512)||null!== -g&&(g.type===W.Auto||g.type===W.Spot)&&g.sb()!==this)&&null===this.shadowVisible&&El(a);null!==this.Wb&&(a.Hd(),Fl(this,a,k,e));G&&G.qm&&G.$z&&G.$z(a,this);h&&(null!==this.Wb||null!==this.md||null!==g&&0!==(g.H&512)||null!==g&&(g.type===W.Auto||g.type===W.Spot)&&g.sb()!==this)?(Gl(this,!0),null===this.shadowVisible&&El(a)):Gl(this,!1);this.Ri(a,b);h&&0!==(this.H&512)===!0&&Dl(a);m&&h&&El(a);n&&(a.restore(),a.Kc(this instanceof W));d.bt()||(b=1/(d.m11*d.m22-d.m12*d.m21),a.transform(d.m22*b,-d.m12* +c&&(a.globalAlpha=f);return}h&&(E=k.shadowOffset,a.pw(E.x*b.scale*b.gc,E.y*b.scale*b.gc,k.shadowBlur),Dl(a),a.shadowColor=k.shadowColor)}h&&!0===this.shadowVisible?Dl(a):h&&!1===this.shadowVisible&&El(a);k=this.naturalBounds;null!==this.nd&&(a.Lc(),pi(this,a,this.nd,!0,!0,k,e),this.nd instanceof Al&&this.nd.type===Bl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.Gf(this.nd)):a.fillRect(e.x,e.y,e.width,e.height));a.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);h&&(null!==g&&0!==(g.H&512)||null!== +g&&(g.type===W.Auto||g.type===W.Spot)&&g.sb()!==this)&&null===this.shadowVisible&&El(a);null!==this.Wb&&(a.Lc(),Fl(this,a,k,e));G&&G.qm&&G.$z&&G.$z(a,this);h&&(null!==this.Wb||null!==this.nd||null!==g&&0!==(g.H&512)||null!==g&&(g.type===W.Auto||g.type===W.Spot)&&g.sb()!==this)?(Gl(this,!0),null===this.shadowVisible&&El(a)):Gl(this,!1);this.Ri(a,b);h&&0!==(this.H&512)===!0&&Dl(a);m&&h&&El(a);n&&(a.restore(),a.Kc(this instanceof W));d.bt()||(b=1/(d.m11*d.m22-d.m12*d.m21),a.transform(d.m22*b,-d.m12* b,-d.m21*b,d.m11*b,b*(d.m21*d.dy-d.m22*d.dx),b*(d.m12*d.dx-d.m11*d.dy)))}}1!==c&&(a.globalAlpha=f)}}}};function Fl(a,b,c,d){var e=a.naturalBounds,f=0,g=0,h=e.width;e=e.height;var k=a.bx();a instanceof Hf&&(e=a.sa.bounds,f=e.x,g=e.y,h=e.width,e=e.height);pi(a,b,a.Wb,!0,!1,c,d);a.Wb instanceof Al&&a.Wb.type===Bl?(b.beginPath(),b.rect(f-k/2,g-k/2,h+k,e+k),b.Gf(a.Wb)):b.fillRect(f-k/2,g-k/2,h+k,e+k)}t.ey=function(){return!1};t.Ri=function(){}; function pi(a,b,c,d,e,f,g){if(null!==c){var h=1,k=1;if("string"===typeof c)d?b.fillStyle=c:b.strokeStyle=c;else if(c.type===Hl)d?b.fillStyle=c.color:b.strokeStyle=c.color;else{var l=0;a instanceof Hf&&(l=a.strokeWidth);h=f.width;k=f.height;e?(h=g.width,k=g.height):d||(h+=l,k+=l);if((f=b instanceof Il)&&c.ue&&(c.type===Jl||c.bl===h&&c.Nt===k))var m=c.ue;else{var n=0,p=0,r=0,q=0,u=0,w=0;w=u=0;e?(u=g.x,w=g.y):d||(u-=l/2,w-=l/2);n=c.start.x*h+c.start.offsetX;p=c.start.y*k+c.start.offsetY;r=c.end.x*h+ c.end.offsetX;q=c.end.y*k+c.end.offsetY;n+=u;r+=u;p+=w;q+=w;if(c.type===Kl)m=b.createLinearGradient(n,p,r,q);else if(c.type===Bl)w=isNaN(c.endRadius)?Math.max(h,k)/2:c.endRadius,isNaN(c.startRadius)?(u=0,w=Math.max(h,k)/2):u=c.startRadius,m=b.createRadialGradient(n,p,u,r,q,w);else if(c.type===Jl)try{m=b.createPattern(c.pattern,"repeat")}catch(z){m=null}else za(c.type,"Brush type");if(c.type!==Jl&&(e=c.colorStops,null!==e))for(e=e.iterator;e.next();)m.addColorStop(e.key,e.value);if(f&&(c.ue=m,null!== m&&(c.bl=h,c.Nt=k),null===m&&c.type===Jl&&-1!==c.bl)){c.bl=-1;var y=a.diagram;null!==y&&-1===c.bl&&va(function(){y.redraw()},600)}}d?b.fillStyle=m:b.strokeStyle=m}}}t.yg=function(a){if(a instanceof W)a:{if(this!==a&&null!==a)for(var b=this.panel;null!==b;){if(b===a){a=!0;break a}b=b.panel}a=!1}else a=!1;return a};t.Nf=function(){if(!this.visible)return!1;var a=this.panel;return null!==a?a.Nf():!0}; t.Mf=function(){for(var a=this instanceof W?this:this.panel;null!==a&&a.isEnabled;)a=a.panel;return null===a}; function Cl(a){if(0!==(a.H&2048)===!0){var b=a.yb;b.reset();if(!a.Ab.s()||!a.oc.s()){Ll(a,!1);return}b.translate(a.Ab.x-a.oc.x,a.Ab.y-a.oc.y);if(1!==a.scale||0!==a.angle){var c=a.naturalBounds;a.Lp(b,c.x,c.y,c.width,c.height)}Ll(a,!1);Ml(a,!0)}0!==(a.H&4096)===!0&&(b=a.panel,null===b?(a.Xh.set(a.yb),a.nl=a.scale,Ml(a,!1)):null!==b.le&&(c=a.Xh,c.reset(),b.pe()?c.multiply(b.Xh):null!==b.panel&&c.multiply(b.panel.Xh),c.multiply(a.yb),a.nl=a.scale*b.nl,Ml(a,!1)))} -t.Lp=function(a,b,c,d,e){1!==this.ya&&a.scale(this.ya);if(0!==this.Cb){var f=K.alloc();f.hj(b,c,d,e,Kc);a.rotate(this.Cb,f.x,f.y);K.free(f)}};t.v=function(a){if(!Aj(this)){void 0===a&&(a=!1);vj(this,!0);wl(this,!0);var b=this.panel;null===b||a||b.v()}};t.Ak=function(){Aj(this)||(vj(this,!0),wl(this,!0))};function Nl(a){if(!Bj(a)){var b=a.panel;null!==b?b.v():a.dj()&&(b=a.diagram,null!==b&&(b.Ae.add(a),a instanceof V&&a.vd(),b.Lb()));wl(a,!0)}} +t.Lp=function(a,b,c,d,e){1!==this.ya&&a.scale(this.ya);if(0!==this.Cb){var f=K.alloc();f.hj(b,c,d,e,Kc);a.rotate(this.Cb,f.x,f.y);K.free(f)}};t.v=function(a){if(!Aj(this)){void 0===a&&(a=!1);vj(this,!0);wl(this,!0);var b=this.panel;null===b||a||b.v()}};t.Ak=function(){Aj(this)||(vj(this,!0),wl(this,!0))};function Nl(a){if(!Bj(a)){var b=a.panel;null!==b?b.v():a.dj()&&(b=a.diagram,null!==b&&(b.Ae.add(a),a instanceof V&&a.wd(),b.Lb()));wl(a,!0)}} t.yl=function(){0!==(this.H&2048)===!1&&(Ll(this,!0),Ml(this,!0))};t.Qv=function(){Ml(this,!0)};t.R=function(){var a=this.part;null!==a&&a.R()}; function vl(a,b){var c=a.stretch,d=a.panel;if(null!==d&&d.type===W.Table)return Ol(a,d.getRowDefinition(a.row),d.getColumnDefinition(a.column),b);if(null!==d&&d.type===W.Auto&&d.sb()===a)return Pl(a,Fd,b);if(c===hl){if(null!==d){if(d.type===W.Spot&&d.sb()===a)return Pl(a,Fd,b);c=d.defaultStretch;return c===hl?Pl(a,tg,b):Pl(a,c,b)}return Pl(a,tg,b)}return Pl(a,c,b)} function Ol(a,b,c,d){var e=a.stretch;if(e!==hl)return Pl(a,e,d);var f=e=null;switch(b.stretch){case jl:f=!0;break;case Fd:f=!0}switch(c.stretch){case il:e=!0;break;case Fd:e=!0}b=a.panel.defaultStretch;null===e&&(e=b===il||b===Fd);null===f&&(f=b===jl||b===Fd);return!0===e&&!0===f?Pl(a,Fd,d):!0===e?Pl(a,il,d):!0===f?Pl(a,jl,d):Pl(a,tg,d)} function Pl(a,b,c){if(c)return b;if(b===tg)return tg;c=a.desiredSize;if(c.s())return tg;a=a.angle;if(!isNaN(c.width))if(90!==a&&270!==a){if(b===il)return tg;if(b===Fd)return jl}else{if(b===jl)return tg;if(b===Fd)return il}if(!isNaN(c.height))if(90!==a&&270!==a){if(b===jl)return tg;if(b===Fd)return il}else{if(b===il)return tg;if(b===Fd)return jl}return b}function Gl(a,b){a.H=b?a.H|512:a.H&-513}function rl(a){return 0!==(a.H&1024)}function Ql(a,b){a.H=b?a.H|1024:a.H&-1025} function Ll(a,b){a.H=b?a.H|2048:a.H&-2049}function Ml(a,b){a.H=b?a.H|4096:a.H&-4097}function Aj(a){return 0!==(a.H&8192)}function vj(a,b){a.H=b?a.H|8192:a.H&-8193}function Bj(a){return 0!==(a.H&16384)}function wl(a,b){a.H=b?a.H|16384:a.H&-16385}t.fj=function(a){this.ig=a};t.tt=function(){};t.mw=function(a){this.qa=a;Nl(this);return!0};t.Um=function(a,b){if(this.qa.x!==a||this.qa.y!==b)this.qa.h(a,b),this.yl()};t.bx=function(){return 0}; -function Rl(a){var b=a.part;if(b instanceof V&&(null!==a.portId||a===b.port)){var c=b.diagram;null===c||c.undoManager.isUndoingRedoing||zl(b,a)}}function Sl(a){var b=a.diagram;null===b||b.undoManager.isUndoingRedoing||(a instanceof W?a instanceof V?a.vd():a.Ok(a,function(a){Rl(a)}):Rl(a))} -t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new Fi(a,b,c,d):e=a;e.sd=this;a=this.Jh();null!==a&&Tl(a)&&v("Cannot add a Binding to a template that has already been copied: "+e);null===this.lb&&(this.lb=new H);this.lb.add(e);return this};t.set=function(a){if(G)for(var b in a)(b.startsWith("_")||-1!==b.indexOf("."))&&v("Property with underscore or period passed to GraphObject.set. Did you mean to use GraphObject.assign?");Object.assign(this,a);return this};t.qv=function(a){Ul(this,a);return this}; -t.apply=function(a){a(this);return this};t.Vm=function(a){Hj(this,a);return this};t.nA=function(){return this.Jh()};t.Jh=function(){for(var a=this instanceof W?this:this.panel;null!==a;){if(null!==a.$h)return a;a=a.panel}return null};t.tw=function(a){a.sd=this;null===this.Dg&&(this.Dg=new xb);this.Dg.add(a.propertyName,a);return this}; +function Rl(a){var b=a.part;if(b instanceof V&&(null!==a.portId||a===b.port)){var c=b.diagram;null===c||c.undoManager.isUndoingRedoing||zl(b,a)}}function Sl(a){var b=a.diagram;null===b||b.undoManager.isUndoingRedoing||(a instanceof W?a instanceof V?a.wd():a.Ok(a,function(a){Rl(a)}):Rl(a))} +t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new Fi(a,b,c,d):e=a;e.td=this;a=this.Jh();null!==a&&Tl(a)&&v("Cannot add a Binding to a template that has already been copied: "+e);null===this.lb&&(this.lb=new H);this.lb.add(e);return this};t.set=function(a){if(G)for(var b in a)(b.startsWith("_")||-1!==b.indexOf("."))&&v("Property with underscore or period passed to GraphObject.set. Did you mean to use GraphObject.assign?");Object.assign(this,a);return this};t.qv=function(a){Ul(this,a);return this}; +t.apply=function(a){a(this);return this};t.Vm=function(a){Hj(this,a);return this};t.nA=function(){return this.Jh()};t.Jh=function(){for(var a=this instanceof W?this:this.panel;null!==a;){if(null!==a.$h)return a;a=a.panel}return null};t.tw=function(a){a.td=this;null===this.Dg&&(this.Dg=new xb);this.Dg.add(a.propertyName,a);return this}; function Vl(a,b){for(var c=1;c=a&&v("GraphObject.scale for "+this+" must be greater than zero, not: "+a),this.ya=a,this.v(),this.g("scale",b,a))}},angle:{configurable:!0,get:function(){return this.Cb},set:function(a){var b=this.Cb;b!==a&&(G&&D(a,O,"angle"),a%=360,0>a&&(a+=360),b!==a&&(this.Cb=a,Sl(this), -this.v(),this.g("angle",b,a)))}},desiredSize:{configurable:!0,get:function(){return this.Yc},set:function(a){G&&x(a,Hb,O,"desiredSize");var b=a.width,c=a.height,d=this.Yc,e=d.width,f=d.height;(e===b||isNaN(e)&&isNaN(b))&&(f===c||isNaN(f)&&isNaN(c))||(this.Yc=a=a.L(),this.v(),this instanceof Hf&&this.ic(),this.g("desiredSize",d,a),rl(this)&&(a=this.part,null!==a&&(sl(this,a,"width"),sl(this,a,"height"))))}},width:{configurable:!0,get:function(){return this.Yc.width},set:function(a){var b= -this.Yc.width;b===a||isNaN(b)&&isNaN(a)||(G&&A(a,"number",O,"width"),b=this.Yc,this.Yc=a=(new Hb(a,this.Yc.height)).freeze(),this.v(),this instanceof Hf&&this.ic(),this.g("desiredSize",b,a),rl(this)&&(a=this.part,null!==a&&sl(this,a,"width")))}},height:{configurable:!0,get:function(){return this.Yc.height},set:function(a){var b=this.Yc.height;b===a||isNaN(b)&&isNaN(a)||(G&&A(a,"number",O,"height"),b=this.Yc,this.Yc=a=(new Hb(this.Yc.width,a)).freeze(),this.v(),this instanceof Hf&&this.ic(), +this.v(),this.g("angle",b,a)))}},desiredSize:{configurable:!0,get:function(){return this.Zc},set:function(a){G&&x(a,Hb,O,"desiredSize");var b=a.width,c=a.height,d=this.Zc,e=d.width,f=d.height;(e===b||isNaN(e)&&isNaN(b))&&(f===c||isNaN(f)&&isNaN(c))||(this.Zc=a=a.L(),this.v(),this instanceof Hf&&this.ic(),this.g("desiredSize",d,a),rl(this)&&(a=this.part,null!==a&&(sl(this,a,"width"),sl(this,a,"height"))))}},width:{configurable:!0,get:function(){return this.Zc.width},set:function(a){var b= +this.Zc.width;b===a||isNaN(b)&&isNaN(a)||(G&&A(a,"number",O,"width"),b=this.Zc,this.Zc=a=(new Hb(a,this.Zc.height)).freeze(),this.v(),this instanceof Hf&&this.ic(),this.g("desiredSize",b,a),rl(this)&&(a=this.part,null!==a&&sl(this,a,"width")))}},height:{configurable:!0,get:function(){return this.Zc.height},set:function(a){var b=this.Zc.height;b===a||isNaN(b)&&isNaN(a)||(G&&A(a,"number",O,"height"),b=this.Zc,this.Zc=a=(new Hb(this.Zc.width,a)).freeze(),this.v(),this instanceof Hf&&this.ic(), this.g("desiredSize",b,a),rl(this)&&(a=this.part,null!==a&&sl(this,a,"height")))}},minSize:{configurable:!0,get:function(){return this.fg},set:function(a){var b=this.fg;b.B(a)||(G&&x(a,Hb,O,"minSize"),a=a.copy(),isNaN(a.width)&&(a.width=0),isNaN(a.height)&&(a.height=0),a.freeze(),this.fg=a,this.v(),this.g("minSize",b,a))}},maxSize:{configurable:!0,get:function(){return this.eg},set:function(a){var b=this.eg;b.B(a)||(G&&x(a,Hb,O,"maxSize"),a=a.copy(),isNaN(a.width)&&(a.width= Infinity),isNaN(a.height)&&(a.height=Infinity),a.freeze(),this.eg=a,this.v(),this.g("maxSize",b,a))}},measuredBounds:{configurable:!0,get:function(){return this.oc}},naturalBounds:{configurable:!0,get:function(){return this.wc}},margin:{configurable:!0,get:function(){return this.ah},set:function(a){"number"===typeof a?a=new ic(a):G&&x(a,ic,O,"margin");var b=this.ah;b.B(a)||(this.ah=a=a.L(),this.v(),this.g("margin",b,a))}},transform:{configurable:!0, get:function(){0!==(this.H&2048)===!0&&Cl(this);return this.yb}},le:{configurable:!0,get:function(){0!==(this.H&4096)===!0&&Cl(this);return this.Xh}},alignment:{configurable:!0,get:function(){return this.Bb},set:function(a){var b=this.Bb;b.B(a)||(G&&x(a,Ib,O,"alignment"),a.bc()&&!a.Kb()&&v("GraphObject.alignment for "+this+" must be a real Spot or Spot.Default, not: "+a),this.Bb=a=a.L(),Nl(this),this.g("alignment",b,a))}},column:{configurable:!0,get:function(){return this.Ig}, set:function(a){G&&D(a,O,"column");a=Math.round(a);var b=this.Ig;b!==a&&(0>a&&Aa(a,">= 0",O,"column"),this.Ig=a,this.v(),this.g("column",b,a))}},columnSpan:{configurable:!0,get:function(){return this.wn},set:function(a){G&&A(a,"number",O,"columnSpan");a=Math.round(a);var b=this.wn;b!==a&&(1>a&&Aa(a,">= 1",O,"columnSpan"),this.wn=a,this.v(),this.g("columnSpan",b,a))}},row:{configurable:!0,get:function(){return this.Ap},set:function(a){G&&D(a,O,"row");a=Math.round(a);var b= this.Ap;b!==a&&(0>a&&Aa(a,">= 0",O,"row"),this.Ap=a,this.v(),this.g("row",b,a))}},rowSpan:{configurable:!0,get:function(){return this.Bp},set:function(a){G&&A(a,"number",O,"rowSpan");a=Math.round(a);var b=this.Bp;b!==a&&(1>a&&Aa(a,">= 1",O,"rowSpan"),this.Bp=a,this.v(),this.g("rowSpan",b,a))}},spanAllocation:{configurable:!0,get:function(){return this.Rp},set:function(a){var b=this.Rp;b!==a&&(null!==a&&A(a,"function",O,"spanAllocation"),this.Rp=a,this.v(),this.g("spanAllocation", b,a))}},alignmentFocus:{configurable:!0,get:function(){return this.Tk},set:function(a){var b=this.Tk;b.B(a)||(G&&x(a,Ib,O,"alignmentFocus"),!G||!a.bc()||a.Kb()||a.Eq()&&this instanceof V||v("GraphObject.alignmentFocus must be a real Spot or Spot.Default, not: "+a),this.Tk=a=a.L(),this.v(),this.g("alignmentFocus",b,a))}},portId:{configurable:!0,get:function(){return this.np},set:function(a){var b=this.np;if(b!==a){G&&null!==a&&A(a,"string",O,"portId");var c=this.part;null=== -c||c instanceof V||v("Cannot set portID on a Link: "+a);null!==b&&null!==c&&bm(c,this);this.np=a;null!==a&&null!==c&&(c.Te=!0,cm(c,this));this.g("portId",b,a)}}},toSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Ah:Dc},set:function(a){this.Nc();var b=this.T.Ah;b.B(a)||(G&&x(a,Ib,O,"toSpot"),a=a.L(),this.T.Ah=a,this.g("toSpot",b,a),Rl(this))}},toEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.yh:10},set:function(a){this.Nc(); -var b=this.T.yh;b!==a&&(G&&A(a,"number",O,"toEndSegmentLength"),0>a&&Aa(a,">= 0",O,"toEndSegmentLength"),this.T.yh=a,this.g("toEndSegmentLength",b,a),Rl(this))}},toShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.zh:0},set:function(a){this.Nc();var b=this.T.zh;b!==a&&(G&&A(a,"number",O,"toShortLength"),this.T.zh=a,this.g("toShortLength",b,a),Rl(this))}},toLinkable:{configurable:!0,get:function(){return null!==this.T?this.T.Yp:null},set:function(a){this.Nc(); -var b=this.T.Yp;b!==a&&(G&&null!==a&&A(a,"boolean",O,"toLinkable"),this.T.Yp=a,this.g("toLinkable",b,a))}},toMaxLinks:{configurable:!0,get:function(){return null!==this.T?this.T.Zp:Infinity},set:function(a){this.Nc();var b=this.T.Zp;b!==a&&(G&&A(a,"number",O,"toMaxLinks"),0>a&&Aa(a,">= 0",O,"toMaxLinks"),this.T.Zp=a,this.g("toMaxLinks",b,a))}},fromSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Vg:Dc},set:function(a){this.Nc();var b=this.T.Vg;b.B(a)||(G&& -x(a,Ib,O,"fromSpot"),a=a.L(),this.T.Vg=a,this.g("fromSpot",b,a),Rl(this))}},fromEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.Tg:10},set:function(a){this.Nc();var b=this.T.Tg;b!==a&&(G&&A(a,"number",O,"fromEndSegmentLength"),0>a&&Aa(a,">= 0",O,"fromEndSegmentLength"),this.T.Tg=a,this.g("fromEndSegmentLength",b,a),Rl(this))}},fromShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.Ug:0},set:function(a){this.Nc();var b=this.T.Ug; -b!==a&&(G&&A(a,"number",O,"fromShortLength"),this.T.Ug=a,this.g("fromShortLength",b,a),Rl(this))}},fromLinkable:{configurable:!0,get:function(){return null!==this.T?this.T.Yn:null},set:function(a){this.Nc();var b=this.T.Yn;b!==a&&(G&&null!==a&&A(a,"boolean",O,"fromLinkable"),this.T.Yn=a,this.g("fromLinkable",b,a))}},fromMaxLinks:{configurable:!0,get:function(){return null!==this.T?this.T.Zn:Infinity},set:function(a){this.Nc();var b=this.T.Zn;b!==a&&(G&&A(a,"number",O,"fromMaxLinks"), +c||c instanceof V||v("Cannot set portID on a Link: "+a);null!==b&&null!==c&&bm(c,this);this.np=a;null!==a&&null!==c&&(c.Te=!0,cm(c,this));this.g("portId",b,a)}}},toSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Ah:Dc},set:function(a){this.Oc();var b=this.T.Ah;b.B(a)||(G&&x(a,Ib,O,"toSpot"),a=a.L(),this.T.Ah=a,this.g("toSpot",b,a),Rl(this))}},toEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.yh:10},set:function(a){this.Oc(); +var b=this.T.yh;b!==a&&(G&&A(a,"number",O,"toEndSegmentLength"),0>a&&Aa(a,">= 0",O,"toEndSegmentLength"),this.T.yh=a,this.g("toEndSegmentLength",b,a),Rl(this))}},toShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.zh:0},set:function(a){this.Oc();var b=this.T.zh;b!==a&&(G&&A(a,"number",O,"toShortLength"),this.T.zh=a,this.g("toShortLength",b,a),Rl(this))}},toLinkable:{configurable:!0,get:function(){return null!==this.T?this.T.Yp:null},set:function(a){this.Oc(); +var b=this.T.Yp;b!==a&&(G&&null!==a&&A(a,"boolean",O,"toLinkable"),this.T.Yp=a,this.g("toLinkable",b,a))}},toMaxLinks:{configurable:!0,get:function(){return null!==this.T?this.T.Zp:Infinity},set:function(a){this.Oc();var b=this.T.Zp;b!==a&&(G&&A(a,"number",O,"toMaxLinks"),0>a&&Aa(a,">= 0",O,"toMaxLinks"),this.T.Zp=a,this.g("toMaxLinks",b,a))}},fromSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Vg:Dc},set:function(a){this.Oc();var b=this.T.Vg;b.B(a)||(G&& +x(a,Ib,O,"fromSpot"),a=a.L(),this.T.Vg=a,this.g("fromSpot",b,a),Rl(this))}},fromEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.Tg:10},set:function(a){this.Oc();var b=this.T.Tg;b!==a&&(G&&A(a,"number",O,"fromEndSegmentLength"),0>a&&Aa(a,">= 0",O,"fromEndSegmentLength"),this.T.Tg=a,this.g("fromEndSegmentLength",b,a),Rl(this))}},fromShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.Ug:0},set:function(a){this.Oc();var b=this.T.Ug; +b!==a&&(G&&A(a,"number",O,"fromShortLength"),this.T.Ug=a,this.g("fromShortLength",b,a),Rl(this))}},fromLinkable:{configurable:!0,get:function(){return null!==this.T?this.T.Yn:null},set:function(a){this.Oc();var b=this.T.Yn;b!==a&&(G&&null!==a&&A(a,"boolean",O,"fromLinkable"),this.T.Yn=a,this.g("fromLinkable",b,a))}},fromMaxLinks:{configurable:!0,get:function(){return null!==this.T?this.T.Zn:Infinity},set:function(a){this.Oc();var b=this.T.Zn;b!==a&&(G&&A(a,"number",O,"fromMaxLinks"), 0>a&&Aa(a,">= 0",O,"fromMaxLinks"),this.T.Zn=a,this.g("fromMaxLinks",b,a))}},cursor:{configurable:!0,get:function(){return this.ci},set:function(a){var b=this.ci;b!==a&&(A(a,"string",O,"cursor"),this.ci=a,this.g("cursor",b,a))}},click:{configurable:!0,get:function(){return null!==this.S?this.S.Hg:null},set:function(a){ol(this);var b=this.S.Hg;b!==a&&(null!==a&&A(a,"function",O,"click"),this.S.Hg=a,this.g("click",b,a))}},doubleClick:{configurable:!0,get:function(){return null!== this.S?this.S.Pg:null},set:function(a){ol(this);var b=this.S.Pg;b!==a&&(null!==a&&A(a,"function",O,"doubleClick"),this.S.Pg=a,this.g("doubleClick",b,a))}},contextClick:{configurable:!0,get:function(){return null!==this.S?this.S.Jg:null},set:function(a){ol(this);var b=this.S.Jg;b!==a&&(null!==a&&A(a,"function",O,"contextClick"),this.S.Jg=a,this.g("contextClick",b,a))}},mouseEnter:{configurable:!0,get:function(){return null!==this.S?this.S.eh:null},set:function(a){ol(this); var b=this.S.eh;b!==a&&(null!==a&&A(a,"function",O,"mouseEnter"),this.S.eh=a,this.g("mouseEnter",b,a))}},mouseLeave:{configurable:!0,get:function(){return null!==this.S?this.S.hh:null},set:function(a){ol(this);var b=this.S.hh;b!==a&&(null!==a&&A(a,"function",O,"mouseLeave"),this.S.hh=a,this.g("mouseLeave",b,a))}},mouseOver:{configurable:!0,get:function(){return null!==this.S?this.S.ih:null},set:function(a){ol(this);var b=this.S.ih;b!==a&&(null!==a&&A(a,"function",O,"mouseOver"), @@ -1033,7 +1033,7 @@ this.S?this.S.dh:null},set:function(a){ol(this);var b=this.S.dh;b!==a&&(null!==a b!==a&&(null!==a&&A(a,"function",O,"actionMove"),this.S.jn=a,this.g("actionMove",b,a))}},actionUp:{configurable:!0,get:function(){return null!==this.S?this.S.kn:null},set:function(a){ol(this);var b=this.S.kn;b!==a&&(null!==a&&A(a,"function",O,"actionUp"),this.S.kn=a,this.g("actionUp",b,a))}},actionCancel:{configurable:!0,get:function(){return null!==this.S?this.S.gn:null},set:function(a){ol(this);var b=this.S.gn;b!==a&&(null!==a&&A(a,"function",O,"actionCancel"),this.S.gn= a,this.g("actionCancel",b,a))}},toolTip:{configurable:!0,get:function(){return null!==this.S?this.S.Bh:null},set:function(a){ol(this);var b=this.S.Bh;b!==a&&(!G||null===a||a instanceof Je||a instanceof Oe||v("GraphObject.toolTip must be an Adornment or HTMLInfo."),this.S.Bh=a,this.g("toolTip",b,a))}},contextMenu:{configurable:!0,get:function(){return null!==this.S?this.S.Kg:null},set:function(a){ol(this);var b=this.S.Kg;b!==a&&(!G||a instanceof Je||a instanceof Oe||v("GraphObject.contextMenu must be an Adornment or HTMLInfo."), this.S.Kg=a,this.g("contextMenu",b,a))}}});O.prototype.trigger=O.prototype.tw;O.prototype.findBindingPanel=O.prototype.Jh;O.prototype.findTemplateBinder=O.prototype.nA;O.prototype.setProperties=O.prototype.Vm;O.prototype.apply=O.prototype.apply;O.prototype.attach=O.prototype.qv;O.prototype.set=O.prototype.set;O.prototype.isEnabledObject=O.prototype.Mf;O.prototype.isVisibleObject=O.prototype.Nf;O.prototype.isContainedBy=O.prototype.yg;O.prototype.getNearestIntersectionPoint=O.prototype.Vs; -O.prototype.getLocalPoint=O.prototype.Us;O.prototype.getDocumentScale=O.prototype.If;O.prototype.getDocumentAngle=O.prototype.Xi;O.prototype.getDocumentBounds=O.prototype.Yi;O.prototype.getDocumentPoint=O.prototype.ja;O.prototype.intersectsRect=O.prototype.Oc;O.prototype.containedInRect=O.prototype.Hh;O.prototype.containsRect=O.prototype.Qe;O.prototype.containsPoint=O.prototype.ca;O.prototype.raiseChanged=O.prototype.g;O.prototype.raiseChangedEvent=O.prototype.ab;O.prototype.addCopyProperty=O.prototype.Nx; +O.prototype.getLocalPoint=O.prototype.Us;O.prototype.getDocumentScale=O.prototype.If;O.prototype.getDocumentAngle=O.prototype.Xi;O.prototype.getDocumentBounds=O.prototype.Yi;O.prototype.getDocumentPoint=O.prototype.ja;O.prototype.intersectsRect=O.prototype.Pc;O.prototype.containedInRect=O.prototype.Hh;O.prototype.containsRect=O.prototype.Qe;O.prototype.containsPoint=O.prototype.ca;O.prototype.raiseChanged=O.prototype.g;O.prototype.raiseChangedEvent=O.prototype.ab;O.prototype.addCopyProperty=O.prototype.Nx; var Wl=null;O.className="GraphObject";Wl=new xb; Zl("Button",function(){function a(a,b){return null!==a.diagram.ac(a.documentPoint,function(a){for(;null!==a.panel&&!a.isActionable;)a=a.panel;return a},function(a){return a===b})}var b=Vl(W,W.Auto,{isActionable:!0,enabledChanged:function(a,b){if(a instanceof W){var c=a.eb("ButtonBorder");null!==c&&(c.fill=b?a._buttonFillNormal:a._buttonFillDisabled)}},cursor:"pointer",_buttonFillNormal:"#F5F5F5",_buttonStrokeNormal:"#BDBDBD",_buttonFillOver:"#E0E0E0",_buttonStrokeOver:"#9E9E9E",_buttonFillPressed:"#BDBDBD", _buttonStrokePressed:"#9E9E9E",_buttonFillDisabled:"#E5E5E5"},Vl(Hf,{name:"ButtonBorder",figure:"RoundedRectangle",spot1:new Ib(0,0,2.76142374915397,2.761423749153969),spot2:new Ib(1,1,-2.76142374915397,-2.761423749153969),parameter1:2,parameter2:2,fill:"#F5F5F5",stroke:"#BDBDBD"}));b.mouseEnter=function(a,b){if(b.Mf()&&b instanceof W&&(a=b.eb("ButtonBorder"),a instanceof Hf)){var c=b._buttonFillOver;b._buttonFillNormal=a.fill;a.fill=c;c=b._buttonStrokeOver;b._buttonStrokeNormal=a.stroke;a.stroke= @@ -1061,42 +1061,42 @@ function Kj(a,b){this.ownerDocument=a=void 0===b?sa.document:b;this.YA="http://w Kj.prototype.resize=function(a,b,c,d){return this.width!==a||this.height!==b?(this.style.width=c+"px",this.style.height=d+"px",this.Qa.setAttributeNS(null,"width",c+"px"),this.Qa.setAttributeNS(null,"height",d+"px"),this.Qa.setAttributeNS(null,"viewBox","0 0 "+c+" "+d),this.context.ox.firstElementChild.setAttributeNS(null,"width",c+"px"),this.context.ox.firstElementChild.setAttributeNS(null,"height",d+"px"),!0):!1}; Kj.prototype.Tb=function(a,b,c){a=this.ownerDocument.createElementNS(this.YA,a);if(Ga(b))for(var d in b)a.setAttributeNS("href"===d?"http://www.w3.org/1999/xlink":"",d,b[d]);void 0!==c&&(a.textContent=c);return a};Kj.prototype.getBoundingClientRect=function(){return this.Qa.getBoundingClientRect()};Kj.prototype.focus=function(){this.Qa.focus()};Kj.prototype.by=function(){this.ownerDocument=null}; oa.Object.defineProperties(Kj.prototype,{width:{configurable:!0,get:function(){return this.Qa.width.baseVal.value},set:function(a){this.Qa.width=a}},height:{configurable:!0,get:function(){return this.Qa.height.baseVal.value},set:function(a){this.Qa.height=a}},style:{configurable:!0,get:function(){return this.Qa.style}}});Kj.className="SVGSurface"; -function fm(a){this.wt=a;this.svg=a.Qa;this.stack=[];this.kd=[];this.fillStyle="#000000";this.font="10px sans-serif";this.globalAlpha=1;this.lineCap="butt";this.lineDashOffset=0;this.lineJoin="miter";this.lineWidth=1;this.miterLimit=10;this.shadowBlur=0;this.shadowColor="rgba(0, 0, 0, 0)";this.shadowOffsetY=this.shadowOffsetX=0;this.strokeStyle="#000000";this.textAlign="start";this.clipInsteadOfFill=!1;this.ng=this.ts=this.ss=0;this.dt=null;this.path=[];this.ku=!1;this.th=null;this.uh=0;this.Re=new dm; -gm(this,1,0,0,1,0,0);var b=pb++,c=this.Tb("clipPath",{id:"mainClip"+b});c.appendChild(this.Tb("rect",{x:0,y:0,width:a.width,height:a.height}));this.ox=c;this.wt.Qa.appendChild(c);this.kd[0].setAttributeNS(null,"clip-path","url(#mainClip"+b+")");this.$A={}}t=fm.prototype; +function fm(a){this.wt=a;this.svg=a.Qa;this.stack=[];this.ld=[];this.fillStyle="#000000";this.font="10px sans-serif";this.globalAlpha=1;this.lineCap="butt";this.lineDashOffset=0;this.lineJoin="miter";this.lineWidth=1;this.miterLimit=10;this.shadowBlur=0;this.shadowColor="rgba(0, 0, 0, 0)";this.shadowOffsetY=this.shadowOffsetX=0;this.strokeStyle="#000000";this.textAlign="start";this.clipInsteadOfFill=!1;this.ng=this.ts=this.ss=0;this.dt=null;this.path=[];this.ku=!1;this.th=null;this.uh=0;this.Re=new dm; +gm(this,1,0,0,1,0,0);var b=qb++,c=this.Tb("clipPath",{id:"mainClip"+b});c.appendChild(this.Tb("rect",{x:0,y:0,width:a.width,height:a.height}));this.ox=c;this.wt.Qa.appendChild(c);this.ld[0].setAttributeNS(null,"clip-path","url(#mainClip"+b+")");this.$A={}}t=fm.prototype; t.arc=function(a,b,c,d,e,f,g,h){var k=2*Math.PI,l=k-1E-6,m=c*Math.cos(d),n=c*Math.sin(d),p=a+m,r=b+n,q=f?0:1;d=f?d-e:e-d;(1E-6d&&(d=d%k+k);d>l?(this.path.push(["A",c,c,0,1,q,a-m,b-n]),this.path.push(["A",c,c,0,1,q,p,r])):1E-6=Math.PI),q,a+c*Math.cos(e),b+c*Math.sin(e)])};t.beginPath=function(){this.path=[]};t.bezierCurveTo=function(a,b,c,d,e,f){this.path.push(["C",a,b,c,d,e,f])};t.clearRect=function(){}; t.clip=function(){this.addPath("clipPath",this.path,this.Re)};t.closePath=function(){this.path.push(["z"])};t.createLinearGradient=function(a,b,c,d){var e=new em("linear");e.x1=a;e.y1=b;e.x2=c;e.y2=d;return e}; -t.createPattern=function(a){var b="";a instanceof HTMLCanvasElement&&(b=a.toDataURL());a instanceof HTMLImageElement&&(b=a.getAttribute("src"));var c=this.$A;if(c[b])return"url(#"+c[b]+")";var d="PATTERN"+pb++,e={x:0,y:0,width:a.width,height:a.height,href:b};a=this.Tb("pattern",{width:a.width,height:a.height,id:d,patternUnits:"userSpaceOnUse"});a.appendChild(this.Tb(Mk,e));this.svg.appendChild(a);c[b]=d;return"url(#"+d+")"}; +t.createPattern=function(a){var b="";a instanceof HTMLCanvasElement&&(b=a.toDataURL());a instanceof HTMLImageElement&&(b=a.getAttribute("src"));var c=this.$A;if(c[b])return"url(#"+c[b]+")";var d="PATTERN"+qb++,e={x:0,y:0,width:a.width,height:a.height,href:b};a=this.Tb("pattern",{width:a.width,height:a.height,id:d,patternUnits:"userSpaceOnUse"});a.appendChild(this.Tb(Mk,e));this.svg.appendChild(a);c[b]=d;return"url(#"+d+")"}; t.createRadialGradient=function(a,b,c,d,e,f){var g=new em("radial");g.x1=a;g.y1=b;g.r1=c;g.x2=d;g.y2=e;g.r2=f;return g}; t.drawImage=function(a,b,c,d,e,f,g,h,k){var l="";a instanceof HTMLCanvasElement&&(l=a.toDataURL());a instanceof HTMLImageElement&&(l=a.getAttribute("src"));var m=a instanceof HTMLImageElement?a.naturalWidth:a.width,n=a instanceof HTMLImageElement?a.naturalHeight:a.height;void 0===d&&(f=b,g=c,h=d=m,k=e=n);d=d||0;e=e||0;f=f||0;g=g||0;h=h||0;k=k||0;a={x:0,y:0,width:m||d,height:n||e,href:l};L.da(d,h)&&L.da(e,k)?-1===l.toLowerCase().indexOf(".svg")&&-1===l.toLowerCase().indexOf("data:image/svg")&&(a.preserveAspectRatio= -"xMidYMid slice"):a.preserveAspectRatio="none";l="";h/=d;k/=e;if(0!==f||0!==g)l+=" translate("+f+", "+g+")";if(1!==h||1!==k)l+=" scale("+h+", "+k+")";if(0!==b||0!==c)l+=" translate("+-b+", "+-c+")";if(0!==b||0!==c||d!==m||e!==n)f="CLIP"+pb++,g=this.Tb("clipPath",{id:f}),g.appendChild(this.Tb("rect",{x:b,y:c,width:d,height:e})),this.svg.appendChild(g),a["clip-path"]="url(#"+f+")";hm(this,Mk,a,this.Re,l);this.addElement(Mk,a)};t.fill=function(){this.addPath("fill",this.path,this.Re)}; +"xMidYMid slice"):a.preserveAspectRatio="none";l="";h/=d;k/=e;if(0!==f||0!==g)l+=" translate("+f+", "+g+")";if(1!==h||1!==k)l+=" scale("+h+", "+k+")";if(0!==b||0!==c)l+=" translate("+-b+", "+-c+")";if(0!==b||0!==c||d!==m||e!==n)f="CLIP"+qb++,g=this.Tb("clipPath",{id:f}),g.appendChild(this.Tb("rect",{x:b,y:c,width:d,height:e})),this.svg.appendChild(g),a["clip-path"]="url(#"+f+")";hm(this,Mk,a,this.Re,l);this.addElement(Mk,a)};t.fill=function(){this.addPath("fill",this.path,this.Re)}; t.Gf=function(){this.clipInsteadOfFill?this.clip():this.fill()};t.fillRect=function(a,b,c,d){a=[a,b,c,d];a={x:a[0],y:a[1],width:a[2],height:a[3]};hm(this,"fill",a,this.Re);this.addElement("rect",a)};t.fillText=function(a,b,c){a=[a,b,c];b=this.textAlign;"left"===b?b="start":"right"===b?b="end":"center"===b&&(b="middle");b={x:a[1],y:a[2],style:"font: "+this.font,"text-anchor":b};hm(this,"fill",b,this.Re);this.addElement("text",b,a[0])};t.lineTo=function(a,b){this.path.push(["L",a,b])}; t.moveTo=function(a,b){this.path.push(["M",a,b])};t.quadraticCurveTo=function(a,b,c,d){this.path.push(["Q",a,b,c,d])};t.rect=function(a,b,c,d){this.path.push(["M",a,b],["L",a+c,b],["L",a+c,b+d],["L",a,b+d],["z"])}; t.restore=function(){this.Re=this.stack.pop();this.path=this.stack.pop();var a=this.stack.pop();this.fillStyle=a.fillStyle;this.font=a.font;this.globalAlpha=a.globalAlpha;this.lineCap=a.lineCap;this.lineDashOffset=a.lineDashOffset;this.lineJoin=a.lineJoin;this.lineWidth=a.lineWidth;this.miterLimit=a.miterLimit;this.shadowBlur=a.shadowBlur;this.shadowColor=a.shadowColor;this.shadowOffsetX=a.shadowOffsetX;this.shadowOffsetY=a.shadowOffsetY;this.strokeStyle=a.strokeStyle;this.textAlign=a.textAlign}; t.save=function(){this.stack.push({fillStyle:this.fillStyle,font:this.font,globalAlpha:this.globalAlpha,lineCap:this.lineCap,lineDashOffset:this.lineDashOffset,lineJoin:this.lineJoin,lineWidth:this.lineWidth,miterLimit:this.miterLimit,shadowBlur:this.shadowBlur,shadowColor:this.shadowColor,shadowOffsetX:this.shadowOffsetX,shadowOffsetY:this.shadowOffsetY,strokeStyle:this.strokeStyle,textAlign:this.textAlign});for(var a=[],b=0;bb.offset?1:-1});for(e=0;eg.width+g.x||g.x> k.width+k.x||n>g.height+g.y||g.y>k.height+k.y)return!0;k=!0;gm(a,1,0,0,1,0,0);a.save();a.beginPath();a.rect(m,n,p,l);a.clip()}if(this.dj()&&!this.isVisible())return!0;a.Re.Sa=[1,0,0,1,0,0];(this instanceof Yg&&1b?(this.scale(b/a,1),this.translate((a-b)/2,0)):b>a&&(this.scale(1,a/b),this.translate(0,(b-a)/2));this.vn?this.clip():this.fill();a>b?(this.translate(-(a-b)/2,0),this.scale(1/(b/a),1)):b>a&&(this.translate(0,-(b-a)/2),this.scale(1,1/(a/b)))}else this.vn?this.clip():this.fill()};t.jj=function(){this.vn||this.stroke()};t.pw=function(a,b,c){this.ss=a;this.ts=b;this.ng=c}; t.Ns=function(a,b){var c=this.aa;void 0!==c.setLineDash&&(c.setLineDash(a),c.lineDashOffset=b)};t.Ls=function(){var a=this.aa;void 0!==a.setLineDash&&(a.setLineDash(jm),a.lineDashOffset=0)};t.Kc=function(a){a&&(this.Lt="");this.Kt=this.Mt=""}; oa.Object.defineProperties(Il.prototype,{fillStyle:{configurable:!0,get:function(){return this.aa.fillStyle},set:function(a){this.Kt!==a&&(this.Kt=this.aa.fillStyle=a)}},font:{configurable:!0,get:function(){return this.aa.font},set:function(a){this.Lt!==a&&(this.Lt=this.aa.font=a)}},globalAlpha:{configurable:!0,get:function(){return this.aa.globalAlpha},set:function(a){this.aa.globalAlpha=a}},lineCap:{configurable:!0,get:function(){return this.aa.lineCap}, @@ -1104,8 +1104,8 @@ set:function(a){this.aa.lineCap=a}},lineDashOffset:{configurable:!0,get:function a}},shadowBlur:{configurable:!0,get:function(){return this.aa.shadowBlur},set:function(a){this.aa.shadowBlur=a}},shadowColor:{configurable:!0,get:function(){return this.aa.shadowColor},set:function(a){this.aa.shadowColor=a}},shadowOffsetX:{configurable:!0,get:function(){return this.aa.shadowOffsetX},set:function(a){this.aa.shadowOffsetX=a}},shadowOffsetY:{configurable:!0,get:function(){return this.aa.shadowOffsetY},set:function(a){this.aa.shadowOffsetY= a}},strokeStyle:{configurable:!0,get:function(){return this.aa.strokeStyle},set:function(a){this.Mt!==a&&(this.Mt=this.aa.strokeStyle=a)}},textAlign:{configurable:!0,get:function(){return this.aa.textAlign},set:function(a){this.aa.textAlign=a}},imageSmoothingEnabled:{configurable:!0,get:function(){return this.aa.imageSmoothingEnabled},set:function(a){this.aa.imageSmoothingEnabled=a}},clipInsteadOfFill:{configurable:!0,get:function(){return this.vn}, set:function(a){this.vn=a}}});var jm=Object.freeze([]);Il.className="CanvasSurfaceContext";function km(){this.P=this.o=this.F=this.j=0}km.className="ColorNumbers"; -function Al(a,b){lm||(mm(),lm=!0);ab(this);this.u=!1;void 0===a?(this.oa=Hl,this.al="black"):"string"===typeof a?(this.oa=Hl,G&&!nm(a)&&v('Color "'+a+'" is not a valid color string for Brush constructor'),this.al=a):(G&&cb(a,Al,Al,"constructor:type"),this.oa=a,this.al="black");a=this.oa;a===Kl?(this.Fd=Fc,this.ol=Nc):this.ol=a===Bl?this.Fd=Kc:this.Fd=Dc;this.ws=0;this.xr=NaN;this.ue=this.hs=this.te=null;this.Nt=this.bl=0;b&&Object.assign(this,b)} -Al.prototype.copy=function(){var a=new Al;a.oa=this.oa;a.al=this.al;a.Fd=this.Fd.L();a.ol=this.ol.L();a.ws=this.ws;a.xr=this.xr;null!==this.te&&(a.te=this.te.copy());a.hs=this.hs;return a};t=Al.prototype;t.freeze=function(){this.u=!0;null!==this.te&&this.te.freeze();return this};t.ka=function(){Object.isFrozen(this)&&v("cannot thaw constant: "+this);this.u=!1;null!==this.te&&this.te.ka();return this};t.mb=function(a){a.classType===Al?this.type=a:Ea(this,a)}; +function Al(a,b){lm||(mm(),lm=!0);ab(this);this.u=!1;void 0===a?(this.oa=Hl,this.al="black"):"string"===typeof a?(this.oa=Hl,G&&!nm(a)&&v('Color "'+a+'" is not a valid color string for Brush constructor'),this.al=a):(G&&cb(a,Al,Al,"constructor:type"),this.oa=a,this.al="black");a=this.oa;a===Kl?(this.Gd=Fc,this.ol=Nc):this.ol=a===Bl?this.Gd=Kc:this.Gd=Dc;this.ws=0;this.xr=NaN;this.ue=this.hs=this.te=null;this.Nt=this.bl=0;b&&Object.assign(this,b)} +Al.prototype.copy=function(){var a=new Al;a.oa=this.oa;a.al=this.al;a.Gd=this.Gd.L();a.ol=this.ol.L();a.ws=this.ws;a.xr=this.xr;null!==this.te&&(a.te=this.te.copy());a.hs=this.hs;return a};t=Al.prototype;t.freeze=function(){this.u=!0;null!==this.te&&this.te.freeze();return this};t.ka=function(){Object.isFrozen(this)&&v("cannot thaw constant: "+this);this.u=!1;null!==this.te&&this.te.ka();return this};t.mb=function(a){a.classType===Al?this.type=a:Ea(this,a)}; t.toString=function(){var a="Brush(";if(this.type===Hl)a+=this.color;else if(a=this.type===Kl?a+"Linear ":this.type===Bl?a+"Radial ":this.type===Jl?a+"Pattern ":a+"(unknown) ",a+=this.start+" "+this.end,null!==this.colorStops)for(var b=this.colorStops.iterator;b.next();)a+=" "+b.key+":"+b.value;return a+")"}; t.addColorStop=function(a,b){this.u&&xa(this);("number"!==typeof a||!isFinite(a)||1a)&&Aa(a,"0 <= loc <= 1",Al,"addColorStop:loc");A(b,"string",Al,"addColorStop:color");G&&!nm(b)&&v('Color "'+b+'" is not a valid color string for Brush.addColorStop');null===this.te&&(this.te=new xb);this.te.add(a,b);this.oa===Hl&&(this.type=Kl);this.ue=null;return this}; function nm(a){if("black"===a)return!0;if(""===a)return!1;G&&A(a,"string",Al,"isValidColor");lm||(mm(),lm=!0);var b=om;if(null===b)return!0;b.fillStyle="#000000";var c=b.fillStyle;b.fillStyle=a;if(b.fillStyle!==c)return!0;b.fillStyle="#FFFFFF";c=b.fillStyle;b.fillStyle=a;return b.fillStyle!==c} @@ -1120,7 +1120,7 @@ ei.P+")";default:v("Unknown color space: "+b)}}function ci(a){lm||(mm(),lm=!0);v function di(){var a=um.j/255,b=um.F/255,c=um.o/255,d=Math.max(a,b,c),e=Math.min(a,b,c),f=d-e;e=(d+e)/2;if(0===f)var g=a=0;else{switch(d){case a:g=(b-c)/f%6;break;case b:g=(c-a)/f+2;break;case c:g=(a-b)/f+4}g*=60;0>g&&(g+=360);a=f/(1-Math.abs(2*e-1))}ei.j=Math.round(g);ei.F=Math.round(100*a);ei.o=Math.round(100*e);ei.P=um.P}function wm(a){a/=255;return.04045>=a?a/12.92:Math.pow((a+.055)/1.055,2.4)}function Em(a){return.0031308>=a?12.92*a:1.055*Math.pow(a,1/2.4)-.055} function ym(a){return a>Dm?Math.pow(a,1/3):(Cm*a+16)/116}function Bm(a){var b=a*a*a;return b>Dm?b:(116*a-16)/Cm}function am(a,b){"string"===typeof a?G&&!nm(a)&&v('Color "'+a+'" is not a valid color string for '+b):a instanceof Al||v("Value for "+b+" must be a color string or a Brush, not "+a)}function mm(){om=Wg?(new Nk(null)).context:null} oa.Object.defineProperties(Al.prototype,{type:{configurable:!0,get:function(){return this.oa},set:function(a){this.u&&xa(this,a);cb(a,Al,Al,"type");this.oa=a;this.start.bc()&&(a===Kl?this.start=Fc:a===Bl&&(this.start=Kc));this.end.bc()&&(a===Kl?this.end=Nc:a===Bl&&(this.end=Kc));this.ue=null}},color:{configurable:!0,get:function(){return this.al},set:function(a){this.u&&xa(this,a);G&&!nm(a)&&v('Color "'+a+'" is not a valid color string for Brush.color');this.al=a;this.ue= -null}},start:{configurable:!0,get:function(){return this.Fd},set:function(a){this.u&&xa(this,a);x(a,Ib,Al,"start");this.Fd=a.L();this.ue=null}},end:{configurable:!0,get:function(){return this.ol},set:function(a){this.u&&xa(this,a);x(a,Ib,Al,"end");this.ol=a.L();this.ue=null}},startRadius:{configurable:!0,get:function(){return this.ws},set:function(a){this.u&&xa(this,a);D(a,Al,"startRadius");0>a&&Aa(a,">= zero",Al,"startRadius");this.ws=a;this.ue=null}},endRadius:{configurable:!0, +null}},start:{configurable:!0,get:function(){return this.Gd},set:function(a){this.u&&xa(this,a);x(a,Ib,Al,"start");this.Gd=a.L();this.ue=null}},end:{configurable:!0,get:function(){return this.ol},set:function(a){this.u&&xa(this,a);x(a,Ib,Al,"end");this.ol=a.L();this.ue=null}},startRadius:{configurable:!0,get:function(){return this.ws},set:function(a){this.u&&xa(this,a);D(a,Al,"startRadius");0>a&&Aa(a,">= zero",Al,"startRadius");this.ws=a;this.ue=null}},endRadius:{configurable:!0, enumerable:!0,get:function(){return this.xr},set:function(a){this.u&&xa(this,a);D(a,Al,"endRadius");0>a&&Aa(a,">= zero",Al,"endRadius");this.xr=a;this.ue=null}},colorStops:{configurable:!0,get:function(){return this.te},set:function(a){this.u&&xa(this,a);G&&x(a,xb,Al,"colorStops");this.te=a;this.ue=null}},pattern:{configurable:!0,get:function(){return this.hs},set:function(a){this.u&&xa(this,a);this.hs=a;this.ue=null}}});Al.prototype.isDark=Al.prototype.Ay; Al.prototype.darkenBy=Al.prototype.Rz;Al.prototype.lightenBy=Al.prototype.RA;Al.prototype.addColorStop=Al.prototype.addColorStop;var Dm=216/24389,Cm=24389/27,zm=[95.047,100,108.883],om=null,um=new km,ei=new km,xm=new km,Am=new km,lm=!1;Al.className="Brush";var Hl;Al.Solid=Hl=new F(Al,"Solid",0);var Kl;Al.Linear=Kl=new F(Al,"Linear",1);var Bl;Al.Radial=Bl=new F(Al,"Radial",2);var Jl;Al.Pattern=Jl=new F(Al,"Pattern",4);var pm;Al.Lab=pm=new F(Al,"Lab",5);var Fm;Al.HSL=Fm=new F(Al,"HSL",6); Al.randomColor=function(a,b){void 0===a&&(a=128);G&&(D(a,Al,"randomColor:min"),(0>a||255b.length&&(b="0"+b);2>d.length&&(d="0"+d);2>a.length&&(a="0"+a);return"#"+b+d+ @@ -1151,29 +1151,29 @@ Mm.prototype.arrange=function(a,b){var c=b.length,d=a.sb(),e=d.measuredBounds,f= p.Kb()&&(p=a.defaultAlignment),p.fb()||(p=Kc),k=f.width*p.x+p.offsetX-k*p.x+g.left+f.x,g=f.height*p.y+p.offsetY-m*p.y+g.top+f.y,h.visible&&(nc(f.x,f.y,f.width,f.height,k,g,l.width,l.height)?h.arrange(k,g,l.width,l.height):h.arrange(k,g,l.width,l.height,new M(f.x,f.y,f.width,f.height))));M.free(f)};function Pm(){this.ta="Base";this.name="Table"}na(Pm,Yl); Pm.prototype.measure=function(a,b,c,d,e){for(var f=d.length,g=Ma(),h=Ma(),k=0;kaa&&(Xa=Math.max(aa-Gc,0));var Ag=0===P.ma;P.fc=P.fc+Xa;P.actual=P.ma+Xa;aa=Math.max(aa-(Xa+(Ag?Gc:0)),0)}if(1===Jb.columnSpan&&(tb===tg||tb===jl)){P=a.getColumnDefinition(jc);var Hh=P.Lc();Xa=Math.max(zc-P.actual,0);Xa+Hh>S&&(Xa=Math.max(S-Hh,0));var Rn=0===P.ma;P.fc=P.fc+Xa;P.actual=P.ma+Xa;S=Math.max(S-(Xa+(Rn?Hh:0)),0)}ye&&Jb.Ak()}}}}}Pa(z); -var Wd=0,ze=0;f=a.columnCount;for(var Bg=0;Bg= -a.rowCount);Sf++)P=a.getRowDefinition(Za.row+Sf),Xa=0,Xa=tb===Fd||tb===jl?Math.max(P.minimum,0===Be[Za.row+Sf]?P.maximum:Math.min(Be[Za.row+Sf],P.maximum)):Math.max(P.minimum,isNaN(P.yc)?P.maximum:Math.min(P.yc,P.maximum)),ad.height+=Xa,ae+=P.minimum;for(var Dd=1;Dd=a.columnCount);Dd++)P=a.getColumnDefinition(Za.column+Dd),Xa=0,Xa=tb===Fd||tb===il?Math.max(P.minimum,0===Cd[Za.column+Dd]?P.maximum:Math.min(Cd[Za.column+Dd],P.maximum)):Math.max(P.minimum,isNaN(P.yc)?P.maximum: -Math.min(P.yc,P.maximum)),ad.width+=Xa,Lh+=P.minimum;ob.width+=ad.width;ob.height+=ad.height;var Tf=Za.margin,Ti=Tf.right+Tf.left,De=Tf.top+Tf.bottom;Za.measure(ob.width,ob.height,Lh,ae);for(var Dg=Za.measuredBounds,Uf=Math.max(Dg.width+Ti,0),Ui=Math.max(Dg.height+De,0),qf=0,kd=0;kd=a.rowCount);kd++)P=a.getRowDefinition(Za.row+kd),qf+=P.total||0;if(qf=Ed)&&!(Za.row+ +void 0!==P&&(P.actual=0)}Y=a.Db;f=Y.length;for(var ma=0;maaa&&(Xa=Math.max(aa-Gc,0));var Ag=0===P.ma;P.fc=P.fc+Xa;P.actual=P.ma+Xa;aa=Math.max(aa-(Xa+(Ag?Gc:0)),0)}if(1===Jb.columnSpan&&(ob===tg||ob===jl)){P=a.getColumnDefinition(jc);var Hh=P.Mc();Xa=Math.max(zc-P.actual,0);Xa+Hh>S&&(Xa=Math.max(S-Hh,0));var Rn=0===P.ma;P.fc=P.fc+Xa;P.actual=P.ma+Xa;S=Math.max(S-(Xa+(Rn?Hh:0)),0)}ye&&Jb.Ak()}}}}}Pa(z); +var Wd=0,ze=0;f=a.columnCount;for(var Bg=0;Bg= +a.rowCount);Sf++)P=a.getRowDefinition(Za.row+Sf),Xa=0,Xa=ob===Fd||ob===jl?Math.max(P.minimum,0===Be[Za.row+Sf]?P.maximum:Math.min(Be[Za.row+Sf],P.maximum)):Math.max(P.minimum,isNaN(P.yc)?P.maximum:Math.min(P.yc,P.maximum)),ad.height+=Xa,ae+=P.minimum;for(var Dd=1;Dd=a.columnCount);Dd++)P=a.getColumnDefinition(Za.column+Dd),Xa=0,Xa=ob===Fd||ob===il?Math.max(P.minimum,0===Cd[Za.column+Dd]?P.maximum:Math.min(Cd[Za.column+Dd],P.maximum)):Math.max(P.minimum,isNaN(P.yc)?P.maximum: +Math.min(P.yc,P.maximum)),ad.width+=Xa,Lh+=P.minimum;pb.width+=ad.width;pb.height+=ad.height;var Tf=Za.margin,Ti=Tf.right+Tf.left,De=Tf.top+Tf.bottom;Za.measure(pb.width,pb.height,Lh,ae);for(var Dg=Za.measuredBounds,Uf=Math.max(Dg.width+Ti,0),Ui=Math.max(Dg.height+De,0),qf=0,kd=0;kd=a.rowCount);kd++)P=a.getRowDefinition(Za.row+kd),qf+=P.total||0;if(qf=Ed)&&!(Za.row+ Ee>=a.rowCount);Ee++){P=a.getRowDefinition(Za.row+Ee);var Pd=P.ma||0,Mh=Wf(Za,P,Vf);G&&"number"!==typeof Mh&&v(Za+" spanAllocation does not return a number: "+Mh);P.actual=Math.min(P.maximum,Pd+Mh);P.ma!==Pd&&(Ed-=P.ma-Pd)}for(;0Ve&&(P.actual=Math.min(P.maximum,Ve+Ed),P.ma!==Ve&&(Ed-=P.ma-Ve));if(0===P.index)break;P=a.getRowDefinition(P.index-1)}}for(var Nh=0,Oh=0;Oh=a.columnCount);Oh++)P=a.getColumnDefinition(Za.column+ Oh),Nh+=P.total||0;if(Nh=ld)&&!(Za.column+Ph>=a.columnCount);Ph++){P=a.getColumnDefinition(Za.column+Ph);var Tn=P.ma||0,Un=Sn(Za,P,Vi);G&&"number"!==typeof Un&&v(Za+" spanAllocation does not return a number: "+Un);P.actual=Math.min(P.maximum,Tn+Un);P.ma!==Tn&&(ld-=P.ma-Tn)}for(;0xk&&(P.actual=Math.min(P.maximum,xk+ld),P.ma!==xk&&(ld-=P.ma-xk)); -if(0===P.index)break;P=a.getColumnDefinition(P.index-1)}}}}Pa(B);Hb.free(ad);Hb.free(ob);void 0!==Be&&Pa(Be);void 0!==Cd&&Pa(Cd);var Eg=0,Fg=0,yk=a.desiredSize,wr=a.maxSize;tb=vl(a,!0);var Wi=ze=Wd=0,Xi=0;f=a.columnCount;for(var zk=0;zk=a.rowCount);Y++){var T=a.getRowDefinition(w+ -Y);0!==T.ma&&(u.height+=T.total)}for(Y=1;Y=a.columnCount);Y++)T=a.getColumnDefinition(z+Y),0!==T.ma&&(u.width+=T.total);var P=B.ma+u.width,ma=y.ma+u.height;Y=h;T=k;var ia=P,Ba=ma,Na=h,rb=k,sb=P,Xa=ma;h+P>c.width&&(sb=Math.max(c.width-h,0));k+ma>c.height&&(Xa=Math.max(c.height-k,0));var Pb=S.alignment;if(Pb.Kb()){Pb=a.defaultAlignment;Pb.fb()||(Pb=Kc);var Ub=Pb.x;var jd=Pb.y;var jc=Pb.offsetX;Pb=Pb.offsetY;var yc=B.alignment,Oc=y.alignment;yc.fb()&&(Ub=yc.x,jc=yc.offsetX);Oc.fb()&& +Y);0!==T.ma&&(u.height+=T.total)}for(Y=1;Y=a.columnCount);Y++)T=a.getColumnDefinition(z+Y),0!==T.ma&&(u.width+=T.total);var P=B.ma+u.width,ma=y.ma+u.height;Y=h;T=k;var ia=P,Ba=ma,Na=h,sb=k,tb=P,Xa=ma;h+P>c.width&&(tb=Math.max(c.width-h,0));k+ma>c.height&&(Xa=Math.max(c.height-k,0));var Pb=S.alignment;if(Pb.Kb()){Pb=a.defaultAlignment;Pb.fb()||(Pb=Kc);var Ub=Pb.x;var jd=Pb.y;var jc=Pb.offsetX;Pb=Pb.offsetY;var yc=B.alignment,Oc=y.alignment;yc.fb()&&(Ub=yc.x,jc=yc.offsetX);Oc.fb()&& (jd=Oc.y,Pb=Oc.offsetY)}else Ub=Pb.x,jd=Pb.y,jc=Pb.offsetX,Pb=Pb.offsetY;if(isNaN(Ub)||isNaN(jd))jd=Ub=.5,Pb=jc=0;yc=aa.width;Oc=aa.height;var xe=S.margin,Nf=xe.left+xe.right,Jb=xe.top+xe.bottom,ye=Ol(S,y,B,!1);!isNaN(S.desiredSize.width)||ye!==Fd&&ye!==il||(yc=Math.max(P-Nf,0));!isNaN(S.desiredSize.height)||ye!==Fd&&ye!==jl||(Oc=Math.max(ma-Jb,0));P=S.maxSize;ma=S.minSize;yc=Math.min(P.width,yc);Oc=Math.min(P.height,Oc);yc=Math.max(ma.width,yc);Oc=Math.max(ma.height,Oc);P=Oc+Jb;Y+=ia*Ub-(yc+Nf)* -Ub+jc+xe.left;T+=Ba*jd-P*jd+Pb+xe.top;S.visible&&(nc(Na,rb,sb,Xa,Y,T,aa.width,aa.height)?S.arrange(Y,T,yc,Oc):S.arrange(Y,T,yc,Oc,new M(Na,rb,sb,Xa)))}}Hb.free(u);for(a=0;ab)return a%b===c;if(a%b!==c)return!1;b=d.length;for(var e=0;en)z.measure(Infinity,Infinity,0,0),B=z.measuredBounds,b.Tc(B),q.push(B);else{var C=z.segmentIndex,E=z.segmentFraction,J=z.alignmentFocus;J.bc()&&(J=Kc);var S=z.segmentOrientation,aa=z.segmentOffset;if(isNaN(C)){var Y=h.sa;B=Ma();Y.Kv(E,B);var T=K.allocAt(B[0],B[1]);T.add(h.i(0)); +k&&(Ym(a,p,r,k),g=k.measuredBounds,b.Uc(g),q.push(g));g=Kb.alloc();for(var u=K.alloc(),w=K.alloc(),y=0;yn)z.measure(Infinity,Infinity,0,0),B=z.measuredBounds,b.Uc(B),q.push(B);else{var C=z.segmentIndex,E=z.segmentFraction,J=z.alignmentFocus;J.bc()&&(J=Kc);var S=z.segmentOrientation,aa=z.segmentOffset;if(isNaN(C)){var Y=h.sa;B=Ma();Y.Kv(E,B);var T=K.allocAt(B[0],B[1]);T.add(h.i(0)); Y.type===N.j?T.offset(-Y.startX,-Y.startY):(Y=Y.figures.first(),null!==Y&&T.offset(-Y.startX,-Y.startY));Y=B[2];if(S!==hg){var P=h.computeAngle(z,S,Y);z.Cb=P}P=T.x-l.x;var ma=T.y-l.y;K.free(T);Pa(B)}else if(C<-n||C>=n)B=K.alloc(),h.Bg(),h.computeMidPoint(B),Y=h.midAngle,S!==hg&&(P=h.computeAngle(z,S,Y),z.Cb=P),P=B.x-l.x,ma=B.y-l.y,K.free(B);else{P=0;0<=C?(ma=m.M(C),B=Cia+10?0<=C?Y.Ua(ma):ma.Ua(Y):ia>T+10?0<=C?B.Ua(P):P.Ua(B):0<=C?Y.Ua(P):P.Ua(Y)}else Y=0<=C?ma.Ua(B):B.Ua(ma);S!==hg&&(P=h.computeAngle(z,S,Y),z.Cb=P);P=ma.x+(B.x-ma.x)*E-l.x;ma=ma.y+(B.y-ma.y)*E-l.y}z.measure(Infinity,Infinity,0,0);B=z.measuredBounds;T=z.naturalBounds;var Ba=0;z instanceof Hf&&(Ba=z.strokeWidth);ia=T.width+Ba;var Na=T.height+Ba;g.reset();g.translate(-B.x,-B.y);g.scale(z.scale,z.scale);g.rotate(S===hg?z.angle:Y,ia/2,Na/2);S!==Zm&&S!== -$m||g.rotate(90,ia/2,Na/2);S!==an&&S!==bn||g.rotate(-90,ia/2,Na/2);S===cn&&(45Y||225Y)&&g.rotate(-Y,ia/2,Na/2);T=new M(0,0,ia,Na);u.gj(T,J);g.Fa(u);J=-u.x+Ba/2*z.scale;z=-u.y+Ba/2*z.scale;w.assign(aa);Ba=isNaN(aa.x);var rb=isNaN(aa.y);if(Ba||rb){ia=ia/2+3;Na=Na/2+3;var sb=45<=Y&&135>=Y,Xa=225<=Y&&315>=Y;S===hg&&(sb||Xa)?(w.x=rb?ia:aa.y,w.y=Ba?Na:aa.x,sb?0<=C||isNaN(C)&&.5>E||!Ba||(w.y=-Na):Xa&&((0<=C||isNaN(C)&&.5>E)&&Ba&&(w.y=-Na),rb&&(w.x=-ia))):(Ba&&(w.x=0<=C||isNaN(C)&&.5>E?ia: --ia),rb&&(w.y=-Na),w.rotate(Y))}else w.rotate(Y);P+=w.x;ma+=w.y;T.set(B);T.h(P+J,ma+z,B.width,B.height);q.push(T);b.Tc(T)}}if(null!==f)for(d=f.labelNodes;d.next();)d.value.measure(Infinity,Infinity);a.pg=b;a=a.location;a.h(a.x+b.x,a.y+b.y);dc(e,b.width||0,b.height||0);Kb.free(g);K.free(u);K.free(w)}}}}; +P=1ia+10?0<=C?Y.Wa(ma):ma.Wa(Y):ia>T+10?0<=C?B.Wa(P):P.Wa(B):0<=C?Y.Wa(P):P.Wa(Y)}else Y=0<=C?ma.Wa(B):B.Wa(ma);S!==hg&&(P=h.computeAngle(z,S,Y),z.Cb=P);P=ma.x+(B.x-ma.x)*E-l.x;ma=ma.y+(B.y-ma.y)*E-l.y}z.measure(Infinity,Infinity,0,0);B=z.measuredBounds;T=z.naturalBounds;var Ba=0;z instanceof Hf&&(Ba=z.strokeWidth);ia=T.width+Ba;var Na=T.height+Ba;g.reset();g.translate(-B.x,-B.y);g.scale(z.scale,z.scale);g.rotate(S===hg?z.angle:Y,ia/2,Na/2);S!==Zm&&S!== +$m||g.rotate(90,ia/2,Na/2);S!==an&&S!==bn||g.rotate(-90,ia/2,Na/2);S===cn&&(45Y||225Y)&&g.rotate(-Y,ia/2,Na/2);T=new M(0,0,ia,Na);u.gj(T,J);g.Fa(u);J=-u.x+Ba/2*z.scale;z=-u.y+Ba/2*z.scale;w.assign(aa);Ba=isNaN(aa.x);var sb=isNaN(aa.y);if(Ba||sb){ia=ia/2+3;Na=Na/2+3;var tb=45<=Y&&135>=Y,Xa=225<=Y&&315>=Y;S===hg&&(tb||Xa)?(w.x=sb?ia:aa.y,w.y=Ba?Na:aa.x,tb?0<=C||isNaN(C)&&.5>E||!Ba||(w.y=-Na):Xa&&((0<=C||isNaN(C)&&.5>E)&&Ba&&(w.y=-Na),sb&&(w.x=-ia))):(Ba&&(w.x=0<=C||isNaN(C)&&.5>E?ia: +-ia),sb&&(w.y=-Na),w.rotate(Y))}else w.rotate(Y);P+=w.x;ma+=w.y;T.set(B);T.h(P+J,ma+z,B.width,B.height);q.push(T);b.Uc(T)}}if(null!==f)for(d=f.labelNodes;d.next();)d.value.measure(Infinity,Infinity);a.pg=b;a=a.location;a.h(a.x+b.x,a.y+b.y);dc(e,b.width||0,b.height||0);Kb.free(g);K.free(u);K.free(w)}}}}; Xm.prototype.arrange=function(a,b){var c=b.length;if(a instanceof Je||a instanceof R){var d=a,e=null;a instanceof Je&&(e=a,d=e.adornedPart);var f=a instanceof Je?null:d.path,g=a.j;if(0!==g.length){var h=0;if(null!==f&&h=c)q=K.alloc(),r=n,w=q,r.Bg(),r.computeMidPoint(w),r=n.midAngle,l!==hg&&(n=n.computeAngle(g,l,r),g.angle=n),n=q.x,w=q.y, -K.free(q);else{u=0;0<=h?(q=b.m[h],w=hz+10?0<=h?r.Ua(q):q.Ua(r):z>y+10?0<=h?w.Ua(u):u.Ua(w):0<=h?r.Ua(u):u.Ua(r)}else r=0<=h?q.Ua(w):w.Ua(q);l!==hg&&(n=n.computeAngle(g,l,r),g.angle=n);n=q.x+(w.x-q.x)*k;w=q.y+(w.y-q.y)*k}if(p.Eq())g.location=new K(n,w);else{p.bc()&&(p=Kc);q=Kb.alloc();q.reset();q.scale(g.scale,g.scale);q.rotate(g.angle, +K.free(q);else{u=0;0<=h?(q=b.m[h],w=hz+10?0<=h?r.Wa(q):q.Wa(r):z>y+10?0<=h?w.Wa(u):u.Wa(w):0<=h?r.Wa(u):u.Wa(r)}else r=0<=h?q.Wa(w):w.Wa(q);l!==hg&&(n=n.computeAngle(g,l,r),g.angle=n);n=q.x+(w.x-q.x)*k;w=q.y+(w.y-q.y)*k}if(p.Eq())g.location=new K(n,w);else{p.bc()&&(p=Kc);q=Kb.alloc();q.reset();q.scale(g.scale,g.scale);q.rotate(g.angle, 0,0);var B=g.naturalBounds;u=M.allocAt(0,0,B.width,B.height);y=K.alloc();y.gj(u,p);q.Fa(y);p=-y.x;z=-y.y;var C=B.width,E=B.height;B=K.alloc();B.assign(m);var J=isNaN(m.x),S=isNaN(m.y);if(J||S){C=C/2+3;E=E/2+3;var aa=45<=r&&135>=r,Y=225<=r&&315>=r;l===hg&&(aa||Y)?(B.x=S?C:m.y,B.y=J?E:m.x,aa?0<=h||isNaN(h)&&.5>k||!J||(B.y=-E):Y&&((0<=h||isNaN(h)&&.5>k)&&J&&(B.y=-E),S&&(B.x=-C))):(J&&(B.x=0<=h||isNaN(h)&&.5>k?C:-C),S&&(B.y=-E),B.rotate(r))}else B.rotate(r);n+=B.x;w+=B.y;q.Wq(u);p+=u.x;z+=u.y;h=K.allocAt(n+ p,w+z);g.move(h);K.free(h);K.free(B);K.free(y);M.free(u);Kb.free(q)}}null!==e?e.Ek(!1):d.Ek(!1)}}; function Ym(a,b,c,d){if(!1!==Aj(d)){var e=d.strokeWidth;0===e&&a instanceof Je&&a.type===W.Link&&a.adornedObject instanceof Hf&&(e=a.adornedObject.strokeWidth);e*=d.ya;a instanceof R&&null!==a.sa?(a=a.sa.bounds,d.Fe(a.x-e/2,a.y-e/2,a.width+e,a.height+e)):a instanceof Je&&null!==a.adornedPart.sa?(a=a.adornedPart.sa.bounds,d.Fe(a.x-e/2,a.y-e/2,a.width+e,a.height+e)):d.Fe(-(e/2),-(e/2),b+e,c+e);vj(d,!1)}}function dn(){this.ta="Base"}na(dn,Yl); dn.prototype.measure=function(a,b,c,d,e,f,g){var h=a.sb();a.Wg=[];var k=h.margin,l=k.right+k.left,m=k.top+k.bottom;h.measure(b,c,f,g);var n=h.measuredBounds,p=new M(-k.left,-k.top,Math.max(n.width+l,0),Math.max(n.height+m,0));a.Wg.push(p);e.assign(p);for(var r=h.geometry,q=h.strokeWidth,u=r.flattenedSegments,w=r.flattenedLengths,y=r.flattenedTotalLength,z=u.length,B=0,C=0,E=Ma(),J=0;Jia&&(ia+=360);aa.push(ia)}B=P;C=ma}E.push(aa)}if(null===a.Zf){for(var Ba=[],Na=a.W.m,rb=Na.length,sb=0;sbUb))for(var jd=0;jdUb&&Pb.push(yc)}}}}a.Zf=Ba}var Oc=a.Zf;var xe=a.W.m,Nf=xe.length,Jb=0,ye=0,yg=y;a.Gj=[];for(var Fh,Gh=0;Ghtk*Ni*y/a.graduatedRange)){var zg=w[0][0],Bd=0,zc=0;ye=y*tb.graduatedStart-1E-4;yg=y*tb.graduatedEnd+1E-4;var Of=tk*Ni,Gc=a.graduatedTickBase;if(Gca.graduatedMin+Of&&(Gc-=Math.floor((Gc-a.graduatedMin)/Of)*Of);for(var Hh=Oc[Gh],Rn=Gc,Wd=1;Gcy&&(Jb=y),ye<=Jb&&Jb<=yg)){for(var Xd=E[Bd][zc],Od=w[Bd][zc];Bdzg&&zcsc&&.4995sc?0sc||.9995Pi){var uk=1-Math.abs(.5-sc);Xd=(Ae*uk+$c*(1-uk))%360;break a}}}Xd=Ae}if(tb instanceof Yg){var Yd="";null!== -tb.graduatedFunction?(Yd=tb.graduatedFunction(Gc),Yd=null!==Yd&&void 0!==Yd?Yd.toString():""):Yd=(+Gc.toFixed(2)).toString();""!==Yd&&Fh.push({Hm:Oi,angle:Xd,text:Yd})}else Fh.push({Hm:Oi,angle:Xd})}Gc=Rn+Wd*Of}}}a.Gj.push(Fh)}Pa(E);var Kh=a.Gj;if(null!==Kh)for(var Pf=d.length,ob=0;obRf;Rf++){switch(Rf){case 0:tc.h(of,pf);break;case 1:tc.h(of+Qi,pf);break;case 2:tc.h(of,pf+Ri);break;case 3:tc.h(of+Qi,pf+Ri)}tc.rotate(wk+Vb.angle);tc.offset(vk,Qf);0===Cd&&0===Rf?ad.h(tc.x,tc.y,0,0):ad.Ye(tc);tc.offset(-vk,-Qf);tc.rotate(-wk-Vb.angle)}K.free(tc);null!==Ac.Wg&& -Ac.Wg.push(ad);mc(Hc,ad.x,ad.y,ad.width,ad.height)}else if(Vb instanceof Yg){var Za=a,$d=e;null===Za.xh&&(Za.xh=new Yg);var Gb=Za.xh;en(Gb,Vb);var Lh=Vb.alignmentFocus;Lh.bc()&&(Lh=Fc);for(var ae=Vb.segmentOrientation,Sf=Vb.segmentOffset,Dd=new M,Tf=0,Ti=0,De=0,Dg=0,Uf=0,Ui=Wb.length,qf=0;qfDe||225De)&&Pd.rotate(-De,Wf/2,Ee/2);var Mh=M.allocAt(0,0,Wf,Ee),Ve=K.alloc();Ve.gj(Mh,Lh);Pd.Fa(Ve);var Nh=-Ve.x,Oh=-Ve.y,ld=K.alloc();ld.assign(Sf);isNaN(ld.x)&&(ld.x=Wf/2+3);isNaN(ld.y)&&(ld.y=-(Ee/2+3));ld.rotate(De); -Tf+=ld.x+Nh;Ti+=ld.y+Oh;var Vi=new M(Tf,Ti,Ed.width,Ed.height),Sn=new M(Ed.x,Ed.y,Ed.width,Ed.height),Ph=new M(Vf.x,Vf.y,Vf.width,Vf.height);kd.PA=Dg;kd.lineCount=Gb.lineCount;kd.lines=[Gb.vb,Gb.pi,Gb.ye,Gb.Ke,Gb.Fc,Gb.Ub,Gb.we];kd.actualBounds=Vi;kd.measuredBounds=Sn;kd.naturalBounds=Ph;0===qf?Dd.assign(Vi):Dd.Tc(Vi);K.free(ld);K.free(Ve);M.free(Mh);Kb.free(Pd)}null!==Za.Wg&&Za.Wg.push(Dd);mc($d,Dd.x,Dd.y,Dd.width,Dd.height)}vj(Vb,!1)}}}; +C,P-B)/Math.PI;0>ia&&(ia+=360);aa.push(ia)}B=P;C=ma}E.push(aa)}if(null===a.Zf){for(var Ba=[],Na=a.W.m,sb=Na.length,tb=0;tbUb))for(var jd=0;jdUb&&Pb.push(yc)}}}}a.Zf=Ba}var Oc=a.Zf;var xe=a.W.m,Nf=xe.length,Jb=0,ye=0,yg=y;a.Gj=[];for(var Fh,Gh=0;Ghtk*Ni*y/a.graduatedRange&&null===ob.graduatedSkip)){var zg=w[0][0],Bd=0,zc=0;ye=y*ob.graduatedStart-1E-4;yg=y*ob.graduatedEnd+1E-4;var Of=tk*Ni,Gc=a.graduatedTickBase;if(Gca.graduatedMin+Of&&(Gc-=Math.floor((Gc-a.graduatedMin)/Of)*Of);for(var Hh=Oc[Gh],Rn=Gc,Wd=1;Gcy&&(Jb=y),ye<=Jb&&Jb<=yg)){for(var Xd=E[Bd][zc],Od=w[Bd][zc];Bdzg&&zcsc&&.4995sc?0sc||.9995Pi){var uk=1-Math.abs(.5-sc);Xd=(Ae*uk+$c*(1-uk))%360;break a}}}Xd=Ae}if(ob instanceof Yg){var Yd= +"";null!==ob.graduatedFunction?(Yd=ob.graduatedFunction(Gc),Yd=null!==Yd&&void 0!==Yd?Yd.toString():""):Yd=(+Gc.toFixed(2)).toString();""!==Yd&&Fh.push({Hm:Oi,angle:Xd,text:Yd})}else Fh.push({Hm:Oi,angle:Xd})}Gc=Rn+Wd*Of}}}a.Gj.push(Fh)}Pa(E);var Kh=a.Gj;if(null!==Kh)for(var Pf=d.length,pb=0;pbRf;Rf++){switch(Rf){case 0:tc.h(of,pf);break;case 1:tc.h(of+Qi,pf);break;case 2:tc.h(of,pf+Ri);break;case 3:tc.h(of+Qi,pf+Ri)}tc.rotate(wk+Vb.angle);tc.offset(vk,Qf);0===Cd&&0===Rf?ad.h(tc.x,tc.y,0,0):ad.Ye(tc);tc.offset(-vk,-Qf);tc.rotate(-wk-Vb.angle)}K.free(tc); +null!==Ac.Wg&&Ac.Wg.push(ad);mc(Hc,ad.x,ad.y,ad.width,ad.height)}else if(Vb instanceof Yg){var Za=a,$d=e;null===Za.xh&&(Za.xh=new Yg);var Gb=Za.xh;en(Gb,Vb);var Lh=Vb.alignmentFocus;Lh.bc()&&(Lh=Fc);for(var ae=Vb.segmentOrientation,Sf=Vb.segmentOffset,Dd=new M,Tf=0,Ti=0,De=0,Dg=0,Uf=0,Ui=Wb.length,qf=0;qfDe||225De)&&Pd.rotate(-De,Wf/2,Ee/2);var Mh=M.allocAt(0,0,Wf,Ee),Ve=K.alloc();Ve.gj(Mh,Lh);Pd.Fa(Ve);var Nh=-Ve.x,Oh=-Ve.y,ld=K.alloc();ld.assign(Sf);isNaN(ld.x)&&(ld.x=Wf/2+3);isNaN(ld.y)&&(ld.y=-(Ee/2+3));ld.rotate(De); +Tf+=ld.x+Nh;Ti+=ld.y+Oh;var Vi=new M(Tf,Ti,Ed.width,Ed.height),Sn=new M(Ed.x,Ed.y,Ed.width,Ed.height),Ph=new M(Vf.x,Vf.y,Vf.width,Vf.height);kd.PA=Dg;kd.lineCount=Gb.lineCount;kd.lines=[Gb.vb,Gb.pi,Gb.ye,Gb.Ke,Gb.Fc,Gb.Ub,Gb.we];kd.actualBounds=Vi;kd.measuredBounds=Sn;kd.naturalBounds=Ph;0===qf?Dd.assign(Vi):Dd.Uc(Vi);K.free(ld);K.free(Ve);M.free(Mh);Kb.free(Pd)}null!==Za.Wg&&Za.Wg.push(Dd);mc($d,Dd.x,Dd.y,Dd.width,Dd.height)}vj(Vb,!1)}}}; dn.prototype.arrange=function(a,b,c){if(null!==a.Wg){var d=a.sb(),e=a.Gj;if(null!==e){var f=a.Wg,g=0,h=f[g];g++;null!==d&&d.arrange(h.x-c.x,h.y-c.y,h.width,h.height);for(var k=b.length,l=0;l=e&&(e=1);for(var g=f.actualBounds,h=a.W.m,k=a.Gj,l=h.length,m=0;ma.graduatedTickUnit*n.interval*f.geometry.flattenedTotalLength/a.graduatedRange*e)){var q=n.measuredBounds,u=n.strokeWidth*n.scale,w=n.alignmentFocus;w.bc()&& -(w=Fc);for(var y=0;y=e&&(e=1);for(var g=f.actualBounds,h=a.W.m,k=a.Gj,l=h.length,m=0;ma.graduatedTickUnit*n.interval*f.geometry.flattenedTotalLength/a.graduatedRange*e&&null===n.graduatedSkip)){var q=n.measuredBounds,u=n.strokeWidth*n.scale, +w=n.alignmentFocus;w.bc()&&(w=Fc);for(var y=0;yf.height)continue}else if(l.position>f.width)continue;var m=l.separatorStrokeWidth;isNaN(m)&&(m=c?a.Ng:a.Mg);var n=l.separatorStroke;null===n&&(n=c?a.fi:a.Lg);if(0!==m&&null!==n){pi(a,b,n,!1,!1,g,f);n=!1;var p=l.separatorDashArray;null===p&&(p=c?a.ei:a.di);null!==p&&(n=!0,b.Ns(p,0));b.beginPath();p=l.position+m;c?p>f.height&&(m-= p-f.height):p>f.width&&(m-=p-f.width);l=l.position+m/2;b.lineWidth=m;m=a.rb;c?(l+=m.top,p=f.width-m.right,b.moveTo(m.left,l),b.lineTo(p,l)):(l+=m.left,p=f.height-m.bottom,b.moveTo(l,m.top),b.lineTo(l,p));b.stroke();n&&b.Ls()}}}} -function kn(a,b,c,d,e){for(var f=d.length,g=a.actualBounds,h=a.naturalBounds,k=mn(a,!0),l=mn(a,!1),m=0;mp)){var r=n.Lc(),q=n.separatorStrokeWidth;isNaN(q)&&(q=c?a.Ng:a.Mg);var u=n.separatorStroke;null===u&&(u=c?a.fi:a.Lg);if(null===u||n.index===(c?k:l))q=0;r-=q;q=n.position+q;r+=n.actual;q+r>p&&(r=p-q);0>=r||(p=a.rb,pi(a,b,n.background,!0,!1,h,g),c?b.fillRect(p.left, +function kn(a,b,c,d,e){for(var f=d.length,g=a.actualBounds,h=a.naturalBounds,k=mn(a,!0),l=mn(a,!1),m=0;mp)){var r=n.Mc(),q=n.separatorStrokeWidth;isNaN(q)&&(q=c?a.Ng:a.Mg);var u=n.separatorStroke;null===u&&(u=c?a.fi:a.Lg);if(null===u||n.index===(c?k:l))q=0;r-=q;q=n.position+q;r+=n.actual;q+r>p&&(r=p-q);0>=r||(p=a.rb,pi(a,b,n.background,!0,!1,h,g),c?b.fillRect(p.left, q+p.top,g.width-(p.left+p.right),r):b.fillRect(q+p.left,p.top,r,g.height-(p.top+p.bottom)))}}}}function mn(a,b){for(var c=b?a.Ib.length:a.Db.length,d=0;dd&&e.set(q),K.free(q));K.free(m);f&&e.transform(g);return l}; @@ -1227,7 +1227,7 @@ t.yl=function(){if(0!==(this.H&2048)===!1){Ll(this,!0);Ml(this,!0);for(var a=thi t.Em=function(a,b,c,d){var e=this.pg;e.h(0,0,0,0);var f=this.desiredSize,g=this.minSize;void 0===c&&(c=g.width,d=g.height);c=Math.max(c,g.width);d=Math.max(d,g.height);var h=this.maxSize;isNaN(f.width)||(a=Math.min(f.width,h.width));isNaN(f.height)||(b=Math.min(f.height,h.height));a=Math.max(c,a);b=Math.max(d,b);var k=this.rb;a=Math.max(a-k.left-k.right,0);b=Math.max(b-k.top-k.bottom,0);var l=this.W.m;0!==l.length&&this.oa.measure(this,a,b,l,e,c,d);a=e.width+k.left+k.right;k=e.height+k.top+k.bottom; isFinite(f.width)&&(a=f.width);isFinite(f.height)&&(k=f.height);a=Math.min(h.width,a);k=Math.min(h.height,k);a=Math.max(g.width,a);k=Math.max(g.height,k);a=Math.max(c,a);k=Math.max(d,k);dc(e,a,k);dc(this.naturalBounds,a,k);this.Fe(0,0,a,k)};t.sb=function(){if(null===this.wh){var a=this.W.m,b=a.length;if(0===b)return null;for(var c=0;cc||f>d)this.v(),this.measure(b>c?c:b,f>d?d:f,0,0);break;case Fd:this.v(!0);this.measure(c+h,d+g,0,0);break;case il:this.v(!0);this.measure(c+h,f+g,0,0);break;case jl:this.v(!0),this.measure(b+h,d+g,0,0)}}this.oa.arrange(this,e,this.pg)}}; -t.Ih=function(a){var b=this.naturalBounds,c=Hm(this);if(nc(0,0,b.width,b.height,a.x,a.y)){b=this.W.m;for(var d=b.length,e=K.allocAt(0,0);d--;){var f=b[d];if(f.visible||f===c)if(Lb(e.set(a),f.transform),f.ca(e))return K.free(e),!0}K.free(e);return null===this.Wb&&null===this.md?!1:!0}return!1};t.Os=function(a){if(this.Zk===a)return this;for(var b=this.W.m,c=b.length,d=0;dp.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof W?m:null;p=Kb.alloc();p.set(g); +t.Hf=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var g=f;void 0===f&&(g=Kb.alloc(),g.reset());g.multiply(this.transform);if(this.Hh(a,g))return tn(this,b,c,e),void 0===f&&Kb.free(g),!0;if(this.Pc(a,g)){if(!this.isAtomic)for(var h=Hm(this),k=this.W.m,l=k.length;l--;){var m=k[l];if(m.visible||m===h){var n=m.actualBounds,p=this.naturalBounds;if(!(n.x>p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof W?m:null;p=Kb.alloc();p.set(g); if(null!==m?m.Hf(a,b,c,d,e,p):ul(n,a,d,p))null!==b&&(n=b(n)),null===n||null!==c&&!c(n)||e.add(n);Kb.free(p)}}}void 0===f&&Kb.free(g);return d}void 0===f&&Kb.free(g);return!1};function tn(a,b,c,d){for(var e=a.W.m,f=e.length;f--;){var g=e[f];if(g.visible){var h=g.actualBounds,k=a.naturalBounds;h.x>k.width||h.y>k.height||0>h.x+h.width||0>h.y+h.height||(g instanceof W&&tn(g,b,c,d),null!==b&&(g=b(g)),null===g||null!==c&&!c(g)||d.add(g))}}} -t.wg=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===c&&(c=null);void 0===d&&(d=null);var g=this.naturalBounds,h=this.pe(),k=h?a:Lb(K.allocAt(a.x,a.y),this.transform),l=h?b:Lb(K.allocAt(b.x,b.y),this.transform),m=k.Ff(l),n=0w.width||u.y>w.height||0>u.x+u.width||0>u.y+u.height))if(q.pe()?(u=q.transform,Lb(k.set(a),u),Lb(l.set(b),u)):(k.set(a),l.set(b)),u=q,q=q instanceof W?q:null,null!==q?q.wg(k,l,c,d,e,f):u.ly(k,l,e))null!==c&&(u=c(u)),null===u||null!==d&&!d(u)||f.add(u)}}K.free(k);K.free(l)}return e?n:g}return!1}; function Nm(a){var b=null;a instanceof Hf&&(b=a.spot1,b===gd&&(b=null),a=a.geometry,null!==a&&null===b&&(b=a.spot1));null===b&&(b=Ec);return b}function Om(a){var b=null;a instanceof Hf&&(b=a.spot2,b===gd&&(b=null),a=a.geometry,null!==a&&null===b&&(b=a.spot2));null===b&&(b=Pc);return b}t.add=function(a){for(var b=[],c=0;ca&&Aa(a,">= 0",W,"remo t.lA=function(a){if(0>a||this.type!==W.Table)return-1;for(var b=0,c=this.Ib,d=c.length,e=this.Ii;ea||this.type!==W.Table)return-1;for(var b=0,c=this.Db,d=c.length,e=this.si;e=c.elements.count&&!(c instanceof U)){var d=!1;if(1===c.elements.count&&(d=null!==c.itemArray,!d))for(h=b.iterator;h.next();)if("itemArray"===h.value.targetProperty){d=!0;break}d||(Fa("Auto, Spot, or Graduated Panel should not have zero or one elements: "+c.toString()+" in "+a.toString()),xn=!0)}}))} t.Pz=function(a){void 0===a&&(a=!1);var b=this.copy();on(b,function(a){a instanceof W&&(a.$h=null,a.nb=null);var b=a.lb;null!==b&&(a.lb=null,b.each(function(b){a.bind(b.copy())}));b=a.Dg;null!==b&&(a.Dg=null,b.each(function(b){a.tw(b.value.copy())}))});a&&sg(b);return b}; t.Ia=function(a){var b=this.$h;if(null!==b)for(void 0===a&&(a=""),b=b.iterator;b.next();){var c=b.value,d=c.sourceProperty;if(""===a||""===d||d===a)if(d=c.targetProperty,null!==c.converter||""!==d){d=this.data;var e=c.sourceName;if(null!==e)if(""===e)d=this;else if("/"===e)d=this;else if("."===e)d=this;else if(".."===e)d=this;else{if(d=this.eb(e),null===d){G&&Fa("Binding error: missing GraphObject named "+e+" in "+this.toString());continue}}else if(c.isToModel)if(d=this.diagram,null!==d)d=d.model.modelData; -else continue;var f=this,g=c.kj;if(-1!==g){if(f=this.Os(g),null===f)continue}else null!==c.sd&&(f=c.sd);"/"===e?d=f.part:"."===e?d=f:".."===e&&(d=f.panel);e=c.Vp;if(0!==e){if(!(f instanceof W))continue;1===e?f=f.getColumnDefinition(c.jm):2===e&&(f=f.getRowDefinition(c.jm))}void 0!==f&&c.ww(f,d)}}};t.ky=function(a){if(void 0===a||null===a||null===this.ce)return null;A(a,"object",W,"findItemPanelForData");return this.ce.K(a)}; +else continue;var f=this,g=c.kj;if(-1!==g){if(f=this.Os(g),null===f)continue}else null!==c.td&&(f=c.td);"/"===e?d=f.part:"."===e?d=f:".."===e&&(d=f.panel);e=c.Vp;if(0!==e){if(!(f instanceof W))continue;1===e?f=f.getColumnDefinition(c.jm):2===e&&(f=f.getRowDefinition(c.jm))}void 0!==f&&c.ww(f,d)}}};t.ky=function(a){if(void 0===a||null===a||null===this.ce)return null;A(a,"object",W,"findItemPanelForData");return this.ce.K(a)}; function yn(a,b){a=a.W.m;for(var c=a.length,d=b.length,e=0,f=null;ea;)this.hc(this.W.length-1,!1);zn(this,this.itemArray)}; function zn(a,b){var c=rn(a);if(null===b||0===b.length)for(;a.W.length>c;)a.hc(a.W.length-1,!1);else if(a.W.length<=c){c=b.length;for(var d=0;da&&Aa(a,">= 0",bk,"height"),this.yc=a,this.actual=this.ma,null!== +t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new Fi(a,b,c,d):e=a;e.td=this;a=this.panel;null!==a&&(b=a.Jh(),null!==b&&Tl(b)&&v("Cannot add a Binding to a RowColumnDefinition that is already frozen: "+e+" on "+a));null===this.lb&&(this.lb=new H);this.lb.add(e);return this}; +oa.Object.defineProperties(bk.prototype,{panel:{configurable:!0,get:function(){return this.ig}},isRow:{configurable:!0,get:function(){return this.Or},set:function(a){this.Or=a}},index:{configurable:!0,get:function(){return this.Va},set:function(a){this.Va=a}},height:{configurable:!0,get:function(){return this.yc},set:function(a){var b=this.yc;b!==a&&(G&&A(a,"number",bk,"height"),0>a&&Aa(a,">= 0",bk,"height"),this.yc=a,this.actual=this.ma,null!== this.panel&&this.panel.v(),this.Hb("height",b,a))}},width:{configurable:!0,get:function(){return this.yc},set:function(a){var b=this.yc;b!==a&&(G&&A(a,"number",bk,"width"),0>a&&Aa(a,">= 0",bk,"width"),this.yc=a,this.actual=this.ma,null!==this.panel&&this.panel.v(),this.Hb("width",b,a))}},minimum:{configurable:!0,get:function(){return this.Vj},set:function(a){var b=this.Vj;b!==a&&(G&&A(a,"number",bk,"minimum"),(0>a||!isFinite(a))&&Aa(a,">= 0",bk,"minimum"),this.Vj=a,this.actual= this.ma,null!==this.panel&&this.panel.v(),this.Hb("minimum",b,a))}},maximum:{configurable:!0,get:function(){return this.Uj},set:function(a){var b=this.Uj;b!==a&&(G&&A(a,"number",bk,"maximum"),0>a&&Aa(a,">= 0",bk,"maximum"),this.Uj=a,this.actual=this.ma,null!==this.panel&&this.panel.v(),this.Hb("maximum",b,a))}},alignment:{configurable:!0,get:function(){return this.Bb},set:function(a){var b=this.Bb;b.B(a)||(G&&x(a,Ib,bk,"alignment"),this.Bb=a.L(),null!==this.panel&&this.panel.v(), this.Hb("alignment",b,a))}},stretch:{configurable:!0,get:function(){return this.Ne},set:function(a){var b=this.Ne;b!==a&&(G&&cb(a,O,bk,"stretch"),this.Ne=a,null!==this.panel&&this.panel.v(),this.Hb("stretch",b,a))}},separatorPadding:{configurable:!0,get:function(){return this.lg},set:function(a){"number"===typeof a?a=new ic(a):null!==a&&G&&x(a,ic,bk,"separatorPadding");var b=this.lg;null!==a&&null!==b&&b.B(a)||(null!==a&&(a=a.L()),this.lg=a,null!==this.panel&&this.panel.v(), @@ -1306,13 +1306,13 @@ this.Hb("separatorPadding",b,a))}},separatorStroke:{configurable:!0,get:function b,a))}},separatorDashArray:{configurable:!0,get:function(){return this.fk},set:function(a){var b=this.fk;if(b!==a){null===a||Array.isArray(a)||za(a,"Array",bk,"separatorDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;ee)){var f=d.measuredBounds,g=Math.max(1,f.width);f=f.height;for(var h=c[0],k=c[1],l,m,n,p,r,q,u=0,w=Ma(),y=2;yn&&(n=1);e=c=n;l=g/2;m=0===l?!1:!0;y=0;q=w[y];n=q[0];r=q[1];p=q[2];q=q[3];for(var z=0;.1<=u;){0===z&&(m?(e=c,e-=l,u-=l,m=!1):e=c,0===e&&(e=1)); if(e>u){Pa(w);return}e>q?(z=e-q,e=q):z=0;var B=Math.sqrt(e*e/(1+p*p));0>n&&(B=-B);h+=B;k+=p*B;a.translate(h,k);a.rotate(r);a.translate(-(g/2),-(f/2));0===z&&d.Ri(a,b);a.translate(g/2,f/2);a.rotate(-r);a.translate(-h,-k);u-=e;q-=e;if(0!==z){y++;if(y===w.length){Pa(w);return}q=w[y];n=q[0];r=q[1];p=q[2];q=q[3];e=z}}Pa(w)}} -t.Ri=function(a,b){var c=this.Jc,d=this.pl;if(null!==c||null!==d){var e=this.sa;if(null!==e){a.Hd();var f=this.actualBounds,g=this.naturalBounds;null!==d&&pi(this,a,d,!0,!1,g,f);var h=this.part,k=this.og;null===c||0!==k||null===h||!this.isPanelMain&&h.sb()!==this||(k=h.type===W.Link&&h instanceof Je&&"Selection"===h.category&&h.adornedObject instanceof Hf&&h.adornedPart.sb()===h.adornedObject?h.adornedObject.strokeWidth:0);0===k&&(c=null);null!==c&&0!==k&&(pi(this,a,c,!1,!1,g,f),a.lineWidth=k,a.lineJoin= +t.Ri=function(a,b){var c=this.Jc,d=this.pl;if(null!==c||null!==d){var e=this.sa;if(null!==e){a.Lc();var f=this.actualBounds,g=this.naturalBounds;null!==d&&pi(this,a,d,!0,!1,g,f);var h=this.part,k=this.og;null===c||0!==k||null===h||!this.isPanelMain&&h.sb()!==this||(k=h.type===W.Link&&h instanceof Je&&"Selection"===h.category&&h.adornedObject instanceof Hf&&h.adornedPart.sb()===h.adornedObject?h.adornedObject.strokeWidth:0);0===k&&(c=null);null!==c&&0!==k&&(pi(this,a,c,!1,!1,g,f),a.lineWidth=k,a.lineJoin= this.gm,a.lineCap=this.fm,a.miterLimit=this.gk);f=!1;h&&b.Se("drawShadows")&&(f=h.isShadowed);h=!0;null===c||null!==d&&"transparent"!==d||(h=!1);g=!1;k=this.strokeDashArray;null!==k&&(g=!0,a.Ns(k,this.uh));if(e.type===N.j)a.beginPath(),a.moveTo(e.startX,e.startY),a.lineTo(e.endX,e.endY),null!==c&&a.jj();else if(e.type===N.F){var l=e.startX;k=e.startY;var m=e.endX,n=e.endY;e=Math.min(l,m);var p=Math.min(k,n);l=Math.abs(m-l);k=Math.abs(n-k);a.beginPath();a.rect(e,p,l,k);null!==d&&a.Gf(d);if(null!== c){h&&f&&El(a);if(0===l||0===k)a.beginPath(),a.rect(e,p,Math.max(l,.1),Math.max(k,.1));a.jj();h&&f&&Dl(a)}}else if(e.type===N.P)l=e.startX,k=e.startY,m=e.endX,n=e.endY,e=Math.abs(m-l)/2,p=Math.abs(n-k)/2,l=Math.min(l,m)+e,k=Math.min(k,n)+p,a.beginPath(),a.moveTo(l,k-p),a.bezierCurveTo(l+L.Cg*e,k-p,l+e,k-L.Cg*p,l+e,k),a.bezierCurveTo(l+e,k+L.Cg*p,l+L.Cg*e,k+p,l,k+p),a.bezierCurveTo(l-L.Cg*e,k+p,l-e,k+L.Cg*p,l-e,k),a.bezierCurveTo(l-e,k-L.Cg*p,l-L.Cg*e,k-p,l,k-p),a.closePath(),null!==d&&a.Gf(d),null!== c&&(h&&f?(El(a),a.jj(),Dl(a)):a.jj());else if(e.type===N.o)for(e=e.figures,k=e.length,p=0;p(c.startX-c.endX)*(a.x-c.endX)+(c.startY-c.endY)*(a.y-c.endY)||0>d)return!1;M.free(f);return L.Rb(c.startX,c.startY,c.endX,c.endY,e,a.x,a.y)}if(c.type=== -N.F){b=c.startX;var g=c.startY,h=c.endX;c=c.endY;f.x=Math.min(b,h);f.y=Math.min(g,c);f.width=Math.abs(h-b);f.height=Math.abs(c-g);if(null===this.fill){f.Mc(-d,-d);if(f.ca(a))return M.free(f),!1;f.Mc(d,d)}null!==this.stroke&&f.Mc(e,e);a=f.ca(a);M.free(f);return a}if(c.type===N.P){g=c.startX;e=c.startY;h=c.endX;var k=c.endY;c=Math.min(g,h);b=Math.min(e,k);g=Math.abs(h-g)/2;e=Math.abs(k-e)/2;c=a.x-(c+g);b=a.y-(b+e);if(null===this.fill){g-=d;e-=d;if(0>=g||0>=e||1>=c*c/(g*g)+b*b/(e*e))return M.free(f), +t.Yi=function(a){void 0===a&&(a=new M);var b=this.naturalBounds,c=this.le;b=M.allocAt(b.x,b.y,b.width,b.height);var d=this.strokeWidth;b.Nc(d/2,d/2);d=K.allocAt(b.x,b.y).transform(c);a.h(d.x,d.y,0,0);d.h(b.right,b.y).transform(c);mc(a,d.x,d.y,0,0);d.h(b.right,b.bottom).transform(c);mc(a,d.x,d.y,0,0);d.h(b.x,b.bottom).transform(c);mc(a,d.x,d.y,0,0);M.free(b);K.free(d);return a}; +t.Ih=function(a,b){var c=this.geometry;if(null===c||null===this.fill&&null===this.stroke)return!1;var d=c.bounds,e=this.strokeWidth/2;c.type!==N.j||b||(e+=2);var f=M.alloc();f.assign(d);f.Nc(e+2,e+2);if(!f.ca(a))return M.free(f),!1;d=e+1E-4;if(c.type===N.j){if(null===this.stroke)return!1;d=(c.endX-c.startX)*(a.x-c.startX)+(c.endY-c.startY)*(a.y-c.startY);if(0>(c.startX-c.endX)*(a.x-c.endX)+(c.startY-c.endY)*(a.y-c.endY)||0>d)return!1;M.free(f);return L.Rb(c.startX,c.startY,c.endX,c.endY,e,a.x,a.y)}if(c.type=== +N.F){b=c.startX;var g=c.startY,h=c.endX;c=c.endY;f.x=Math.min(b,h);f.y=Math.min(g,c);f.width=Math.abs(h-b);f.height=Math.abs(c-g);if(null===this.fill){f.Nc(-d,-d);if(f.ca(a))return M.free(f),!1;f.Nc(d,d)}null!==this.stroke&&f.Nc(e,e);a=f.ca(a);M.free(f);return a}if(c.type===N.P){g=c.startX;e=c.startY;h=c.endX;var k=c.endY;c=Math.min(g,h);b=Math.min(e,k);g=Math.abs(h-g)/2;e=Math.abs(k-e)/2;c=a.x-(c+g);b=a.y-(b+e);if(null===this.fill){g-=d;e-=d;if(0>=g||0>=e||1>=c*c/(g*g)+b*b/(e*e))return M.free(f), !1;g+=d;e+=d}null!==this.stroke&&(g+=d,e+=d);M.free(f);return 0>=g||0>=e?!1:1>=c*c/(g*g)+b*b/(e*e)}if(c.type===N.o)return M.free(f),null===this.fill?ge(c,a.x,a.y,e):ee(c,a,e,1=this.strokeWidth)m=L.Ve(l.startX,l.startY,l.endX,l.endY,f,g,h,k,e);else{l.startX===l.endX?(d=n,m=0):(b=(l.endY-l.startY)/(l.endX-l.startX),m=n/Math.sqrt(1+b*b), d=m*b);b=Ma();a=new K;L.Ve(l.startX+d,l.startY+m,l.endX+d,l.endY+m,f,g,h,k,a)&&b.push(a);a=new K;L.Ve(l.startX-d,l.startY-m,l.endX-d,l.endY-m,f,g,h,k,a)&&b.push(a);a=new K;L.Ve(l.startX+d,l.startY+m,l.startX-d,l.startY-m,f,g,h,k,a)&&b.push(a);a=new K;L.Ve(l.endX+d,l.endY+m,l.endX-d,l.endY-m,f,g,h,k,a)&&b.push(a);h=b.length;if(0===h)return Pa(b),!1;m=!0;k=Infinity;for(d=0;dMath.abs(c)){k=g-m-c*(f-d);if(0>a*a*c*c+l*l-k*k){e.x=NaN;e.y=NaN;m=!1;break a}n=Math.sqrt(a*a*c*c+l*l-k*k);h=(-(a*a*c*k)+a*l*n)/(l*l+a*a*c*c)+d;a=(-(a*a*c*k)-a*l*n)/(l*l+a*a*c*c)+d;l=c*(h-d)+k+m;k=c* +n,r.y+r.height+n,f,g,h,k,e);else if(l.type===N.P){b=M.allocAt(r.x,r.y,r.width,r.height).Nc(n,n);a:if(0===b.width)m=L.Ve(b.x,b.y,b.x,b.y+b.height,f,g,h,k,e);else if(0===b.height)m=L.Ve(b.x,b.y,b.x+b.width,b.y,f,g,h,k,e);else{a=b.width/2;l=b.height/2;d=b.x+a;m=b.y+l;c=9999;f!==h&&(c=(g-k)/(f-h));if(9999>Math.abs(c)){k=g-m-c*(f-d);if(0>a*a*c*c+l*l-k*k){e.x=NaN;e.y=NaN;m=!1;break a}n=Math.sqrt(a*a*c*c+l*l-k*k);h=(-(a*a*c*k)+a*l*n)/(l*l+a*a*c*c)+d;a=(-(a*a*c*k)-a*l*n)/(l*l+a*a*c*c)+d;l=c*(h-d)+k+m;k=c* (a-d)+k+m;Math.abs((f-h)*(f-h))+Math.abs((g-l)*(g-l))h){e.x=NaN;e.y=NaN;m=!1;break a}k=Math.sqrt(h);h=m+k;k=m-k;Math.abs(h-g)Math.abs(q)?(u*=.5/q,q=.5):0!==u&&.5>Math.abs(u)&&(q*=.5/u,u=.5),y-=q,z-= u;r.contains(y,z);)y-=q,z-=u;e.x=h;e.y=k;for(u=0;uc?a-c:c-a)<(b>d?b-d:d-b)?(a=ba||L.da(k.y,a))&&(k.yb||L.da(k.x,b))&&(k.x=a&&d<=b;a=d&&c<=a} -t.ly=function(a,b,c){function d(a,b){for(var c=a.length,d=0;de)return!0;return!1}if(c&&null!==this.fill&&this.Ih(a,!0))return!0;var e=a.Ff(b),f=e;1.5e)return!0;return!1}if(c&&null!==this.fill&&this.Ih(a,!0))return!0;var e=a.Ff(b),f=e;1.5=e||Nb(b,f,0,-n)>= -e||Nb(b,f,0,n)>=e||Nb(b,f,m,0)>=e?!1:!0}else if(b.type===N.o){l=b.bounds;f=l.x;h=l.y;k=l.x+l.width;l=l.y+l.height;if(a.x>k&&a.xl&&a.ye&&Mb(a.x,a.y,f,h,k,h)>e&&Mb(a.x,a.y,k,l,f,l)>e&&Mb(a.x,a.y,k,l,k,h)>e)return!1;f=Math.sqrt(e);if(c){if(null===this.fill?ge(b,a.x,a.y,f):ee(b,a,f,!0,!1))return!0}else{c=b.figures;for(b=0;be)return!1;h=f.segments.m;k=h.length;for(l=0;le)return!1;break;case Td:var p=Ma();L.Pe(g,m,n.point1X,n.point1Y,n.point2X,n.point2Y,n.endX,n.endY,.8,p);g=d(p,a);Pa(p);if(g)return!1;g=n.endX;m=n.endY;if(a.td(g,m)>e)return!1;break;case Ud:p=Ma();L.Kq(g,m,n.point1X,n.point1Y,n.endX,n.endY,.8,p);g=d(p,a);Pa(p);if(g)return!1;g=n.endX;m=n.endY;if(a.td(g,m)>e)return!1;break;case Vd:case be:p=n.type===Vd?ce(n,f):de(n,f,g,m);var r=p.length;if(0===r){g=n.type===Vd?n.centerX:n.endX;m=n.type===Vd?n.centerY:n.endY;if(a.td(g,m)> +e||Nb(b,f,0,n)>=e||Nb(b,f,m,0)>=e?!1:!0}else if(b.type===N.o){l=b.bounds;f=l.x;h=l.y;k=l.x+l.width;l=l.y+l.height;if(a.x>k&&a.xl&&a.ye&&Mb(a.x,a.y,f,h,k,h)>e&&Mb(a.x,a.y,k,l,f,l)>e&&Mb(a.x,a.y,k,l,k,h)>e)return!1;f=Math.sqrt(e);if(c){if(null===this.fill?ge(b,a.x,a.y,f):ee(b,a,f,!0,!1))return!0}else{c=b.figures;for(b=0;be)return!1;h=f.segments.m;k=h.length;for(l=0;le)return!1;break;case Td:var p=Ma();L.Pe(g,m,n.point1X,n.point1Y,n.point2X,n.point2Y,n.endX,n.endY,.8,p);g=d(p,a);Pa(p);if(g)return!1;g=n.endX;m=n.endY;if(a.ud(g,m)>e)return!1;break;case Ud:p=Ma();L.Kq(g,m,n.point1X,n.point1Y,n.endX,n.endY,.8,p);g=d(p,a);Pa(p);if(g)return!1;g=n.endX;m=n.endY;if(a.ud(g,m)>e)return!1;break;case Vd:case be:p=n.type===Vd?ce(n,f):de(n,f,g,m);var r=p.length;if(0===r){g=n.type===Vd?n.centerX:n.endX;m=n.type===Vd?n.centerY:n.endY;if(a.ud(g,m)> e)return!1;break}n=null;for(var q=Ma(),u=0;ub+1E-5||d.bounds.height>c+1E-5)&&v('Geometry made with figure "'+a.figure+'" has bounds '+d.bounds.toString()+" that are too large for the given size ("+b+","+c+"). See documentation for Shape.defineFigureGenerator."); return d};function Qn(a){var b=Pn[a];if(void 0===b){var c=a.toLowerCase();if("none"===c)return"None";b=Pn[c];if(void 0===b){var d=null,e;for(e in L.cn)if(e.toLowerCase()===c){d=e;break}if(null!==d)return a=N.parse(L.cn[d],!1),Pn[d]=a,c!==d&&(Pn[c]=d),d}}return"string"===typeof b?b:b instanceof N?a:null} -oa.Object.defineProperties(Hf.prototype,{geometry:{configurable:!0,get:function(){return null!==this.sa?this.sa:this.Gd},set:function(a){var b=this.sa,c=this.Gd;if(b!==a){null!==a?(G&&x(a,N,Hf,"geometry"),this.Gd=this.sa=a.freeze()):this.Gd=this.sa=null;var d=this.part;null!==d&&(d.dg=NaN);this.v();this.g("geometry",b||c,a);rl(this)&&(a=this.part,null!==a&&sl(this,a,"geometryString"))}}},geometryString:{configurable:!0,get:function(){return null===this.geometry?"":this.geometry.toString()}, +oa.Object.defineProperties(Hf.prototype,{geometry:{configurable:!0,get:function(){return null!==this.sa?this.sa:this.Hd},set:function(a){var b=this.sa,c=this.Hd;if(b!==a){null!==a?(G&&x(a,N,Hf,"geometry"),this.Hd=this.sa=a.freeze()):this.Hd=this.sa=null;var d=this.part;null!==d&&(d.dg=NaN);this.v();this.g("geometry",b||c,a);rl(this)&&(a=this.part,null!==a&&sl(this,a,"geometryString"))}}},geometryString:{configurable:!0,get:function(){return null===this.geometry?"":this.geometry.toString()}, set:function(a){a=N.parse(a);var b=a.normalize();this.geometry=a;this.position=a=K.allocAt(-b.x,-b.y);K.free(a)}},isGeometryPositioned:{configurable:!0,get:function(){return this.ro},set:function(a){G&&A(a,"boolean",Hf,"isGeometryPositioned");var b=this.ro;b!==a&&(this.ro=a,this.v(),this.g("isGeometryPositioned",b,a))}},fill:{configurable:!0,get:function(){return this.pl},set:function(a){var b=this.pl;b!==a&&(null!==a&&am(a,"Shape.fill"),a instanceof Al&&a.freeze(),this.pl= a,this.R(),this.g("fill",b,a))}},stroke:{configurable:!0,get:function(){return this.Jc},set:function(a){var b=this.Jc;b!==a&&(null!==a&&am(a,"Shape.stroke"),a instanceof Al&&a.freeze(),this.Jc=a,this.R(),this.g("stroke",b,a))}},strokeWidth:{configurable:!0,get:function(){return this.og},set:function(a){var b=this.og;if(b!==a)if(G&&D(a,Hf,"strokeWidth"),0<=a){this.og=a;this.v();var c=this.part;null!==c&&(c.dg=NaN);this.g("strokeWidth",b,a)}else Aa(a,"value >= 0",Hf,"strokeWidth:value")}}, strokeCap:{configurable:!0,get:function(){return this.fm},set:function(a){var b=this.fm;b!==a&&("string"!==typeof a||"butt"!==a&&"round"!==a&&"square"!==a?Aa(a,'"butt", "round", or "square"',Hf,"strokeCap"):(this.fm=a,this.R(),this.g("strokeCap",b,a)))}},strokeJoin:{configurable:!0,get:function(){return this.gm},set:function(a){var b=this.gm;b!==a&&("string"!==typeof a||"miter"!==a&&"bevel"!==a&&"round"!==a?Aa(a,'"miter", "bevel", or "round"',Hf,"strokeJoin"):(this.gm= a,this.R(),this.g("strokeJoin",b,a)))}},strokeMiterLimit:{configurable:!0,get:function(){return this.gk},set:function(a){var b=this.gk;if(b!==a)if(G&&D(a,Hf,"strokeMiterLimit"),1<=a){this.gk=a;this.R();var c=this.part;null!==c&&(c.dg=NaN);this.g("strokeMiterLimit",b,a)}else G&&Aa(a,"value >= 1",Hf,"strokeWidth:value")}},strokeDashArray:{configurable:!0,get:function(){return this.th},set:function(a){var b=this.th;if(b!==a){null===a||Array.isArray(a)||za(a,"Array",Hf,"strokeDashArray:value"); if(null!==a){for(var c=a.length,d=0,e=0;ea?a=0:1a?a=0:1(n*n+m*m)*p*p&&(c=!0);b.Xb!==a&&(c=!1);!1===b.Se("textGreeking")&&(c=!1);b=this.tf;n= -this.uf;switch(this.flip){case ml:a.translate(e,0);a.scale(-1,1);break;case ll:a.translate(0,f);a.scale(1,-1);break;case nl:a.translate(e,f),a.scale(-1,-1)}a.Hd();m=this.bd;p=(b+g+n)*m;f>p&&(d=this.Ni,d=d.y*f-d.y*p+d.offsetY);if(1===m&&null!==this.we)n=this.vb,n>e&&(n=e),this.Qi(this.we,a,0,d+b,e,g,n,c,h,k,l);else if(null!==this.Fc&&null!==this.Ub)for(p=0;pe&&(r=e);d+=b;this.Qi(this.Ub[p],a,0,d,e,g,r,c,h,k,l);d+=g+n}switch(this.flip){case ml:a.scale(-1,1);a.translate(-e, +this.uf;switch(this.flip){case ml:a.translate(e,0);a.scale(-1,1);break;case ll:a.translate(0,f);a.scale(1,-1);break;case nl:a.translate(e,f),a.scale(-1,-1)}a.Lc();m=this.cd;p=(b+g+n)*m;f>p&&(d=this.Ni,d=d.y*f-d.y*p+d.offsetY);if(1===m&&null!==this.we)n=this.vb,n>e&&(n=e),this.Qi(this.we,a,0,d+b,e,g,n,c,h,k,l);else if(null!==this.Fc&&null!==this.Ub)for(p=0;pe&&(r=e);d+=b;this.Qi(this.Ub[p],a,0,d,e,g,r,c,h,k,l);d+=g+n}switch(this.flip){case ml:a.scale(-1,1);a.translate(-e, 0);break;case ll:a.scale(1,-1);a.translate(0,-f);break;case nl:a.scale(-1,-1),a.translate(-e,-f)}}}; t.Qi=function(a,b,c,d,e,f,g,h,k,l,m){var n=0;h?("left"===k?n=0:"right"===k?n=e-g:"center"===k&&(n=(e-g)/2),b.fillRect(c+n,d+.25*f,g,1)):("left"===k?n=0:"right"===k?n=e:"center"===k&&(n=e/2),e=null!==fo?fo(this,f):.75*f,b.fillText(a,c+n,d+e),a=f/20|0,0===a&&(a=1),"right"===k?n-=g:"center"===k&&(n-=g/2),l&&(k=null!==go?go(this,f):.8*f,b.beginPath(),b.lineWidth=a,b.moveTo(c+n,d+k),b.lineTo(c+n+g,d+k),b.stroke()),m&&(b.beginPath(),b.lineWidth=a,d=d+f-f/2.2|0,0!==a%2&&(d+=.5),b.moveTo(c+n,d),b.lineTo(c+ n+g,d),b.stroke()))}; t.Em=function(a,b,c,d){this.pi=a;var e=this.xe;null!==Zn&&ho!==e&&(ho=Zn.font=e);this.vb=this.Ke=0;this.we=this.Ub=this.Fc=this.ye=null;var f;if(isNaN(this.desiredSize.width)){e=this.Zb.replace(/\r\n/g,"\n").replace(/\r/g,"\n");if(0===e.length)e=0;else if(this.isMultiline){for(var g=f=0,h=!1;!h;){var k=e.indexOf("\n",g);-1===k&&(k=e.length,h=!0);g=e.substr(g,k-g);this.ii===bo&&(g=g.trim());f=Math.max(f,io(g));g=k+1}e=f}else f=e.indexOf("\n",0),0<=f&&(e=e.substr(0,f)),e=io(e);e=Math.min(e,a/this.scale); e=Math.max(8,e)}else e=this.desiredSize.width;null!==this.panel&&(e=Math.min(e,this.panel.maxSize.width));f=jo(this,e);isNaN(this.desiredSize.height)?f=Math.min(f,b/this.scale):f=this.desiredSize.height;h=f;if(0!==this.vb&&null!==this.Fc&&null!==this.Ub&&this.gg===ko&&(b=this.xe,b=this.gg===ko?lo(b):0,k=this.tf+this.uf,k=Math.max(0,eo(this)+k),h=Math.min(this.maxLines-1,Math.max(Math.floor(h/k+.01)-1,0)),!(h+1>=this.Ub.length))){k=this.Ub[h];for(b=Math.max(1,a-b);io(k)>b&&1=a.Ee)null!==d&&d.h(0,h);else if(g=b,a.sg===qo){a.Ke=1;var l=io(b);if(0===k||l<=c)a.vb=Math.max(a.vb,l),oo(a,b,a.vb),null!==d&&d.h(l,h);else{f=ro(a,g);g=g.substr(f.length);b=ro(a,g);for(l=io(f+b);0c&&1c;){var n=1;l=io(b.substr(0,n));for(m=0;l<=c;)n++,m=l,l=io(b.substr(0,n));if(1===n){var p=l;f=Math.max(f,l)}else p=m,f=Math.max(f,m);n--;1>n&&(n=1);oo(a,b.substr(0,n),p);k++;b=b.substr(n);if(a.bd+k>a.Ee)break}m=ro(a,g);for(l=io(b+m);0a.Ee))break}a.Ke=Math.min(a.Ee,k);a.vb=Math.max(a.vb,f);null!==d&&d.h(a.vb,h*a.Ke)}}function ro(a,b){if(a.sg===so)return b.substr(0,1);for(var c=b.length,d=0,e=to;d=b.length?b:b.substr(0,d)}function io(a){return null===Zn?8*a.length:Zn.measureText(a).width} +function po(a,b,c,d){var e=a.ii===bo;e&&(b=b.trim());var f=0,g=a.xe,h=a.tf+a.uf;h=Math.max(0,eo(a)+h);var k=a.gg===ko?lo(g):0;if(a.cd>=a.Ee)null!==d&&d.h(0,h);else if(g=b,a.sg===qo){a.Ke=1;var l=io(b);if(0===k||l<=c)a.vb=Math.max(a.vb,l),oo(a,b,a.vb),null!==d&&d.h(l,h);else{f=ro(a,g);g=g.substr(f.length);b=ro(a,g);for(l=io(f+b);0c&&1c;){var n=1;l=io(b.substr(0,n));for(m=0;l<=c;)n++,m=l,l=io(b.substr(0,n));if(1===n){var p=l;f=Math.max(f,l)}else p=m,f=Math.max(f,m);n--;1>n&&(n=1);oo(a,b.substr(0,n),p);k++;b=b.substr(n);if(a.cd+k>a.Ee)break}m=ro(a,g);for(l=io(b+m);0a.Ee))break}a.Ke=Math.min(a.Ee,k);a.vb=Math.max(a.vb,f);null!==d&&d.h(a.vb,h*a.Ke)}}function ro(a,b){if(a.sg===so)return b.substr(0,1);for(var c=b.length,d=0,e=to;d=b.length?b:b.substr(0,d)}function io(a){return null===Zn?8*a.length:Zn.measureText(a).width} function eo(a){if(null!==a.ye)return a.ye;var b=a.xe;if(null===Zn){var c=16;return a.ye=c}void 0!==vo[b]&&5E3>wo?c=vo[b]:(c=1.3*Zn.measureText("M").width,vo[b]=c,wo++);return a.ye=c}function lo(a){if(null===Zn)return 6;if(void 0!==xo[a]&&5E3>yo)var b=xo[a];else b=Zn.measureText(mo).width,xo[a]=b,yo++;return b} -function jo(a,b){var c=a.Zb.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),d=a.tf+a.uf;d=Math.max(0,eo(a)+d);if(0===c.length)return a.vb=0,a.bd=1,d;if(!a.isMultiline){var e=c.indexOf("\n",0);0<=e&&(c=c.substr(0,e))}e=0;for(var f=a.bd=0,g,h=!1;!h;){g=c.indexOf("\n",f);-1===g&&(g=c.length,h=!0);if(f<=g){f=c.substr(f,g-f);if(a.sg!==qo){a.Ke=0;var k=Hb.alloc();po(a,f,b,k);e+=k.height;Hb.free(k);a.bd+=a.Ke}else po(a,f,b,null),e+=d,a.bd++;a.bd===a.Ee&&(h=!0)}f=g+1}return a.Vr=e} +function jo(a,b){var c=a.Zb.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),d=a.tf+a.uf;d=Math.max(0,eo(a)+d);if(0===c.length)return a.vb=0,a.cd=1,d;if(!a.isMultiline){var e=c.indexOf("\n",0);0<=e&&(c=c.substr(0,e))}e=0;for(var f=a.cd=0,g,h=!1;!h;){g=c.indexOf("\n",f);-1===g&&(g=c.length,h=!0);if(f<=g){f=c.substr(f,g-f);if(a.sg!==qo){a.Ke=0;var k=Hb.alloc();po(a,f,b,k);e+=k.height;Hb.free(k);a.cd+=a.Ke}else po(a,f,b,null),e+=d,a.cd++;a.cd===a.Ee&&(h=!0)}f=g+1}return a.Vr=e} oa.Object.defineProperties(Yg.prototype,{font:{configurable:!0,get:function(){return this.xe},set:function(a){var b=this.xe;b!==a&&(G&&(A(a,"string",Yg,"font"),co(a)||v('Not a valid font: "'+a+'"')),this.xe=a,this.ye=null,this.v(),this.g("font",b,a))}},text:{configurable:!0,get:function(){return this.Zb},set:function(a){var b=this.Zb;null!==a&&void 0!==a?a=a.toString():a="";b!==a&&(this.Zb=a,this.v(),this.g("text",b,a))}},textAlign:{configurable:!0,get:function(){return this.Gi}, set:function(a){var b=this.Gi;b!==a&&(G&&A(a,"string",Yg,"textAlign"),"start"===a||"end"===a||"left"===a||"right"===a||"center"===a?(this.Gi=a,this.R(),this.g("textAlign",b,a)):G&&Aa(a,'"start", "end", "left", "right", or "center"',Yg,"textAlign"))}},flip:{configurable:!0,get:function(){return this.Xd},set:function(a){var b=this.Xd;b!==a&&(cb(a,O,Yg,"flip"),this.Xd=a,this.R(),this.g("flip",b,a))}},verticalAlignment:{configurable:!0,get:function(){return this.Ni},set:function(a){var b= this.Ni;b.B(a)||(G&&(x(a,Ib,Yg,"verticalAlignment"),a.bc()&&v("TextBlock.verticalAlignment for "+this+" must be a real Spot, not:"+a)),this.Ni=a=a.L(),Nl(this),this.g("verticalAlignment",b,a))}},naturalBounds:{configurable:!0,get:function(){if(!this.wc.s()){var a=Hb.alloc();po(this,this.Zb,999999,a);var b=a.width;Hb.free(a);a=jo(this,b);var c=this.desiredSize;isNaN(c.width)||(b=c.width);isNaN(c.height)||(a=c.height);dc(this.wc,b,a)}return this.wc}},isMultiline:{configurable:!0, get:function(){return this.Nj},set:function(a){var b=this.Nj;b!==a&&(G&&A(a,"boolean",Yg,"isMultiline"),this.Nj=a,this.v(),this.g("isMultiline",b,a))}},isUnderline:{configurable:!0,get:function(){return this.mi},set:function(a){var b=this.mi;b!==a&&(G&&A(a,"boolean",Yg,"isUnderline"),this.mi=a,this.R(),this.g("isUnderline",b,a))}},isStrikethrough:{configurable:!0,get:function(){return this.li},set:function(a){var b=this.li;b!==a&&(G&&A(a,"boolean",Yg,"isStrikethrough"), this.li=a,this.R(),this.g("isStrikethrough",b,a))}},wrap:{configurable:!0,get:function(){return this.sg},set:function(a){var b=this.sg;b!==a&&(G&&cb(a,Yg,Yg,"wrap"),this.sg=a,this.v(),this.g("wrap",b,a))}},overflow:{configurable:!0,get:function(){return this.gg},set:function(a){var b=this.gg;b!==a&&(G&&cb(a,Yg,Yg,"overflow"),this.gg=a,this.v(),this.g("overflow",b,a))}},stroke:{configurable:!0,get:function(){return this.Jc},set:function(a){var b=this.Jc;b!== -a&&(null!==a&&am(a,"TextBlock.stroke"),a instanceof Al&&a.freeze(),this.Jc=a,this.R(),this.g("stroke",b,a))}},lineCount:{configurable:!0,get:function(){return this.bd}},lineHeight:{configurable:!0,get:function(){return eo(this)}},editable:{configurable:!0,get:function(){return this.Rn},set:function(a){var b=this.Rn;b!==a&&(G&&A(a,"boolean",Yg,"editable"),this.Rn=a,this.g("editable",b,a))}},textEditor:{configurable:!0,get:function(){return this.Xp}, -set:function(a){var b=this.Xp;b!==a&&(!G||a instanceof Oe||v("TextBlock.textEditor must be an HTMLInfo."),this.Xp=a,this.g("textEditor",b,a))}},errorFunction:{configurable:!0,get:function(){return this.qd},set:function(a){var b=this.qd;b!==a&&(null!==a&&A(a,"function",Yg,"errorFunction"),this.qd=a,this.g("errorFunction",b,a))}},interval:{configurable:!0,get:function(){return this.be},set:function(a){var b=this.be;G&&D(a,Yg,"interval");a=Math.round(a);if(b!==a&&0!==a&&isFinite(a)){this.be= +a&&(null!==a&&am(a,"TextBlock.stroke"),a instanceof Al&&a.freeze(),this.Jc=a,this.R(),this.g("stroke",b,a))}},lineCount:{configurable:!0,get:function(){return this.cd}},lineHeight:{configurable:!0,get:function(){return eo(this)}},editable:{configurable:!0,get:function(){return this.Rn},set:function(a){var b=this.Rn;b!==a&&(G&&A(a,"boolean",Yg,"editable"),this.Rn=a,this.g("editable",b,a))}},textEditor:{configurable:!0,get:function(){return this.Xp}, +set:function(a){var b=this.Xp;b!==a&&(!G||a instanceof Oe||v("TextBlock.textEditor must be an HTMLInfo."),this.Xp=a,this.g("textEditor",b,a))}},errorFunction:{configurable:!0,get:function(){return this.rd},set:function(a){var b=this.rd;b!==a&&(null!==a&&A(a,"function",Yg,"errorFunction"),this.rd=a,this.g("errorFunction",b,a))}},interval:{configurable:!0,get:function(){return this.be},set:function(a){var b=this.be;G&&D(a,Yg,"interval");a=Math.round(a);if(b!==a&&0!==a&&isFinite(a)){this.be= a;this.v();var c=this.panel;null!==c&&(c.Zf=null);this.g("interval",b,a)}}},graduatedStart:{configurable:!0,get:function(){return this.$d},set:function(a){var b=this.$d;G&&D(a,Yg,"graduatedStart");b!==a&&(0>a?a=0:1a?a=0:1=a&&Aa(a,"> 0",Yg,"maxLines"),this.Ee=a,this.v(),this.g("maxLines",b,a))}},metrics:{configurable:!0,get:function(){return{arrSize:null!==this.Fc?this.Fc:[this.vb],arrText:null!==this.Ub?this.Ub:[this.we],maxLineWidth:this.vb,fontHeight:this.ye}}},choices:{configurable:!0,get:function(){return this.un},set:function(a){var b=this.un;b!==a&&(G&&null!==a&&!Array.isArray(a)&&za(a,"Array",Yg,"choices:value"),this.un=a,this.g("choices",b,a))}}}); var fo=null,go=null,qo=new F(Yg,"None",0),no=new F(Yg,"WrapFit",1),ao=new F(Yg,"WrapDesiredSize",2),so=new F(Yg,"WrapBreakAll",3),$n=new F(Yg,"OverflowClip",0),ko=new F(Yg,"OverflowEllipsis",1),bo=new F(Yg,"FormatTrim",0),uo=new F(Yg,"FormatNone",0),to=/[ \u200b\u00ad]/,vo=new eb,wo=0,xo=new eb,yo=0,mo="...",ho="",Zn=null,Yn=!1;Yg.className="TextBlock";Yg.getEllipsis=function(){return mo};Yg.setEllipsis=function(a){mo=a;xo=new eb;yo=0};Yg.getBaseline=function(){return fo}; Yg.setBaseline=function(a){fo=a};Yg.getUnderline=function(){return go};Yg.setUnderline=function(a){go=a};Yg.isValidFont=co;Yg.FormatNone=uo;Yg.FormatTrim=bo;Yg.None=qo;Yg.OverflowClip=$n;Yg.OverflowEllipsis=ko;Yg.WrapBreakAll=so;Yg.WrapDesiredSize=ao;Yg.WrapFit=no; -function jk(a,b){O.call(this);this.Sg=null;this.Qp="";this.sh=uc;this.sl=Fd;this.vh=this.qd=null;this.rl=Kc;this.Xd=tg;this.im=null;this.qo=!1;this.hi=!0;this.Hl=!1;this.bm=null;"string"===typeof a?this.source=a:a&&Object.assign(this,a);b&&Object.assign(this,b)}var zo;na(jk,O);jk.prototype.cloneProtected=function(a){O.prototype.cloneProtected.call(this,a);a.element=this.Sg;a.Qp=this.Qp;a.sh=this.sh.L();a.sl=this.sl;a.Xd=this.Xd;a.qd=this.qd;a.vh=this.vh;a.rl=this.rl.L();a.hi=this.hi;a.bm=this.bm}; +function jk(a,b){O.call(this);this.Sg=null;this.Qp="";this.sh=uc;this.sl=Fd;this.vh=this.rd=null;this.rl=Kc;this.Xd=tg;this.im=null;this.qo=!1;this.hi=!0;this.Hl=!1;this.bm=null;"string"===typeof a?this.source=a:a&&Object.assign(this,a);b&&Object.assign(this,b)}var zo;na(jk,O);jk.prototype.cloneProtected=function(a){O.prototype.cloneProtected.call(this,a);a.element=this.Sg;a.Qp=this.Qp;a.sh=this.sh.L();a.sl=this.sl;a.Xd=this.Xd;a.rd=this.rd;a.vh=this.vh;a.rl=this.rl.L();a.hi=this.hi;a.bm=this.bm}; jk.prototype.mb=function(a){a===tg||a===vg||a===kl?this.imageStretch=a:O.prototype.mb.call(this,a)};jk.prototype.toString=function(){return"Picture("+this.source+")#"+kb(this)};function Ki(a){void 0===a&&(a="");A(a,"string",jk,"clearCache:url");""!==a?zo[a]&&(delete zo[a],Ao--):(zo=new eb,Ao=0)} function Bo(a,b){b.kz||(b.Ur=function(c){b.Mr=!0;b.ko=!1;var d=b.Og.copy();if(null!==d&&void 0!==d){for(d=d.iterator;d.next();){var e=d.value;var f=b.getAttribute("src")||"";var g=e.lh.K(f);if(null!==g)for(var h=g.length,k=0;k=d.width&&(e=e+r.offsetX+(m*r.x-d.width*r.x));n>=d.height&&(f=f+r.offsetY+(n*r.y-d.height*r.y));h=Math.min(d.width,m);g=Math.min(d.height,n);break;case Fd:m=d.width;n=d.height;break;case vg:case kl:p===vg?(p=Math.min(d.height/n,d.width/m),m*=p,n*=p):p===kl&&(p=Math.max(d.height/n,d.width/m),m*=p,n*=p,m>=d.width&&(e=(e+r.offsetX+(m*r.x-d.width*r.x)/m)*h),n>=d.height&&(f=(f+r.offsetY+(n*r.y-d.height*r.y)/n)*g),h*=1/(m/ d.width),g*=1/(n/d.height),m=d.width,n=d.height)}p=this.If()*b.scale;var q=m*p*n*p,u=h*g/q,w=c.__goCache;p=null;var y=Co;if(c.Mr&&void 0!==w&&4y*y)for(null===w.Pi&&(Do(w,4,k,l,c),Do(w,16,k,l,c)),k=w.Pi,l=k.length,q=0;qe.x&&a.y>e.y&&a.righte.x&&b.y>e.y&&b.righte.x&&a.y>e.y&&a.righte.x&&b.y>e.y&&b.right=c.maxSelectionCount)){this.G^=4096;var d=!1;if(null!==c){d=c.skipsUndoManager;c.skipsUndoManager=!0;var e=c.selection; e.ka();a?e.add(this):e.remove(this);e.freeze()}this.g("isSelected",b,a);this.Qb();a=this.selectionChanged;null!==a&&a(this);null!==c&&(c.Lb(),c.skipsUndoManager=d)}}}},isHighlighted:{configurable:!0,get:function(){return 0!==(this.G&524288)},set:function(a){var b=0!==(this.G&524288);if(b!==a){G&&A(a,"boolean",U,"isHighlighted");this.G^=524288;var c=this.diagram;null!==c&&(c=c.highlighteds,c.ka(),a?c.add(this):c.remove(this),c.freeze());this.g("isHighlighted",b,a);this.R();a=this.highlightedChanged; @@ -1496,7 +1496,7 @@ this.Gp=a,this.g("selectionAdornmentTemplate",b,a))}},selectionObject:{configura b,a))}},resizeAdornmentTemplate:{configurable:!0,get:function(){return this.sp},set:function(a){var b=this.sp;b!==a&&(G&&x(a,Je,U,"resizeAdornmentTemplate"),this.sp=a,this.g("resizeAdornmentTemplate",b,a))}},resizeObjectName:{configurable:!0,get:function(){return this.vp},set:function(a){var b=this.vp;b!==a&&(G&&A(a,"string",U,"resizeObjectName"),this.vp=a,this.g("resizeObjectName",b,a))}},resizeObject:{configurable:!0,get:function(){var a=this.resizeObjectName; return""!==a&&(a=this.eb(a),null!==a)?a:this}},resizeCellSize:{configurable:!0,get:function(){return this.tp},set:function(a){var b=this.tp;b.B(a)||(G&&x(a,Hb,U,"resizeCellSize"),this.tp=a=a.L(),this.g("resizeCellSize",b,a))}},rotateAdornmentTemplate:{configurable:!0,get:function(){return this.xp},set:function(a){var b=this.xp;b!==a&&(G&&x(a,Je,U,"rotateAdornmentTemplate"),this.xp=a,this.g("rotateAdornmentTemplate",b,a))}},rotateObjectName:{configurable:!0, get:function(){return this.yp},set:function(a){var b=this.yp;b!==a&&(G&&A(a,"string",U,"rotateObjectName"),this.yp=a,this.g("rotateObjectName",b,a))}},rotateObject:{configurable:!0,get:function(){var a=this.rotateObjectName;return""!==a&&(a=this.eb(a),null!==a)?a:this}},rotationSpot:{configurable:!0,get:function(){return this.zp},set:function(a){var b=this.zp;b.B(a)||(G&&(x(a,Ib,U,"rotationSpot"),a===gd||a.fb()||v("Part.rotationSpot must be a specific Spot value or Spot.Default, not: "+ -a)),this.zp=a=a.L(),this.g("rotationSpot",b,a))}},text:{configurable:!0,get:function(){return this.Zb},set:function(a){var b=this.Zb;b!==a&&(G&&A(a,"string",U,"text"),this.Zb=a,this.g("text",b,a))}},containingGroup:{configurable:!0,get:function(){return this.ai},set:function(a){if(this.Pc()){var b=this.ai;if(b!==a){G&&null!==a&&x(a,vf,U,"containingGroup");null===a||this!==a&&!a.Md(this)||(this===a&&v("Cannot make a Group a member of itself: "+this.toString()),v("Cannot make a Group indirectly contain itself: "+ +a)),this.zp=a=a.L(),this.g("rotationSpot",b,a))}},text:{configurable:!0,get:function(){return this.Zb},set:function(a){var b=this.Zb;b!==a&&(G&&A(a,"string",U,"text"),this.Zb=a,this.g("text",b,a))}},containingGroup:{configurable:!0,get:function(){return this.ai},set:function(a){if(this.Qc()){var b=this.ai;if(b!==a){G&&null!==a&&x(a,vf,U,"containingGroup");null===a||this!==a&&!a.Md(this)||(this===a&&v("Cannot make a Group a member of itself: "+this.toString()),v("Cannot make a Group indirectly contain itself: "+ this.toString()+" already contains "+a.toString()));this.C(2);var c=this.diagram;null!==b?Vo(b,this):this instanceof vf&&null!==c&&c.Ji.remove(this);this.ai=a;null!==a?Uo(a,this):this instanceof vf&&null!==c&&c.Ji.add(this);this.C(1);if(null!==c&&c.ba){var d=this.data,e=c.model;if(null!==d&&e.aj()){var f=e.va(null!==a?a.data:null);e.Tq(d,f)}}d=this.containingGroupChanged;null!==d&&(e=!0,null!==c&&(e=c.ba,c.ba=!0),d(this,b,a),null!==c&&(c.ba=e));if(this instanceof vf)for(c=new I,el(c,this,!0,0,!0), c=c.iterator;c.next();)if(d=c.value,d instanceof V)for(d=d.linksConnected;d.next();)$o(d.value);if(this instanceof V){for(c=this.linksConnected;c.next();)$o(c.value);c=this.labeledLink;null!==c&&$o(c)}this.g("containingGroup",b,a);null!==a&&(b=a.layer,null!==b&&qi(b,-1,a))}}else v("cannot set the Part.containingGroup of a Link or Adornment")}},containingGroupChanged:{configurable:!0,get:function(){return this.xn},set:function(a){var b=this.xn;b!==a&&(null!==a&&A(a,"function",U,"containingGroupChanged"), this.xn=a,this.g("containingGroupChanged",b,a))}},isTopLevel:{configurable:!0,get:function(){return null!==this.containingGroup||this instanceof V&&null!==this.labeledLink?!1:!0}},layoutConditions:{configurable:!0,get:function(){return this.Eo},set:function(a){var b=this.Eo;b!==a&&(G&&A(a,"number",U,"layoutConditions"),this.Eo=a,this.g("layoutConditions",b,a))}},dragComputation:{configurable:!0,get:function(){return this.Nn},set:function(a){var b=this.Nn; @@ -1504,14 +1504,14 @@ b!==a&&(null!==a&&A(a,"function",U,"dragComputation"),this.Nn=a,this.g("dragComp enumerable:!0,get:function(){return this.ng},set:function(a){var b=this.ng;b!==a&&(G&&A(a,"number",U,"shadowBlur"),this.ng=a,this.R(),this.g("shadowBlur",b,a))}}});U.prototype.invalidateLayout=U.prototype.C;U.prototype.findCommonContainingGroup=U.prototype.iy;U.prototype.isMemberOf=U.prototype.Md;U.prototype.findTopLevelPart=U.prototype.qA;U.prototype.findSubGraphLevel=U.prototype.mA;U.prototype.ensureBounds=U.prototype.Xa;U.prototype.getDocumentBounds=U.prototype.Yi;U.prototype.findObject=U.prototype.eb; U.prototype.moveTo=U.prototype.moveTo;U.prototype.invalidateAdornments=U.prototype.Qb;U.prototype.clearAdornments=U.prototype.mk;U.prototype.removeAdornment=U.prototype.Of;U.prototype.addAdornment=U.prototype.Eh;U.prototype.findAdornment=U.prototype.vk;U.prototype.updateTargetBindings=U.prototype.Ia;var So=!1;U.className="Part";U.LayoutNone=0;U.LayoutAdded=1;U.LayoutRemoved=2;U.LayoutShown=4;U.LayoutHidden=8;U.LayoutNodeSized=16;U.LayoutGroupLayout=32;U.LayoutNodeReplaced=64;U.LayoutStandard=127; U.LayoutAll=16777215;function Je(a,b){void 0===a||a instanceof Yl||"string"===typeof a?U.call(this,a):(U.call(this),a&&(b=a));this.G&=-257;this.$g="Adornment";this.re=null;this.sx=0;this.Mx=!1;this.j=this.Ra=null;b&&Object.assign(this,b)}na(Je,U);Je.prototype.toString=function(){var a=this.adornedPart;return"Adornment("+this.category+")"+(null!==a?a.toString():"")};Je.prototype.updateRelationshipsFromData=function(){}; -Je.prototype.Ek=function(a){var b=this.adornedObject,c=null===b||void 0===b?void 0:b.part;if(c instanceof R&&b instanceof Hf){b=c.path;c.Ek(a);a=b.geometry;c=this.W.m;b=c.length;for(var d=0;da&&(a=2);var b=this.diagram;if(null!==b&&!b.Ue){b.Ue=!0;var c=new I;c.add(this);mp(this,c,b.isTreePathToChildren,a,b,this,b.treeCollapsePolicy===Ei);b.Ue=!1}}; -function mp(a,b,c,d,e,f,g){for(var h=f===a?!1:a.isTreeExpanded,k=c?a.uq():a.Kd();k.next();){var l=k.value;l.isTreeLink&&(h||l.xd||l.Za(),l=l.zq(a),null!==l&&l!==a&&!b.contains(l)&&(b.add(l),h||(l.Sb(!0),l.Nh(),g&&e.kk(l,f)),2e&&(e=h.right);h.bottom>f&&(f=h.bottom)}}isFinite(c)&&isFinite(d)?a.h(c,d,e-c,f-d):(b=b.location, a.h(b.x,b.y,0,0));return a};oa.Object.defineProperties(rg.prototype,{padding:{configurable:!0,get:function(){return this.rb},set:function(a){"number"===typeof a?a=new ic(a):x(a,ic,rg,"padding");var b=this.rb;b.B(a)||(this.rb=a=a.L(),this.g("padding",b,a),this.v())}}});rg.className="Placeholder"; -function R(a){U.call(this,W.Link);this.Na=8;this.df=null;this.ef="";this.xf=this.$n=null;this.yf="";this.$p=null;this.Rk=hg;this.En=0;this.Gn=hg;this.Hn=NaN;this.ak=rp;this.Pp=.5;this.rd=null;this.Gb=(new H).freeze();this.qf=this.Ic=null;this.Tl=new M;this.sa=new N;this.F=this.o=this.Uf=this.Yf=null;this.dv=new K;this.Dr=this.Fx=this.Ex=null;this.du=NaN;this.T=null;this.j=[];a&&Object.assign(this,a)}na(R,U); +function R(a){U.call(this,W.Link);this.Na=8;this.df=null;this.ef="";this.xf=this.$n=null;this.yf="";this.$p=null;this.Rk=hg;this.En=0;this.Gn=hg;this.Hn=NaN;this.ak=rp;this.Pp=.5;this.sd=null;this.Gb=(new H).freeze();this.qf=this.Ic=null;this.Tl=new M;this.sa=new N;this.F=this.o=this.Uf=this.Yf=null;this.dv=new K;this.Dr=this.Fx=this.Ex=null;this.du=NaN;this.T=null;this.j=[];a&&Object.assign(this,a)}na(R,U); R.prototype.cloneProtected=function(a){U.prototype.cloneProtected.call(this,a);a.Na=this.Na&-113;a.ef=this.ef;a.$n=this.$n;a.yf=this.yf;a.$p=this.$p;a.Rk=this.Rk;a.En=this.En;a.Gn=this.Gn;a.Hn=this.Hn;a.ak=this.ak;a.Pp=this.Pp;null!==this.T&&(a.T=this.T.copy())};t=R.prototype;t.Ef=function(a){U.prototype.Ef.call(this,a);this.ef=a.ef;this.yf=a.yf;a.Ic=null;a.Za();a.Uf=this.Uf;var b=a.fromPort;null!==b&&dp(b);a=a.toPort;null!==a&&dp(a)}; -t.mb=function(a){a.classType===R?2===(a.value&2)?this.routing=a:a===kg||a===gg||a===fg?this.curve=a:a===sp||a===tp||a===up?this.adjusting=a:a!==rp&&a!==hg&&v("Unknown Link enum value for a Link property: "+a):U.prototype.mb.call(this,a)};t.Nc=function(){null===this.T&&(this.T=new ql)};t.ej=function(){var a=this.fromNode;if(null!==a){var b=a.findVisibleNode();null!==b&&(a=b);if(Bj(a)||Cj(a))return!1}a=this.toNode;return null!==a&&(b=a.findVisibleNode(),null!==b&&(a=b),Bj(a)||Cj(a))?!1:!0};t.mw=function(){return!1}; -t.tt=function(){};t.Pc=function(){return!1};R.prototype.computeAngle=function(a,b,c){return R.computeAngle(b,c)};R.computeAngle=function(a,b){switch(a){default:case hg:a=0;break;case fn:a=b;break;case Zm:a=b+90;break;case an:a=b-90;break;case vp:a=b+180;break;case gn:a=L.Iq(b);90a&&(a-=180);break;case $m:a=L.Iq(b+90);90a&&(a-=180);break;case bn:a=L.Iq(b-90);90a&&(a-=180);break;case cn:a=L.Iq(b);if(45a||225a)return 0;90a&&(a-=180)}return L.Iq(a)}; -function $o(a){var b=a.fromNode,c=a.toNode,d=null;null!==b?d=null!==c?b.iy(c):b.containingGroup:null!==c?d=c.containingGroup:d=null;b=d;c=a.ai;if(c!==b){null!==c&&Vo(c,a);a.ai=b;null!==b&&Uo(b,a);var e=a.containingGroupChanged;if(null!==e){var f=!0,g=a.diagram;null!==g&&(f=g.ba,g.ba=!0);e(a,c,b);null!==g&&(g.ba=f)}!a.xd||a.Ex!==c&&a.Fx!==c||a.Za()}if(a.isLabeledLink)for(a=a.labelNodes;a.next();)a.value.containingGroup=d}t=R.prototype; -t.Nh=function(){var a=this.containingGroup;null!==a&&this.fromNode!==a&&this.toNode!==a&&a.computesBoundsIncludingLinks&&U.prototype.Nh.call(this)};t.zq=function(a){G&&x(a,V,R,"getOtherNode:node");var b=this.fromNode;return a===b?this.toNode:b};t.zA=function(a){G&&x(a,O,R,"getOtherPort:port");var b=this.fromPort;return a===b?this.toPort:b};function hp(a,b){null===a.rd&&(a.rd=new I);a.rd.add(b);a.v()} +t.mb=function(a){a.classType===R?2===(a.value&2)?this.routing=a:a===kg||a===gg||a===fg?this.curve=a:a===sp||a===tp||a===up?this.adjusting=a:a!==rp&&a!==hg&&v("Unknown Link enum value for a Link property: "+a):U.prototype.mb.call(this,a)};t.Oc=function(){null===this.T&&(this.T=new ql)};t.ej=function(){var a=this.fromNode;if(null!==a){var b=a.findVisibleNode();null!==b&&(a=b);if(Bj(a)||Cj(a))return!1}a=this.toNode;return null!==a&&(b=a.findVisibleNode(),null!==b&&(a=b),Bj(a)||Cj(a))?!1:!0};t.mw=function(){return!1}; +t.tt=function(){};t.Qc=function(){return!1};R.prototype.computeAngle=function(a,b,c){return R.computeAngle(b,c)};R.computeAngle=function(a,b){switch(a){default:case hg:a=0;break;case fn:a=b;break;case Zm:a=b+90;break;case an:a=b-90;break;case vp:a=b+180;break;case gn:a=L.Iq(b);90a&&(a-=180);break;case $m:a=L.Iq(b+90);90a&&(a-=180);break;case bn:a=L.Iq(b-90);90a&&(a-=180);break;case cn:a=L.Iq(b);if(45a||225a)return 0;90a&&(a-=180)}return L.Iq(a)}; +function $o(a){var b=a.fromNode,c=a.toNode,d=null;null!==b?d=null!==c?b.iy(c):b.containingGroup:null!==c?d=c.containingGroup:d=null;b=d;c=a.ai;if(c!==b){null!==c&&Vo(c,a);a.ai=b;null!==b&&Uo(b,a);var e=a.containingGroupChanged;if(null!==e){var f=!0,g=a.diagram;null!==g&&(f=g.ba,g.ba=!0);e(a,c,b);null!==g&&(g.ba=f)}!a.yd||a.Ex!==c&&a.Fx!==c||a.Za()}if(a.isLabeledLink)for(a=a.labelNodes;a.next();)a.value.containingGroup=d}t=R.prototype; +t.Nh=function(){var a=this.containingGroup;null!==a&&this.fromNode!==a&&this.toNode!==a&&a.computesBoundsIncludingLinks&&U.prototype.Nh.call(this)};t.zq=function(a){G&&x(a,V,R,"getOtherNode:node");var b=this.fromNode;return a===b?this.toNode:b};t.zA=function(a){G&&x(a,O,R,"getOtherPort:port");var b=this.fromPort;return a===b?this.toPort:b};function hp(a,b){null===a.sd&&(a.sd=new I);a.sd.add(b);a.v()} t.Bq=function(a){U.prototype.Bq.call(this,a);wp(this)&&this.Dq(this.actualBounds);if(!a){a=this.df;var b=null;null!==a&&(b=this.fromPort,fp(a,this,b));var c=this.xf;if(null!==c){var d=this.toPort;c===a&&d===b||fp(c,this,d)}xp(this)}};t.Cq=function(a){U.prototype.Cq.call(this,a);wp(this)&&this.Dq(this.actualBounds);if(!a){a=this.df;var b=null;null!==a&&(b=this.fromPort,gp(a,this,b));var c=this.xf;if(null!==c){var d=this.toPort;c===a&&d===b||gp(c,this,d)}yp(this)}}; -t.tk=function(){this.xd=!0;if(null!==this.rd){var a=this.diagram;if(null!==a)for(var b=this.rd.copy().iterator;b.next();)a.remove(b.value)}null!==this.data&&(a=this.diagram,null!==a&&a.partManager.removeDataForLink(this))};R.prototype.updateRelationshipsFromData=function(){if(null!==this.data){var a=this.diagram;null!==a&&a.partManager.updateRelationshipsFromData(this)}}; +t.tk=function(){this.yd=!0;if(null!==this.sd){var a=this.diagram;if(null!==a)for(var b=this.sd.copy().iterator;b.next();)a.remove(b.value)}null!==this.data&&(a=this.diagram,null!==a&&a.partManager.removeDataForLink(this))};R.prototype.updateRelationshipsFromData=function(){if(null!==this.data){var a=this.diagram;null!==a&&a.partManager.updateRelationshipsFromData(this)}}; R.prototype.move=function(a,b){var c=b?this.location:this.position,d=c.x;isNaN(d)&&(d=0);var e=c.y;isNaN(e)&&(e=0);d=a.x-d;e=a.y-e;!0===b?U.prototype.move.call(this,a,!1):(a=K.allocAt(c.x+d,c.y+e),U.prototype.move.call(this,a,!1),K.free(a));lf(this,d,e);for(a=this.labelNodes;a.next();)b=a.value,c=b.position,b.moveTo(c.x+d,c.y+e)}; R.prototype.canRelinkFrom=function(){if(!this.relinkableFrom)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowRelink)return!1;a=a.diagram;return null===a||a.allowRelink?!0:!1};R.prototype.canRelinkTo=function(){if(!this.relinkableTo)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowRelink)return!1;a=a.diagram;return null===a||a.allowRelink?!0:!1}; R.prototype.computeMidPoint=function(a){var b=this.pointsCount;if(0===b)return a.assign(Cb),a;if(1===b)return a.assign(this.i(0)),a;if(2===b){var c=this.i(0),d=this.i(1);a.h((c.x+d.x)/2,(c.y+d.y)/2);return a}if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===kg))return this.sa.Jv(.5,a),a.add(this.i(0)),c=this.sa.figures.first(),a.offset(-c.startX,-c.startY),a;if(this.computeCurve()===kg){if(3===b)return this.i(1);d=(b-1)/3|0;c=3*(d/2|0);if(1===d%2){d=this.i(c);var e=this.i(c+1), f=this.i(c+2);c=this.i(c+3);L.Hz(d.x,d.y,e.x,e.y,f.x,f.y,c.x,c.y,a)}else a.assign(this.i(c));return a}var g=this.flattenedLengths;c=this.flattenedTotalLength;for(e=f=d=0;dc/2)break;d+=e;f++}b=this.i(f);f=this.i(f+1);1>Math.abs(b.x-f.x)?b.y>f.y?a.h(b.x,b.y-(c/2-d)):a.h(b.x,b.y+(c/2-d)):1>Math.abs(b.y-f.y)?b.x>f.x?a.h(b.x-(c/2-d),b.y):a.h(b.x+(c/2-d),b.y):(c=(c/2-d)/e,a.h(b.x+c*(f.x-b.x),b.y+c*(f.y-b.y)));return a}; -R.prototype.computeMidAngle=function(){var a=this.pointsCount;if(2>a)return NaN;if(2===a)return this.i(0).Ua(this.i(1));if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===kg))return this.sa.oy(.5);if(this.computeCurve()===kg&&4<=a){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){c=Math.floor(c);a=this.i(c);b=this.i(c+1);var d=this.i(c+2);c=this.i(c+3);return L.Gz(a.x,a.y,b.x,b.y,d.x,d.y,c.x,c.y)}if(0d/2)break;e+=f;c++}b=this.i(c);d=this.i(c+1);if(1>Math.abs(b.x-d.x)&&1>Math.abs(b.y-d.y)){if(0Math.abs(b.x-d.x))return b.y>d.y?270:90;if(1>Math.abs(b.y-d.y))return b.x>d.x?180:0}return b.Ua(d)};t=R.prototype;t.i=function(a){return this.Gb.m[a]}; -t.Sc=function(a,b){G&&(x(b,K,R,"setPoint"),b.s()||v("Link.setPoint called with a Point that does not have real numbers: "+b.toString()));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.Rc(a,b)};t.O=function(a,b,c){G&&(D(b,R,"setPointAt:x"),D(c,R,"setPointAt:y"));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.Rc(a,new K(b,c))}; +R.prototype.computeMidAngle=function(){var a=this.pointsCount;if(2>a)return NaN;if(2===a)return this.i(0).Wa(this.i(1));if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===kg))return this.sa.oy(.5);if(this.computeCurve()===kg&&4<=a){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){c=Math.floor(c);a=this.i(c);b=this.i(c+1);var d=this.i(c+2);c=this.i(c+3);return L.Gz(a.x,a.y,b.x,b.y,d.x,d.y,c.x,c.y)}if(0d/2)break;e+=f;c++}b=this.i(c);d=this.i(c+1);if(1>Math.abs(b.x-d.x)&&1>Math.abs(b.y-d.y)){if(0Math.abs(b.x-d.x))return b.y>d.y?270:90;if(1>Math.abs(b.y-d.y))return b.x>d.x?180:0}return b.Wa(d)};t=R.prototype;t.i=function(a){return this.Gb.m[a]}; +t.Tc=function(a,b){G&&(x(b,K,R,"setPoint"),b.s()||v("Link.setPoint called with a Point that does not have real numbers: "+b.toString()));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.Sc(a,b)};t.O=function(a,b,c){G&&(D(b,R,"setPointAt:x"),D(c,R,"setPointAt:y"));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.Sc(a,new K(b,c))}; t.IA=function(a,b){G&&(x(b,K,R,"insertPoint"),b.s()||v("Link.insertPoint called with a Point that does not have real numbers: "+b.toString()));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.zb(a,b)};t.l=function(a,b,c){G&&(D(b,R,"insertPointAt:x"),D(c,R,"insertPointAt:y"));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.zb(a,new K(b,c))}; t.ke=function(a){G&&(x(a,K,R,"addPoint"),a.s()||v("Link.addPoint called with a Point that does not have real numbers: "+a.toString()));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.add(a)};t.Bf=function(a,b){G&&(D(a,R,"insertPointAt:x"),D(b,R,"insertPointAt:y"));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.add(new K(a,b))}; t.ew=function(a){G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.kb(a)};t.nk=function(){G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.clear()}; -function lf(a,b,c){if(0!==b||0!==c)if(0===a.pointsCount)a.defaultFromPoint&&a.defaultFromPoint.offset(b,c),a.defaultToPoint&&a.defaultToPoint.offset(b,c);else{for(var d=a.xd,e=new H,f=a.Gb.iterator;f.next();){var g=f.value;e.add((new K(g.x+b,g.y+c)).freeze())}e.freeze();f=a.Gb;a.Gb=e;g=a.diagram;isNaN(b)||isNaN(c)||null!==g&&g.animationManager.wb?a.v():(a.ge.h(a.ge.x+b,a.ge.y+c),a.qa.h(a.qa.x+b,a.qa.y+c),Nl(a));d?zp(a):(a.defaultFromPoint&&(a.defaultFromPoint=a.i(0)),a.defaultToPoint&&(a.defaultToPoint= +function lf(a,b,c){if(0!==b||0!==c)if(0===a.pointsCount)a.defaultFromPoint&&a.defaultFromPoint.offset(b,c),a.defaultToPoint&&a.defaultToPoint.offset(b,c);else{for(var d=a.yd,e=new H,f=a.Gb.iterator;f.next();){var g=f.value;e.add((new K(g.x+b,g.y+c)).freeze())}e.freeze();f=a.Gb;a.Gb=e;g=a.diagram;isNaN(b)||isNaN(c)||null!==g&&g.animationManager.wb?a.v():(a.ge.h(a.ge.x+b,a.ge.y+c),a.qa.h(a.qa.x+b,a.qa.y+c),Nl(a));d?zp(a):(a.defaultFromPoint&&(a.defaultFromPoint=a.i(0)),a.defaultToPoint&&(a.defaultToPoint= a.i(a.pointsCount-1)));null!==g&&g.animationManager.wb&&(b=g.animationManager,a.qf=e,b.Vl.add(a));a.g("points",f,e)}}t.Sh=function(){null===this.Ic&&(this.Ic=this.Gb,this.Gb=this.Gb.copy())}; t.Df=function(){if(null!==this.Ic){for(var a=this.Ic,b=this.Gb,c=Infinity,d=Infinity,e=a.m,f=e.length,g=0;gl&&(n=-n),u= -(0>k?-1:1)*n+r,w=m*(u-r)+q);r=f.x+2*h/3;q=f.y+2*k/3;var y=r,z=q;L.A(k,0)?z=0k?-1:1)*n+r,z=m*(y-r)+q);this.nk();this.ke(f);this.Bf(u,w);this.Bf(y,z);this.ke(p);this.Sc(0,this.getLinkPoint(a,b,g,!0,!1,d,e));this.Sc(3,this.getLinkPoint(d,e,c,!1,!1,a,b))}else if(f=d,p=e,d=this.getLinkPoint(a,b,g,!0,!1,f,p),e=this.getLinkPoint(f,p,c,!1,!1,a,b),this.hasCurviness())p=e.x-d.x,c=e.y-d.y,g=this.computeCurviness(),a=d.x+p/2,b=d.y+c/2,f=a,h=b,L.A(c,0)?h=0g&&(f=-f),f=(0>c?-1:1)*f+a,h=p*(f-a)+b),this.ke(d),this.Bf(f,h),this.ke(e);else{this.ke(d);this.ke(e);h=M.alloc();b.Yi(h);k=h.ca(e);p.Yi(h);l=h.ca(d);if(k||l)g=b.ja(Ep(g),new K),this.Sc(0,this.getLinkPointFromPoint(a,b,g,e,!0,g)),c=p.ja(Ep(c),new K),this.Sc(1,this.getLinkPointFromPoint(f,p,c,d,!1,c));M.free(h)}}else{n=this.isAvoiding;p&&(m&&n||l)&&this.nk();var B=l?this.computeCurviness():0;n=this.getLinkPoint(a,b,g,!0,m,d,e);r=u=q=0;if(m||!h||l)w=this.computeEndSegmentLength(a,b,g,!0),r= +(0>k?-1:1)*n+r,w=m*(u-r)+q);r=f.x+2*h/3;q=f.y+2*k/3;var y=r,z=q;L.A(k,0)?z=0k?-1:1)*n+r,z=m*(y-r)+q);this.nk();this.ke(f);this.Bf(u,w);this.Bf(y,z);this.ke(p);this.Tc(0,this.getLinkPoint(a,b,g,!0,!1,d,e));this.Tc(3,this.getLinkPoint(d,e,c,!1,!1,a,b))}else if(f=d,p=e,d=this.getLinkPoint(a,b,g,!0,!1,f,p),e=this.getLinkPoint(f,p,c,!1,!1,a,b),this.hasCurviness())p=e.x-d.x,c=e.y-d.y,g=this.computeCurviness(),a=d.x+p/2,b=d.y+c/2,f=a,h=b,L.A(c,0)?h=0g&&(f=-f),f=(0>c?-1:1)*f+a,h=p*(f-a)+b),this.ke(d),this.Bf(f,h),this.ke(e);else{this.ke(d);this.ke(e);h=M.alloc();b.Yi(h);k=h.ca(e);p.Yi(h);l=h.ca(d);if(k||l)g=b.ja(Ep(g),new K),this.Tc(0,this.getLinkPointFromPoint(a,b,g,e,!0,g)),c=p.ja(Ep(c),new K),this.Tc(1,this.getLinkPointFromPoint(f,p,c,d,!1,c));M.free(h)}}else{n=this.isAvoiding;p&&(m&&n||l)&&this.nk();var B=l?this.computeCurviness():0;n=this.getLinkPoint(a,b,g,!0,m,d,e);r=u=q=0;if(m||!h||l)w=this.computeEndSegmentLength(a,b,g,!0),r= this.getLinkDirection(a,b,n,g,!0,m,d,e),l&&(h||g.B(c)||!m&&1===g.x+c.x&&1===g.y+c.y)&&(r-=m?90:30,0>B&&(r-=180)),0>r?r+=360:360<=r&&(r-=360),l&&(w+=Math.abs(B)*(m?1:2)),0===r?q=w:90===r?u=w:180===r?q=-w:270===r?u=-w:(q=w*Math.cos(r*Math.PI/180),u=w*Math.sin(r*Math.PI/180)),g.bc()&&l&&(w=b.ja(Kc,K.alloc()),y=K.allocAt(w.x+1E3*q,w.y+1E3*u),this.getLinkPointFromPoint(a,b,w,y,!0,n),K.free(w),K.free(y));w=this.getLinkPoint(d,e,c,!1,m,a,b);var C=z=y=0;if(m||!k||l){var E=this.computeEndSegmentLength(d,e, c,!1);C=this.getLinkDirection(d,e,w,c,!1,m,a,b);l&&(k||g.B(c)||!m&&1===g.x+c.x&&1===g.y+c.y)&&(C+=m?0:30,0>B&&(C+=180));0>C?C+=360:360<=C&&(C-=360);l&&(E+=Math.abs(B)*(m?1:2));0===C?y=E:90===C?z=E:180===C?y=-E:270===C?z=-E:(y=E*Math.cos(C*Math.PI/180),z=E*Math.sin(C*Math.PI/180));c.bc()&&l&&(c=e.ja(Kc,K.alloc()),g=K.allocAt(c.x+1E3*y,c.y+1E3*z),this.getLinkPointFromPoint(d,e,c,g,!1,w),K.free(c),K.free(g))}c=n;if(m||!h||l)c=new K(n.x+q,n.y+u);g=w;if(m||!k||l)g=new K(w.x+y,w.y+z);!p&&!m&&h&&3Math.abs(b.y-a.y)?(b.x>=a.x?b.x=a.x+9E9:b.x=a.x-9E9,b.y=a.y):(b.y>=a.y?b.y=a.y+9E9:b.y=a.y-9E9,b.x=a.x);return b} +n,f-2,g)?this.Tc(f-1,w):!p&&!m&&k&&3Math.abs(b.y-a.y)?(b.x>=a.x?b.x=a.x+9E9:b.x=a.x-9E9,b.y=a.y):(b.y>=a.y?b.y=a.y+9E9:b.y=a.y-9E9,b.x=a.x);return b} R.prototype.getLinkPointFromPoint=function(a,b,c,d,e,f){void 0===f&&(f=new K);if(null===a||null===b)return f.assign(c),f;a.isVisible()||(e=a.findVisibleNode(),null!==e&&e!==a&&(b=e.port));a=null;e=b.panel;null===e||e.pe()||(e=e.panel);if(null===e){e=d.x;d=d.y;var g=c.x;c=c.y}else{a=e.le;e=1/(a.m11*a.m22-a.m12*a.m21);g=a.m22*e;var h=-a.m12*e,k=-a.m21*e,l=a.m11*e,m=e*(a.m21*a.dy-a.m22*a.dx),n=e*(a.m12*a.dx-a.m11*a.dy);e=d.x*g+d.y*k+m;d=d.x*h+d.y*l+n;g=c.x*g+c.y*k+m;c=c.x*h+c.y*l+n}b.yk(e,d,g,c,f);null!== a&&f.transform(a);return f};function Gp(a,b){var c=b.op;null===c&&(c=new Hp,c.port=b,c.node=b.part,b.op=c);return Ip(c,a)} -R.prototype.getLinkPoint=function(a,b,c,d,e,f,g,h){void 0===h&&(h=new K);if(c.fb()&&!Dp(c))return b.ja(c,h),h;if(c.Qc()){var k=Gp(this,b);if(null!==k){h.assign(k.Gq);if(e&&this.routing===Jp){var l=Gp(this,g);if(null!==l&&k.tm=m.y&&a.y<=m.y+m.height?h.y=a.y:(c.Lf(Qc)||c.Lf(Tc))&&a.x>=m.x&&a.x<=m.x+m.width&&(h.x=a.x);K.free(k);K.free(l)}}return h}}c= +R.prototype.getLinkPoint=function(a,b,c,d,e,f,g,h){void 0===h&&(h=new K);if(c.fb()&&!Dp(c))return b.ja(c,h),h;if(c.Rc()){var k=Gp(this,b);if(null!==k){h.assign(k.Gq);if(e&&this.routing===Jp){var l=Gp(this,g);if(null!==l&&k.tm=m.y&&a.y<=m.y+m.height?h.y=a.y:(c.Lf(Qc)||c.Lf(Tc))&&a.x>=m.x&&a.x<=m.x+m.width&&(h.x=a.x);K.free(k);K.free(l)}}return h}}c= b.ja(Ep(c),K.alloc());this.pointsCount>(e?6:2)?(g=d?this.i(1):this.i(this.pointsCount-2),e&&(g=Fp(c,g.copy()))):(k=this.computeSpot(!d,g),f=K.alloc(),g=g.ja(Ep(k),f),e&&(g=Fp(c,g)),K.free(f));this.getLinkPointFromPoint(a,b,c,g,d,h);K.free(c);return h}; -R.prototype.getLinkDirection=function(a,b,c,d,e,f,g,h){a:if(d.fb())var k=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x1-d.y?90:d.x<1-d.y?180:135:.5>d.x?225:.5(f?6:2)?(h=e?this.i(1):this.i(this.pointsCount-2),h=f?Fp(k,h.copy()):c):(c=K.alloc(),h=h.ja(Kc,c),K.free(c));c=Math.abs(h.x-k.x)>Math.abs(h.y-k.y)?h.x>= -k.x?0:180:h.y>=k.y?90:270;K.free(k);k=c}d.bc()&&g.Md(a)&&(k+=180,360<=k&&(k-=360));if(Dp(d))return k;a=b.Xi();if(0===a)return k;45<=a&&135>a?k+=90:135<=a&&225>a?k+=180:225<=a&&315>a&&(k+=270);360<=k&&(k-=360);return k};R.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.Qc()&&(a=Gp(this,b),null!==a))return a.Bv;a=d?this.fromEndSegmentLength:this.toEndSegmentLength;null!==b&&isNaN(a)&&(a=d?b.fromEndSegmentLength:b.toEndSegmentLength);isNaN(a)&&(a=10);return a}; +R.prototype.getLinkDirection=function(a,b,c,d,e,f,g,h){a:if(d.fb())var k=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x1-d.y?90:d.x<1-d.y?180:135:.5>d.x?225:.5(f?6:2)?(h=e?this.i(1):this.i(this.pointsCount-2),h=f?Fp(k,h.copy()):c):(c=K.alloc(),h=h.ja(Kc,c),K.free(c));c=Math.abs(h.x-k.x)>Math.abs(h.y-k.y)?h.x>= +k.x?0:180:h.y>=k.y?90:270;K.free(k);k=c}d.bc()&&g.Md(a)&&(k+=180,360<=k&&(k-=360));if(Dp(d))return k;a=b.Xi();if(0===a)return k;45<=a&&135>a?k+=90:135<=a&&225>a?k+=180:225<=a&&315>a&&(k+=270);360<=k&&(k-=360);return k};R.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.Rc()&&(a=Gp(this,b),null!==a))return a.Bv;a=d?this.fromEndSegmentLength:this.toEndSegmentLength;null!==b&&isNaN(a)&&(a=d?b.fromEndSegmentLength:b.toEndSegmentLength);isNaN(a)&&(a=10);return a}; R.prototype.computeSpot=function(a,b){void 0===b&&(b=null);a?(a=b?b:this.fromPort,null===a?a=Kc:(b=this.fromSpot,b.Kb()&&(b=a.fromSpot),a=b===gd?Dc:b)):(a=b?b:this.toPort,null===a?a=Kc:(b=this.toSpot,b.Kb()&&(b=a.toSpot),a=b===gd?Dc:b));return a};function Dp(a){return a===Dc||.5===a.x&&.5===a.y}function Ep(a){return.5===a.x&&.5===a.y?a:Kc} R.prototype.computeOtherPoint=function(a,b){if(this.computeAdjusting()!==hg&&4p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=Kb.alloc();n.set(g); +R.prototype.Hf=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var g=f;void 0===f&&(g=Kb.alloc(),g.reset());g.multiply(this.transform);if(this.Hh(a,g))return tn(this,b,c,e),void 0===f&&Kb.free(g),!0;if(this.Pc(a,g)){var h=!1;if(!this.isAtomic)for(var k=this.W.m,l=k.length;l--;){var m=k[l];if(m.visible||m===this.locationObject){var n=m.actualBounds,p=this.naturalBounds;if(!(n.x>p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=Kb.alloc();n.set(g); if(m instanceof W)h=m.Hf(a,b,c,d,e,n);else if(this.path===m){if(m instanceof Hf)if(h=a,p=d,!1===m.pickable)h=!1;else if(n.multiply(m.transform),p)b:{var r=h,q=n;if(m.Hh(r,q))h=!0;else{if(void 0===q&&(q=m.transform,r.Qe(m.actualBounds))){h=!0;break b}h=r.left;p=r.right;var u=r.top;r=r.bottom;var w=K.alloc(),y=K.alloc(),z=K.alloc(),B=Kb.alloc();B.set(q);B.Vv(m.transform);B.$s();y.x=p;y.y=u;y.transform(B);w.x=h;w.y=u;w.transform(B);q=!1;Nn(m,w,y,z)?q=!0:(w.x=p,w.y=r,w.transform(B),Nn(m,w,y,z)?q=!0:(y.x= h,y.y=r,y.transform(B),Nn(m,w,y,z)?q=!0:(w.x=h,w.y=u,w.transform(B),Nn(m,w,y,z)&&(q=!0))));Kb.free(B);K.free(w);K.free(y);K.free(z);h=q}}else h=m.Hh(h,n)}else h=ul(m,a,d,n);h&&(p=m,null!==b&&(p=b(m)),p&&(null===c||c(p))&&e.add(p));Kb.free(n)}}}void 0===f&&Kb.free(g);return h||null!==this.background||null!==this.areaBackground}void 0===f&&Kb.free(g);return!1}; R.prototype.computeCurve=function(){if(null===this.Yf){var a=this.fromPort,b=this.isOrthogonal;this.Yf=null!==a&&a===this.toPort&&!b}return this.Yf?kg:this.curve};R.prototype.computeCorner=function(){if(this.curve===kg)return 0;var a=this.corner;if(isNaN(a)||0>a)a=10;return a}; R.prototype.findMidLabel=function(){for(var a=this.path,b=this.W.m,c=b.length,d=0;dk?-Math.PI/2:Math.PI/2;else m=Math.atan(k/Math.abs(h)),0>h&&(m=Math.PI-m);g=b.x;var n=b.y;h=d.x-g;var p=d.y-n;k=Math.sqrt(h*h+p*p);L.da(h,0)?p=0>p?-Math.PI/2:Math.PI/2:(p=Math.atan(p/Math.abs(h)),0>h&&(p=Math.PI-p)); -l=k/l;m=p-m;this.Sc(a,b);for(a+=1;ak?-Math.PI/2:Math.PI/2:(k=Math.atan(k/Math.abs(h)),0>h&&(k=Math.PI-k)),h=k+m,b*=l,this.O(a,g+b*Math.cos(h),n+b*Math.sin(h)));this.Sc(c,d)}}return!0;case up:f=this.i(a);n=this.i(c);if(!f.Ya(b)||!n.Ya(d)){e=f.x;f=f.y;g=n.x;n=n.y;l=(g-e)*(g-e)+(n-f)*(n-f);h=b.x;m=b.y;k=d.x;p=d.y;var r=1;if(0!==k-h){var q=(p-m)/(k-h);r=Math.sqrt(1+1/(q*q))}else q=9E9;this.Sc(a,b);for(a+=1;ab?b+=360:360<=b&&(b-=360);0>d?d+=360:360<=d&&(d-=360);var g=d;b=315<=b||45>b?0:45<=b&&135>b?90:135<=b&&225>b?180:270;d=315<=d||45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.actualBounds.copy(),k=f.actualBounds.copy();if(h.s()&&k.s()){h.Mc(Mp,Mp);k.Mc(Mp,Mp);h.Ye(a);k.Ye(c);var l=K.alloc(),m=K.alloc();if(0===b)if(c.x>a.x||270===d&&c.ya.x||90===d&&c.y>a.y&&k.right>a.x)l.h(c.x,a.y),m.h(c.x,(a.y+c.y)/2),180===d?(l.x=this.computeMidOrthoPosition(a.x, +l=k/l;m=p-m;this.Tc(a,b);for(a+=1;ak?-Math.PI/2:Math.PI/2:(k=Math.atan(k/Math.abs(h)),0>h&&(k=Math.PI-k)),h=k+m,b*=l,this.O(a,g+b*Math.cos(h),n+b*Math.sin(h)));this.Tc(c,d)}}return!0;case up:f=this.i(a);n=this.i(c);if(!f.Ya(b)||!n.Ya(d)){e=f.x;f=f.y;g=n.x;n=n.y;l=(g-e)*(g-e)+(n-f)*(n-f);h=b.x;m=b.y;k=d.x;p=d.y;var r=1;if(0!==k-h){var q=(p-m)/(k-h);r=Math.sqrt(1+1/(q*q))}else q=9E9;this.Tc(a,b);for(a+=1;ab?b+=360:360<=b&&(b-=360);0>d?d+=360:360<=d&&(d-=360);var g=d;b=315<=b||45>b?0:45<=b&&135>b?90:135<=b&&225>b?180:270;d=315<=d||45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.actualBounds.copy(),k=f.actualBounds.copy();if(h.s()&&k.s()){h.Nc(Mp,Mp);k.Nc(Mp,Mp);h.Ye(a);k.Ye(c);var l=K.alloc(),m=K.alloc();if(0===b)if(c.x>a.x||270===d&&c.ya.x||90===d&&c.y>a.y&&k.right>a.x)l.h(c.x,a.y),m.h(c.x,(a.y+c.y)/2),180===d?(l.x=this.computeMidOrthoPosition(a.x, a.y,c.x,c.y,!1),m.x=l.x,m.y=c.y):270===d&&c.ya.y?(l.x=a.xk.bottom)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):k.right,m.x=l.x,m.y=c.y):0===d&&a.xk.top&&a.yh.bottom)180===d&&(k.ca(a)||h.ca(c))? l.y=this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!0):c.ya.y&&(180===d||270===d)&&(l.y=this.computeMidOrthoPosition(a.x,h.bottom,c.x,Math.min(c.y,k.top),!0)),m.x=c.x,m.y=l.y;if(l.y>h.top&&l.y=h.left&&c.x<=a.x||a.x<=k.right&&a.x>=c.x){if(90===d||270===d)l.h(Math.max((a.x+c.x)/2,a.x),a.y),m.h(l.x,c.y)}else l.y=270===d||(0===d||180===d)&&c.ya.y&&k.lefta.y?(l.x=a.x>k.right?this.computeMidOrthoPosition(a.x,a.y,k.right,c.y,!1):a.x>k.left&&(270===d&&a.yk.bottom)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):k.left,m.x=l.x, @@ -1649,16 +1649,16 @@ a.y,c.x,c.y,!1):c.xa.x&&k.top=a.x?(l.y=a.y>k.bottom?this.computeMidOrthoPosition(a.x,a.y,c.x,k.bottom,!0):a.y>k.top&&(180===d&&a.xk.right)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!0):k.top,m.x=c.x,m.y=l.y):270===d&&a.y>k.bottom&&a.x>k.left&&a.xh.right)90===d&&(k.ca(a)||h.ca(c))?l.x=this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):c.xa.x&&(90===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right,a.y,Math.min(c.x,k.left),c.y,!1)),m.x=l.x,m.y=c.y;if(l.x>h.left&&l.x=a.y||a.y>=k.top&&a.y<=c.y){if(0===d||180===d)l.h(a.x,Math.min((a.y+c.y)/2,a.y)),m.h(c.x,l.y)}else l.x=180===d||(90===d||270===d)&&c.x=Pp&&(Fk(r),h.Mc(r.oq*r.Cy,r.nq*r.Dy),Np(r,a,b,n,d,h,!1),k=Op(r, +Math.min(a.y,l.y),Math.abs(a.x-l.x),Math.abs(a.y-l.y))&&r.Ck(Math.min(l.x,m.x),Math.min(l.y,m.y),Math.abs(l.x-m.x),Math.abs(l.y-m.y))&&r.Ck(Math.min(m.x,n.x),Math.min(m.y,n.y),Math.abs(m.x-n.x),Math.abs(m.y-n.y)))b=!1;else{e=a;f=n;var q=c=null;if(p.isVirtualized){p=r.bounds.copy();p.Nc(-r.oq,-r.nq);var u=K.alloc();Gk(r,a.x,a.y)||(L.Kf(p.x,p.y,p.x+p.width,p.y+p.height,a.x,a.y,l.x,l.y,u)?(c=a=u.copy(),b=u.Wa(l)):L.Kf(p.x,p.y,p.x+p.width,p.y+p.height,l.x,l.y,m.x,m.y,u)?(c=a=u.copy(),b=u.Wa(m)):L.Kf(p.x, +p.y,p.x+p.width,p.y+p.height,m.x,m.y,n.x,n.y,u)&&(c=a=u.copy(),b=u.Wa(n)));Gk(r,n.x,n.y)||(L.Kf(p.x,p.y,p.x+p.width,p.y+p.height,n.x,n.y,m.x,m.y,u)?(q=n=u.copy(),d=m.Wa(u)):L.Kf(p.x,p.y,p.x+p.width,p.y+p.height,m.x,m.y,l.x,l.y,u)?(q=n=u.copy(),d=l.Wa(u)):L.Kf(p.x,p.y,p.x+p.width,p.y+p.height,l.x,l.y,a.x,a.y,u)&&(q=n=u.copy(),d=a.Wa(u)));K.free(u)}h=h.copy().Uc(k);h.Nc(r.oq*r.vt,r.nq*r.vt);Np(r,a,b,n,d,h,!0);k=Op(r,n.x,n.y);!r.abort&&k>=Pp&&(Fk(r),h.Nc(r.oq*r.Cy,r.nq*r.Dy),Np(r,a,b,n,d,h,!1),k=Op(r, n.x,n.y));if(!r.abort&&kthis.pointsCount)0===b||180===b?(h.x=a.x,h.y=n.y):(h.x=n.x,h.y=a.y),this.O(2,h.x,h.y),this.l(3,h.x,h.y);else if(g=this.i(3),0===b||180===b)L.A(h.x,g.x)?(h=0===b?Math.max(h.x,a.x):Math.min(h.x,a.x),this.O(2,h,a.y),this.O(3,h,g.y)):L.A(h.y,g.y)?(Math.abs(a.y-h.y)<=r.nq/2&&(this.O(2,h.x,a.y),this.O(3,g.x,a.y)),this.l(2,h.x,a.y)):this.O(2,a.x,h.y);else if(90===b||270===b)L.A(h.y,g.y)?(h=90===b?Math.max(h.y,a.y): Math.min(h.y,a.y),this.O(2,a.x,h),this.O(3,g.x,h)):L.A(h.x,g.x)?(Math.abs(a.x-h.x)<=r.oq/2&&(this.O(2,a.x,h.y),this.O(3,a.x,g.y)),this.l(2,a.x,h.y)):this.O(2,h.x,a.y);null!==c&&(a=this.i(1),g=this.i(2),a.x!==g.x&&a.y!==g.y?0===b||180===b?this.l(2,a.x,g.y):this.l(2,g.x,a.y):0===b||180===b?this.l(2,e.x,c.y):this.l(2,c.x,e.y));null!==q&&(0===d||180===d?this.Bf(f.x,q.y):this.Bf(q.x,f.y));b=!0}else b=!1}}}else b=!1;b||(this.ke(l.copy()),this.ke(m.copy()));K.free(l);K.free(m)}}; -R.prototype.computeMidOrthoPosition=function(a,b,c,d,e){var f=0;!this.hasCurviness()||this.computeSpot(!0,this.fromPort).Qc()||this.computeSpot(!1,this.toPort).Qc()||(f=this.computeCurviness());return e?(b+d)/2+f:(a+c)/2+f}; +R.prototype.computeMidOrthoPosition=function(a,b,c,d,e){var f=0;!this.hasCurviness()||this.computeSpot(!0,this.fromPort).Rc()||this.computeSpot(!1,this.toPort).Rc()||(f=this.computeCurviness());return e?(b+d)/2+f:(a+c)/2+f}; function Yj(a){if(null===a.diagram||!a.isAvoiding||!qk(a.diagram))return!1;var b=a.points.m,c=b.length;if(4>c)return!1;a=rk(a.diagram,!0,a.containingGroup,null);for(var d=1;dRp&&Op(b,m,n)!==l-1&&(Op(b,c-h,d)===l-1?(e=180,m=c-h,n=d):Op(b,c+h,d)===l-1?(e=0,m=c+h,n=d):Op(b,c,d-k)===l-1?(e=270,m=c,n=d-k):Op(b,c,d+k)===l-1&&(e=90,m=c,n=d+k));for(;l>Rp&&Op(b,m,n)===l-1;)c=m,d=n,0===e?m+=h:90===e?n+=k:180===e?m-=h:n-=k,--l;if(f){if(l>Rp)if(180===e||0===e)c=Math.floor(c/h)*h+h/2;else if(90===e||270===e)d=Math.floor(d/k)*k+k/2}else c=Math.floor(c/h)*h+h/2,d=Math.floor(d/ k)*k+k/2;l>Rp&&(f=e,g=c,m=d,0===e?(f=90,m+=k):90===e?(f=180,g-=h):180===e?(f=270,m-=k):270===e&&(f=0,g+=h),Op(b,g,m)===l-1?Qp(a,b,g,m,f,!1,f):(g=c,m=d,0===e?(f=270,m-=k):90===e?(f=0,g+=h):180===e?(f=90,m+=k):270===e&&(f=180,g-=h),Op(b,g,m)===l-1&&Qp(a,b,g,m,f,!1,f)));a.Bf(c,d)} R.prototype.cA=function(a){G&&x(a,K,R,"findClosestSegment:p");var b=a.x;a=a.y;for(var c=this.i(0),d=this.i(1),e=Mb(b,a,c.x,c.y,d.x,d.y),f=0,g=1;gb)return a.type=N.j,this.Zm=!0,a;var c=!1,d=this.diagram;null!==d&&wp(this)&&d.gi.contains(this)&&(0!==this.Tl.width||0!==this.Tl.height)&&(c=!0);var e=this.i(0).copy(),f=e.copy();d=this.Gb.m;var g=this.computeCurve();if(g===kg&&3<=b&&!L.da(this.smoothness,0))if(3===b){var h=this.i(1);d=Math.min(e.x,h.x);var k=Math.min(e.y,h.y);h=this.i(2);d=Math.min(d,h.x);k=Math.min(k,h.y)}else{if(this.isOrthogonal)for(k=0;k=b&&(d=b-1),k=this.i(d),f.x=Math.min(k.x,f.x),f.y=Math.min(k.y,f.y);d=f.x;k=f.y}else{for(k=0;kw?q>r?(f.x= @@ -1672,13 +1672,13 @@ function Tp(a,b,c,d){for(var e=a.pointsCount,f=b;L.da(b.x,f.x)&&L.da(b.y,f.y);){ function Vp(a,b,c,d,e,f,g){if(!g&&wp(a)){g=a.computeJumpLength();var h=g/2,k=[],l=0;a.isVisible()&&(l=Wp(a,e,f,k));if(0n-g)l--,n=Math.max(m-h,f.x);else break;m=f.y-g+d;n+=c;r=f.y+d;a.curve===gg?Jd(b,n,r,!1):Kd(b,p,m,n,m,n,r)}else if(L.A(e.x,f.x))if(e.ym-g)l--,m=Math.max(n-h,f.y);else break;n=f.x-g+c;r=f.x+c;m+=d;a.curve===gg?Jd(b,r,m,!1):Kd(b,n,p,n,m,r,m)}}b.lineTo(f.x+c,f.y+d)} -function Wp(a,b,c,d){var e=a.diagram;if(null===e||b.B(c))return 0;for(e=e.layers;e.next();){var f=e.value;if(null!==f&&f.visible){f=f.Ka.m;for(var g=f.length,h=0;hg.x&&m.x>=l.x||l.xg.y&&m.y>=l.y||l.yq&&Math.min(g,w)n&&!L.A(g,w)){h.x=q;h.y=n;m=!0;break a}}else if(!L.A(n,r)&& L.A(g,w)&&Math.min(n,r)g&&Math.min(q,u)m&&!L.A(q,u)){h.x=m;h.y=g;m=!0;break a}h.x=0;h.y=0;m=!1}m&&(e?c.push(h.x):c.push(h.y));g=l}K.free(h)}function wp(a){a=a.curve;return a===fg||a===gg}function Ap(a,b){if(b||wp(a))b=a.diagram,null===b||b.animationManager.isTicking||b.gi.contains(a)||0===a.Tl.width&&0===a.Tl.height||b.gi.add(a,a.Tl.copy())} R.prototype.Dq=function(a){var b=this.layer;if(null!==b&&b.visible&&!b.isTemporary){var c=b.diagram;if(null!==c&&!c.animationManager.isTicking){var d=!1;for(c=c.layers;c.next();){var e=c.value;if(e.visible)if(e===b){d=!0;var f=!1;e=e.Ka.m;for(var g=e.length,h=0;ha&&Aa(a,">= 0",R,"fromEndSegmentLength"),this.T.Tg=a,this.g("fromEndSegmentLength",b,a),this.Za())}},fromShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.Ug:NaN},set:function(a){this.Nc();var b=this.T.Ug;b!==a&&(G&&A(a,"number",R,"fromShortLength"),this.T.Ug= -a,this.ic(!0),this.g("fromShortLength",b,a))}},toSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Ah:gd},set:function(a){this.Nc();var b=this.T.Ah;b.B(a)||(G&&x(a,Ib,R,"toSpot"),a=a.L(),this.T.Ah=a,this.g("toSpot",b,a),(b.Qc()||a.Qc())&&null!==this.toNode&&dp(this.toPort),this.Za())}},toEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.yh:NaN},set:function(a){this.Nc();var b=this.T.yh;b!==a&&(G&&A(a,"number",R,"toEndSegmentLength"), -0>a&&Aa(a,">= 0",R,"toEndSegmentLength"),this.T.yh=a,this.g("toEndSegmentLength",b,a),this.Za())}},toShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.zh:NaN},set:function(a){this.Nc();var b=this.T.zh;b!==a&&(G&&A(a,"number",R,"toShortLength"),this.T.zh=a,this.ic(!0),this.g("toShortLength",b,a))}},isLabeledLink:{configurable:!0,get:function(){return null===this.rd?!1:0a&&Aa(a,">= 0",R,"fromEndSegmentLength"),this.T.Tg=a,this.g("fromEndSegmentLength",b,a),this.Za())}},fromShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.Ug:NaN},set:function(a){this.Oc();var b=this.T.Ug;b!==a&&(G&&A(a,"number",R,"fromShortLength"),this.T.Ug= +a,this.ic(!0),this.g("fromShortLength",b,a))}},toSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Ah:gd},set:function(a){this.Oc();var b=this.T.Ah;b.B(a)||(G&&x(a,Ib,R,"toSpot"),a=a.L(),this.T.Ah=a,this.g("toSpot",b,a),(b.Rc()||a.Rc())&&null!==this.toNode&&dp(this.toPort),this.Za())}},toEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.yh:NaN},set:function(a){this.Oc();var b=this.T.yh;b!==a&&(G&&A(a,"number",R,"toEndSegmentLength"), +0>a&&Aa(a,">= 0",R,"toEndSegmentLength"),this.T.yh=a,this.g("toEndSegmentLength",b,a),this.Za())}},toShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.zh:NaN},set:function(a){this.Oc();var b=this.T.zh;b!==a&&(G&&A(a,"number",R,"toShortLength"),this.T.zh=a,this.ic(!0),this.g("toShortLength",b,a))}},isLabeledLink:{configurable:!0,get:function(){return null===this.sd?!1:0=d&&(f=d-1);var h=this.i(f-1),k=this.i(f);L.pm(e.x,e.y,g.x,g.y,h.x,h.y,k.x,k.y,.5,a);b=Math.min(k.x,b);c=Math.min(k.y,c);e=k}else for(e=this.i(0),f=this.i(1),b=Math.min(e.x,f.x),c=Math.min(e.y,f.y),a.h(e.x,e.y,0,0),a.Ye(f),e=2;ed&&(d=-d)):L.da(d.y,e.y)?(d=e.x-d.x,0>d&&(d=-d)):d=Math.sqrt(d.Ff(e));a.push(d)}}return this.Dr}},flattenedTotalLength:{configurable:!0, +enumerable:!0,get:function(){this.Bg();return this.computeMidPoint(new K)}},midAngle:{configurable:!0,get:function(){this.Bg();return this.computeMidAngle()}},flattenedLengths:{configurable:!0,get:function(){if(null===this.Dr){this.yd||zp(this);for(var a=this.Dr=[],b=this.pointsCount,c=0;cd&&(d=-d)):L.da(d.y,e.y)?(d=e.x-d.x,0>d&&(d=-d)):d=Math.sqrt(d.Ff(e));a.push(d)}}return this.Dr}},flattenedTotalLength:{configurable:!0, enumerable:!0,get:function(){var a=this.du;if(isNaN(a)){for(var b=this.flattenedLengths,c=b.length,d=a=0;d=this.pointsCount?0:this.isOrthogonal||!Dp(this.computeSpot(!0))?1:0}},lastPickIndex:{configurable:!0,get:function(){var a=this.pointsCount;return 0=== a?0:2>=a?a-1:this.isOrthogonal||!Dp(this.computeSpot(!1))?a-2:a-1}},adjusting:{configurable:!0,get:function(){return this.Rk},set:function(a){var b=this.Rk;b!==a&&(G&&a!==hg&&a!==sp&&a!==tp&&a!==up&&v("Link.adjusting can only be set to Link.None, Link.End, LInk.Scale, or Link.Stretch, not: "+a),this.Rk=a,this.g("adjusting",b,a))}},corner:{configurable:!0,get:function(){return this.En},set:function(a){var b=this.En;b!==a&&(G&&A(a,"number",R,"corner"),this.En=a,this.ic(!0), this.g("corner",b,a))}},curve:{configurable:!0,get:function(){return this.Gn},set:function(a){var b=this.Gn;b!==a&&(G&&a!==hg&&a!==kg&&a!==gg&&a!==fg&&v("Link.curve can only be set to Link.None, Link.Bezier, LInk.JumpGap, or Link.JumpOver, not: "+a),this.Gn=a,this.Za(),this.ic(!0),Ap(this,b===gg||b===fg||a===gg||a===fg),this.g("curve",b,a))}},curviness:{configurable:!0,get:function(){return this.Hn},set:function(a){var b=this.Hn;b!==a&&(G&&A(a,"number",R,"curviness"),this.Hn= a,this.Za(),this.ic(!1),this.g("curviness",b,a))}},routing:{configurable:!0,get:function(){return this.ak},set:function(a){var b=this.ak;b!==a&&(G&&a!==rp&&a!==$p&&a!==aq&&a!==Jp&&v("Link.routing can only be set to Link.Normal, Link.Orthogonal, LInk.AvoidsNodes, not: "+a),this.ak=a,this.Yf=null,this.Za(),Ap(this,2===(b.value&2)||2===(a.value&2)),this.g("routing",b,a))}},smoothness:{configurable:!0,get:function(){return this.Pp},set:function(a){var b=this.Pp;b!==a&&(G&& A(a,"number",R,"smoothness"),this.Pp=a,this.ic(!0),this.g("smoothness",b,a))}},key:{configurable:!0,get:function(){var a=this.diagram;if(null!==a&&a.model.cj())return a.model.sc(this.data)}}});R.prototype.invalidateOtherJumpOvers=R.prototype.Dq;R.prototype.findClosestSegment=R.prototype.cA;R.prototype.updateRoute=R.prototype.Bg;R.prototype.invalidateRoute=R.prototype.Za;R.prototype.rollbackRoute=R.prototype.gw;R.prototype.commitRoute=R.prototype.Df;R.prototype.startRoute=R.prototype.Sh; -R.prototype.clearPoints=R.prototype.nk;R.prototype.removePoint=R.prototype.ew;R.prototype.addPointAt=R.prototype.Bf;R.prototype.addPoint=R.prototype.ke;R.prototype.insertPointAt=R.prototype.l;R.prototype.insertPoint=R.prototype.IA;R.prototype.setPointAt=R.prototype.O;R.prototype.setPoint=R.prototype.Sc;R.prototype.getPoint=R.prototype.i;R.prototype.getOtherPort=R.prototype.zA;R.prototype.getOtherNode=R.prototype.zq; +R.prototype.clearPoints=R.prototype.nk;R.prototype.removePoint=R.prototype.ew;R.prototype.addPointAt=R.prototype.Bf;R.prototype.addPoint=R.prototype.ke;R.prototype.insertPointAt=R.prototype.l;R.prototype.insertPoint=R.prototype.IA;R.prototype.setPointAt=R.prototype.O;R.prototype.setPoint=R.prototype.Tc;R.prototype.getPoint=R.prototype.i;R.prototype.getOtherPort=R.prototype.zA;R.prototype.getOtherNode=R.prototype.zq; var Bp=null,Cp=null,rp=new F(R,"Normal",1),$p=new F(R,"Orthogonal",2),aq=new F(R,"AvoidsNodes",6),Jp=new F(R,"AvoidsNodesStraight",7),hg=new F(R,"None",0),kg=new F(R,"Bezier",9),gg=new F(R,"JumpGap",10),fg=new F(R,"JumpOver",11),sp=new F(R,"End",17),tp=new F(R,"Scale",18),up=new F(R,"Stretch",19),fn=new F(R,"OrientAlong",21),Zm=new F(R,"OrientPlus90",22),an=new F(R,"OrientMinus90",23),vp=new F(R,"OrientOpposite",24),gn=new F(R,"OrientUpright",25),$m=new F(R,"OrientPlus90Upright",26),bn=new F(R,"OrientMinus90Upright", 27),cn=new F(R,"OrientUpright45",28),Lp=16,Kp=14,Mp=8;R.className="Link";R.Normal=rp;R.Orthogonal=$p;R.AvoidsNodes=aq;R.AvoidsNodesStraight=Jp;R.None=hg;R.Bezier=kg;R.JumpGap=gg;R.JumpOver=fg;R.End=sp;R.Scale=tp;R.Stretch=up;R.OrientAlong=fn;R.OrientPlus90=Zm;R.OrientMinus90=an;R.OrientOpposite=vp;R.OrientUpright=gn;R.OrientPlus90Upright=$m;R.OrientMinus90Upright=bn;R.OrientUpright45=cn;R.EndSegmentStep=8;R.CurvinessStart=Lp;R.SpacingMin=Kp;R.OrthoShortCut=Mp; function Zp(a,b,c,d){ab(this);this.Be=this.Jr=!1;this.it=a;this.Ky=b;this.Wv=c;this.Ly=d;this.links=[]}Zp.prototype.Am=function(){if(!this.Jr){var a=this.links;0=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.Cd=Math.floor((a.x-this.jc)/this.jc)*this.jc;this.Dd=Math.floor((b-this.kc)/this.kc)*this.kc;this.Mo=Math.ceil((c+2*this.jc)/this.jc)*this.jc;this.No=Math.ceil((d+2*this.kc)/this.kc)*this.kc;a=1+(Math.ceil((this.Mo-this.Cd)/this.jc)|0);b=1+(Math.ceil((this.No-this.Dd)/this.kc)|0);if(null===this.Vb||this.Li=Rp&&(c[d]=bq)} -sk.prototype.Ck=function(a,b,c,d){if(a>this.Mo||a+cthis.No||b+da&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e)return!0;d=Math.min(a+c-1,this.Li)|0;for(c=Math.min(b+e-1,this.Mi)|0;a<=d;a++){e=this.Vb[a];for(var f=b;f<=c;f++)if(e[f]===Hk)return!1}return!0}; +function sk(a){ab(this);this.Vy=this.group=null;this.Zs=!0;this.abort=!1;this.Ed=this.Dd=1;this.No=this.Mo=-1;this.jc=a.width;this.kc=a.height;this.Vb=null;this.Mi=this.Li=0;this.vt=11;this.Dy=this.Cy=22} +sk.prototype.initialize=function(a){if(!(0>=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.Dd=Math.floor((a.x-this.jc)/this.jc)*this.jc;this.Ed=Math.floor((b-this.kc)/this.kc)*this.kc;this.Mo=Math.ceil((c+2*this.jc)/this.jc)*this.jc;this.No=Math.ceil((d+2*this.kc)/this.kc)*this.kc;a=1+(Math.ceil((this.Mo-this.Dd)/this.jc)|0);b=1+(Math.ceil((this.No-this.Ed)/this.kc)|0);if(null===this.Vb||this.Li=Rp&&(c[d]=bq)} +sk.prototype.Ck=function(a,b,c,d){if(a>this.Mo||a+cthis.No||b+da&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e)return!0;d=Math.min(a+c-1,this.Li)|0;for(c=Math.min(b+e-1,this.Mi)|0;a<=d;a++){e=this.Vb[a];for(var f=b;f<=c;f++)if(e[f]===Hk)return!1}return!0}; function cq(a,b,c,d,e,f,g,h,k){if(!(bg||ck)){var l=b|0;var m=c|0;var n=a.Vb[l][m];if(n>=Rp&&n=a.Vb[l][m]);)a.Vb[l][m]=n,n+=1,e?m+=d:l+=d;l=e?m:l;if(e)if(0l;c+=d)cq(a,b,c,1,!e,f,g,h,k),cq(a,b,c,-1,!e,f,g,h,k);else if(0l;b+=d)cq(a,b,c,1,!e,f,g,h,k),cq(a,b,c,-1,!e,f,g,h, k)}}function dq(a,b,c,d,e,f,g,h,k){b|=0;c|=0;var l=Hk,m=Rp;for(a.Vb[b][c]=m;l===Hk&&b>f&&bh&&cf&&bh&&c=Math.abs(h-l)&&1>=Math.abs(k-m))a.abort=!0;else{var n=f.x;d=f.y;b=f.x+f.width;var p=f.y+f.height;n-=a.Cd;n/=a.jc;d-=a.Dd;d/=a.kc;b-=a.Cd;b/=a.jc;p-=a.Dd;p/=a.kc;f=Math.max(0,Math.min(a.Li,n|0));b=Math.min(a.Li,Math.max(0,b|0));n=Math.max(0,Math.min(a.Mi,d|0));p=Math.min(a.Mi,Math.max(0,p|0));d=a.Vb;h|=0;k|=0;l|=0;m|= +function Np(a,b,c,d,e,f,g){if(null!==a.Vb){a.abort=!1;var h=b.x,k=b.y;if(Gk(a,h,k)){h-=a.Dd;h/=a.jc;k-=a.Ed;k/=a.kc;var l=d.x,m=d.y;if(Gk(a,l,m))if(l-=a.Dd,l/=a.jc,m-=a.Ed,m/=a.kc,1>=Math.abs(h-l)&&1>=Math.abs(k-m))a.abort=!0;else{var n=f.x;d=f.y;b=f.x+f.width;var p=f.y+f.height;n-=a.Dd;n/=a.jc;d-=a.Ed;d/=a.kc;b-=a.Dd;b/=a.jc;p-=a.Ed;p/=a.kc;f=Math.max(0,Math.min(a.Li,n|0));b=Math.min(a.Li,Math.max(0,b|0));n=Math.max(0,Math.min(a.Mi,d|0));p=Math.min(a.Mi,Math.max(0,p|0));d=a.Vb;h|=0;k|=0;l|=0;m|= 0;var r=0===c||90===c?1:-1;c=90===c||270===c;d[h][k]===Hk?(dq(a,h,k,r,c,f,b,n,p),dq(a,h,k,1,!c,f,b,n,p),dq(a,h,k,-1,!c,f,b,n,p)):dq(a,h,k,r,c,h,k,h,k);d[l][m]===Hk?(eq(a,l,m,0===e||90===e?1:-1,90===e||270===e,f,b,n,p),eq(a,l,m,1,!(90===e||270===e),f,b,n,p),eq(a,l,m,-1,!(90===e||270===e),f,b,n,p)):eq(a,l,m,r,c,l,m,l,m);c=Ma();if(g&&fq(a,l,m,e,h,k,c)){if(c[0]!==l||c[1]!==m)c.unshift(m),c.unshift(l);if(c[c.length-2]!==h||c[c.length-1]!==k)c.push(h),c.push(k);a=Rp;e=c[c.length-2];g=c[c.length-1];d[e][g]= a++;for(f=c.length-4;0<=f;f-=2)for(e=c[f+2],g=c[f+3],b=c[f],l=c[f+1];b>e?e++:bg?g++:le)m--;else break;else if(n>f)n--;else break;var p=h[m][n];if(0===p||p===gq)break;k=m;l=n}for(;;){m=d;n=k;p=l;0===d?pf&&(m=270,p--):90===d?ne&&(m=180,n--):180===d?pf&&(m=270,p--):ne&&(m=180,n--);n=h[n][p];if(m!==d&&0!==n&&n!==gq){g.push(k);g.push(l);if(fq(a,k,l, m,e,f,g))return!0;g.pop();g.pop()}h[k][l]=gq;if(0===d){if(k===b)return!1;k--}else if(90===d){if(l===c)return!1;l--}else if(180===d){if(k===b)return!1;k++}else{if(l===c)return!1;l++}}} -oa.Object.defineProperties(sk.prototype,{bounds:{configurable:!0,get:function(){return new M(this.Cd,this.Dd,this.Mo-this.Cd,this.No-this.Dd)}},oq:{configurable:!0,get:function(){return this.jc},set:function(a){0=c?180:0}a=180*Math.atan2(a.height,a.width)/Math.PI;switch(b){case 3:return c>a&&c<=180+a?180:270;case 5:return c>180-a&&c<=360-a?270:0;case 12:return c>a&&c<=180+a?90:0;case 10:return c>180-a&&c<=360-a?180:90;case 7:return 90180+a&&c<=360-a?270:0;case 13:return 180a&&180>=c?90:0;case 14:return c> a&&c<=180-a?90:c>180-a&&270>=c?180:0;case 11:return c>180-a&&c<=180+a?180:c>180+a?270:90}d&&15!==b&&(c-=15,0>c&&(c+=360));return c>a&&c<180-a?90:c>=180-a&&c<=180+a?180:c>180+a&&c<360-a?270:0}Hp.prototype.Am=function(){this.me.length=0}; function Ip(a,b){var c=a.me;if(0===c.length){a:if(!a.Hq){c=a.Hq;a.Hq=!0;var d=null,e=a.node,f=e instanceof vf?e:null;if(null===f||f.isSubGraphExpanded)var g=e.isTreeExpanded?e.findLinksConnected(a.port.portId):e.jy();else{if(!f.actualBounds.s()){a.Hq=c;break a}d=f;g=d.Dv()}f=a.me.length=0;var h=a.port.ja(Ec,K.alloc()),k=a.port.ja(Pc,K.alloc());e=M.allocAt(h.x,h.y,0,0);e.Ye(k);K.free(h);K.free(k);h=K.allocAt(e.x+e.width/2,e.y+e.height/2);k=a.port.Xi();for(g=g.iterator;g.next();){var l=g.value;if(l.isVisible()&& -l.fromPort!==l.toPort){var m=l.fromPort===a.port||null!==l.fromNode&&l.fromNode.Md(d),n=l.computeSpot(m,a.port);if(n.Qc()){var p=m?l.toPort:l.fromPort;if(null!==p&&(m=p.part,null!==m)){var r=m.findVisibleNode();null!==r&&r!==m&&(m=r,p=m.port);m=l.computeOtherPoint(m,p);p=h.Ua(p.ja(Kc));r=h.Ua(m);p+=(r-p)/360;p-=k;0>p?p+=360:360<=p&&(p-=360);n=hq(e,n,p,l.isOrthogonal);0===n?(n=4,180p&&(p+=360));r=a.me[f];void 0===r?(r=new iq(l,p,n),a.me[f]= -r):(r.link=l,r.angle=p,r.Dc=n);r.Yv.set(m);f++}}}}K.free(h);a.me.sort(Hp.prototype.j);k=a.me.length;d=-1;for(f=h=0;fMath.abs(u)?(z=Math.abs(u)/p,p=Math.abs(u)):z=1;break;case 2:r>Math.abs(B)?(z=Math.abs(B)/r,r=Math.abs(B)):z=1;break;case 1:n>Math.abs(u)?(z=Math.abs(u)/n,n=Math.abs(u)):z=1;break;default:case 4:m> -Math.abs(B)?(z=Math.abs(B)/m,m=Math.abs(B)):z=1}y=0}var J=C.Gq;if(d===op){C=C.link.computeThickness();C*=z;J.set(E);switch(q){case 8:J.x=E.x+u/2+p/2-y-C/2;break;case 2:J.y=E.y+B/2+r/2-y-C/2;break;case 1:J.x=E.x+u/2-n/2+y+C/2;break;default:case 4:J.y=E.y+B/2-m/2+y+C/2}y+=C}else{var S=.5;d===ap&&(S=(C.Aq+1)/(C.tm+1));J.x=E.x+u*S;J.y=E.y+B*S}}}K.free(h);K.free(k);K.free(g);K.free(l);E=a.me;for(f=0;fb.Dc?1:a.angleb.angle?1:0}; +l.fromPort!==l.toPort){var m=l.fromPort===a.port||null!==l.fromNode&&l.fromNode.Md(d),n=l.computeSpot(m,a.port);if(n.Rc()&&(m=m?l.toPort:l.fromPort,null!==m)){var p=m.part;if(null!==p){var r=p.findVisibleNode();null!==r&&r!==p&&(p=r,m=p.port);m=l.computeOtherPoint(p,m);p=h.Wa(m);p-=k;0>p?p+=360:360<=p&&(p-=360);n=hq(e,n,p,l.isOrthogonal);0===n?(n=4,180p&&(p+=360));r=a.me[f];void 0===r?(r=new iq(l,p,n),a.me[f]=r):(r.link=l,r.angle=p,r.Dc= +n);r.Yv.set(m);f++}}}}K.free(h);a.me.sort(Hp.prototype.j);k=a.me.length;d=-1;for(f=h=0;fMath.abs(u)?(z=Math.abs(u)/p,p=Math.abs(u)):z=1;break;case 2:r>Math.abs(B)?(z=Math.abs(B)/r,r=Math.abs(B)):z=1;break;case 1:n>Math.abs(u)?(z=Math.abs(u)/n,n=Math.abs(u)):z=1;break;default:case 4:m>Math.abs(B)?(z=Math.abs(B)/ +m,m=Math.abs(B)):z=1}y=0}var J=C.Gq;if(d===op){C=C.link.computeThickness();C*=z;J.set(E);switch(q){case 8:J.x=E.x+u/2+p/2-y-C/2;break;case 2:J.y=E.y+B/2+r/2-y-C/2;break;case 1:J.x=E.x+u/2-n/2+y+C/2;break;default:case 4:J.y=E.y+B/2-m/2+y+C/2}y+=C}else{var S=.5;d===ap&&(S=(C.Aq+1)/(C.tm+1));J.x=E.x+u*S;J.y=E.y+B*S}}}K.free(h);K.free(k);K.free(g);K.free(l);E=a.me;for(f=0;fb.Dc?1:a.angleb.angle?1:0}; Hp.prototype.computeEndSegmentLength=function(a){var b=a.link,c=b.computeEndSegmentLength(this.node,this.port,Dc,b.fromPort===this.port),d=a.Aq;if(0>d)return c;var e=a.tm;if(1>=e||!b.isOrthogonal)return c;b=a.Yv;var f=a.Gq;if(2===a.Dc||8===a.Dc)d=e-1-d;return((a=2===a.Dc||4===a.Dc)?b.y=b-1?(f=0,d=c,e+=g+20,g=0):f++}}; zi.prototype.doMinimalNetworkLayout=function(){var a=Math.ceil(Math.sqrt(this.network.vertexes.count));this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin);for(var b=this.arrangementOrigin.x,c=b,d=this.arrangementOrigin.y,e=0,f=0,g=this.network.vertexes.iterator;g.next();){var h=g.value.node;if(!(null===h||h instanceof R)&&(lq(h),this.Qh(h))){var k=h.measuredBounds,l=k.width;k=k.height;h.moveTo(c,d);h instanceof vf&&(h.Qh=!1);c+=Math.max(l,50)+20;f=Math.max(f,Math.max(k,50));e>=a-1?(e= -0,c=b,d+=f+20,f=0):e++}}};zi.prototype.Qh=function(a){return!a.location.s()||a instanceof vf&&a.Qh?!0:!1};function kq(a,b,c,d,e,f,g,h){for(c=c.iterator;c.next();){var k=c.value;d&&!k.isTopLevel||null!==e&&!e(k)||!k.canLayout()||(f&&k instanceof V?k.isLinkLabel||(k instanceof vf?null===k.layout?kq(a,b,k.memberParts,!1,e,f,g,h):(lq(k),b.add(k)):(lq(k),b.add(k))):g&&k instanceof R?b.add(k):!h||!k.Pc()||k instanceof V||(lq(k),b.add(k)))}} +0,c=b,d+=f+20,f=0):e++}}};zi.prototype.Qh=function(a){return!a.location.s()||a instanceof vf&&a.Qh?!0:!1};function kq(a,b,c,d,e,f,g,h){for(c=c.iterator;c.next();){var k=c.value;d&&!k.isTopLevel||null!==e&&!e(k)||!k.canLayout()||(f&&k instanceof V?k.isLinkLabel||(k instanceof vf?null===k.layout?kq(a,b,k.memberParts,!1,e,f,g,h):(lq(k),b.add(k)):(lq(k),b.add(k))):g&&k instanceof R?b.add(k):!h||!k.Qc()||k instanceof V||(lq(k),b.add(k)))}} function lq(a){var b=a.actualBounds;(0===b.width||0===b.height||isNaN(b.width)||isNaN(b.height))&&a.Xa()}zi.prototype.Zi=function(a,b){var c=this.boundsComputation;if(null!==c)return b||(b=new M),c(a,this,b);if(!b)return a.actualBounds;b.set(a.actualBounds);return b}; zi.prototype.Vx=function(a){var b=new I;a instanceof Q?(kq(this,b,a.nodes,!0,null,!0,!0,!0),kq(this,b,a.links,!0,null,!0,!0,!0),kq(this,b,a.parts,!0,null,!0,!0,!0)):a instanceof vf?kq(this,b,a.memberParts,!1,null,!0,!0,!0):kq(this,b,a.iterator,!1,null,!0,!0,!0);return b}; zi.prototype.initialOrigin=function(a){var b=this.group;if(null!==b){var c=b.position.copy();(isNaN(c.x)||isNaN(c.y))&&c.set(a);b=b.placeholder;null!==b&&(c=b.ja(Ec),(isNaN(c.x)||isNaN(c.y))&&c.set(a),a=b.padding,c.x+=a.left,c.y+=a.top);return c}return a};zi.prototype.mayUseWorker=function(){return this.mayUseWorkerFunction?this.mayUseWorkerFunction(this):!1};zi.prototype.workerLayout=function(){return!1}; @@ -1765,39 +1765,39 @@ jq.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutNetwork"+(null! jq.prototype.tg=function(a,b,c){if(null!==a){void 0===b&&(b=!1);A(b,"boolean",jq,"addParts:toplevelonly");void 0===c&&(c=null);null===c&&(c=function(a){if(a instanceof V)return!a.isLinkLabel;if(a instanceof R){var b=a.fromNode;if(null===b||b.isLinkLabel)return!1;a=a.toNode;return null===a||a.isLinkLabel?!1:!0}return!1});for(a=a.iterator;a.next();){var d=a.value;if(d instanceof V&&(!b||d.isTopLevel)&&d.canLayout()&&c(d))if(d instanceof vf&&null===d.layout)this.tg(d.memberParts,!1);else if(null===this.Wi(d)){var e= this.createVertex();e.node=d;this.ug(e)}}for(a.reset();a.next();)if(d=a.value,d instanceof R&&(!b||d.isTopLevel)&&d.canLayout()&&c(d)&&null===this.tq(d)){var f=d.fromNode;e=d.toNode;null!==f&&null!==e&&f!==e&&(f=this.findGroupVertex(f),e=this.findGroupVertex(e),null!==f&&null!==e&&this.Dk(f,e,d))}}}; jq.prototype.findGroupVertex=function(a){if(null===a)return null;var b=a.findVisibleNode();if(null===b)return null;a=this.Wi(b);if(null!==a)return a;for(b=b.containingGroup;null!==b;){a=this.Wi(b);if(null!==a)return a;b=b.containingGroup}return null};t=jq.prototype;t.ug=function(a){if(null!==a){G&&x(a,xq,jq,"addVertex:vertex");this.zf.add(a);var b=a.node;null!==b&&this.jt.add(b,a);a.network=this}}; -t.lk=function(a){if(null===a)return null;G&&x(a,V,jq,"addNode:node");var b=this.Wi(a);null===b&&(b=this.createVertex(),b.node=a,this.ug(b));return b};t.yv=function(a){if(null!==a&&(G&&x(a,xq,jq,"deleteVertex:vertex"),zq(this,a))){for(var b=a.wd,c=b.count-1;0<=c;c--){var d=b.M(c);this.uk(d)}b=a.Jd;for(a=b.count-1;0<=a;a--)c=b.M(a),this.uk(c)}};function zq(a,b){if(null===b)return!1;var c=a.zf.remove(b);c&&(b=b.node,null!==b&&a.jt.remove(b));return c} +t.lk=function(a){if(null===a)return null;G&&x(a,V,jq,"addNode:node");var b=this.Wi(a);null===b&&(b=this.createVertex(),b.node=a,this.ug(b));return b};t.yv=function(a){if(null!==a&&(G&&x(a,xq,jq,"deleteVertex:vertex"),zq(this,a))){for(var b=a.xd,c=b.count-1;0<=c;c--){var d=b.M(c);this.uk(d)}b=a.Jd;for(a=b.count-1;0<=a;a--)c=b.M(a),this.uk(c)}};function zq(a,b){if(null===b)return!1;var c=a.zf.remove(b);c&&(b=b.node,null!==b&&a.jt.remove(b));return c} t.Uz=function(a){null!==a&&(G&&x(a,V,jq,"deleteNode:node"),a=this.Wi(a),null!==a&&this.yv(a))};t.Wi=function(a){if(null===a)return null;G&&x(a,V,jq,"findVertex:node");return this.jt.K(a)};t.nm=function(a){if(null!==a){G&&x(a,yq,jq,"addEdge:edge");Aq(this,a);var b=a.toVertex;null!==b&&b.ov(a);b=a.fromVertex;null!==b&&b.mv(a)}};function Aq(a,b){if(null!==b){a.ve.add(b);var c=b.link;null!==c&&null===a.tq(c)&&a.et.add(c,b);b.network=a}} t.xz=function(a){if(null===a)return null;G&&x(a,R,jq,"addLink:link");var b=a.fromNode,c=a.toNode,d=this.tq(a);null===d?(d=this.createEdge(),d.link=a,null!==b&&(d.fromVertex=this.lk(b)),null!==c&&(d.toVertex=this.lk(c)),this.nm(d)):(null!==b?d.fromVertex=this.lk(b):d.fromVertex=null,null!==c?d.toVertex=this.lk(c):d.toVertex=null);return d};t.uk=function(a){if(null!==a){G&&x(a,yq,jq,"deleteEdge:edge");var b=a.toVertex;null!==b&&b.xv(a);b=a.fromVertex;null!==b&&b.wv(a);Bq(this,a)}}; function Bq(a,b){null!==b&&a.ve.remove(b)&&(b=b.link,null!==b&&a.et.remove(b))}t.Tz=function(a){null!==a&&(G&&x(a,R,jq,"deleteLink:link"),a=this.tq(a),null!==a&&this.uk(a))};t.tq=function(a){if(null===a)return null;G&&x(a,R,jq,"findEdge:link");return this.et.K(a)}; t.Dk=function(a,b,c){if(null===a||null===b)return null;G&&(x(a,xq,jq,"linkVertexes:fromVertex"),x(b,xq,jq,"linkVertexes:toVertex"),null!==c&&x(c,R,jq,"linkVertexes:link"));if(a.network===this&&b.network===this){var d=this.createEdge();d.link=c;d.fromVertex=a;d.toVertex=b;this.nm(d);return d}return null};t.Om=function(a){if(null!==a){G&&x(a,yq,jq,"reverseEdge:edge");var b=a.fromVertex,c=a.toVertex;null!==b&&null!==c&&(b.wv(a),c.xv(a),a.Om(),b.ov(a),c.mv(a))}}; t.rq=function(){for(var a=Ma(),b=this.ve.iterator;b.next();){var c=b.value;c.fromVertex===c.toVertex&&a.push(c)}b=a.length;for(c=0;cb?1:0):1:null!==b?-1:0} -oa.Object.defineProperties(xq.prototype,{sourceEdgesArrayAccess:{configurable:!0,get:function(){return this.wd._dataArray}},destinationEdgesArrayAccess:{configurable:!0,get:function(){return this.Jd._dataArray}},data:{configurable:!0,get:function(){return this.nb},set:function(a){this.nb=a;if(null!==a&&a.bounds){var b=a.bounds;a=b.x;var c=b.y,d=b.width;b=b.height;this.o.h(d/2,b/2);this.j.h(a,c,d,b)}}},node:{configurable:!0,get:function(){return this.zi}, +oa.Object.defineProperties(xq.prototype,{sourceEdgesArrayAccess:{configurable:!0,get:function(){return this.xd._dataArray}},destinationEdgesArrayAccess:{configurable:!0,get:function(){return this.Jd._dataArray}},data:{configurable:!0,get:function(){return this.nb},set:function(a){this.nb=a;if(null!==a&&a.bounds){var b=a.bounds;a=b.x;var c=b.y,d=b.width;b=b.height;this.o.h(d/2,b/2);this.j.h(a,c,d,b)}}},node:{configurable:!0,get:function(){return this.zi}, set:function(a){if(this.zi!==a){G&&null!==a&&x(a,V,xq,"node");this.zi=a;a.Xa();var b=this.network.layout,c=M.alloc(),d=b.Zi(a,c);b=d.x;var e=d.y,f=d.width;d=d.height;isNaN(b)&&(b=0);isNaN(e)&&(e=0);this.j.h(b,e,f,d);M.free(c);if(!(a instanceof vf)&&(a=a.locationObject.ja(Kc),a.s())){this.o.h(a.x-b,a.y-e);return}this.o.h(f/2,d/2)}}},bounds:{configurable:!0,get:function(){return this.j},set:function(a){this.j.B(a)||(G&&x(a,M,xq,"bounds"),this.j.assign(a))}},focus:{configurable:!0, get:function(){return this.o},set:function(a){this.o.B(a)||(G&&x(a,K,xq,"focus"),this.o.assign(a))}},centerX:{configurable:!0,get:function(){return this.j.x+this.o.x},set:function(a){var b=this.j;b.x+this.o.x!==a&&(G&&D(a,xq,"centerX"),b.ka(),b.x=a-this.o.x,b.freeze())}},centerY:{configurable:!0,get:function(){return this.j.y+this.o.y},set:function(a){var b=this.j;b.y+this.o.y!==a&&(G&&D(a,xq,"centerY"),b.ka(),b.y=a-this.o.y,b.freeze())}},focusX:{configurable:!0, get:function(){return this.o.x},set:function(a){var b=this.o;b.x!==a&&(b.ka(),b.x=a,b.freeze())}},focusY:{configurable:!0,get:function(){return this.o.y},set:function(a){var b=this.o;b.y!==a&&(b.ka(),b.y=a,b.freeze())}},x:{configurable:!0,get:function(){return this.j.x},set:function(a){var b=this.j;b.x!==a&&(b.ka(),b.x=a,b.freeze())}},y:{configurable:!0,get:function(){return this.j.y},set:function(a){var b=this.j;b.y!==a&&(b.ka(),b.y=a,b.freeze())}},width:{configurable:!0, -enumerable:!0,get:function(){return this.j.width},set:function(a){var b=this.j;b.width!==a&&(b.ka(),b.width=a,b.freeze())}},height:{configurable:!0,get:function(){return this.j.height},set:function(a){var b=this.j;b.height!==a&&(b.ka(),b.height=a,b.freeze())}},network:{configurable:!0,get:function(){return this.Vc},set:function(a){G&&x(a,jq,xq,"network");this.Vc=a}},sourceVertexes:{configurable:!0,get:function(){for(var a=new I,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex); -return a.iterator}},destinationVertexes:{configurable:!0,get:function(){for(var a=new I,b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},vertexes:{configurable:!0,get:function(){for(var a=new I,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);for(b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},sourceEdges:{configurable:!0,get:function(){return this.wd.iterator}},destinationEdges:{configurable:!0, -enumerable:!0,get:function(){return this.Jd.iterator}},edges:{configurable:!0,get:function(){for(var a=new H,b=this.sourceEdges;b.next();)a.add(b.value);for(b=this.destinationEdges;b.next();)a.add(b.value);return a.iterator}},edgesCount:{configurable:!0,get:function(){return this.wd.count+this.Jd.count}}});xq.prototype.deleteDestinationEdge=xq.prototype.wv;xq.prototype.addDestinationEdge=xq.prototype.mv;xq.prototype.deleteSourceEdge=xq.prototype.xv; +enumerable:!0,get:function(){return this.j.width},set:function(a){var b=this.j;b.width!==a&&(b.ka(),b.width=a,b.freeze())}},height:{configurable:!0,get:function(){return this.j.height},set:function(a){var b=this.j;b.height!==a&&(b.ka(),b.height=a,b.freeze())}},network:{configurable:!0,get:function(){return this.Wc},set:function(a){G&&x(a,jq,xq,"network");this.Wc=a}},sourceVertexes:{configurable:!0,get:function(){for(var a=new I,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex); +return a.iterator}},destinationVertexes:{configurable:!0,get:function(){for(var a=new I,b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},vertexes:{configurable:!0,get:function(){for(var a=new I,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);for(b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},sourceEdges:{configurable:!0,get:function(){return this.xd.iterator}},destinationEdges:{configurable:!0, +enumerable:!0,get:function(){return this.Jd.iterator}},edges:{configurable:!0,get:function(){for(var a=new H,b=this.sourceEdges;b.next();)a.add(b.value);for(b=this.destinationEdges;b.next();)a.add(b.value);return a.iterator}},edgesCount:{configurable:!0,get:function(){return this.xd.count+this.Jd.count}}});xq.prototype.deleteDestinationEdge=xq.prototype.wv;xq.prototype.addDestinationEdge=xq.prototype.mv;xq.prototype.deleteSourceEdge=xq.prototype.xv; xq.prototype.addSourceEdge=xq.prototype.ov;xq.className="LayoutVertex";xq.standardComparer=Eq; xq.smartComparer=function(a,b){G&&x(a,xq,xq,"smartComparer:m");G&&x(b,xq,xq,"smartComparer:n");if(null!==a){if(null!==b){a=a.zi;var c=b.zi;if(null!==a){if(null!==c){b=a.text.toLocaleLowerCase().split(/([+-]?[.]?\d+(?:\.\d*)?(?:e[+-]?\d+)?)/);a=c.text.toLocaleLowerCase().split(/([+-]?[.]?\d+(?:\.\d*)?(?:e[+-]?\d+)?)/);for(c=0;c=f&&0>=g&&(f=1);b=this.spacing.width;isFinite(b)||(b=0);c=this.spacing.height;isFinite(c)||(c=0);null!==a&&a.Da("Layout");d=[];switch(this.alignment){case Nq:var h=b,k=c,l=M.alloc(),m=Math.max(this.cellSize.width,1);if(!isFinite(m))for(var n= @@ -1809,13 +1809,13 @@ aa=aa*r+y}else switch(q){case Mq:B=aa+P.x+T.width;break;default:B=aa-P.x}switch( d[h],e=Math.min(e,k.x),g=Math.min(g,k.y),f=Math.max(f,k.x+k.width);this.arrangement===Mq?this.commitLayers(d,new K(e+b/2-(f+e),g-c/2)):this.commitLayers(d,new K(e-b/2,g-c/2));null!==a&&a.cb("Layout");this.isValidLayout=!0}};Zk.prototype.commitLayers=function(){};function Iq(a,b){G&&x(a,U,Zk,"standardComparer:a");G&&x(b,U,Zk,"standardComparer:b");a=a.text;b=b.text;return ab?1:0} oa.Object.defineProperties(Zk.prototype,{wrappingWidth:{configurable:!0,get:function(){return this.hq},set:function(a){this.hq!==a&&(A(a,"number",Zk,"wrappingWidth"),0d.indexOf(a.newValue)&&d.splice(c,0,a.newValue));return}}else if(a.change===se){c=a.oldParam;if("linkDataArray"===a.modelChange){a=a.oldValue;Ga(a)&&"number"===typeof c&&(d=this.sc(a),b?(this.cg.add(a),this.cd[c]!==a&&this.cd.splice(c,0,a),void 0!==d&&this.ob.add(d,a)):(this.cg.remove(a),this.cd[c]=== -a&&this.cd.splice(c,1),void 0!==d&&this.ob.remove(d)));return}if("linkLabelKeys"===a.modelChange){d=this.Jf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue):(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)));return}}X.prototype.changeState.call(this,a,b)}};t=Gr.prototype;t.Dm=function(a){if(void 0!==a){var b=this.zj;if(null!==b){var c=this.$b(a);null===c&&(c=this.copyNodeData(b),ak(c,this.nodeKeyProperty,a),this.Af(c))}return a}}; +Gr.prototype.changeState=function(a,b){if(null!==a&&a.model===this){if(a.change===pe){var c=a.object,d=a.propertyName;if(d===this.linkKeyProperty&&this.Ac(c)){var e=a.K(b);b=a.K(!b);void 0!==b&&this.ob.remove(b);void 0!==e&&this.ob.add(e,c);ak(c,d,e);return}}else if(a.change===re){c=a.newParam;if("linkDataArray"===a.modelChange){a=a.newValue;Ga(a)&&"number"===typeof c&&(d=this.sc(a),b?(this.cg.remove(a),this.dd[c]===a&&this.dd.splice(c,1),void 0!==d&&this.ob.remove(d)):(this.cg.add(a),this.dd[c]!== +a&&this.dd.splice(c,0,a),void 0!==d&&this.ob.add(d,a)));return}if("linkLabelKeys"===a.modelChange){d=this.Jf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)):0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue));return}}else if(a.change===se){c=a.oldParam;if("linkDataArray"===a.modelChange){a=a.oldValue;Ga(a)&&"number"===typeof c&&(d=this.sc(a),b?(this.cg.add(a),this.dd[c]!==a&&this.dd.splice(c,0,a),void 0!==d&&this.ob.add(d,a)):(this.cg.remove(a),this.dd[c]=== +a&&this.dd.splice(c,1),void 0!==d&&this.ob.remove(d)));return}if("linkLabelKeys"===a.modelChange){d=this.Jf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue):(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)));return}}X.prototype.changeState.call(this,a,b)}};t=Gr.prototype;t.Dm=function(a){if(void 0!==a){var b=this.zj;if(null!==b){var c=this.$b(a);null===c&&(c=this.copyNodeData(b),ak(c,this.nodeKeyProperty,a),this.Af(c))}return a}}; t.qy=function(a){return ar(this,a,!0)};t.jw=function(a,b){ir(this,a,b,!0)};t.uy=function(a){return ar(this,a,!1)};t.nw=function(a,b){ir(this,a,b,!1)};function ar(a,b,c){if(null!==b&&(a=c?a.jf:a.kf,""!==a&&(a=En(b,a),void 0!==a))){if(cr(a))return a;v((c?"FromKey":"ToKey")+" value for link data "+b+" is not a number or a string: "+a)}} function ir(a,b,c,d){null===c&&(c=void 0);void 0===c||cr(c)||za(c,"number or string",Gr,d?"setFromKeyForLinkData:key":"setToKeyForLinkData:key");if(null!==b){var e=d?a.jf:a.kf;if(""!==e)if(c=a.Dm(c),a.Ac(b)){var f=En(b,e);f!==c&&(gr(a,f,b),ak(b,e,c),null===a.$b(c)&&hr(a,c,b),Ar(a,d?"linkFromKey":"linkToKey",pe,e,b,f,c),"string"===typeof e&&a.Ia(b,e))}else ak(b,e,c)}}t.sy=function(a){return $q(this,a,!0)};t.kw=function(a,b){jr(this,a,b,!0)};t.vy=function(a){return $q(this,a,!1)}; t.ow=function(a,b){jr(this,a,b,!1)};function $q(a,b,c){if(null===b)return"";a=c?a.Sj:a.Tj;if(""===a)return"";b=En(b,a);return void 0===b?"":b}function jr(a,b,c,d){A(c,"string",Gr,d?"setFromPortIdForLinkData:portname":"setToPortIdForLinkData:portname");if(null!==b){var e=d?a.Sj:a.Tj;if(""!==e)if(a.Ac(b)){var f=En(b,e);void 0===f&&(f="");f!==c&&(ak(b,e,c),Ar(a,d?"linkFromPortId":"linkToPortId",pe,e,b,f,c),"string"===typeof e&&a.Ia(b,e))}else ak(b,e,c)}} @@ -1982,8 +1982,8 @@ t.My=function(a,b){if(null!==b&&void 0!==b&&(cr(b)||za(b,"number or string",Gr," t.sc=function(a){if(null!==a){var b=this.ti;if(""!==b&&(b=En(a,b),void 0!==b)){if(cr(b))return b;v("Key value for link data "+a+" is not a number or a string: "+b)}}};t.qt=function(a,b){void 0!==b&&null!==b&&cr(b)||za(b,"number or string",Gr,"setKeyForLinkData:key");if(null!==a){var c=this.ti;if(""!==c)if(this.Ac(a)){var d=En(a,c);d!==b&&null===this.Kh(b)&&(ak(a,c,b),void 0!==d&&this.ob.remove(d),this.ob.add(b,a),Ar(this,"linkKey",pe,c,a,d,b),"string"===typeof c&&this.Ia(a,c))}else ak(a,c,b)}}; t.Kh=function(a){null===a&&v("GraphLinksModel.findLinkDataForKey:key must not be null");return void 0!==a&&cr(a)?this.ob.K(a):null}; t.gt=function(a){if(null!==a){var b=this.ti;if(""!==b){var c=this.sc(a);if(void 0===c||this.ob.contains(c)){var d=this.Jl;if(null!==d&&(c=d(this,a),void 0!==c&&null!==c&&!this.ob.contains(c))){ak(a,b,c);return}if("string"===typeof c){for(d=2;this.ob.contains(c+d);)d++;ak(a,b,c+d)}else if(void 0===c||"number"===typeof c){for(c=-this.ob.count-1;this.ob.contains(c);)c--;ak(a,b,c)}else G&&v("GraphLinksModel.getKeyForLinkData returned something other than a string or a number: "+c)}}}}; -t.Ac=function(a){return null===a?!1:this.cg.contains(a)};t.Oi=function(a){null!==a&&(mb(a),this.Ac(a)||er(this,a,!0))};function er(a,b,c){if(""!==a.linkKeyProperty){var d=a.sc(b);if(void 0!==d&&a.ob.K(d)===b)return;a.gt(b);d=a.sc(b);void 0===d&&v("GraphLinksModel.makeLinkDataKeyUnique failed on "+b+". Data not added to model.");a.ob.add(d,b)}a.cg.add(b);d=null;c&&(d=a.cd.length,a.cd.splice(d,0,b));Ar(a,"linkDataArray",re,"linkDataArray",a,null,b,null,d);Kr(a,b)} -t.yz=function(a){if(Array.isArray(a))for(var b=a.length,c=0;cd)return;a.cd.splice(d,1)}Ar(a,"linkDataArray",se,"linkDataArray",a,b,null,d,null);c=ar(a,b,!0);gr(a,c,b);c=ar(a,b,!1);gr(a,c,b);d=a.Jf(b);if(Array.isArray(d))for(var e=d.length,f=0;fd)return;a.dd.splice(d,1)}Ar(a,"linkDataArray",se,"linkDataArray",a,b,null,d,null);c=ar(a,b,!0);gr(a,c,b);c=ar(a,b,!1);gr(a,c,b);d=a.Jf(b);if(Array.isArray(d))for(var e=d.length,f=0;f=a.count)1===a.count&&(a=a.first(),a.centerX=0,a.centerY=0);else{var b=new H;b.addAll(a.iterator);a=new H;var c=new H;var d=this.sort(b);var e,f,g=this.mr;var h=this.arrangement;var k=this.nodeDiameterFormula; var l=this.radius;if(!isFinite(l)||0>=l)l=NaN;var m=this.aspectRatio;if(!isFinite(m)||0>=m)m=1;var n=this.startAngle;isFinite(n)||(n=0);var p=this.sweepAngle;if(!isFinite(p)||360p)p=360;b=this.spacing;isFinite(b)||(b=NaN);h===as&&k===bs?h=Nr:h===as&&k!==bs&&(h=this.arrangement);if((this.direction===Wr||this.direction===Xr)&&this.sorting!==Qr){for(k=0;!(k>=d.length);k+=2){a.add(d.M(k));if(k+1>=d.length)break;c.add(d.M(k+1))}this.direction===Wr?(this.arrangement===as&&a.reverse(),d=new H,d.addAll(a), @@ -2055,7 +2055,7 @@ c.indexOf(b[l][z]),0<=E&&(E=Math.abs(u-(E>=u?E+1:E)),y+=Er||r===m||(q=r>m?r-m:m-r,n+=rg-q?1:-1);c.splice(0>n?m:m+1,0,k);d.splice(h,1);h--}else f=!1;if(f)break;else c.push(d[0]),d.splice(0,1)}for(b=0;b=a?this.hm=a:this.hm=360,this.C())}},arrangement:{configurable:!0,get:function(){return this.Mb},set:function(a){this.Mb!==a&&(cb(a,Mr,Mr,"arrangement"),a===as||a===Nr||a===$r||a===Zr)&&(this.Mb=a,this.C())}},direction:{configurable:!0,get:function(){return this.N},set:function(a){this.N!==a&&(cb(a,Mr,Mr,"direction"), -a===Pr||a===Yr||a===Wr||a===Xr)&&(this.N=a,this.C())}},sorting:{configurable:!0,get:function(){return this.dd},set:function(a){this.dd!==a&&(cb(a,Mr,Mr,"sorting"),a===Ur||a===Vr||a===Sr||Tr||a===Qr)&&(this.dd=a,this.C())}},comparer:{configurable:!0,get:function(){return this.Xc},set:function(a){this.Xc!==a&&(A(a,"function",Mr,"comparer"),this.Xc=a,this.C())}},spacing:{configurable:!0,get:function(){return this.sf},set:function(a){this.sf!==a&&(A(a,"number", +a===Pr||a===Yr||a===Wr||a===Xr)&&(this.N=a,this.C())}},sorting:{configurable:!0,get:function(){return this.ed},set:function(a){this.ed!==a&&(cb(a,Mr,Mr,"sorting"),a===Ur||a===Vr||a===Sr||Tr||a===Qr)&&(this.ed=a,this.C())}},comparer:{configurable:!0,get:function(){return this.Yc},set:function(a){this.Yc!==a&&(A(a,"function",Mr,"comparer"),this.Yc=a,this.C())}},spacing:{configurable:!0,get:function(){return this.sf},set:function(a){this.sf!==a&&(A(a,"number", Mr,"spacing"),this.sf=a,this.C())}},nodeDiameterFormula:{configurable:!0,get:function(){return this.$o},set:function(a){this.$o!==a&&(cb(a,Mr,Mr,"nodeDiameterFormula"),a===Rr||a===bs)&&(this.$o=a,this.C())}},actualXRadius:{configurable:!0,get:function(){return this.ec}},actualYRadius:{configurable:!0,get:function(){return this.je}},actualSpacing:{configurable:!0,get:function(){return this.Dj}},actualCenter:{configurable:!0,get:function(){return this.Nw}}}); var Nr=new F(Mr,"ConstantSpacing",0),$r=new F(Mr,"ConstantDistance",1),Zr=new F(Mr,"ConstantAngle",2),as=new F(Mr,"Packed",3),Pr=new F(Mr,"Clockwise",4),Yr=new F(Mr,"Counterclockwise",5),Wr=new F(Mr,"BidirectionalLeft",6),Xr=new F(Mr,"BidirectionalRight",7),Ur=new F(Mr,"Forwards",8),Vr=new F(Mr,"Reverse",9),Sr=new F(Mr,"Ascending",10),Tr=new F(Mr,"Descending",11),Qr=new F(Mr,"Optimized",12),Rr=new F(Mr,"Pythagorean",13),bs=new F(Mr,"Circular",14);Mr.className="CircularLayout";Mr.ConstantSpacing=Nr; Mr.ConstantDistance=$r;Mr.ConstantAngle=Zr;Mr.Packed=as;Mr.Clockwise=Pr;Mr.Counterclockwise=Yr;Mr.BidirectionalLeft=Wr;Mr.BidirectionalRight=Xr;Mr.Forwards=Ur;Mr.Reverse=Vr;Mr.Ascending=Sr;Mr.Descending=Tr;Mr.Optimized=Qr;Mr.Pythagorean=Rr;Mr.Circular=bs;function Or(){this.xm=-Infinity;this.bn=this.Pk=null} @@ -2063,8 +2063,8 @@ Or.prototype.compare=function(a,b){if(0this.xm||Math.abs(a)h?(e=p.x+p.width/2,f=p.y+ p.height/2,l[0]=new K(p.x+p.width+d.width,p.y),l[1]=new K(p.x,p.y+p.height+d.height),h=2):(k=vs(l,h,e,f,p.width,p.height,d),n=l[k],r=new K(n.x+p.width+d.width,n.y),p=new K(n.x,n.y+p.height+d.height),k+1this.network.vertexes.count)return!1;for(var a=0,b=0,c=this.network.vertexes.first().bounds,d=this.network.vertexes.iterator;d.next();){if(d.value.bounds.Oc(c)&&(a++,2this.network.vertexes.count)return!1;for(var a=0,b=0,c=this.network.vertexes.first().bounds,d=this.network.vertexes.iterator;d.next();){if(d.value.bounds.Pc(c)&&(a++,2a.network.vertexes.count)return!1;a.Dh=a.network.vertexes.Ea();a=a.Dh;a.sort(function(a,b){return null===a||null===b||a===b?0:b.Nd-a.Nd});for(b=a.length-1;0<=b&&1>=a[b].Nd;)b--;return 1u&&0u&&0a[this.vc]&&(this.wi=a[c]-1,this.vc=c),a[c]c)for(g=a.Ha;0c)for(d.reset();d.next();)c=d.value,e[c.component]&&(c.column+=1)} Is.prototype.commitLayout=function(){if(this.setsPortSpots)for(var a=Ps(this,!0),b=Ps(this,!1),c=this.network.edges.iterator;c.next();){var d=c.value.link;null!==d&&(d.fromSpot=a,d.toSpot=b)}this.commitNodes();this.tv();this.isRouting&&this.commitLinks()};function Ps(a,b){return 270===a.N?b?od:rd:90===a.N?b?rd:od:180===a.N?b?pd:qd:b?qd:pd} -Is.prototype.commitNodes=function(){this.de=[];this.Bd=[];this.Ad=[];this.Pa=[];for(var a=0;a<=this.xa;a++)this.de[a]=0,this.Bd[a]=0,this.Ad[a]=0,this.Pa[a]=0;for(a=this.network.vertexes.iterator;a.next();){var b=a.value,c=b.layer;this.de[c]=Math.max(this.de[c],this.nodeMinLayerSpace(b,!0));this.Bd[c]=Math.max(this.Bd[c],this.nodeMinLayerSpace(b,!1))}b=0;c=this.ee;for(var d=0;d<=this.xa;d++){var e=c;0>=this.de[d]+this.Bd[d]&&(e=0);0=this.de[d]+this.Cd[d]&&(e=0);0=n.bounds.bottom?(n=n.bounds.y+n.bounds.height,b.l(q++,C,n+J),b.l(q++,C,n),b.l(q++,C,n-B)):(b.l(q++,C,E+J),b.l(q++,C,E),b.l(q++,C,E-B)):270===this.N?E<=n.bounds.y?(n=n.bounds.y,b.l(q++,C,n-B),b.l(q++,C,n),b.l(q++,C,n+J)):(b.l(q++,C,E-B),b.l(q++,C,E),b.l(q++,C,E+J)):0===this.N&&(C>=n.bounds.right?(n=n.bounds.x+n.bounds.width,b.l(q++,n+J,E),b.l(q++,n,E),b.l(q++,n-B,E)):(b.l(q++,C+J,E),b.l(q++,C,E),b.l(q++,C-B,E)));else{b.l(q++,y,z);var S=0;if(180===this.N||0===this.N){if(180===this.N?C>=n.bounds.right: -C<=n.bounds.x)S=(0===this.N?-B:J)/2;b.l(q++,y+S,E)}else{if(270===this.N?E>=n.bounds.bottom:E<=n.bounds.y)S=(90===this.N?-B:J)/2;b.l(q++,C,z+S)}b.l(q++,C,E)}}else B=Math.max(10,this.de[w.layer]),J=Math.max(10,this.Bd[w.layer]),r?180===this.N?(b.l(q++,C-B-u,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C+J+u,E)):90===this.N?(b.l(q++,C,E+J+u),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E-B-u)): -270===this.N?(b.l(q++,C,E-B-u),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E+J+u)):(b.l(q++,C+J+u,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C-B-u,E)):b.l(q++,C,E)}n=w}if(null===h||l!==Dc||p)if(y=b.i(q-1).x,z=b.i(q-1).y,C=b.i(q).x,E=b.i(q).y,p)u=this.Bd[m.layer],180===this.N||0===this.N?(p=z,p>=m.bounds.y&&p<=m.bounds.bottom&&(180===this.N?C>=m.bounds.x:C<=m.bounds.right)&&(n=m.centerX+(180=== -this.N?-u:u),p=m.bounds.x&&p<=m.bounds.right&&(270===this.N?E>=m.bounds.y:E<=m.bounds.bottom)&&(n=m.centerY+(270===this.N?-u:u),p=m.bounds.x?(n=m.bounds.x+ -m.bounds.width,b.O(q-2,n,z),b.O(q-1,n+J,z)):90===this.N&&E<=m.bounds.bottom?(n=m.bounds.y,b.O(q-2,y,n),b.O(q-1,y,n-B)):270===this.N&&E>=m.bounds.y?(n=m.bounds.y+m.bounds.height,b.O(q-2,y,n),b.O(q-1,y,n+J)):0===this.N&&C<=m.bounds.right&&(n=m.bounds.x,b.O(q-2,n,z),b.O(q-1,n-B,z));else{B=Math.max(10,this.de[m.layer]);J=Math.max(10,this.Bd[m.layer]);p=0;if(180===this.N||0===this.N){if(180===this.N?C<=m.bounds.x:C>=m.bounds.right)p=(0===this.N?J:-B)/2;b.l(q++,C+p,z)}else{if(270===this.N?E<=m.bounds.y: -E>=m.bounds.bottom)p=(90===this.N?J:-B)/2;b.l(q++,y,E+p)}b.l(q++,C,E)}}else{for(;null!==m&&m!==n;){B=w=null;for(m=m.destinationEdges.iterator;m.next()&&(y=m.value,y.link!==c.link||(w=y.toVertex,B=y.fromVertex,null!==B.node&&(B=null),null!==w.node)););if(null===w)break;w!==n&&(y=b.i(q-1).x,z=b.i(q-1).y,C=w.centerX,E=w.centerY,p?180===this.N||0===this.N?(null!==B?B.centerY:z)!==E&&(B=this.Pa[w.layer]+this.Wc.x,q===b.firstPickIndex+1&&(B=0===this.N?Math.max(B,y):Math.min(B,y)),b.l(q++,B,z),b.l(q++,B, -E)):(null!==B?B.centerX:y)!==C&&(B=this.Pa[w.layer]+this.Wc.y,q===b.firstPickIndex+1&&(B=90===this.N?Math.max(B,z):Math.min(B,z)),b.l(q++,y,B),b.l(q++,C,B)):(B=Math.max(10,this.de[w.layer]),J=Math.max(10,this.Bd[w.layer]),r?180===this.N?(b.l(q++,C+J+u,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C-B-u,E)):90===this.N?(b.l(q++,C,E-B-u),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E+J+u)):270=== +C<=n.bounds.x)S=(0===this.N?-B:J)/2;b.l(q++,y+S,E)}else{if(270===this.N?E>=n.bounds.bottom:E<=n.bounds.y)S=(90===this.N?-B:J)/2;b.l(q++,C,z+S)}b.l(q++,C,E)}}else B=Math.max(10,this.de[w.layer]),J=Math.max(10,this.Cd[w.layer]),r?180===this.N?(b.l(q++,C-B-u,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C+J+u,E)):90===this.N?(b.l(q++,C,E+J+u),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E-B-u)): +270===this.N?(b.l(q++,C,E-B-u),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E+J+u)):(b.l(q++,C+J+u,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C-B-u,E)):b.l(q++,C,E)}n=w}if(null===h||l!==Dc||p)if(y=b.i(q-1).x,z=b.i(q-1).y,C=b.i(q).x,E=b.i(q).y,p)u=this.Cd[m.layer],180===this.N||0===this.N?(p=z,p>=m.bounds.y&&p<=m.bounds.bottom&&(180===this.N?C>=m.bounds.x:C<=m.bounds.right)&&(n=m.centerX+(180=== +this.N?-u:u),p=m.bounds.x&&p<=m.bounds.right&&(270===this.N?E>=m.bounds.y:E<=m.bounds.bottom)&&(n=m.centerY+(270===this.N?-u:u),p=m.bounds.x?(n=m.bounds.x+ +m.bounds.width,b.O(q-2,n,z),b.O(q-1,n+J,z)):90===this.N&&E<=m.bounds.bottom?(n=m.bounds.y,b.O(q-2,y,n),b.O(q-1,y,n-B)):270===this.N&&E>=m.bounds.y?(n=m.bounds.y+m.bounds.height,b.O(q-2,y,n),b.O(q-1,y,n+J)):0===this.N&&C<=m.bounds.right&&(n=m.bounds.x,b.O(q-2,n,z),b.O(q-1,n-B,z));else{B=Math.max(10,this.de[m.layer]);J=Math.max(10,this.Cd[m.layer]);p=0;if(180===this.N||0===this.N){if(180===this.N?C<=m.bounds.x:C>=m.bounds.right)p=(0===this.N?J:-B)/2;b.l(q++,C+p,z)}else{if(270===this.N?E<=m.bounds.y: +E>=m.bounds.bottom)p=(90===this.N?J:-B)/2;b.l(q++,y,E+p)}b.l(q++,C,E)}}else{for(;null!==m&&m!==n;){B=w=null;for(m=m.destinationEdges.iterator;m.next()&&(y=m.value,y.link!==c.link||(w=y.toVertex,B=y.fromVertex,null!==B.node&&(B=null),null!==w.node)););if(null===w)break;w!==n&&(y=b.i(q-1).x,z=b.i(q-1).y,C=w.centerX,E=w.centerY,p?180===this.N||0===this.N?(null!==B?B.centerY:z)!==E&&(B=this.Pa[w.layer]+this.Xc.x,q===b.firstPickIndex+1&&(B=0===this.N?Math.max(B,y):Math.min(B,y)),b.l(q++,B,z),b.l(q++,B, +E)):(null!==B?B.centerX:y)!==C&&(B=this.Pa[w.layer]+this.Xc.y,q===b.firstPickIndex+1&&(B=90===this.N?Math.max(B,z):Math.min(B,z)),b.l(q++,y,B),b.l(q++,C,B)):(B=Math.max(10,this.de[w.layer]),J=Math.max(10,this.Cd[w.layer]),r?180===this.N?(b.l(q++,C+J+u,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C-B-u,E)):90===this.N?(b.l(q++,C,E-B-u),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E+J+u)):270=== this.N?(b.l(q++,C,E+J+u),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E-B-u)):(b.l(q++,C-B-u,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C+J+u,E)):180===this.N?(b.l(q++,C+J,E),b.l(q++,C-B,E)):90===this.N?(b.l(q++,C,E-B),b.l(q++,C,E+J)):270===this.N?(b.l(q++,C,E+J),b.l(q++,C,E-B)):(b.l(q++,C-B,E),b.l(q++,C+J,E))));m=w}p&&(y=b.i(q-1).x,z=b.i(q-1).y,C=b.i(q).x,E=b.i(q).y,180===this.N||0===this.N? -z!==E&&(B=0===this.N?Math.min(Math.max((C+y)/2,this.Pa[n.layer]+this.Wc.x),C):Math.max(Math.min((C+y)/2,this.Pa[n.layer]+this.Wc.x),C),b.l(q++,B,z),b.l(q++,B,E)):y!==C&&(B=90===this.N?Math.min(Math.max((E+z)/2,this.Pa[n.layer]+this.Wc.y),E):Math.max(Math.min((E+z)/2,this.Pa[n.layer]+this.Wc.y),E),b.l(q++,y,B),b.l(q++,C,B)))}null!==d&&r&&(null!==g&&(l===Dc&&(l=b.i(0),d=b.i(2),l.B(d)||b.O(1,(l.x+d.x)/2,(l.y+d.y)/2)),l=b.getLinkPoint(e,g,Dc,!0,!1,f,h),l.s()||l.set(e.actualBounds.center),b.O(0,l.x,l.y)), +z!==E&&(B=0===this.N?Math.min(Math.max((C+y)/2,this.Pa[n.layer]+this.Xc.x),C):Math.max(Math.min((C+y)/2,this.Pa[n.layer]+this.Xc.x),C),b.l(q++,B,z),b.l(q++,B,E)):y!==C&&(B=90===this.N?Math.min(Math.max((E+z)/2,this.Pa[n.layer]+this.Xc.y),E):Math.max(Math.min((E+z)/2,this.Pa[n.layer]+this.Xc.y),E),b.l(q++,y,B),b.l(q++,C,B)))}null!==d&&r&&(null!==g&&(l===Dc&&(l=b.i(0),d=b.i(2),l.B(d)||b.O(1,(l.x+d.x)/2,(l.y+d.y)/2)),l=b.getLinkPoint(e,g,Dc,!0,!1,f,h),l.s()||l.set(e.actualBounds.center),b.O(0,l.x,l.y)), null!==h&&(k===Dc&&(k=b.i(b.pointsCount-1),l=b.i(b.pointsCount-3),k.B(l)||b.O(b.pointsCount-2,(k.x+l.x)/2,(k.y+l.y)/2)),e=b.getLinkPoint(f,h,Dc,!1,!1,e,g),e.s()||e.set(f.actualBounds.center),b.O(b.pointsCount-1,e.x,e.y)));b.Df();c.commit()}}}this.avoidOrthogonalOverlaps()}; Is.prototype.avoidOrthogonalOverlaps=function(){if(!(0>=this.linkSpacing)){for(var a=new H,b=this.network.edges.iterator;b.next();){var c=b.value.link;null!==c&&c.isOrthogonal&&!a.contains(c)&&a.add(c)}if(0f.y&&(m=l.y>f.y?0:g.xf.y&&(m=l.y>f.y?0:g.xf.x&&(m=l.x>f.x?0:g.yb.layer?1:a.jdb.jd?1:a.zcb.zc?1:0:0};t.Qy=function(a,b){return a instanceof Ct&&b instanceof Ct&&a!==b?a.firstb.first||a.jb.j||a.jdb.jd?1:a.zcb.zc?1:0:0}; -t.pt=function(a,b){return a instanceof Ct&&b instanceof Ct&&a!==b?a.ccb.cc||a.jb.j||a.jdb.jd?1:a.zcb.zc?1:0:0};t.A=function(a,b){G&&(D(a,Is,"isApprox:a"),D(b,Is,"isApprox:b"));a-=b;return-1a}; +a.value,null!==d&&d.isOrthogonal)for(e=2;ef.x&&(m=l.x>f.x?0:g.yb.layer?1:a.kdb.kd?1:a.zcb.zc?1:0:0};t.Qy=function(a,b){return a instanceof Ct&&b instanceof Ct&&a!==b?a.firstb.first||a.jb.j||a.kdb.kd?1:a.zcb.zc?1:0:0}; +t.pt=function(a,b){return a instanceof Ct&&b instanceof Ct&&a!==b?a.ccb.cc||a.jb.j||a.kdb.kd?1:a.zcb.zc?1:0:0};t.A=function(a,b){G&&(D(a,Is,"isApprox:a"),D(b,Is,"isApprox:b"));a-=b;return-1a}; t.ij=function(a,b,c,d){var e=a.length,f=d-c;if(!(1>=f))if((0>c||c>=e-1)&&v("not in range 0 <= from < length: "+c),2===f)d=a[c],e=a[c+1],0=e)a.sort(b);else for(c=a.slice(0,d),c.sort(b),b=0;b=e)for(d=a.slice(c),d.sort(b),b=c;b=a.Ge.length){var d=[];for(var e=0;ea&&(this.hg=a,this.C()))}},setsPortSpots:{configurable:!0,get:function(){return this.rf},set:function(a){this.rf!==a&&(A(a,"boolean",Is,"setsPortSpots"),this.rf=a,this.C())}},linkSpacing:{configurable:!0,get:function(){return this.Ho},set:function(a){this.Ho!==a&&(A(a,"number",Is,"linkSpacing"),0<=a&&(this.Ho=a,this.C()))}},maxLayer:{configurable:!0, get:function(){return this.xa}},maxIndex:{configurable:!0,get:function(){return this.wi}},maxColumn:{configurable:!0,get:function(){return this.Ha}},minIndexLayer:{configurable:!0,get:function(){return this.bh}},maxIndexLayer:{configurable:!0,get:function(){return this.vc}}}); var Js=new F(Is,"CycleDepthFirst",0),bt=new F(Is,"CycleGreedy",1),Os=new F(Is,"CycleFromLayers",2),Ks=new F(Is,"LayerOptimalLinkLength",0),gt=new F(Is,"LayerLongestPathSink",1),it=new F(Is,"LayerLongestPathSource",2),Ls=new F(Is,"InitDepthFirstOut",0),ot=new F(Is,"InitDepthFirstIn",1),mt=new F(Is,"InitNaive",2),st=new F(Is,"AggressiveNone",0),Ms=new F(Is,"AggressiveLess",1),tt=new F(Is,"AggressiveMore",2),ut=8;Is.className="LayeredDigraphLayout";Is.CycleDepthFirst=Js;Is.CycleGreedy=bt; -Is.CycleFromLayers=Os;Is.LayerOptimalLinkLength=Ks;Is.LayerLongestPathSink=gt;Is.LayerLongestPathSource=it;Is.InitDepthFirstOut=Ls;Is.InitDepthFirstIn=ot;Is.InitNaive=mt;Is.AggressiveNone=st;Is.AggressiveLess=Ms;Is.AggressiveMore=tt;Is.PackNone=0;Is.PackExpand=1;Is.PackStraighten=2;Is.PackMedian=4;Is.PackAll=15;function Ct(){this.index=this.zc=this.jd=this.cc=this.first=this.layer=0;this.link=null;this.j=0}Ct.className="SegInfo";function Ns(a){jq.call(this,a)}na(Ns,jq);Ns.prototype.createVertex=function(){return new Et(this)}; -Ns.prototype.createEdge=function(){return new Ft(this)};Ns.className="LayeredDigraphNetwork";function Et(a){xq.call(this,a);this.Wa=this.Ig=this.ri=-1;this.F=NaN;this.P=null;this.valid=!1;this.finish=this.vg=NaN;this.Cf=0;this.Gk=this.Hk=null}na(Et,xq); +Is.CycleFromLayers=Os;Is.LayerOptimalLinkLength=Ks;Is.LayerLongestPathSink=gt;Is.LayerLongestPathSource=it;Is.InitDepthFirstOut=Ls;Is.InitDepthFirstIn=ot;Is.InitNaive=mt;Is.AggressiveNone=st;Is.AggressiveLess=Ms;Is.AggressiveMore=tt;Is.PackNone=0;Is.PackExpand=1;Is.PackStraighten=2;Is.PackMedian=4;Is.PackAll=15;function Ct(){this.index=this.zc=this.kd=this.cc=this.first=this.layer=0;this.link=null;this.j=0}Ct.className="SegInfo";function Ns(a){jq.call(this,a)}na(Ns,jq);Ns.prototype.createVertex=function(){return new Et(this)}; +Ns.prototype.createEdge=function(){return new Ft(this)};Ns.className="LayeredDigraphNetwork";function Et(a){xq.call(this,a);this.Va=this.Ig=this.ri=-1;this.F=NaN;this.P=null;this.valid=!1;this.finish=this.vg=NaN;this.Cf=0;this.Gk=this.Hk=null}na(Et,xq); Et.prototype.serializeVertexProperties=function(a,b){xq.prototype.serializeVertexProperties.call(this,a,b);a.layer=this.layer;a.column=this.column;a.index=this.index;a.component=this.component;a.near=this.near?kb(this.near):null;a.valid=this.valid;a.vg=this.vg;a.finish=this.finish;a.Cf=this.Cf;a.Hk=this.Hk;a.Gk=this.Gk}; Et.prototype.deserializeVertexProperties=function(a,b,c,d){xq.prototype.deserializeVertexProperties.call(this,a,b,c,d);this.layer=a.layer;this.column=a.column;this.index=a.index;this.component=a.component;if(b=b.get(a.near))this.near=b;this.valid=a.valid;this.vg=a.vg;this.finish=a.finish;this.Cf=a.Cf;this.Hk=a.Hk;this.Gk=a.Gk}; -oa.Object.defineProperties(Et.prototype,{layer:{configurable:!0,get:function(){return this.ri},set:function(a){this.ri!==a&&(A(a,"number",Et,"layer"),this.ri=a)}},column:{configurable:!0,get:function(){return this.Ig},set:function(a){this.Ig!==a&&(A(a,"number",Et,"column"),this.Ig=a)}},index:{configurable:!0,get:function(){return this.Wa},set:function(a){this.Wa!==a&&(A(a,"number",Et,"index"),this.Wa=a)}},component:{configurable:!0,get:function(){return this.F}, +oa.Object.defineProperties(Et.prototype,{layer:{configurable:!0,get:function(){return this.ri},set:function(a){this.ri!==a&&(A(a,"number",Et,"layer"),this.ri=a)}},column:{configurable:!0,get:function(){return this.Ig},set:function(a){this.Ig!==a&&(A(a,"number",Et,"column"),this.Ig=a)}},index:{configurable:!0,get:function(){return this.Va},set:function(a){this.Va!==a&&(A(a,"number",Et,"index"),this.Va=a)}},component:{configurable:!0,get:function(){return this.F}, set:function(a){this.F!==a&&(A(a,"number",Et,"component"),this.F=a)}},near:{configurable:!0,get:function(){return this.P},set:function(a){this.P!==a&&(G&&null!==a&&x(a,Et,Et,"near"),this.P=a)}}});Et.className="LayeredDigraphVertex";function Ft(a){yq.call(this,a);this.j=this.Ma=this.bb=!1;this.La=this.F=NaN;this.P=this.o=0}na(Ft,yq); Ft.prototype.serializeEdgeProperties=function(a,b){yq.prototype.serializeEdgeProperties.call(this,a,b);a.valid=this.valid;a.rev=this.rev;a.forest=this.forest;a.portFromPos=this.portFromPos;a.portToPos=this.portToPos;a.portFromColOffset=this.portFromColOffset;a.portToColOffset=this.portToColOffset}; Ft.prototype.deserializeEdgeProperties=function(a,b,c,d){yq.prototype.deserializeEdgeProperties.call(this,a,b,c,d);this.valid=a.valid;this.rev=a.rev;this.forest=a.forest;this.portFromPos=a.portFromPos;this.portToPos=a.portToPos;this.portFromColOffset=a.portFromColOffset;this.portToColOffset=a.portToColOffset}; -oa.Object.defineProperties(Ft.prototype,{fromVertex:{configurable:!0,get:function(){return this.Zc},set:function(a){this.Zc!==a&&(G&&null!==a&&x(a,Et,Ft,"fromVertex"),this.Zc=a)}},toVertex:{configurable:!0,get:function(){return this.gd},set:function(a){this.gd!==a&&(G&&null!==a&&x(a,Et,Ft,"toVertex"),this.gd=a)}},valid:{configurable:!0,get:function(){return this.bb},set:function(a){this.bb!==a&&(A(a,"boolean",Ft,"valid"),this.bb=a)}},rev:{configurable:!0, +oa.Object.defineProperties(Ft.prototype,{fromVertex:{configurable:!0,get:function(){return this.$c},set:function(a){this.$c!==a&&(G&&null!==a&&x(a,Et,Ft,"fromVertex"),this.$c=a)}},toVertex:{configurable:!0,get:function(){return this.hd},set:function(a){this.hd!==a&&(G&&null!==a&&x(a,Et,Ft,"toVertex"),this.hd=a)}},valid:{configurable:!0,get:function(){return this.bb},set:function(a){this.bb!==a&&(A(a,"boolean",Ft,"valid"),this.bb=a)}},rev:{configurable:!0, enumerable:!0,get:function(){return this.Ma},set:function(a){this.Ma!==a&&(A(a,"boolean",Ft,"rev"),this.Ma=a)}},forest:{configurable:!0,get:function(){return this.j},set:function(a){this.j!==a&&(A(a,"boolean",Ft,"forest"),this.j=a)}},portFromPos:{configurable:!0,get:function(){return this.F},set:function(a){this.F!==a&&(A(a,"number",Ft,"portFromPos"),this.F=a)}},portToPos:{configurable:!0,get:function(){return this.La},set:function(a){this.La!==a&&(A(a,"number", Ft,"portToPos"),this.La=a)}},portFromColOffset:{configurable:!0,get:function(){return this.o},set:function(a){this.o!==a&&(A(a,"number",Ft,"portFromColOffset"),this.o=a)}},portToColOffset:{configurable:!0,get:function(){return this.P},set:function(a){this.P!==a&&(A(a,"number",Ft,"portToColOffset"),this.P=a)}}});Ft.className="LayeredDigraphEdge"; -function Z(a){zi.call(this);this.Pb=new I;this.kp=Gt;this.pd=Ht;this.bq=It;this.Tr=Jt;this.Ow=[];this.nd=!0;this.Mb=Kt;this.Td=(new Hb(10,10)).freeze();var b=new Lt(this);this.Z=new Mt(b);this.$=new Mt(b);this.cv=[];a&&Object.assign(this,a)}na(Z,zi);Z.prototype.cloneProtected=function(a){zi.prototype.cloneProtected.call(this,a);a.kp=this.kp;a.bq=this.bq;a.Tr=this.Tr;a.nd=this.nd;a.Mb=this.Mb;a.Td.assign(this.Td);a.Z.copyInheritedPropertiesFrom(this.Z);a.$.copyInheritedPropertiesFrom(this.$)}; +function Z(a){zi.call(this);this.Pb=new I;this.kp=Gt;this.qd=Ht;this.bq=It;this.Tr=Jt;this.Ow=[];this.od=!0;this.Mb=Kt;this.Td=(new Hb(10,10)).freeze();var b=new Lt(this);this.Z=new Mt(b);this.$=new Mt(b);this.cv=[];a&&Object.assign(this,a)}na(Z,zi);Z.prototype.cloneProtected=function(a){zi.prototype.cloneProtected.call(this,a);a.kp=this.kp;a.bq=this.bq;a.Tr=this.Tr;a.od=this.od;a.Mb=this.Mb;a.Td.assign(this.Td);a.Z.copyInheritedPropertiesFrom(this.Z);a.$.copyInheritedPropertiesFrom(this.$)}; Z.prototype.mb=function(a){a.classType===Z?0===a.name.indexOf("Alignment")?this.alignment=a:0===a.name.indexOf("Arrangement")?this.arrangement=a:0===a.name.indexOf("Compaction")?this.compaction=a:0===a.name.indexOf("Path")?this.path=a:0===a.name.indexOf("Sorting")?this.sorting=a:0===a.name.indexOf("Style")?this.treeStyle=a:v("Unknown enum value: "+a):zi.prototype.mb.call(this,a)};Z.prototype.createNetwork=function(){return new Lt(this)}; Z.prototype.makeNetwork=function(a){function b(a){if(a instanceof V)return!a.isLinkLabel&&"Comment"!==a.category;if(a instanceof R){var b=a.fromNode;if(null===b||b.isLinkLabel||"Comment"===b.category)return!1;a=a.toNode;return null===a||a.isLinkLabel||"Comment"===a.category?!1:!0}return!1}var c=this.createNetwork();a instanceof Q?(c.tg(a.nodes,!0,b),c.tg(a.links,!0,b)):a instanceof vf?c.tg(a.memberParts,!1,b):c.tg(a.iterator,!1,b);return c}; -Z.prototype.doLayout=function(a){G&&null===a&&v("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");null===this.network&&(this.network=this.makeNetwork(a));this.arrangement!==Nt&&(this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin));var b=this.diagram;null===b&&a instanceof Q&&(b=a);this.path===Gt&&null!==b?this.pd=b.isTreePathToChildren?Ht:Ot:this.pd=this.path===Gt?Ht:this.path;if(0b.level)return!1;a.removeChild(c.parent,c)}return!0} Z.prototype.removeChild=function(a,b){if(null!==a&&null!==b){G&&x(a,Mt,Z,"removeChild:p");G&&x(b,Mt,Z,"removeChild:c");for(var c=a.children,d=0,e=0;ee?wu(a,g,ia,y,z):xu(a,g,ia,y,z);ia=z.x;y=z.width;z=z.height;break;case iu:for(C=0;Cn&&(aasb&&(Cu(a,-sb,0,ma,Ba-1),Du(C,-sb,0),Du(E,-sb,0),sb=0)}Na.Y.h(sb,Y);y=Math.max(y,J);z=Math.max(z,B+(0===T?0:q)+rb.height);aa=J}else{0n&&(Ysb&&(Cu(a,0,-sb,ma,Ba-1),Du(C,0,-sb),Du(E,0,-sb),sb=0);Na.Y.h(aa,sb);z=Math.max(z,S);y=Math.max(y,B+(0===T?0:q)+rb.width);Y=S}P++}0n&&(aatb&&(Cu(a,-tb,0,ma,Ba-1),Du(C,-tb,0),Du(E,-tb,0),tb=0)}Na.Y.h(tb,Y);y=Math.max(y,J);z=Math.max(z,B+(0===T?0:q)+sb.height);aa=J}else{0n&&(Ytb&&(Cu(a,0,-tb,ma,Ba-1),Du(C,0,-tb),Du(E,0,-tb),tb=0);Na.Y.h(aa,tb);z=Math.max(z,S);y=Math.max(y,B+(0===T?0:q)+sb.width);Y=S}P++}0l&&(l=0),135u&&(u=0),k===ju&&(h+=p/2+a.focus.y),g+=d+c):b?(null===a.comments?d>y&&(y=Iu(k,d-y,0),g=y.x,h=y.y,y=d,l=0):y=Gu(a,y,l),0>l&&(g-=l,l=0),135z&&(z=Iu(k,0,w-z),g=z.x,h=z.y,z=w,u=0):z=Hu(a,z,u),0>u&&(h-=u,u=0),g+=d+c);if(0b&&(b=c+a.width),0>c&&(b-=c),b;case qu:return a.width>b?a.width:b;case ru:return 2*a.focus.x>b?a.width:b+a.width-2*a.focus.x;case hu:case Yt:return Math.max(a.width,Math.max(b,c+a.width)-Math.min(0,c));case iu:return a.width-a.focus.x+a.nodeSpacing/2+b;case ju:return Math.max(a.width,a.focus.x+a.nodeSpacing/2+b);default:return b}} function Hu(a,b,c){G&&x(a,Mt,Z,"calculateSubheight:v");switch(a.alignment){case Fu:case Eu:return c+a.height>b&&(b=c+a.height),0>c&&(b-=c),b;case qu:return a.height>b?a.height:b;case ru:return 2*a.focus.y>b?a.height:b+a.height-2*a.focus.y;case hu:case Yt:return Math.max(a.height,Math.max(b,c+a.height)-Math.min(0,c));case iu:return a.height-a.focus.y+a.nodeSpacing/2+b;case ju:return Math.max(a.height,a.focus.y+a.nodeSpacing/2+b);default:return b}} function Iu(a,b,c){G&&x(a,F,Z,"alignOffset:align");switch(a){case Eu:b/=2;c/=2;break;case Fu:b/=2;c/=2;break;case qu:c=b=0;break;case ru:break;default:v("Unhandled alignment value "+a.toString())}return new K(b,c)}function zu(a,b,c,d,e,f){G&&x(a,Mt,Z,"shiftRelPosAlign:v");G&&x(b,F,Z,"shiftRelPosAlign:align");b=Iu(b,c,d);Cu(a,b.x,b.y,e,f)}function Cu(a,b,c,d,e){G&&x(a,Mt,Z,"shiftRelPos:v");if(0!==b||0!==c)for(a=a.children;d<=e;d++){var f=a[d].Y;f.x+=b;f.y+=c}} -function Au(a,b,c,d){G&&(x(b,Mt,Z,"recordMidPoints:v"),A(c,"number",Z,"recordMidPoints:x"),A(d,"number",Z,"recordMidPoints:y"));var e=b.parent;switch(a.pd){case Ht:for(a=b.sourceEdges;a.next();)b=a.value,b.fromVertex===e&&b.relativePoint.h(c,d);break;case Ot:for(a=b.destinationEdges;a.next();)b=a.value,b.toVertex===e&&b.relativePoint.h(c,d);break;default:v("Unhandled path value "+a.pd.toString())}}function Du(a,b,c){for(var d=0;dn.length||null===r||2>r.length))for(e=c= 0;cl&&f.yf.y&&lb.length||null===c||2>c.length)d=null;else{m=yu(a,b.length+c.length);for(d=f=k=0;fk;)l=c[f++],m[d++].h(l.x+e,l.y);c=yu(a,d);for(k=0;kn.length||null===f||2>f.length)e=null;else{m=yu(a,n.length+f.length);for(e=l=c=0;cf;)k=n[c++],m[e++].h(k.x, @@ -2288,17 +2288,17 @@ function Ju(a,b){var c=b.length,d=a.cv[c];void 0===d&&(d=[],a.cv[c]=d);d.push(b) Z.prototype.arrangeTrees=function(){if(this.Mb===Nt)for(var a=this.Pb.iterator;a.next();){var b=a.value;if(b instanceof Mt){var c=b.node;if(null!==c){var d=c.position;c=d.x;d=d.y;isFinite(c)||(c=0);isFinite(d)||(d=0);Nu(this,b,c,d)}}}else{a=[];for(b=this.Pb.iterator;b.next();)c=b.value,c instanceof Mt&&a.push(c);switch(this.sorting){case cu:break;case du:a.reverse();break;case eu:a.sort(this.comparer);break;case fu:a.sort(this.comparer);a.reverse();break;default:v("Unhandled sorting value "+this.sorting.toString())}c= this.arrangementOrigin;b=c.x;c=c.y;for(d=0;d=a?0:135>=a?90:225>=a?180:315>=a?270:0}function uu(a){G&&x(a,Mt,Z,"computeLayerSpacing:v");var b=pu(a);b=90===b||270===b;var c=a.layerSpacing;if(0p.y+c.rowIndent&&(e=Math.min(e,Math.max(m.y,e-vu(c))))):c.alignment===qu?(e=d.top+b.y,0===b.y&&m.yp.x+c.rowIndent&&(e=Math.min(e,Math.max(m.x,e-vu(c))))):c.alignment===qu?(e=d.left+b.x,0===b.x&&m.xp.y+c.rowIndent&&(e=Math.min(e,Math.max(m.y,e-vu(c))))):c.alignment===qu?(e=d.top+b.y,0===b.y&&m.yc;c++)b["0123456789abcdef".charAt(c>>4)+"0123456789abcdef".charAt(c&15)]=String.fromCharCode(c);a.length%2&&(a="0"+a);c=[];for(var d=0,e=0;ec;c++)b[c]=c;for(c=d=0;256>c;c++)d=(d+b[c]+119)%256,e=b[c],b[c]=b[d],b[d]=e;d=c=0;for(var f="",g=0;gthis.key)return!1;Da(a)}a=a.m;var b=a.length,c=++this.Wa,d=this.nf;if(null!==d)for(;cthis.key)return!1;Da(a)}var b=--this.Wa;if(0<=b)return this.key=b,this.value=a.m[b],!0;this.Wd();return!1};jb.prototype.ud=function(){return this.next()}; -jb.prototype.first=function(){var a=this.ub;this.pa=a.w;var b=a.m;this.Wa=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null};jb.prototype.any=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Wa=e;for(--e;0<=e;e--){if(a(d[e]))return!0;b.w!==c&&Da(b)}return!1};jb.prototype.all=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Wa=e;for(--e;0<=e;e--){if(!a(d[e]))return!1;b.w!==c&&Da(b)}return!0}; -jb.prototype.each=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Wa=e;for(--e;0<=e;e--)a(d[e]),b.w!==c&&Da(b);return this};jb.prototype.map=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=[],e=b.m,f=e.length;this.Wa=f;for(--f;0<=f;f--)d.push(a(e[f])),b.w!==c&&Da(b);a=new H;a.m=d;a.pb();return a.iterator}; -jb.prototype.filter=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=[],e=b.m,f=e.length;this.Wa=f;for(--f;0<=f;f--){var g=e[f];a(g)&&d.push(g);b.w!==c&&Da(b)}a=new H;a.m=d;a.pb();return a.iterator};jb.prototype.Wd=function(){this.key=-1;this.value=null;this.pa=-1;this.ub.Zg=this};jb.prototype.toString=function(){return"ListIteratorBackwards("+this.Wa+"/"+this.ub.count+")"}; -oa.Object.defineProperties(jb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.ub.m.length}}});jb.prototype.first=jb.prototype.first;jb.prototype.hasNext=jb.prototype.ud;jb.prototype.next=jb.prototype.next;jb.prototype.reset=jb.prototype.reset;jb.className="ListIteratorBackwards"; +b.Gm[e.zk],{set:function(a,b){return function(){throw Error("Property "+a.Gm[b.zk]+" of "+a.x+" is read-only.");}}(b,e)})}}}b={Gm:b.Gm,x:b.x}}}};function fb(){}fb.prototype.reset=function(){};fb.prototype.next=function(){return!1};fb.prototype.vd=function(){return!1};fb.prototype.first=function(){return null};fb.prototype.any=function(){return!1};fb.prototype.all=function(){return!0};fb.prototype.each=function(){return this};fb.prototype.map=function(){return this};fb.prototype.filter=function(){return this}; +fb.prototype.Wd=function(){};fb.prototype.toString=function(){return"EmptyIterator"};oa.Object.defineProperties(fb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return 0}}});fb.prototype.first=fb.prototype.first;fb.prototype.hasNext=fb.prototype.vd;fb.prototype.next=fb.prototype.next;fb.prototype.reset=fb.prototype.reset;var gb=null;fb.className="EmptyIterator";gb=new fb;function hb(a){this.key=-1;this.value=a} +hb.prototype.reset=function(){this.key=-1};hb.prototype.next=function(){return-1===this.key?(this.key=0,!0):!1};hb.prototype.vd=function(){return this.next()};hb.prototype.first=function(){this.key=0;return this.value};hb.prototype.any=function(a){this.key=-1;return a(this.value)};hb.prototype.all=function(a){this.key=-1;return a(this.value)};hb.prototype.each=function(a){this.key=-1;a(this.value);return this};hb.prototype.map=function(a){return new hb(a(this.value))}; +hb.prototype.filter=function(a){return a(this.value)?new hb(this.value):gb};hb.prototype.Wd=function(){this.value=null};hb.prototype.toString=function(){return"SingletonIterator("+this.value+")"};oa.Object.defineProperties(hb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return 1}}});hb.prototype.first=hb.prototype.first;hb.prototype.hasNext=hb.prototype.vd;hb.prototype.next=hb.prototype.next; +hb.prototype.reset=hb.prototype.reset;hb.className="SingletonIterator";function ib(a){this.ub=a;this.nf=null;a.Oa=null;this.pa=a.w;this.Va=-1}ib.prototype.reset=function(){var a=this.ub;a.Oa=null;this.pa=a.w;this.Va=-1};ib.prototype.next=function(){var a=this.ub;if(a.w!==this.pa){if(0>this.key)return!1;Da(a)}a=a.m;var b=a.length,c=++this.Va,d=this.nf;if(null!==d)for(;cthis.key)return!1;Da(a)}var b=--this.Va;if(0<=b)return this.key=b,this.value=a.m[b],!0;this.Wd();return!1};jb.prototype.vd=function(){return this.next()}; +jb.prototype.first=function(){var a=this.ub;this.pa=a.w;var b=a.m;this.Va=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null};jb.prototype.any=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Va=e;for(--e;0<=e;e--){if(a(d[e]))return!0;b.w!==c&&Da(b)}return!1};jb.prototype.all=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Va=e;for(--e;0<=e;e--){if(!a(d[e]))return!1;b.w!==c&&Da(b)}return!0}; +jb.prototype.each=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=b.m,e=d.length;this.Va=e;for(--e;0<=e;e--)a(d[e]),b.w!==c&&Da(b);return this};jb.prototype.map=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=[],e=b.m,f=e.length;this.Va=f;for(--f;0<=f;f--)d.push(a(e[f])),b.w!==c&&Da(b);a=new H;a.m=d;a.pb();return a.iterator}; +jb.prototype.filter=function(a){var b=this.ub;b.Zg=null;var c=b.w,d=[],e=b.m,f=e.length;this.Va=f;for(--f;0<=f;f--){var g=e[f];a(g)&&d.push(g);b.w!==c&&Da(b)}a=new H;a.m=d;a.pb();return a.iterator};jb.prototype.Wd=function(){this.key=-1;this.value=null;this.pa=-1;this.ub.Zg=this};jb.prototype.toString=function(){return"ListIteratorBackwards("+this.Va+"/"+this.ub.count+")"}; +oa.Object.defineProperties(jb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.ub.m.length}}});jb.prototype.first=jb.prototype.first;jb.prototype.hasNext=jb.prototype.vd;jb.prototype.next=jb.prototype.next;jb.prototype.reset=jb.prototype.reset;jb.className="ListIteratorBackwards"; function H(a){ab(this);this.u=!1;this.m=[];this.w=0;this.Zg=this.Oa=null;(G&&"function"===typeof a||"string"===typeof a)&&v("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=H.prototype;t.pb=function(){var a=this.w;a++;999999999a||a>=b.length)&&Aa(a,"0 <= i < length",H,"elt:i");return b[a]};t.get=function(a){return this.M(a)};t.Rc=function(a,b){G&&D(a,H,"setElt:i");var c=this.m;(0>a||a>=c.length)&&Aa(a,"0 <= i < length",H,"setElt:i");this.u&&xa(this,a);c[a]=b};t.set=function(a,b){this.Rc(a,b)};t.first=function(){var a=this.m;return 0===a.length?null:a[0]}; +t.indexOf=function(a){return null===a?-1:this.m.indexOf(a)};t.M=function(a){G&&D(a,H,"elt:i");var b=this.m;(0>a||a>=b.length)&&Aa(a,"0 <= i < length",H,"elt:i");return b[a]};t.get=function(a){return this.M(a)};t.Sc=function(a,b){G&&D(a,H,"setElt:i");var c=this.m;(0>a||a>=c.length)&&Aa(a,"0 <= i < length",H,"setElt:i");this.u&&xa(this,a);c[a]=b};t.set=function(a,b){this.Sc(a,b)};t.first=function(){var a=this.m;return 0===a.length?null:a[0]}; t.cc=function(){var a=this.m,b=a.length;return 0a&&Aa(a,">= 0",H,"insertAt:i");this.u&&xa(this,a);var c=this.m;a>=c.length?c.push(b):c.splice(a,0,b);this.pb()};t.remove=function(a){if(null===a)return!1;this.u&&xa(this,a);var b=this.m;a=b.indexOf(a);if(-1===a)return!1;a===b.length-1?b.pop():b.splice(a,1);this.pb();return!0};t.delete=function(a){return this.remove(a)}; @@ -53,38 +53,38 @@ t.ij=function(a,b,c){var d=this.m,e=d.length;void 0===b&&(b=0);void 0===c&&(c=e) else for(e=d.slice(b,c),e.sort(a),a=b;a=this.m.length)return gb;var a=this.Oa;return null!==a?(a.reset(),a):new ib(this)}},iteratorBackwards:{configurable:!0, enumerable:!0,get:function(){if(0>=this.m.length)return gb;var a=this.Zg;return null!==a?(a.reset(),a):new jb(this)}}});H.prototype.reverse=H.prototype.reverse;H.prototype.sortRange=H.prototype.ij;H.prototype.sort=H.prototype.sort;H.prototype.toSet=H.prototype.sw;H.prototype.toArray=H.prototype.Ea;H.prototype.removeRange=H.prototype.removeRange;H.prototype.removeAt=H.prototype.kb;H.prototype["delete"]=H.prototype.delete;H.prototype.remove=H.prototype.remove;H.prototype.insertAt=H.prototype.zb; -H.prototype.pop=H.prototype.pop;H.prototype.last=H.prototype.cc;H.prototype.first=H.prototype.first;H.prototype.set=H.prototype.set;H.prototype.setElt=H.prototype.Rc;H.prototype.get=H.prototype.get;H.prototype.elt=H.prototype.M;H.prototype.indexOf=H.prototype.indexOf;H.prototype.has=H.prototype.has;H.prototype.contains=H.prototype.contains;H.prototype.clear=H.prototype.clear;H.prototype.addAll=H.prototype.addAll;H.prototype.push=H.prototype.push;H.prototype.add=H.prototype.add;H.prototype.thaw=H.prototype.ka; -H.prototype.freeze=H.prototype.freeze;H.className="List";function lb(a){this.mg=a;a.Oa=null;this.pa=a.w;this.ra=null}lb.prototype.reset=function(){var a=this.mg;a.Oa=null;this.pa=a.w;this.ra=null};lb.prototype.next=function(){var a=this.mg;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=b.value,this.key=b.key,!0;this.Wd();return!1};lb.prototype.ud=function(){return this.next()}; +H.prototype.pop=H.prototype.pop;H.prototype.last=H.prototype.cc;H.prototype.first=H.prototype.first;H.prototype.set=H.prototype.set;H.prototype.setElt=H.prototype.Sc;H.prototype.get=H.prototype.get;H.prototype.elt=H.prototype.M;H.prototype.indexOf=H.prototype.indexOf;H.prototype.has=H.prototype.has;H.prototype.contains=H.prototype.contains;H.prototype.clear=H.prototype.clear;H.prototype.addAll=H.prototype.addAll;H.prototype.push=H.prototype.push;H.prototype.add=H.prototype.add;H.prototype.thaw=H.prototype.ka; +H.prototype.freeze=H.prototype.freeze;H.className="List";function lb(a){this.mg=a;a.Oa=null;this.pa=a.w;this.ra=null}lb.prototype.reset=function(){var a=this.mg;a.Oa=null;this.pa=a.w;this.ra=null};lb.prototype.next=function(){var a=this.mg;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=b.value,this.key=b.key,!0;this.Wd();return!1};lb.prototype.vd=function(){return this.next()}; lb.prototype.first=function(){var a=this.mg;this.pa=a.w;a=a.ga;if(null!==a){this.ra=a;var b=a.value;this.key=a.key;return this.value=b}return null};lb.prototype.any=function(a){var b=this.mg;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(a(d.value))return!0;b.w!==c&&Da(b);d=d.ua}return!1};lb.prototype.all=function(a){var b=this.mg;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(!a(d.value))return!1;b.w!==c&&Da(b);d=d.ua}return!0}; lb.prototype.each=function(a){var b=this.mg;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;)a(d.value),b.w!==c&&Da(b),d=d.ua;return this};lb.prototype.map=function(a){var b=this.mg;b.Oa=null;for(var c=new H,d=b.w,e=b.ga;null!==e;)c.add(a(e.value)),b.w!==d&&Da(b),e=e.ua;return c.iterator};lb.prototype.filter=function(a){var b=this.mg;b.Oa=null;for(var c=new H,d=b.w,e=b.ga;null!==e;){var f=e.value;a(f)&&c.add(f);b.w!==d&&Da(b);e=e.ua}return c.iterator}; -lb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1;this.mg.Oa=this};lb.prototype.toString=function(){return null!==this.ra?"SetIterator@"+this.ra.value:"SetIterator"};oa.Object.defineProperties(lb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.mg.Nb}}});lb.prototype.first=lb.prototype.first;lb.prototype.hasNext=lb.prototype.ud;lb.prototype.next=lb.prototype.next;lb.prototype.reset=lb.prototype.reset; +lb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1;this.mg.Oa=this};lb.prototype.toString=function(){return null!==this.ra?"SetIterator@"+this.ra.value:"SetIterator"};oa.Object.defineProperties(lb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.mg.Nb}}});lb.prototype.first=lb.prototype.first;lb.prototype.hasNext=lb.prototype.vd;lb.prototype.next=lb.prototype.next;lb.prototype.reset=lb.prototype.reset; lb.className="SetIterator";function I(a){ab(this);this.u=!1;this.Ob={};this.Nb=0;this.Oa=null;this.w=0;this.hf=this.ga=null;(G&&"function"===typeof a||"string"===typeof a)&&v("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=I.prototype;t.pb=function(){var a=this.w;a++;999999999=this.Nb)return gb;var a=this.Oa;return null!==a?(a.reset(),a):new lb(this)}}});I.prototype.toList=I.prototype.rw;I.prototype.toArray=I.prototype.Ea;I.prototype.clear=I.prototype.clear;I.prototype.retainAll=I.prototype.kB;I.prototype.removeAll=I.prototype.Oq; -I.prototype["delete"]=I.prototype.delete;I.prototype.remove=I.prototype.remove;I.prototype.first=I.prototype.first;I.prototype.containsAny=I.prototype.Oz;I.prototype.containsAll=I.prototype.Nz;I.prototype.has=I.prototype.has;I.prototype.contains=I.prototype.contains;I.prototype.addAll=I.prototype.addAll;I.prototype.add=I.prototype.add;I.prototype.thaw=I.prototype.ka;I.prototype.freeze=I.prototype.freeze;var pb=1;I.className="Set";I.uniqueHash=ab;I.hashIdUnique=mb;I.hashId=kb; -function qb(a){this.na=a;this.pa=a.w;this.ra=null}qb.prototype.reset=function(){this.pa=this.na.w;this.ra=null};qb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=this.key=a=b.key,!0;this.Wd();return!1};qb.prototype.ud=function(){return this.next()};qb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;return null!==a?(this.ra=a,this.value=this.key=a=a.key):null}; -qb.prototype.any=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(a(d.key))return!0;b.w!==c&&Da(b);d=d.ua}return!1};qb.prototype.all=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(!a(d.key))return!1;b.w!==c&&Da(b);d=d.ua}return!0};qb.prototype.each=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;)a(d.key),b.w!==c&&Da(b),d=d.ua;return this}; -qb.prototype.map=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;)d.add(a(e.key)),b.w!==c&&Da(b),e=e.ua;return d.iterator};qb.prototype.filter=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;){var f=e.key;a(f)&&d.add(f);b.w!==c&&Da(b);e=e.ua}return d.iterator};qb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1};qb.prototype.toString=function(){return null!==this.ra?"MapKeySetIterator@"+this.ra.value:"MapKeySetIterator"}; -oa.Object.defineProperties(qb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});qb.prototype.first=qb.prototype.first;qb.prototype.hasNext=qb.prototype.ud;qb.prototype.next=qb.prototype.next;qb.prototype.reset=qb.prototype.reset;qb.className="MapKeySetIterator";function ub(a){I.call(this);ab(this);this.u=!0;this.na=a}na(ub,I);t=ub.prototype;t.freeze=function(){return this};t.ka=function(){return this}; +I.prototype["delete"]=I.prototype.delete;I.prototype.remove=I.prototype.remove;I.prototype.first=I.prototype.first;I.prototype.containsAny=I.prototype.Oz;I.prototype.containsAll=I.prototype.Nz;I.prototype.has=I.prototype.has;I.prototype.contains=I.prototype.contains;I.prototype.addAll=I.prototype.addAll;I.prototype.add=I.prototype.add;I.prototype.thaw=I.prototype.ka;I.prototype.freeze=I.prototype.freeze;var qb=1;I.className="Set";I.uniqueHash=ab;I.hashIdUnique=mb;I.hashId=kb; +function rb(a){this.na=a;this.pa=a.w;this.ra=null}rb.prototype.reset=function(){this.pa=this.na.w;this.ra=null};rb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=this.key=a=b.key,!0;this.Wd();return!1};rb.prototype.vd=function(){return this.next()};rb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;return null!==a?(this.ra=a,this.value=this.key=a=a.key):null}; +rb.prototype.any=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(a(d.key))return!0;b.w!==c&&Da(b);d=d.ua}return!1};rb.prototype.all=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(!a(d.key))return!1;b.w!==c&&Da(b);d=d.ua}return!0};rb.prototype.each=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=b.ga;null!==d;)a(d.key),b.w!==c&&Da(b),d=d.ua;return this}; +rb.prototype.map=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;)d.add(a(e.key)),b.w!==c&&Da(b),e=e.ua;return d.iterator};rb.prototype.filter=function(a){var b=this.na,c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;){var f=e.key;a(f)&&d.add(f);b.w!==c&&Da(b);e=e.ua}return d.iterator};rb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1};rb.prototype.toString=function(){return null!==this.ra?"MapKeySetIterator@"+this.ra.value:"MapKeySetIterator"}; +oa.Object.defineProperties(rb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});rb.prototype.first=rb.prototype.first;rb.prototype.hasNext=rb.prototype.vd;rb.prototype.next=rb.prototype.next;rb.prototype.reset=rb.prototype.reset;rb.className="MapKeySetIterator";function ub(a){I.call(this);ab(this);this.u=!0;this.na=a}na(ub,I);t=ub.prototype;t.freeze=function(){return this};t.ka=function(){return this}; t.toString=function(){return"MapKeySet("+this.na.toString()+")"};t.add=function(){v("This Set is read-only: "+this.toString())};t.contains=function(a){return this.na.contains(a)};t.has=function(a){return this.contains(a)};t.remove=function(){v("This Set is read-only: "+this.toString())};t.delete=function(a){return this.remove(a)};t.clear=function(){v("This Set is read-only: "+this.toString())};t.first=function(){var a=this.na.ga;return null!==a?a.key:null}; ub.prototype.any=function(a){for(var b=this.na.ga;null!==b;){if(a(b.key))return!0;b=b.ua}return!1};ub.prototype.all=function(a){for(var b=this.na.ga;null!==b;){if(!a(b.key))return!1;b=b.ua}return!0};ub.prototype.each=function(a){for(var b=this.na.ga;null!==b;)a(b.key),b=b.ua;return this};ub.prototype.map=function(a){for(var b=new I,c=this.na.ga;null!==c;)b.add(a(c.key)),c=c.ua;return b};ub.prototype.filter=function(a){for(var b=new I,c=this.na.ga;null!==c;){var d=c.key;a(d)&&b.add(d);c=c.ua}return b}; ub.prototype.copy=function(){return new ub(this.na)};ub.prototype.sw=function(){var a=new I,b=this.na.Ob,c;for(c in b)a.add(b[c].key);return a};ub.prototype.Ea=function(){var a=this.na.Ob,b=Array(this.na.Nb),c=0,d;for(d in a)b[c]=a[d].key,c++;return b};ub.prototype.rw=function(){var a=new H,b=this.na.Ob,c;for(c in b)a.add(b[c].key);return a}; -oa.Object.defineProperties(ub.prototype,{count:{configurable:!0,get:function(){return this.na.Nb}},size:{configurable:!0,get:function(){return this.na.Nb}},iterator:{configurable:!0,get:function(){return 0>=this.na.Nb?gb:new qb(this.na)}}});ub.prototype.toList=ub.prototype.rw;ub.prototype.toArray=ub.prototype.Ea;ub.prototype.toSet=ub.prototype.sw;ub.prototype.first=ub.prototype.first;ub.prototype.clear=ub.prototype.clear;ub.prototype["delete"]=ub.prototype.delete; +oa.Object.defineProperties(ub.prototype,{count:{configurable:!0,get:function(){return this.na.Nb}},size:{configurable:!0,get:function(){return this.na.Nb}},iterator:{configurable:!0,get:function(){return 0>=this.na.Nb?gb:new rb(this.na)}}});ub.prototype.toList=ub.prototype.rw;ub.prototype.toArray=ub.prototype.Ea;ub.prototype.toSet=ub.prototype.sw;ub.prototype.first=ub.prototype.first;ub.prototype.clear=ub.prototype.clear;ub.prototype["delete"]=ub.prototype.delete; ub.prototype.remove=ub.prototype.remove;ub.prototype.has=ub.prototype.has;ub.prototype.contains=ub.prototype.contains;ub.prototype.add=ub.prototype.add;ub.prototype.thaw=ub.prototype.ka;ub.prototype.freeze=ub.prototype.freeze;ub.className="MapKeySet";function vb(a){this.na=a;a.gf=null;this.pa=a.w;this.ra=null}vb.prototype.reset=function(){var a=this.na;a.gf=null;this.pa=a.w;this.ra=null}; -vb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=b.value,this.key=b.key,!0;this.Wd();return!1};vb.prototype.ud=function(){return this.next()};vb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;if(null!==a){this.ra=a;var b=a.value;this.key=a.key;return this.value=b}return null}; +vb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.value=b.value,this.key=b.key,!0;this.Wd();return!1};vb.prototype.vd=function(){return this.next()};vb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;if(null!==a){this.ra=a;var b=a.value;this.key=a.key;return this.value=b}return null}; vb.prototype.any=function(a){var b=this.na;b.gf=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(a(d.value))return!0;b.w!==c&&Da(b);d=d.ua}return!1};vb.prototype.all=function(a){var b=this.na;b.gf=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(!a(d.value))return!1;b.w!==c&&Da(b);d=d.ua}return!0};vb.prototype.each=function(a){var b=this.na;b.gf=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;)a(d.value),b.w!==c&&Da(b),d=d.ua;return this}; vb.prototype.map=function(a){var b=this.na;b.gf=null;var c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;)d.add(a(e.value)),b.w!==c&&Da(b),e=e.ua;return d.iterator};vb.prototype.filter=function(a){var b=this.na;b.gf=null;var c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;){var f=e.value;a(f)&&d.add(f);b.w!==c&&Da(b);e=e.ua}return d.iterator};vb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1;this.na.gf=this}; -vb.prototype.toString=function(){return null!==this.ra?"MapValueSetIterator@"+this.ra.value:"MapValueSetIterator"};oa.Object.defineProperties(vb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});vb.prototype.first=vb.prototype.first;vb.prototype.hasNext=vb.prototype.ud;vb.prototype.next=vb.prototype.next;vb.prototype.reset=vb.prototype.reset;vb.className="MapValueSetIterator"; +vb.prototype.toString=function(){return null!==this.ra?"MapValueSetIterator@"+this.ra.value:"MapValueSetIterator"};oa.Object.defineProperties(vb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});vb.prototype.first=vb.prototype.first;vb.prototype.hasNext=vb.prototype.vd;vb.prototype.next=vb.prototype.next;vb.prototype.reset=vb.prototype.reset;vb.className="MapValueSetIterator"; function nb(a,b){this.key=a;this.value=b;this.Sl=this.ua=null}nb.prototype.toString=function(){return"{"+this.key+":"+this.value+"}"};nb.className="KeyValuePair";function wb(a){this.na=a;a.Oa=null;this.pa=a.w;this.ra=null}wb.prototype.reset=function(){var a=this.na;a.Oa=null;this.pa=a.w;this.ra=null}; -wb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.key=b.key,this.value=b.value,!0;this.Wd();return!1};wb.prototype.ud=function(){return this.next()};wb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;return null!==a?(this.ra=a,this.key=a.key,this.value=a.value,a):null}; +wb.prototype.next=function(){var a=this.na;if(a.w!==this.pa){if(null===this.key)return!1;Da(a)}var b=this.ra;b=null===b?a.ga:b.ua;if(null!==b)return this.ra=b,this.key=b.key,this.value=b.value,!0;this.Wd();return!1};wb.prototype.vd=function(){return this.next()};wb.prototype.first=function(){var a=this.na;this.pa=a.w;a=a.ga;return null!==a?(this.ra=a,this.key=a.key,this.value=a.value,a):null}; wb.prototype.any=function(a){var b=this.na;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(a(d))return!0;b.w!==c&&Da(b);d=d.ua}return!1};wb.prototype.all=function(a){var b=this.na;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;){if(!a(d))return!1;b.w!==c&&Da(b);d=d.ua}return!0};wb.prototype.each=function(a){var b=this.na;b.Oa=null;var c=b.w;this.ra=null;for(var d=b.ga;null!==d;)a(d),b.w!==c&&Da(b),d=d.ua;return this}; wb.prototype.map=function(a){var b=this.na;b.Oa=null;var c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;)d.add(a(e)),b.w!==c&&Da(b),e=e.ua;return d.iterator};wb.prototype.filter=function(a){var b=this.na;b.Oa=null;var c=b.w;this.ra=null;for(var d=new H,e=b.ga;null!==e;)a(e)&&d.add(e),b.w!==c&&Da(b),e=e.ua;return d.iterator};wb.prototype.Wd=function(){this.value=this.key=null;this.pa=-1;this.na.Oa=this};wb.prototype.toString=function(){return null!==this.ra?"MapIterator@"+this.ra:"MapIterator"}; -oa.Object.defineProperties(wb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});wb.prototype.first=wb.prototype.first;wb.prototype.hasNext=wb.prototype.ud;wb.prototype.next=wb.prototype.next;wb.prototype.reset=wb.prototype.reset;wb.className="MapIterator"; +oa.Object.defineProperties(wb.prototype,{iterator:{configurable:!0,get:function(){return this}},count:{configurable:!0,get:function(){return this.na.Nb}}});wb.prototype.first=wb.prototype.first;wb.prototype.hasNext=wb.prototype.vd;wb.prototype.next=wb.prototype.next;wb.prototype.reset=wb.prototype.reset;wb.className="MapIterator"; function xb(a){ab(this);this.u=!1;this.Ob={};this.Nb=0;this.gf=this.Oa=null;this.w=0;this.hf=this.ga=null;(G&&"function"===typeof a||"string"===typeof a)&&v("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=xb.prototype;t.pb=function(){var a=this.w;a++;999999999=this.count)return gb;var a=this.Oa;return null!==a?(a.reset(),a):new wb(this)}},iteratorKeys:{configurable:!0,get:function(){return 0>=this.count?gb:new qb(this)}},iteratorValues:{configurable:!0,get:function(){if(0>=this.count)return gb; +oa.Object.defineProperties(xb.prototype,{count:{configurable:!0,get:function(){return this.Nb}},size:{configurable:!0,get:function(){return this.Nb}},iterator:{configurable:!0,get:function(){if(0>=this.count)return gb;var a=this.Oa;return null!==a?(a.reset(),a):new wb(this)}},iteratorKeys:{configurable:!0,get:function(){return 0>=this.count?gb:new rb(this)}},iteratorValues:{configurable:!0,get:function(){if(0>=this.count)return gb; var a=this.gf;return null!==a?(a.reset(),a):new vb(this)}}});xb.prototype.toKeySet=xb.prototype.Qf;xb.prototype.toArray=xb.prototype.Ea;xb.prototype.clear=xb.prototype.clear;xb.prototype["delete"]=xb.prototype.delete;xb.prototype.remove=xb.prototype.remove;xb.prototype.get=xb.prototype.get;xb.prototype.getValue=xb.prototype.K;xb.prototype.has=xb.prototype.has;xb.prototype.contains=xb.prototype.contains;xb.prototype.first=xb.prototype.first;xb.prototype.addAll=xb.prototype.addAll; xb.prototype.set=xb.prototype.set;xb.prototype.add=xb.prototype.add;xb.prototype.thaw=xb.prototype.ka;xb.prototype.freeze=xb.prototype.freeze;xb.className="Map";function K(a,b){void 0===a?this.J=this.I=0:"number"===typeof a&&"number"===typeof b?(this.I=a,this.J=b):v("Invalid arguments to Point constructor: "+a+", "+b);this.u=!1}var yb,zb,Ab,Bb,Cb;K.prototype.assign=function(a){this.I=a.I;this.J=a.J;return this};K.prototype.h=function(a,b){this.I=a;this.J=b;return this}; K.prototype.zg=function(a,b){G&&(A(a,"number",K,"setTo:x"),A(b,"number",K,"setTo:y"),this.ha());this.I=a;this.J=b;return this};K.prototype.set=function(a){G&&(x(a,K,K,"set:p"),this.ha());this.I=a.I;this.J=a.J;return this};K.prototype.copy=function(){var a=new K;a.I=this.I;a.J=this.J;return a};t=K.prototype;t.ia=function(){this.u=!0;Object.freeze(this);return this};t.L=function(){return this.u||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.u=!0;return this}; t.ka=function(){Object.isFrozen(this)&&v("cannot thaw constant: "+this);this.u=!1;return this};t.ha=function(a){if(G&&this.u){var b="The Point is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);v(b)}};function Db(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));return new K(c,e)}return new K} function Eb(a){G&&x(a,K);return a.x.toString()+" "+a.y.toString()}t.toString=function(){return"Point("+this.x+","+this.y+")"};t.B=function(a){return a instanceof K?this.I===a.x&&this.J===a.y:!1};t.Si=function(a,b){return this.I===a&&this.J===b};t.Ya=function(a){return L.A(this.I,a.x)&&L.A(this.J,a.y)};t.add=function(a){G&&(x(a,K,K,"add:p"),this.ha());this.I+=a.x;this.J+=a.y;return this};t.oe=function(a){G&&(x(a,K,K,"subtract:p"),this.ha());this.I-=a.x;this.J-=a.y;return this}; t.offset=function(a,b){G&&(D(a,K,"offset:dx"),D(b,K,"offset:dy"),this.ha());this.I+=a;this.J+=b;return this};K.prototype.rotate=function(a){G&&(D(a,K,"rotate:angle"),this.ha());if(0===a)return this;var b=this.I,c=this.J;if(0===b&&0===c)return this;360<=a?a-=360:0>a&&(a+=360);if(90===a){a=0;var d=1}else 180===a?(a=-1,d=0):270===a?(a=0,d=-1):(d=a*Math.PI/180,a=Math.cos(d),d=Math.sin(d));this.I=a*b-d*c;this.J=d*b+a*c;return this};t=K.prototype; -t.scale=function(a,b){G&&(D(a,K,"scale:sx"),D(b,K,"scale:sy"),this.ha());this.I*=a;this.J*=b;return this};t.Ff=function(a){G&&x(a,K,K,"distanceSquaredPoint:p");var b=a.x-this.I;a=a.y-this.J;return b*b+a*a};t.td=function(a,b){G&&(D(a,K,"distanceSquared:px"),D(b,K,"distanceSquared:py"));a-=this.I;b-=this.J;return a*a+b*b};t.normalize=function(){G&&this.ha();var a=this.I,b=this.J,c=Math.sqrt(a*a+b*b);0b?270:0;if(0===b)return 0a?c=0>b?c+180:180-c:0>b&&(c=360-c);return c} +t.scale=function(a,b){G&&(D(a,K,"scale:sx"),D(b,K,"scale:sy"),this.ha());this.I*=a;this.J*=b;return this};t.Ff=function(a){G&&x(a,K,K,"distanceSquaredPoint:p");var b=a.x-this.I;a=a.y-this.J;return b*b+a*a};t.ud=function(a,b){G&&(D(a,K,"distanceSquared:px"),D(b,K,"distanceSquared:py"));a-=this.I;b-=this.J;return a*a+b*b};t.normalize=function(){G&&this.ha();var a=this.I,b=this.J,c=Math.sqrt(a*a+b*b);0b?270:0;if(0===b)return 0a?c=0>b?c+180:180-c:0>b&&(c=360-c);return c} t.Mz=function(a,b){G&&(x(a,K,K,"compareWithLineSegmentPoint:p"),x(b,K,K,"compareWithLineSegmentPoint:q"));return L.sm(a.x,a.y,b.x,b.y,this.x,this.y)};t.aB=function(a,b,c,d){G&&(D(a,K,"projectOntoLineSegment:px"),D(b,K,"projectOntoLineSegment:py"),D(c,K,"projectOntoLineSegment:qx"),D(d,K,"projectOntoLineSegment:qy"));L.Ph(a,b,c,d,this.I,this.J,this);return this}; t.bB=function(a,b){G&&(x(a,K,K,"projectOntoLineSegmentPoint:p"),x(b,K,K,"projectOntoLineSegmentPoint:q"));L.Ph(a.x,a.y,b.x,b.y,this.I,this.J,this);return this};t.pB=function(a,b,c,d){G&&(D(a,K,"snapToGrid:originx"),D(b,K,"snapToGrid:originy"),D(c,K,"snapToGrid:cellwidth"),D(d,K,"snapToGrid:cellheight"));L.vq(this.I,this.J,a,b,c,d,this);return this};t.qB=function(a,b){G&&(x(a,K,K,"snapToGridPoint:p"),x(b,Hb,K,"snapToGridPoint:q"));L.vq(this.I,this.J,a.x,a.y,b.width,b.height,this);return this}; t.gj=function(a,b){G&&(x(a,M,K,"setRectSpot:r"),x(b,Ib,K,"setRectSpot:spot"),this.ha());this.I=a.x+b.x*a.width+b.offsetX;this.J=a.y+b.y*a.height+b.offsetY;return this};t.hj=function(a,b,c,d,e){G&&(D(a,K,"setSpot:x"),D(b,K,"setSpot:y"),D(c,K,"setSpot:w"),D(d,K,"setSpot:h"),(0>c||0>d)&&v("Point.setSpot:Width and height cannot be negative"),x(e,Ib,K,"setSpot:spot"),this.ha());this.I=a+e.x*c+e.offsetX;this.J=b+e.y*d+e.offsetY;return this}; @@ -110,8 +110,8 @@ function Nb(a,b,c,d){G&&(D(a,K,"distanceSquared:px"),D(b,K,"distanceSquared:py") t.s=function(){return isFinite(this.x)&&isFinite(this.y)};K.alloc=function(){var a=Qb.pop();return void 0===a?new K:a};K.allocAt=function(a,b){var c=Qb.pop();if(void 0===c)return new K(a,b);c.x=a;c.y=b;return c};K.free=function(a){Qb.push(a)}; oa.Object.defineProperties(K.prototype,{x:{configurable:!0,get:function(){return this.I},set:function(a){G&&(A(a,"number",K,"x"),this.ha(a));this.I=a}},y:{configurable:!0,get:function(){return this.J},set:function(a){G&&(A(a,"number",K,"y"),this.ha(a));this.J=a}}});K.prototype.isReal=K.prototype.s;K.prototype.setSpot=K.prototype.hj;K.prototype.setRectSpot=K.prototype.gj;K.prototype.snapToGridPoint=K.prototype.qB;K.prototype.snapToGrid=K.prototype.pB; K.prototype.projectOntoLineSegmentPoint=K.prototype.bB;K.prototype.projectOntoLineSegment=K.prototype.aB;K.intersectingLineSegments=function(a,b,c,d,e,f,g,h){G&&(D(a,K,"intersectingLineSegments:a1x"),D(b,K,"intersectingLineSegments:a1y"),D(c,K,"intersectingLineSegments:a2x"),D(d,K,"intersectingLineSegments:a2y"),D(e,K,"intersectingLineSegments:b1x"),D(f,K,"intersectingLineSegments:b1y"),D(g,K,"intersectingLineSegments:b2x"),D(h,K,"intersectingLineSegments:b2y"));return L.zm(a,b,c,d,e,f,g,h)}; -K.prototype.compareWithLineSegmentPoint=K.prototype.Mz;K.compareWithLineSegment=function(a,b,c,d,e,f){G&&(D(a,K,"compareWithLineSegment:a1x"),D(b,K,"compareWithLineSegment:a1y"),D(c,K,"compareWithLineSegment:a2x"),D(d,K,"compareWithLineSegment:a2y"),D(e,K,"compareWithLineSegment:b1x"),D(f,K,"compareWithLineSegment:b1y"));return L.sm(a,b,c,d,e,f)};K.prototype.direction=K.prototype.direction;K.prototype.directionPoint=K.prototype.Ua;K.prototype.normalize=K.prototype.normalize; -K.prototype.distanceSquared=K.prototype.td;K.prototype.distanceSquaredPoint=K.prototype.Ff;K.prototype.scale=K.prototype.scale;K.prototype.rotate=K.prototype.rotate;K.prototype.offset=K.prototype.offset;K.prototype.subtract=K.prototype.oe;K.prototype.add=K.prototype.add;K.prototype.equalsApprox=K.prototype.Ya;K.prototype.equalTo=K.prototype.Si;K.prototype.equals=K.prototype.B;K.prototype.set=K.prototype.set;K.prototype.setTo=K.prototype.zg;var Qb=[];K.className="Point";K.parse=Db;K.stringify=Eb; +K.prototype.compareWithLineSegmentPoint=K.prototype.Mz;K.compareWithLineSegment=function(a,b,c,d,e,f){G&&(D(a,K,"compareWithLineSegment:a1x"),D(b,K,"compareWithLineSegment:a1y"),D(c,K,"compareWithLineSegment:a2x"),D(d,K,"compareWithLineSegment:a2y"),D(e,K,"compareWithLineSegment:b1x"),D(f,K,"compareWithLineSegment:b1y"));return L.sm(a,b,c,d,e,f)};K.prototype.direction=K.prototype.direction;K.prototype.directionPoint=K.prototype.Wa;K.prototype.normalize=K.prototype.normalize; +K.prototype.distanceSquared=K.prototype.ud;K.prototype.distanceSquaredPoint=K.prototype.Ff;K.prototype.scale=K.prototype.scale;K.prototype.rotate=K.prototype.rotate;K.prototype.offset=K.prototype.offset;K.prototype.subtract=K.prototype.oe;K.prototype.add=K.prototype.add;K.prototype.equalsApprox=K.prototype.Ya;K.prototype.equalTo=K.prototype.Si;K.prototype.equals=K.prototype.B;K.prototype.set=K.prototype.set;K.prototype.setTo=K.prototype.zg;var Qb=[];K.className="Point";K.parse=Db;K.stringify=Eb; K.distanceLineSegmentSquared=Mb;K.distanceSquared=Nb;K.direction=Ob;K.Origin=yb=(new K(0,0)).ia();K.InfiniteTopLeft=zb=(new K(-Infinity,-Infinity)).ia();K.InfiniteBottomRight=Ab=(new K(Infinity,Infinity)).ia();K.SixPoint=Bb=(new K(6,6)).ia();K.NoPoint=Cb=(new K(NaN,NaN)).ia();K.parse=Db;K.stringify=Eb;K.distanceLineSegmentSquared=Mb;K.distanceSquared=Nb;K.direction=Ob; function Hb(a,b){void 0===a?this.ea=this.fa=0:"number"===typeof a&&(0<=a||isNaN(a))&&"number"===typeof b&&(0<=b||isNaN(b))?(this.fa=a,this.ea=b):v("Invalid arguments to Size constructor: "+a+", "+b);this.u=!1}var Rb,Sb,Tb,Xb,Yb,Zb,$b;Hb.prototype.assign=function(a){this.fa=a.fa;this.ea=a.ea;return this};Hb.prototype.h=function(a,b){this.fa=a;this.ea=b;return this}; Hb.prototype.zg=function(a,b){G&&(A(a,"number",Hb,"setTo:w"),A(b,"number",Hb,"setTo:h"),0>a&&Aa(a,">= 0",Hb,"setTo:w"),0>b&&Aa(b,">= 0",Hb,"setTo:h"),this.ha());this.fa=a;this.ea=b;return this};Hb.prototype.set=function(a){G&&(x(a,Hb,Hb,"set:s"),this.ha());this.fa=a.fa;this.ea=a.ea;return this};Hb.prototype.copy=function(){var a=new Hb;a.fa=this.fa;a.ea=this.ea;return a};t=Hb.prototype;t.ia=function(){this.u=!0;Object.freeze(this);return this}; @@ -122,17 +122,17 @@ oa.Object.defineProperties(Hb.prototype,{width:{configurable:!0,get:function(){r Hb.prototype.equals=Hb.prototype.B;Hb.prototype.set=Hb.prototype.set;Hb.prototype.setTo=Hb.prototype.zg;var cc=[];Hb.className="Size";Hb.parse=ac;Hb.stringify=bc;Hb.ZeroSize=Rb=(new Hb(0,0)).ia();Hb.OneSize=Sb=(new Hb(1,1)).ia();Hb.SixSize=Tb=(new Hb(6,6)).ia();Hb.EightSize=Xb=(new Hb(8,8)).ia();Hb.TenSize=Yb=(new Hb(10,10)).ia();Hb.InfiniteSize=Zb=(new Hb(Infinity,Infinity)).ia();Hb.NoSize=$b=(new Hb(NaN,NaN)).ia();Hb.parse=ac;Hb.stringify=bc; function M(a,b,c,d){void 0===a?this.ea=this.fa=this.J=this.I=0:"number"===typeof a&&"number"===typeof b&&"number"===typeof c&&(0<=c||isNaN(c))&&"number"===typeof d&&(0<=d||isNaN(d))?(this.I=a,this.J=b,this.fa=c,this.ea=d):a instanceof K?(c=a.x,a=a.y,b instanceof K?(d=b.x,b=b.y,this.I=Math.min(c,d),this.J=Math.min(a,b),this.fa=Math.abs(c-d),this.ea=Math.abs(a-b)):b instanceof Hb?(this.I=c,this.J=a,this.fa=b.width,this.ea=b.height):v("Incorrect second argument supplied to Rect constructor "+b)):v("Invalid arguments to Rect constructor: "+ a+", "+b+", "+c+", "+d);this.u=!1}t=M.prototype;t.assign=function(a){this.I=a.I;this.J=a.J;this.fa=a.fa;this.ea=a.ea;return this};t.h=function(a,b,c,d){this.I=a;this.J=b;this.fa=c;this.ea=d;return this};function dc(a,b,c){a.fa=b;a.ea=c}t.zg=function(a,b,c,d){G&&(A(a,"number",M,"setTo:x"),A(b,"number",M,"setTo:y"),A(c,"number",M,"setTo:w"),A(d,"number",M,"setTo:h"),0>c&&Aa(c,">= 0",M,"setTo:w"),0>d&&Aa(d,">= 0",M,"setTo:h"),this.ha());this.I=a;this.J=b;this.fa=c;this.ea=d;return this}; -t.set=function(a){G&&(x(a,M,M,"set:r"),this.ha());this.I=a.I;this.J=a.J;this.fa=a.fa;this.ea=a.ea;return this};t.Sc=function(a){G&&(x(a,K,M,"setPoint:p"),this.ha());this.I=a.x;this.J=a.y;return this};t.oB=function(a){G&&(x(a,Hb,M,"setSize:s"),this.ha());this.fa=a.width;this.ea=a.height;return this};M.prototype.copy=function(){var a=new M;a.I=this.I;a.J=this.J;a.fa=this.fa;a.ea=this.ea;return a};t=M.prototype;t.ia=function(){this.u=!0;Object.freeze(this);return this}; +t.set=function(a){G&&(x(a,M,M,"set:r"),this.ha());this.I=a.I;this.J=a.J;this.fa=a.fa;this.ea=a.ea;return this};t.Tc=function(a){G&&(x(a,K,M,"setPoint:p"),this.ha());this.I=a.x;this.J=a.y;return this};t.oB=function(a){G&&(x(a,Hb,M,"setSize:s"),this.ha());this.fa=a.width;this.ea=a.height;return this};M.prototype.copy=function(){var a=new M;a.I=this.I;a.J=this.J;a.fa=this.fa;a.ea=this.ea;return a};t=M.prototype;t.ia=function(){this.u=!0;Object.freeze(this);return this}; t.L=function(){return this.u||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.u=!0;return this};t.ka=function(){Object.isFrozen(this)&&v("cannot thaw constant: "+this);this.u=!1;return this};t.ha=function(a){if(G&&this.u){var b="The Rect is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);v(b)}}; function ec(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));for(var f=0;""===a[b];)b++;(d=a[b++])&&(f=parseFloat(d));for(var g=0;""===a[b];)b++;(d=a[b++])&&(g=parseFloat(d));return new M(c,e,f,g)}return new M}function fc(a){G&&x(a,M);return a.x.toString()+" "+a.y.toString()+" "+a.width.toString()+" "+a.height.toString()} t.toString=function(){return"Rect("+this.x+","+this.y+","+this.width+","+this.height+")"};t.B=function(a){return a instanceof M?this.I===a.x&&this.J===a.y&&this.fa===a.width&&this.ea===a.height:!1};t.Si=function(a,b,c,d){return this.I===a&&this.J===b&&this.fa===c&&this.ea===d};t.Ya=function(a){return L.A(this.I,a.x)&&L.A(this.J,a.y)&&L.A(this.fa,a.width)&&L.A(this.ea,a.height)};function gc(a,b){return L.da(a.I,b.x)&&L.da(a.J,b.y)&&L.da(a.fa,b.width)&&L.da(a.ea,b.height)} t.ca=function(a){G&&x(a,K,M,"containsPoint:p");return this.I<=a.x&&this.I+this.fa>=a.x&&this.J<=a.y&&this.J+this.ea>=a.y};t.Qe=function(a){G&&x(a,M,M,"containsRect:r");return this.I<=a.x&&a.x+a.width<=this.I+this.fa&&this.J<=a.y&&a.y+a.height<=this.J+this.ea}; t.contains=function(a,b,c,d){G?(D(a,M,"contains:x"),D(b,M,"contains:y"),void 0===c?c=0:D(c,M,"contains:w"),void 0===d?d=0:D(d,M,"contains:h"),(0>c||0>d)&&v("Rect.contains:Width and height cannot be negative")):(void 0===c&&(c=0),void 0===d&&(d=0));return this.I<=a&&a+c<=this.I+this.fa&&this.J<=b&&b+d<=this.J+this.ea};t.offset=function(a,b){G&&(D(a,M,"offset:dx"),D(b,M,"offset:dy"),this.ha());this.I+=a;this.J+=b;return this}; -t.Mc=function(a,b){G&&(D(a,M,"inflate:w"),D(b,M,"inflate:h"));return hc(this,b,a,b,a)};t.jq=function(a){G&&x(a,ic,M,"addMargin:m");return hc(this,a.top,a.right,a.bottom,a.left)};t.qw=function(a){G&&x(a,ic,M,"subtractMargin:m");return hc(this,-a.top,-a.right,-a.bottom,-a.left)};t.EA=function(a,b,c,d){G&&(D(a,M,"grow:t"),D(b,M,"grow:r"),D(c,M,"grow:b"),D(d,M,"grow:l"));return hc(this,a,b,c,d)}; +t.Nc=function(a,b){G&&(D(a,M,"inflate:w"),D(b,M,"inflate:h"));return hc(this,b,a,b,a)};t.jq=function(a){G&&x(a,ic,M,"addMargin:m");return hc(this,a.top,a.right,a.bottom,a.left)};t.qw=function(a){G&&x(a,ic,M,"subtractMargin:m");return hc(this,-a.top,-a.right,-a.bottom,-a.left)};t.EA=function(a,b,c,d){G&&(D(a,M,"grow:t"),D(b,M,"grow:r"),D(c,M,"grow:b"),D(d,M,"grow:l"));return hc(this,a,b,c,d)}; function hc(a,b,c,d,e){G&&a.ha();var f=a.fa;c+e<=-f?(a.I+=f/2,a.fa=0):(a.I-=e,a.fa+=c+e);c=a.ea;b+d<=-c?(a.J+=c/2,a.ea=0):(a.J-=b,a.ea+=b+d);return a}t.yy=function(a){G&&x(a,M,M,"intersectRect:r");return kc(this,a.x,a.y,a.width,a.height)};t.Ov=function(a,b,c,d){G&&(D(a,M,"intersect:x"),D(b,M,"intersect:y"),D(c,M,"intersect:w"),D(d,M,"intersect:h"),(0>c||0>d)&&v("Rect.intersect:Width and height cannot be negative"));return kc(this,a,b,c,d)}; -function kc(a,b,c,d,e){G&&a.ha();var f=Math.max(a.I,b),g=Math.max(a.J,c);b=Math.min(a.I+a.fa,b+d);c=Math.min(a.J+a.ea,c+e);a.I=f;a.J=g;a.fa=Math.max(0,b-f);a.ea=Math.max(0,c-g);return a}t.Oc=function(a){G&&x(a,M,M,"intersectsRect:r");return this.Pv(a.x,a.y,a.width,a.height)}; +function kc(a,b,c,d,e){G&&a.ha();var f=Math.max(a.I,b),g=Math.max(a.J,c);b=Math.min(a.I+a.fa,b+d);c=Math.min(a.J+a.ea,c+e);a.I=f;a.J=g;a.fa=Math.max(0,b-f);a.ea=Math.max(0,c-g);return a}t.Pc=function(a){G&&x(a,M,M,"intersectsRect:r");return this.Pv(a.x,a.y,a.width,a.height)}; t.Pv=function(a,b,c,d){G&&(D(a,M,"intersects:x"),D(b,M,"intersects:y"),D(a,M,"intersects:w"),D(b,M,"intersects:h"),(0>c||0>d)&&v("Rect.intersects:Width and height cannot be negative"));var e=this.fa,f=this.I;if(Infinity!==e&&Infinity!==c&&(e+=f,c+=a,isNaN(c)||isNaN(e)||f>c||a>e))return!1;a=this.ea;c=this.J;return Infinity!==a&&Infinity!==d&&(a+=c,d+=b,isNaN(d)||isNaN(a)||c>d||b>a)?!1:!0}; -function lc(a,b){var c=a.fa,d=a.I,e=b.x-10;if(d>b.width+10+10+e||e>c+d)return!1;c=a.ea;a=a.J;d=b.y-10;return a>b.height+10+10+d||d>c+a?!1:!0}t.Ye=function(a){G&&x(a,K,M,"unionPoint:p");return mc(this,a.x,a.y,0,0)};t.Tc=function(a){G&&x(a,M,M,"unionRect:r");return mc(this,a.I,a.J,a.fa,a.ea)}; +function lc(a,b){var c=a.fa,d=a.I,e=b.x-10;if(d>b.width+10+10+e||e>c+d)return!1;c=a.ea;a=a.J;d=b.y-10;return a>b.height+10+10+d||d>c+a?!1:!0}t.Ye=function(a){G&&x(a,K,M,"unionPoint:p");return mc(this,a.x,a.y,0,0)};t.Uc=function(a){G&&x(a,M,M,"unionRect:r");return mc(this,a.I,a.J,a.fa,a.ea)}; t.uw=function(a,b,c,d){G?(D(a,M,"union:x"),D(b,M,"union:y"),void 0===c?c=0:D(c,M,"union:w"),void 0===d?d=0:D(d,M,"union:h"),(0>c||0>d)&&v("Rect.union:Width and height cannot be negative"),this.ha()):(void 0===c&&(c=0),void 0===d&&(d=0));return mc(this,a,b,c,d)};function mc(a,b,c,d,e){var f=Math.min(a.I,b),g=Math.min(a.J,c);b=Math.max(a.I+a.fa,b+d);c=Math.max(a.J+a.ea,c+e);a.I=f;a.J=g;a.fa=b-f;a.ea=c-g;return a} t.hj=function(a,b,c){G&&(D(a,M,"setSpot:x"),D(b,M,"setSpot:y"),x(c,Ib,M,"setSpot:spot"),this.ha());this.I=a-c.offsetX-c.x*this.fa;this.J=b-c.offsetY-c.y*this.ea;return this}; function nc(a,b,c,d,e,f,g,h){G?(D(a,M,"contains:rx"),D(b,M,"contains:ry"),D(c,M,"contains:rw"),D(d,M,"contains:rh"),D(e,M,"contains:x"),D(f,M,"contains:y"),void 0===g?g=0:D(g,M,"contains:w"),void 0===h?h=0:D(h,M,"contains:h"),(0>c||0>d||0>g||0>h)&&v("Rect.contains:Width and height cannot be negative")):(void 0===g&&(g=0),void 0===h&&(h=0));return a<=e&&e+g<=a+c&&b<=f&&f+h<=b+d} @@ -143,8 +143,8 @@ set:function(a){G&&(A(a,"number",M,"height"),this.ha(a));0>a&&Aa(a,">= 0",M,"hei bottom:{configurable:!0,get:function(){return this.J+this.ea},set:function(a){G&&(D(a,M,"top"),this.ha(a));this.J+=a-(this.J+this.ea)}},position:{configurable:!0,get:function(){return new K(this.I,this.J)},set:function(a){G&&(x(a,K,M,"position"),this.ha(a));this.I=a.x;this.J=a.y}},size:{configurable:!0,get:function(){return new Hb(this.fa,this.ea)},set:function(a){G&&(x(a,Hb,M,"size"),this.ha(a));this.fa=a.width;this.ea=a.height}},center:{configurable:!0, enumerable:!0,get:function(){return new K(this.I+this.fa/2,this.J+this.ea/2)},set:function(a){G&&(x(a,K,M,"center"),this.ha(a));this.I=a.x-this.fa/2;this.J=a.y-this.ea/2}},centerX:{configurable:!0,get:function(){return this.I+this.fa/2},set:function(a){G&&(D(a,M,"centerX"),this.ha(a));this.I=a-this.fa/2}},centerY:{configurable:!0,get:function(){return this.J+this.ea/2},set:function(a){G&&(D(a,M,"centerY"),this.ha(a));this.J=a-this.ea/2}}});M.prototype.isEmpty=M.prototype.KA; M.prototype.isReal=M.prototype.s;M.intersectsLineSegment=function(a,b,c,d,e,f,g,h){G&&(D(a,M,"intersectsLineSegment:x"),D(b,M,"intersectsLineSegment:y"),D(c,M,"intersectsLineSegment:w"),D(d,M,"intersectsLineSegment:h"),D(e,M,"intersectsLineSegment:p1x"),D(f,M,"intersectsLineSegment:p1y"),D(g,M,"intersectsLineSegment:p2x"),D(h,M,"intersectsLineSegment:p2y"),(0>c||0>d)&&v("Rect.intersectsLineSegment: width and height cannot be negative"));return L.zy(a,b,c,d,e,f,g,h)};M.prototype.setSpot=M.prototype.hj; -M.prototype.union=M.prototype.uw;M.prototype.unionRect=M.prototype.Tc;M.prototype.unionPoint=M.prototype.Ye;M.prototype.intersects=M.prototype.Pv;M.prototype.intersectsRect=M.prototype.Oc;M.prototype.intersect=M.prototype.Ov;M.prototype.intersectRect=M.prototype.yy;M.prototype.grow=M.prototype.EA;M.prototype.subtractMargin=M.prototype.qw;M.prototype.addMargin=M.prototype.jq;M.prototype.inflate=M.prototype.Mc;M.prototype.offset=M.prototype.offset;M.prototype.contains=M.prototype.contains; -M.prototype.containsRect=M.prototype.Qe;M.prototype.containsPoint=M.prototype.ca;M.prototype.equalsApprox=M.prototype.Ya;M.prototype.equalTo=M.prototype.Si;M.prototype.equals=M.prototype.B;M.prototype.setSize=M.prototype.oB;M.prototype.setPoint=M.prototype.Sc;M.prototype.set=M.prototype.set;M.prototype.setTo=M.prototype.zg;var qc=null,uc=null,pc=[];M.className="Rect";M.parse=ec;M.stringify=fc;M.contains=nc;M.intersects=oc;M.ZeroRect=qc=(new M(0,0,0,0)).ia();M.NoRect=uc=(new M(NaN,NaN,NaN,NaN)).ia(); +M.prototype.union=M.prototype.uw;M.prototype.unionRect=M.prototype.Uc;M.prototype.unionPoint=M.prototype.Ye;M.prototype.intersects=M.prototype.Pv;M.prototype.intersectsRect=M.prototype.Pc;M.prototype.intersect=M.prototype.Ov;M.prototype.intersectRect=M.prototype.yy;M.prototype.grow=M.prototype.EA;M.prototype.subtractMargin=M.prototype.qw;M.prototype.addMargin=M.prototype.jq;M.prototype.inflate=M.prototype.Nc;M.prototype.offset=M.prototype.offset;M.prototype.contains=M.prototype.contains; +M.prototype.containsRect=M.prototype.Qe;M.prototype.containsPoint=M.prototype.ca;M.prototype.equalsApprox=M.prototype.Ya;M.prototype.equalTo=M.prototype.Si;M.prototype.equals=M.prototype.B;M.prototype.setSize=M.prototype.oB;M.prototype.setPoint=M.prototype.Tc;M.prototype.set=M.prototype.set;M.prototype.setTo=M.prototype.zg;var qc=null,uc=null,pc=[];M.className="Rect";M.parse=ec;M.stringify=fc;M.contains=nc;M.intersects=oc;M.ZeroRect=qc=(new M(0,0,0,0)).ia();M.NoRect=uc=(new M(NaN,NaN,NaN,NaN)).ia(); M.parse=ec;M.stringify=fc;M.contains=nc;M.intersects=oc;function ic(a,b,c,d){void 0===a?this.De=this.se=this.Me=this.Oe=0:void 0===b?this.left=this.bottom=this.right=this.top=a:void 0===c?(this.top=a,this.right=b,this.bottom=a,this.left=b):void 0!==d?(this.top=a,this.right=b,this.bottom=c,this.left=d):v("Invalid arguments to Margin constructor: "+a+", "+b+", "+c+", "+d);this.u=!1}ic.prototype.assign=function(a){this.Oe=a.Oe;this.Me=a.Me;this.se=a.se;this.De=a.De;return this}; ic.prototype.zg=function(a,b,c,d){G&&(A(a,"number",ic,"setTo:t"),A(b,"number",ic,"setTo:r"),A(c,"number",ic,"setTo:b"),A(d,"number",ic,"setTo:l"),this.ha());this.Oe=a;this.Me=b;this.se=c;this.De=d;return this};ic.prototype.set=function(a){G&&(x(a,ic,ic,"assign:m"),this.ha());this.Oe=a.Oe;this.Me=a.Me;this.se=a.se;this.De=a.De;return this};ic.prototype.copy=function(){var a=new ic;a.Oe=this.Oe;a.Me=this.Me;a.se=this.se;a.De=this.De;return a};t=ic.prototype; t.ia=function(){this.u=!0;Object.freeze(this);return this};t.L=function(){return this.u||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.u=!0;return this};t.ka=function(){Object.isFrozen(this)&&v("cannot thaw constant: "+this);this.u=!1;return this};t.ha=function(a){if(G&&this.u){var b="The Margin is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);v(b)}}; @@ -162,10 +162,10 @@ a)return Rc;if("RightSide"===a)return Sc;if("BottomSide"===a)return Tc;if("TopBo var d=a[b++];void 0!==d&&0c,f=0>d;if(al;++l){b=.5*(h+k);if(b===h||b===k)break;var m=a/(b+e),n=g/(b+f);m=m*m+n*n-1;if(0m)k=b;else break}c=e*c/(b+e)-c;d=f*d/(b+f)-d;c=Math.sqrt(c*c+d*d)}else c=Math.abs(d-b);else d=a*a-b*b,f=a*c,fg&&(g+=360),q.startAngle+=g);0>a&&(q.startAngle=180-q.startAngle,q.sweepAngle=-q.sweepAngle); 0>d&&(q.startAngle=-q.startAngle,q.sweepAngle=-q.sweepAngle);q.radiusX*=Math.sqrt(a*a+c*c);void 0!==q.radiusY&&(q.radiusY*=Math.sqrt(b*b+d*d));break;case be:g=q.endX;h=q.endY;q.endX=g*a+h*c+e;q.endY=g*b+h*d+f;if(0===q.radiusX||0===q.radiusY)break;0!==b&&(g=180*Math.atan2(b,a)/Math.PI,0>g&&(g+=360),q.xAxisRotation+=g);0>a&&(q.xAxisRotation=180-q.xAxisRotation,q.isClockwiseArc=!q.isClockwiseArc);0>d&&(q.xAxisRotation=-q.xAxisRotation,q.isClockwiseArc=!q.isClockwiseArc);q.radiusX*=Math.sqrt(a*a+c*c); q.radiusY*=Math.sqrt(b*b+d*d);break;default:v("Unknown Segment type: "+q.type)}}}}this.wa=!0;return this}; -t.ca=function(a,b){void 0===b&&(b=0);var c=this.ed,d=this.fd,e=this.lc,f=this.uc;switch(this.type){case N.j:return L.Rb(c,d,e,f,b,a.x,a.y);case N.F:var g=M.allocAt(Math.min(c,e)-b,Math.min(d,f)-b,Math.abs(e-c)+2*b,Math.abs(f-d)+2*b);a=g.ca(a);M.free(g);return a;case N.P:g=Math.min(c,e)-b;var h=Math.min(d,f)-b;c=(Math.abs(e-c)+2*b)/2;b=(Math.abs(f-d)+2*b)/2;if(0>=c||0>=b)return!1;g=a.x-(g+c);h=a.y-(h+b);return 1>=g*g/(c*c)+h*h/(b*b);case N.o:return ee(this,a,b,!0,!1);default:return!1}}; +t.ca=function(a,b){void 0===b&&(b=0);var c=this.fd,d=this.gd,e=this.lc,f=this.uc;switch(this.type){case N.j:return L.Rb(c,d,e,f,b,a.x,a.y);case N.F:var g=M.allocAt(Math.min(c,e)-b,Math.min(d,f)-b,Math.abs(e-c)+2*b,Math.abs(f-d)+2*b);a=g.ca(a);M.free(g);return a;case N.P:g=Math.min(c,e)-b;var h=Math.min(d,f)-b;c=(Math.abs(e-c)+2*b)/2;b=(Math.abs(f-d)+2*b)/2;if(0>=c||0>=b)return!1;g=a.x-(g+c);h=a.y-(h+b);return 1>=g*g/(c*c)+h*h/(b*b);case N.o:return ee(this,a,b,!0,!1);default:return!1}}; function ee(a,b,c,d,e){var f=b.x;b=b.y;for(var g=a.bounds.x-20,h=0,k,l,m,n,p=a.figures.m,r=p.length,q=0;qa?"M"+this.startX.toString()+" "+this.startY.toString():"M"+this.startX.toFixed(a)+" "+this.startY.toFixed(a);for(var c=this.segments.m,d=c.length,e=0;ea&&(a+=360),this.Le=a,this.Ci=0,G&&D(d,je,"x1"),this.Di=Math.max(d,0),G&&D(e,je,"y1"),this.mh=Math.max(e,0),this.El="boolean"===typeof g?g:"number"===typeof g?!!g:!1,this.$k=!!h):(G&&D(d,je,"x1"),this.Le=d, G&&D(e,je,"y1"),this.Ci=e,G&&D(f,je,"x2"),a===Vd&&(f=Math.max(f,0)),this.Di=f,"number"===typeof g?(a===Vd&&(g=Math.max(g,0)),this.mh=g):this.mh=0,this.$k=this.El=!1);this.Lj=!1;this.wa=!0;this.Ud=null}je.prototype.copy=function(){var a=new je;a.oa=this.oa;a.lc=this.lc;a.uc=this.uc;a.Le=this.Le;a.Ci=this.Ci;a.Di=this.Di;a.mh=this.mh;a.El=this.El;a.$k=this.$k;a.Lj=this.Lj;a.wa=this.wa;return a};t=je.prototype; t.Ya=function(a){if(!(a instanceof je)||this.type!==a.type||this.isClosed!==a.isClosed)return!1;switch(this.type){case Sd:case Hd:return L.A(this.endX,a.endX)&&L.A(this.endY,a.endY);case Td:return L.A(this.endX,a.endX)&&L.A(this.endY,a.endY)&&L.A(this.point1X,a.point1X)&&L.A(this.point1Y,a.point1Y)&&L.A(this.point2X,a.point2X)&&L.A(this.point2Y,a.point2Y);case Ud:return L.A(this.endX,a.endX)&&L.A(this.endY,a.endY)&&L.A(this.point1X,a.point1X)&&L.A(this.point1Y,a.point1Y);case Vd:return L.A(this.startAngle, @@ -269,15 +269,15 @@ a;this.wa=!0}},point2Y:{configurable:!0,get:function(){return this.mh},set:funct get:function(){return this.Di},set:function(a){G&&D(a,je,"radiusX");0>a&&Aa(a,">= zero",je,"radiusX");this.u&&xa(this,a);this.Di=a;this.wa=!0}},radiusY:{configurable:!0,get:function(){return this.mh},set:function(a){G&&D(a,je,"radiusY");0>a&&Aa(a,">= zero",je,"radiusY");this.u&&xa(this,a);this.mh=a;this.wa=!0}},startAngle:{configurable:!0,get:function(){return this.lc},set:function(a){this.lc!==a&&(this.u&&xa(this,a),G&&D(a,je,"startAngle"),a%=360,0>a&&(a+=360),this.lc= a,this.wa=!0)}},sweepAngle:{configurable:!0,get:function(){return this.uc},set:function(a){G&&D(a,je,"sweepAngle");this.u&&xa(this,a);360a&&(a=-360);this.uc=a;this.wa=!0}},isClockwiseArc:{configurable:!0,get:function(){return this.$k},set:function(a){this.u&&xa(this,a);this.$k=a;this.wa=!0}},isLargeArc:{configurable:!0,get:function(){return this.El},set:function(a){this.u&&xa(this,a);this.El=a;this.wa=!0}},xAxisRotation:{configurable:!0, get:function(){return this.Le},set:function(a){G&&D(a,je,"xAxisRotation");a%=360;0>a&&(a+=360);this.u&&xa(this,a);this.Le=a;this.wa=!0}}});je.prototype.equalsApprox=je.prototype.Ya;var Sd=new F(je,"Move",0),Hd=new F(je,"Line",1),Td=new F(je,"Bezier",2),Ud=new F(je,"QuadraticBezier",3),Vd=new F(je,"Arc",4),be=new F(je,"SvgArc",4);je.className="PathSegment";je.Move=Sd;je.Line=Hd;je.Bezier=Td;je.QuadraticBezier=Ud;je.Arc=Vd;je.SvgArc=be; -function le(){this.D=null;this.iv=(new K(0,0)).freeze();this.Ut=(new K(0,0)).freeze();this.er=this.Yr=0;this.fr=1;this.oi="";this.Es=this.vr=!1;this.tr=this.hr=0;this.Eg=this.Hr=this.Nr=!1;this.zr=null;this.Cs=0;this.sd=this.Bs=null}le.prototype.copy=function(){var a=new le;return this.clone(a)}; -le.prototype.clone=function(a){a.D=this.D;a.iv.assign(this.viewPoint);a.Ut.assign(this.documentPoint);a.Yr=this.Yr;a.er=this.er;a.fr=this.fr;a.oi=this.oi;a.vr=this.vr;a.Es=this.Es;a.hr=this.hr;a.tr=this.tr;a.Nr=this.Nr;a.Hr=this.Hr;a.Eg=this.Eg;a.zr=this.zr;a.Cs=this.Cs;a.Bs=this.Bs;a.sd=this.sd;return a}; +function le(){this.D=null;this.iv=(new K(0,0)).freeze();this.Ut=(new K(0,0)).freeze();this.er=this.Yr=0;this.fr=1;this.oi="";this.Es=this.vr=!1;this.tr=this.hr=0;this.Eg=this.Hr=this.Nr=!1;this.zr=null;this.Cs=0;this.td=this.Bs=null}le.prototype.copy=function(){var a=new le;return this.clone(a)}; +le.prototype.clone=function(a){a.D=this.D;a.iv.assign(this.viewPoint);a.Ut.assign(this.documentPoint);a.Yr=this.Yr;a.er=this.er;a.fr=this.fr;a.oi=this.oi;a.vr=this.vr;a.Es=this.Es;a.hr=this.hr;a.tr=this.tr;a.Nr=this.Nr;a.Hr=this.Hr;a.Eg=this.Eg;a.zr=this.zr;a.Cs=this.Cs;a.Bs=this.Bs;a.td=this.td;return a}; le.prototype.toString=function(){var a="^";0!==this.modifiers&&(a+="M:"+this.modifiers);0!==this.button&&(a+="B:"+this.button);""!==this.key&&(a+="K:"+this.key);0!==this.clickCount&&(a+="C:"+this.clickCount);0!==this.delta&&(a+="D:"+this.delta);this.handled&&(a+="h");this.bubbles&&(a+="b");null!==this.documentPoint&&(a+="@"+this.documentPoint.toString());return a};le.prototype.yq=function(a,b){var c=this.diagram;if(null===c)return b;me(c,this.event,a,b);return b}; le.prototype.yA=function(a,b){var c=this.diagram;if(null===c)return b;me(c,this.event,a,b);b.assign(c.xt(b));return b}; oa.Object.defineProperties(le.prototype,{diagram:{configurable:!0,get:function(){return this.D},set:function(a){this.D=a}},viewPoint:{configurable:!0,get:function(){return this.iv},set:function(a){x(a,K,le,"viewPoint");this.iv.assign(a)}},documentPoint:{configurable:!0,get:function(){return this.Ut},set:function(a){x(a,K,le,"documentPoint");this.Ut.assign(a)}},modifiers:{configurable:!0,get:function(){return this.Yr},set:function(a){this.Yr= a}},button:{configurable:!0,get:function(){return this.er},set:function(a){this.er=a;if(null===this.event)switch(a){case 0:this.buttons=1;break;case 1:this.buttons=4;break;case 2:this.buttons=2}}},buttons:{configurable:!0,get:function(){return this.fr},set:function(a){this.fr=a}},key:{configurable:!0,get:function(){return this.oi},set:function(a){this.oi=a}},down:{configurable:!0,get:function(){return this.vr},set:function(a){this.vr=a}},up:{configurable:!0, enumerable:!0,get:function(){return this.Es},set:function(a){this.Es=a}},clickCount:{configurable:!0,get:function(){return this.hr},set:function(a){this.hr=a}},delta:{configurable:!0,get:function(){return this.tr},set:function(a){this.tr=a}},isMultiTouch:{configurable:!0,get:function(){return this.Nr},set:function(a){this.Nr=a}},handled:{configurable:!0,get:function(){return this.Hr},set:function(a){this.Hr=a}},bubbles:{configurable:!0, get:function(){return this.Eg},set:function(a){this.Eg=a}},event:{configurable:!0,get:function(){return this.zr},set:function(a){this.zr=a}},isTouchEvent:{configurable:!0,get:function(){var a=sa.TouchEvent,b=this.event;return a&&b instanceof a?!0:(a=sa.PointerEvent)&&b instanceof a&&("touch"===b.pointerType||"pen"===b.pointerType)}},timestamp:{configurable:!0,get:function(){return this.Cs},set:function(a){this.Cs=a}},targetDiagram:{configurable:!0, -get:function(){return this.Bs},set:function(a){this.Bs=a}},targetObject:{configurable:!0,get:function(){return this.sd},set:function(a){this.sd=a}},control:{configurable:!0,get:function(){return 0!==(this.modifiers&1)},set:function(a){this.modifiers=a?this.modifiers|1:this.modifiers&-2}},shift:{configurable:!0,get:function(){return 0!==(this.modifiers&4)},set:function(a){this.modifiers=a?this.modifiers|4:this.modifiers&-5}},alt:{configurable:!0, +get:function(){return this.Bs},set:function(a){this.Bs=a}},targetObject:{configurable:!0,get:function(){return this.td},set:function(a){this.td=a}},control:{configurable:!0,get:function(){return 0!==(this.modifiers&1)},set:function(a){this.modifiers=a?this.modifiers|1:this.modifiers&-2}},shift:{configurable:!0,get:function(){return 0!==(this.modifiers&4)},set:function(a){this.modifiers=a?this.modifiers|4:this.modifiers&-5}},alt:{configurable:!0, get:function(){return 0!==(this.modifiers&2)},set:function(a){this.modifiers=a?this.modifiers|2:this.modifiers&-3}},meta:{configurable:!0,get:function(){return 0!==(this.modifiers&8)},set:function(a){this.modifiers=a?this.modifiers|8:this.modifiers&-9}},left:{configurable:!0,get:function(){var a=this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons&1):0===this.button},set:function(a){this.buttons= a?this.buttons|1:this.buttons&-2}},right:{configurable:!0,get:function(){var a=this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons&2):2===this.button},set:function(a){this.buttons=a?this.buttons|2:this.buttons&-3}},middle:{configurable:!0,get:function(){var a=this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons& 4):1===this.button},set:function(a){this.buttons=a?this.buttons|4:this.buttons&-5}}});le.prototype.getMultiTouchDocumentPoint=le.prototype.yA;le.prototype.getMultiTouchViewPoint=le.prototype.yq;le.className="InputEvent";function ne(){this.D=null;this.ta="";this.gs=this.xs=null}ne.prototype.copy=function(){var a=new ne;a.D=this.D;a.ta=this.ta;a.xs=this.xs;a.gs=this.gs;return a}; @@ -294,9 +294,9 @@ a}},oldParam:{configurable:!0,get:function(){return this.ep},set:function(a){thi oe.prototype.getValue=oe.prototype.K;oe.prototype.clear=oe.prototype.clear;var qe=new F(oe,"Transaction",-1),pe=new F(oe,"Property",0),re=new F(oe,"Insert",1),se=new F(oe,"Remove",2);oe.className="ChangedEvent";oe.Transaction=qe;oe.Property=pe;oe.Insert=re;oe.Remove=se;function te(){this.o=(new H).freeze();this.ta="";this.j=!1} te.prototype.toString=function(a){var b="Transaction: "+this.name+" "+this.changes.count.toString()+(this.isComplete?"":", incomplete");if(void 0!==a&&0b&&a.Rc(b,d),b++);for(;a.length>b;)a.pop();a.freeze()}}; +te.prototype.lt=function(){if(this.isComplete){var a=this.changes;a.ka();for(var b=new xb,c=0;cb&&a.Sc(b,d),b++);for(;a.length>b;)a.pop();a.freeze()}}; oa.Object.defineProperties(te.prototype,{changes:{configurable:!0,get:function(){return this.o}},name:{configurable:!0,get:function(){return this.ta},set:function(a){this.ta=a}},isComplete:{configurable:!0,get:function(){return this.j},set:function(a){this.j=a}}});te.prototype.optimize=te.prototype.lt;te.prototype.redo=te.prototype.redo;te.prototype.canRedo=te.prototype.canRedo;te.prototype.undo=te.prototype.undo;te.prototype.canUndo=te.prototype.canUndo; -te.prototype.clear=te.prototype.clear;te.className="Transaction";function ue(){this.Au=new I;this.zd=!1;this.F=(new H).freeze();this.ze=-1;this.o=999;this.Be=!1;this.qr=null;this.Ki=0;this.j=!1;G&&(this.j=!0);this.He=(new H).freeze();this.Nl=new H;this.bu=!0;this.lu=this.Lr=this.ou=this.nu=!1} +te.prototype.clear=te.prototype.clear;te.className="Transaction";function ue(){this.Au=new I;this.Ad=!1;this.F=(new H).freeze();this.ze=-1;this.o=999;this.Be=!1;this.qr=null;this.Ki=0;this.j=!1;G&&(this.j=!0);this.He=(new H).freeze();this.Nl=new H;this.bu=!0;this.lu=this.Lr=this.ou=this.nu=!1} ue.prototype.toString=function(a){var b="UndoManager "+this.historyIndex+"<"+this.history.count+"<="+this.maxHistoryLength;b+="[";for(var c=this.nestedTransactionNames.count,d=0;d=this.transactionLevel&&!this.bu&&(a=a.diagram,null!==a&&!1===a.bj||Fa("Change not within a transaction: "+c.toString()))}}; ue.prototype.skipsEvent=function(a){if(null===a||0>a.change.value)return!0;a=a.object;if(null===a)return!1;if(void 0!==a.layer){if(a=a.layer,null!==a&&a.isTemporary)return!0}else if(a.isTemporary)return!0;return!1}; -oa.Object.defineProperties(ue.prototype,{models:{configurable:!0,get:function(){return this.Au.iterator}},isEnabled:{configurable:!0,get:function(){return this.zd},set:function(a){this.zd=a}},transactionToUndo:{configurable:!0,get:function(){return 0<=this.historyIndex&&this.historyIndex<=this.history.count-1?this.history.M(this.historyIndex):null}},transactionToRedo:{configurable:!0,get:function(){return this.historyIndexe&&(e=-3),0g&&(g=-3);if(void 0===h||void (e*=a.scrollHorizontalLineChange/16,0e||Math.abs(b.y-a.y)>d}; -oa.Object.defineProperties(we.prototype,{diagram:{configurable:!0,get:function(){return this.D},set:function(a){a instanceof Q&&(this.D=a)}},name:{configurable:!0,get:function(){return this.ta},set:function(a){A(a,"string",we,"name");this.ta=a}},isEnabled:{configurable:!0,get:function(){return this.zd},set:function(a){A(a,"boolean",we,"isEnabled");this.zd=a}},isActive:{configurable:!0,get:function(){return this.Uc},set:function(a){A(a,"boolean", -we,"isActive");this.Uc=a}},transactionResult:{configurable:!0,get:function(){return this.Hw},set:function(a){null!==a&&A(a,"string",we,"transactionResult");this.Hw=a}}});we.prototype.startTransaction=we.prototype.Da;we.className="Tool";function Ua(){we.call(this);this.name="ToolManager";this.Ec=new H;this.Vc=new H;this.Qd=new H;this.P=this.La=850;this.o=(new Hb(2,2)).ia();this.bb=5E3;this.Ma=Ie;this.F=Ke;this.pr=this.j=null;this.hk=-1}na(Ua,we);Ua.prototype.initializeStandardTools=function(){}; +oa.Object.defineProperties(we.prototype,{diagram:{configurable:!0,get:function(){return this.D},set:function(a){a instanceof Q&&(this.D=a)}},name:{configurable:!0,get:function(){return this.ta},set:function(a){A(a,"string",we,"name");this.ta=a}},isEnabled:{configurable:!0,get:function(){return this.Ad},set:function(a){A(a,"boolean",we,"isEnabled");this.Ad=a}},isActive:{configurable:!0,get:function(){return this.Vc},set:function(a){A(a,"boolean", +we,"isActive");this.Vc=a}},transactionResult:{configurable:!0,get:function(){return this.Hw},set:function(a){null!==a&&A(a,"string",we,"transactionResult");this.Hw=a}}});we.prototype.startTransaction=we.prototype.Da;we.className="Tool";function Ua(){we.call(this);this.name="ToolManager";this.Ec=new H;this.Wc=new H;this.Qd=new H;this.P=this.La=850;this.o=(new Hb(2,2)).ia();this.bb=5E3;this.Ma=Ie;this.F=Ke;this.pr=this.j=null;this.hk=-1}na(Ua,we);Ua.prototype.initializeStandardTools=function(){}; Ua.prototype.updateAdornments=function(a){var b=this.currentToolTip;if(b instanceof Je&&this.pr===a){var c=b.adornedObject;(null!==a?c.part===a:null===c)?this.showToolTip(b,c):this.hideToolTip()}}; Ua.prototype.doMouseDown=function(){var a=this.diagram,b=a.lastInput;b.isTouchEvent&&this.gestureBehavior===Le&&(b.bubbles=!1);if(b.isMultiTouch){this.cancelWaitAfter();if(this.gestureBehavior===Me){b.bubbles=!0;return}if(this.gestureBehavior===Le)return;if(a.currentTool.canStartMultiTouch()){a.currentTool.standardPinchZoomStart();return}}var c=a.undoManager;G&&c.checksTransactionLevel&&0!==c.transactionLevel&&Fa("WARNING: In ToolManager.doMouseDown: UndoManager.transactionLevel is not zero");c=this.mouseDownTools.length; for(var d=0;dg&&(g=l),m>h&&(h=m))}}Infinity===d?f.h(0,0,0,0):f.h(d,e,g-d,h-e);d=f.x+f.width/2;e=f.y+f.height/2;M.free(f); -f=a.vs;g=new xb;h=K.alloc();for(k=b.iterator;k.next();)l=k.value,l instanceof R&&l.canCopy()&&(m=c.K(l),null!==m&&(m.points=l.points,lf(m,f.x-d,f.y-e),m.suspendsRouting=!0,g.add(m,a.Ed())));for(b=b.iterator;b.next();)l=b.value,l.Pc()&&l.canCopy()&&(k=c.K(l),null!==k&&(l=l.location,h.h(f.x-(d-l.x),f.y-(e-l.y)),k.location=h,k.Xa(),g.add(k,a.Ed(h))));K.free(h);a.copiedParts=g;We(a,g.Qf());null!==a.draggedLink&&(c=a.draggedLink,b=c.routeBounds,lf(c,a.startPoint.x-(b.x+b.width/2),a.startPoint.y-(b.y+b.height/ +f=a.vs;g=new xb;h=K.alloc();for(k=b.iterator;k.next();)l=k.value,l instanceof R&&l.canCopy()&&(m=c.K(l),null!==m&&(m.points=l.points,lf(m,f.x-d,f.y-e),m.suspendsRouting=!0,g.add(m,a.Fd())));for(b=b.iterator;b.next();)l=b.value,l.Qc()&&l.canCopy()&&(k=c.K(l),null!==k&&(l=l.location,h.h(f.x-(d-l.x),f.y-(e-l.y)),k.location=h,k.Xa(),g.add(k,a.Fd(h))));K.free(h);a.copiedParts=g;We(a,g.Qf());null!==a.draggedLink&&(c=a.draggedLink,b=c.routeBounds,lf(c,a.startPoint.x-(b.x+b.width/2),a.startPoint.y-(b.y+b.height/ 2)));a.doUpdateCursor(null,!0)}}}Qe.prototype.doSimulatedDragOut=function(){var a=this.diagram;a.ut=!1;this.mayCopy()||this.mayMove()?a.currentCursor="":a.currentCursor=this.nodropCursor;this.Co=null};Qe.prototype.computeMove=function(a,b,c,d){c=this.diagram;return null!==c?c.computeMove(a,b,this.dragOptions,d):new K}; -oa.Object.defineProperties(Qe.prototype,{isCopyEnabled:{configurable:!0,get:function(){return this.Vc},set:function(a){A(a,"boolean",Qe,"isCopyEnabled");this.Vc=a}},copiesEffectiveCollection:{configurable:!0,get:function(){return this.F},set:function(a){A(a,"boolean",Qe,"copiesEffectiveCollection");this.F=a}},dragOptions:{configurable:!0,get:function(){return this.Ma},set:function(a){x(a,Re,Qe,"dragOptions");this.Ma=a}},isGridSnapEnabled:{configurable:!0, +oa.Object.defineProperties(Qe.prototype,{isCopyEnabled:{configurable:!0,get:function(){return this.Wc},set:function(a){A(a,"boolean",Qe,"isCopyEnabled");this.Wc=a}},copiesEffectiveCollection:{configurable:!0,get:function(){return this.F},set:function(a){A(a,"boolean",Qe,"copiesEffectiveCollection");this.F=a}},dragOptions:{configurable:!0,get:function(){return this.Ma},set:function(a){x(a,Re,Qe,"dragOptions");this.Ma=a}},isGridSnapEnabled:{configurable:!0, enumerable:!0,get:function(){return this.dragOptions.isGridSnapEnabled},set:function(a){A(a,"boolean",Qe,"isGridSnapEnabled");this.dragOptions.isGridSnapEnabled=a}},isComplexRoutingRealtime:{configurable:!0,get:function(){return this.Ec},set:function(a){A(a,"boolean",Qe,"isComplexRoutingRealtime");this.Ec=a}},isGridSnapRealtime:{configurable:!0,get:function(){return this.dragOptions.isGridSnapRealtime},set:function(a){A(a,"boolean",Qe,"isGridSnapRealtime");this.dragOptions.isGridSnapRealtime= a}},gridSnapCellSize:{configurable:!0,get:function(){return this.dragOptions.gridSnapCellSize},set:function(a){x(a,Hb,Qe,"gridSnapCellSize");this.dragOptions.gridSnapCellSize.B(a)||(a=a.L(),this.dragOptions.gridSnapCellSize=a)}},gridSnapCellSpot:{configurable:!0,get:function(){return this.dragOptions.gridSnapCellSpot},set:function(a){x(a,Ib,Qe,"gridSnapCellSpot");this.dragOptions.gridSnapCellSpot.B(a)||(a=a.L(),this.dragOptions.gridSnapCellSpot=a)}},gridSnapOrigin:{configurable:!0, enumerable:!0,get:function(){return this.dragOptions.gridSnapOrigin},set:function(a){x(a,K,Qe,"gridSnapOrigin");this.dragOptions.gridSnapOrigin.B(a)||(a=a.L(),this.dragOptions.gridSnapOrigin=a)}},dragsLink:{configurable:!0,get:function(){return this.dragOptions.dragsLink},set:function(a){A(a,"boolean",Qe,"dragsLink");this.dragOptions.dragsLink=a}},dragsTree:{configurable:!0,get:function(){return this.dragOptions.dragsTree},set:function(a){A(a,"boolean",Qe,"dragsTree"); @@ -401,7 +401,7 @@ get:function(){return this.o},set:function(a){this.o=a}},draggedParts:{configura isDragOutStarted:{configurable:!0,get:function(){return this.Qd},set:function(a){this.Qd=a}},startPoint:{configurable:!0,get:function(){return this.vs},set:function(a){x(a,K,Qe,"startPoint");this.vs.B(a)||this.vs.assign(a)}},delay:{configurable:!0,get:function(){return this.ll},set:function(a){A(a,"number",Qe,"delay");this.ll=a}}});Qe.prototype.getDraggingSource=Qe.prototype.xA;var Te=null,Ze=null;Qe.className="DraggingTool";Se=new H; Ta("draggingTool",function(){return this.findTool("Dragging")},function(a){this.gb("Dragging",a,this.mouseMoveTools)});Ua.prototype.doCancel=function(){null!==Te&&Te.doCancel();we.prototype.doCancel.call(this)}; function Gf(){0b.firstPickIndex+1&&c=n&&(n=1);0>=p&&(p=1);n=p/n}p=K.alloc();L.vq(a.x,a.y,h,k,e.width,e.height,p);a=g.copy();0>=b.x?0>=b.y?(a.x=Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=Math.max(l-a.x,c.width),a.y=Math.max(p.y,m-d.height),a.y=Math.min(a.y,m-c.height),a.height=Math.max(m-a.y,c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n* a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width),a.x=l-a.width,a.y=m-a.height)):1<=b.y?(a.x=Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=Math.max(l-a.x,c.width),a.height=Math.max(Math.min(p.y-k,d.height),c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width),a.x=l-a.width)):(a.x= Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=l-a.x,f||(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n,a.y=k+.5*(m-k-a.height))):1<=b.x?0>=b.y?(a.width=Math.max(Math.min(p.x-h,d.width),c.width),a.y=Math.max(p.y,m-d.height),a.y=Math.min(a.y,m-c.height),a.height=Math.max(m-a.y,c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width), @@ -501,9 +501,9 @@ wg.prototype.doActivate=function(){var a=this.diagram;if(null===this.adornedObje wg.prototype.computeRotationPoint=function(a){var b=a.part,c=b.locationObject;return b.rotationSpot.fb()?a.ja(b.rotationSpot):a===b||a===c?c.ja(b.locationSpot):a.ja(Kc)}; wg.prototype.computeAdornmentLocation=function(a){var b=this.rotationPoint;b.s()||(b=this.computeRotationPoint(a));b=a.Us(b);var c=this.handleAngle;0>c?c+=360:360<=c&&(c-=360);c=Math.round(45*Math.round(c/45));var d=this.handleDistance;0===c?b.x=a.naturalBounds.width+d:45===c?(b.x=a.naturalBounds.width+d,b.y=a.naturalBounds.height+d):90===c?b.y=a.naturalBounds.height+d:135===c?(b.x=-d,b.y=a.naturalBounds.height+d):180===c?b.x=-d:225===c?(b.x=-d,b.y=-d):270===c?b.y=-d:315===c&&(b.x=a.naturalBounds.width+ d,b.y=-d);return a.ja(b)};wg.prototype.doDeactivate=function(){var a=this.diagram;this.stopTransaction();this.re=this.handle=null;this.ls=new K(NaN,NaN);this.isActive=a.isMouseCaptured=!1};wg.prototype.doCancel=function(){this.diagram.delaysLayout=!1;this.rotate(this.originalAngle);this.stopTool()};wg.prototype.doMouseMove=function(){var a=this.diagram;this.isActive&&(a=this.computeRotate(a.lastInput.documentPoint),this.rotate(a))}; -wg.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){a.delaysLayout=!1;var b=this.computeRotate(a.lastInput.documentPoint);this.rotate(b);a.Va();this.transactionResult=this.name;a.V("PartRotated",this.adornedObject,this.originalAngle)}this.stopTool()}; -wg.prototype.rotate=function(a){G&&D(a,wg,"rotate:newangle");var b=this.adornedObject;if(null!==b){b.angle=a;b=b.part;b.Xa();var c=b.locationObject,d=b.rotateObject;if(c===d||c.yg(d))c=this.gp.copy(),b.location=c.oe(this.rotationPoint).rotate(a-this.originalAngle).add(this.rotationPoint);this.diagram.ld()}}; -wg.prototype.computeRotate=function(a){a=this.rotationPoint.Ua(a)-this.handleAngle;var b=this.adornedObject.panel;null!==b&&(a-=b.Xi());360<=a?a-=360:0>a&&(a+=360);b=Math.min(Math.abs(this.snapAngleMultiple),180);var c=Math.min(Math.abs(this.snapAngleEpsilon),b/2);!this.diagram.lastInput.shift&&0b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a}; +wg.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){a.delaysLayout=!1;var b=this.computeRotate(a.lastInput.documentPoint);this.rotate(b);a.Ua();this.transactionResult=this.name;a.V("PartRotated",this.adornedObject,this.originalAngle)}this.stopTool()}; +wg.prototype.rotate=function(a){G&&D(a,wg,"rotate:newangle");var b=this.adornedObject;if(null!==b){b.angle=a;b=b.part;b.Xa();var c=b.locationObject,d=b.rotateObject;if(c===d||c.yg(d))c=this.gp.copy(),b.location=c.oe(this.rotationPoint).rotate(a-this.originalAngle).add(this.rotationPoint);this.diagram.md()}}; +wg.prototype.computeRotate=function(a){a=this.rotationPoint.Wa(a)-this.handleAngle;var b=this.adornedObject.panel;null!==b&&(a-=b.Xi());360<=a?a-=360:0>a&&(a+=360);b=Math.min(Math.abs(this.snapAngleMultiple),180);var c=Math.min(Math.abs(this.snapAngleEpsilon),b/2);!this.diagram.lastInput.shift&&0b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a}; oa.Object.defineProperties(wg.prototype,{handleArchetype:{configurable:!0,get:function(){return this.o},set:function(a){null!==a&&x(a,O,wg,"handleArchetype");this.o=a}},handle:{configurable:!0,get:function(){return this.j},set:function(a){if(null!==a&&(x(a,O,wg,"handle"),!(a.part instanceof Je)))throw Error("new handle is not in an Adornment: "+a);this.j=a}},adornedObject:{configurable:!0,get:function(){return this.re},set:function(a){if(null!==a&&(x(a,O, wg,"handle"),a.part instanceof Je))throw Error("new handle must not be in an Adornment: "+a);this.re=a}},snapAngleMultiple:{configurable:!0,get:function(){return this.Ma},set:function(a){A(a,"number",wg,"snapAngleMultiple");this.Ma=a}},snapAngleEpsilon:{configurable:!0,get:function(){return this.La},set:function(a){A(a,"number",wg,"snapAngleEpsilon");this.La=a}},originalAngle:{configurable:!0,get:function(){return this.ux}},rotationPoint:{configurable:!0, enumerable:!0,get:function(){return this.ls},set:function(a){this.ls=a.copy()}},handleAngle:{configurable:!0,get:function(){return this.F},set:function(a){A(a,"number",wg,"handleAngle");this.F=a}},handleDistance:{configurable:!0,get:function(){return this.P},set:function(a){A(a,"number",wg,"handleDistance");this.P=a}}});wg.className="RotatingTool";Ta("rotatingTool",function(){return this.findTool("Rotating")},function(a){this.gb("Rotating",a,this.mouseDownTools)}); @@ -513,7 +513,7 @@ Gg.prototype.doMouseMove=function(){if(this.isActive){var a=this.diagram.lastInp Gg.prototype.doCancel=function(){var a=this.diagram.lastInput,b=this.Qk;null!==b&&(a.targetObject=b,null!==b.actionCancel&&b.actionCancel(a,b),this.stopTool())};Gg.prototype.doStop=function(){this.Qk=null};Gg.className="ActionTool";function Hg(){we.call(this);0a&&Aa(a,">= 1",oh,"duration");this.Rg=a}},isAnimating:{configurable:!0, +oa.Object.defineProperties(oh.prototype,{animationReasons:{configurable:!0,get:function(){return this.Sd}},isEnabled:{configurable:!0,get:function(){return this.Ad},set:function(a){A(a,"boolean",oh,"isEnabled");(this.Ad=a)&&this.mj.each(function(a){a.isAnimating||Infinity!==a.runCount||a.start()})}},duration:{configurable:!0,get:function(){return this.Rg},set:function(a){A(a,"number",oh,"duration");1>a&&Aa(a,">= 1",oh,"duration");this.Rg=a}},isAnimating:{configurable:!0, enumerable:!0,get:function(){return this.nc}},isTicking:{configurable:!0,get:function(){return this.Qr}},isInitial:{configurable:!0,get:function(){return this.ki},set:function(a){A(a,"boolean",oh,"isInitial");this.ki=a}},defaultAnimation:{configurable:!0,get:function(){return this.Vd}},activeAnimations:{configurable:!0,get:function(){return this.mj}},initialAnimationStyle:{configurable:!0,get:function(){return this.ul},set:function(a){G&& cb(a,oh,oh,"initialAnimationStyle");this.ul=a}}});oh.prototype.stopAnimation=oh.prototype.tc;var Yh=null,ph=!1,rh=new F(oh,"Default",1),xh=new F(oh,"AnimateLocations",2),wh=new F(oh,"None",3);oh.className="AnimationManager";oh.defineAnimationEffect=function(a,b){ph||(qh(),ph=!0);Yh.add(a,b)};oh.Default=rh;oh.AnimateLocations=xh;oh.None=wh; -function sh(a){this.gv=this.Gx=this.Rd=this.D=null;this.Bl=this.nc=this.j=!1;this.Vn=this.Fd=0;this.nr=this.Xt=Zh;this.Al=this.wp=!1;this.Ou=1;this.Mu=0;this.yd=this.Rg=NaN;this.Vw=0;this.Wn=null;this.o=yb;this.pc=new xb;this.Eu=new xb;this.lm=new I;this.Fu=new I;this.Sw=$h;a&&Object.assign(this,a)}sh.prototype.suspend=function(){this.Bl=!0};sh.prototype.advanceTo=function(a,b){b&&(this.Bl=!1);this.wp&&a>=this.yd&&(this.Al=!0,a-=this.yd);this.Vw=a;Sh(this,!0);Bh(this.Rd);Ef(this.D);Dh(this.Rd);this.D.redraw()}; -function yh(a,b){a.Eu.clear();a.Al=!1;a.Mu=0;a.yd=NaN;0=this.zd&&(this.Al=!0,a-=this.zd);this.Vw=a;Sh(this,!0);Bh(this.Rd);Ef(this.D);Dh(this.Rd);this.D.redraw()}; +function yh(a,b){a.Eu.clear();a.Al=!1;a.Mu=0;a.zd=NaN;0a.Vn?a.yd:d-a.Fd;b&&(e=a.Vw,ea.Vn&&(a.wp&&!a.Al?(a.Fd=+new Date,a.Vn=a.Fd+a.yd,a.Al=!0):a.um(!1))}}} -function Ch(a,b){for(var c=a.yd,d=a.pc.iterator,e=a.Al;d.next();){var f=d.key;if(!(f instanceof O&&null===f.diagram)){var g=d.value,h=e?g.end:g.start;g=e?g.start:g.end;var k=Yh,l;for(l in g)"position"===l&&(g["position:placeholder"]||g["position:nodeCollapse"])||null===k.get(l)||k.get(l)(f,h[l],g[l],a.nr,b,c,a)}}}t.stop=function(){if(!this.nc)return this;this.um(!0);return this}; +function Sh(a,b){if(!a.Bl||b){var c=a.Rd;if(!1!==a.nc){var d=+new Date,e=d>a.Vn?a.zd:d-a.Gd;b&&(e=a.Vw,ea.Vn&&(a.wp&&!a.Al?(a.Gd=+new Date,a.Vn=a.Gd+a.zd,a.Al=!0):a.um(!1))}}} +function Ch(a,b){for(var c=a.zd,d=a.pc.iterator,e=a.Al;d.next();){var f=d.key;if(!(f instanceof O&&null===f.diagram)){var g=d.value,h=e?g.end:g.start;g=e?g.start:g.end;var k=Yh,l;for(l in g)"position"===l&&(g["position:placeholder"]||g["position:nodeCollapse"])||null===k.get(l)||k.get(l)(f,h[l],g[l],a.nr,b,c,a)}}}t.stop=function(){if(!this.nc)return this;this.um(!0);return this}; t.um=function(a){null!==this.gv&&this.gv.Dp.remove(this.Gx);if(this.nc){var b=this.D,c=this.Rd;this.Bl=this.nc=c.tl=!1;Bh(c);for(var d=this.pc,e=this.lm.iterator;e.next();)b.remove(e.value);for(e=this.Fu.iterator;e.next();)e.value.v();e=this.wp;d=d.iterator;for(var f=Yh;d.next();){var g=d.key,h=d.value,k=e?h.end:h.start,l=e?h.start:h.end,m=h.Cv,n;for(n in l)if(null!==f.get(n)){var p=n;!h.uv||"position:nodeCollapse"!==p&&"position:placeholder"!==p||(p="position");f.get(p)(g,k[n],void 0!==m[n]?m[n]: -h.uv?k[n]:l[n],this.nr,this.yd,this.yd,this)}h.uv&&void 0!==m.location&&g instanceof U&&(g.location=m.location);h.cw&&g instanceof U&&g.Sb(!1)}b.ft.clear();ff(b,!1);b.Va();b.R();Ef(b,!0);if(c.defaultAnimation===this){for(n=c.Vl.iterator;n.next();)e=n.value,null!==e.qf&&(e.points=e.qf,e.qf=null);c.Vl.clear()}this.isViewportUnconstrained&&(b.scrollMode=this.Sw);Dh(c);this.Mu++;!a&&this.Ou>this.Mu?(this.Al=!1,this.start()):(this.Wn&&this.Wn(this),yh(this,null),c.um(this),b.Lb())}}; +h.uv?k[n]:l[n],this.nr,this.zd,this.zd,this)}h.uv&&void 0!==m.location&&g instanceof U&&(g.location=m.location);h.cw&&g instanceof U&&g.Sb(!1)}b.ft.clear();ff(b,!1);b.Ua();b.R();Ef(b,!0);if(c.defaultAnimation===this){for(n=c.Vl.iterator;n.next();)e=n.value,null!==e.qf&&(e.points=e.qf,e.qf=null);c.Vl.clear()}this.isViewportUnconstrained&&(b.scrollMode=this.Sw);Dh(c);this.Mu++;!a&&this.Ou>this.Mu?(this.Al=!1,this.start()):(this.Wn&&this.Wn(this),yh(this,null),c.um(this),b.Lb())}}; t.kk=function(a,b){var c=b.actualBounds,d=null;b instanceof vf&&(d=b.placeholder);null!==d?(c=d.ja(Ec),d=d.padding,c.x+=d.left,c.y+=d.top,this.add(a,"position",c,a.position,!1)):this.add(a,"position",new K(c.x+c.width/2,c.y+c.height/2),a.position,!1);this.add(a,"scale",.01,a.scale,!1);if(a instanceof vf)for(a=a.memberParts;a.next();)d=a.value,d instanceof V&&this.kk(d,b)}; t.ik=function(a,b){if(a.isVisible()){var c=null;b instanceof vf&&(c=b.placeholder);null!==c?this.add(a,"position:placeholder",a.position,c,!0):this.add(a,"position:nodeCollapse",a.position,b,!0);this.add(a,"scale",a.scale,.01,!0);c=this.pc;c.contains(a)&&(c.K(a).cw=!0);if(a instanceof vf)for(a=a.memberParts;a.next();)c=a.value,c instanceof V&&this.ik(c,b)}};t.BA=function(a){var b=this.Eu.get(a);null===b&&(b={},this.Eu.add(a,b));return b}; oa.Object.defineProperties(sh.prototype,{duration:{configurable:!0,get:function(){return this.Rg},set:function(a){A(a,"number",sh,"duration");1>a&&Aa(a,">= 1",sh,"duration");this.Rg=a}},reversible:{configurable:!0,get:function(){return this.wp},set:function(a){this.wp=a}},runCount:{configurable:!0,get:function(){return this.Ou},set:function(a){0a?c/2*a*a+b:-c/2*(--a*(a-2)-1)+b}function ai(a,b,c,d){return a===d?b+c:c*(-Math.pow(2,-10*a/d)+1)+b}sh.className="Animation";sh.EaseLinear=function(a,b,c,d){return c*a/d+b};sh.EaseInOutQuad=Zh;sh.EaseInQuad=function(a,b,c,d){return c*(a/=d)*a+b};sh.EaseOutQuad=function(a,b,c,d){return-c*(a/=d)*(a-2)+b};sh.EaseInExpo=function(a,b,c,d){return 0===a?b:c*Math.pow(2,10*(a/d-1))+b};sh.EaseOutExpo=ai; -function gi(a,b,c){this.start=a;this.end=b;this.Cv={};this.uv=c;this.cw=!1}gi.className="AnimationState";function hi(a,b,c){this.sd=null;this.pf=a;this.Tp=c||ii;this.Vk=null;void 0!==b&&(this.Vk=b,void 0===c&&(this.Tp=ji))}hi.prototype.copy=function(){var a=new hi(this.pf);a.Tp=this.Tp;var b=this.Vk;if(null!==b){var c={};void 0!==b.duration&&(c.duration=b.duration);void 0!==b.finished&&(c.finished=b.finished);void 0!==b.easing&&(c.easing=b.easing);a.Vk=c}return a}; +function gi(a,b,c){this.start=a;this.end=b;this.Cv={};this.uv=c;this.cw=!1}gi.className="AnimationState";function hi(a,b,c){this.td=null;this.pf=a;this.Tp=c||ii;this.Vk=null;void 0!==b&&(this.Vk=b,void 0===c&&(this.Tp=ji))}hi.prototype.copy=function(){var a=new hi(this.pf);a.Tp=this.Tp;var b=this.Vk;if(null!==b){var c={};void 0!==b.duration&&(c.duration=b.duration);void 0!==b.finished&&(c.finished=b.finished);void 0!==b.easing&&(c.easing=b.easing);a.Vk=c}return a}; function ki(a,b){a=a.Vk;null!==a&&(a.duration&&(b.duration=a.duration),a.finished&&(b.finished=a.finished),a.easing&&(b.easing=a.easing))} oa.Object.defineProperties(hi.prototype,{propertyName:{configurable:!0,get:function(){return this.pf},set:function(a){this.pf=a}},animationSettings:{configurable:!0,get:function(){return this.Vk},set:function(a){this.Vk=a}},startCondition:{configurable:!0,get:function(){return this.Tp},set:function(a){G&&cb(a,hi,hi,"startCondition");this.Tp=a}}});var ii=new F(hi,"Default",1),ji=new F(hi,"Immediate",2),li=new F(hi,"Bundled",3);hi.className="AnimationTrigger"; hi.Default=ii;hi.Immediate=ji;hi.Bundled=li;function mi(a){ab(this);this.D=null;this.Ka=new H;this.ta="";this.qb=1;this.o=!1;this.j=this.Bi=this.F=this.wj=this.vj=this.uj=this.tj=this.rj=this.sj=this.qj=this.yj=this.pj=this.xj=this.oj=this.nj=!0;this.hp=[];a&&Object.assign(this,a)}t=mi.prototype;t.clear=function(){this.Ka.clear();this.hp.length=0};t.Xe=function(a){this.D=a}; @@ -611,9 +611,9 @@ t.Hf=function(a,b,c,d,e){void 0===b&&(b=null);void 0===c&&(c=null);void 0===d&&( t.Hv=function(a,b,c,d,e,f,g){if(!1===this.Bi)return e;for(var h=this.Ka.m,k=h.length;k--;){var l=h[k];if((!0!==g||!1!==qg(l))&&f(l)&&l.isVisible()){var m=l;l.Hf(a,b,c,d,e)&&(null!==b&&(m=b(m)),null===m||null!==c&&!c(m)||e.add(m))}}return e}; t.wg=function(a,b,c,d,e,f){void 0===c&&(c=null);void 0===d&&(d=null);void 0===e&&(e=!0);if(!1!==e&&!0!==e){if(e instanceof H||e instanceof I)f=e;e=!0}f instanceof H||f instanceof I||(f=new I);if(!1===this.Bi)return f;G&&!a.s()&&v("findObjectsNear: Point must have a real value, not: "+a.toString());var g=!1;null!==this.diagram&&this.diagram.viewportBounds.ca(a)&&(g=!0);for(var h=K.alloc(),k=K.alloc(),l=this.Ka.m,m=l.length;m--;){var n=l[m];if((!0!==g||!1!==qg(n))&&n.isVisible()){h.assign(a);Lb(h,n.le); k.h(a.x+b,a.y);Lb(k,n.le);var p=n;n.wg(h,k,c,d,e,f)&&(null!==c&&(p=c(p)),null===p||null!==d&&!d(p)||f.add(p))}}K.free(h);K.free(k);return f}; -t.Pd=function(a,b){if(this.visible){var c=this.Ka.m,d=c.length;if(0!==d){a=Ma();for(var e=Ma(),f=0;fc.Wr||h.height*e>c.Wr?b.rc(a,c):(e=b.actualBounds,f=b.naturalBounds,0===e.width||0===e.height||isNaN(e.x)|| +t.Qi=function(a,b,c,d,e,f,g){if(!g||qg(b)){if(null!==d&&b instanceof R&&(b.isOrthogonal&&d.push(b),!1===b.yd))return;g=!1;for(d=b.containingGroup;null!==d;)g?null!==d.hb&&f.yy(d.hb):null!==d.hb&&(g=!0,f.assign(d.hb)),d=d.containingGroup;var h=b.actualBounds;d=!1;if(g&&b.isVisible()){if(!f.Pc(h))return;d=!f.Qe(h)}d&&(a.save(),a.beginPath(),a.rect(f.x,f.y,f.width,f.height),a.clip());h.width*e>c.Wr||h.height*e>c.Wr?b.rc(a,c):(e=b.actualBounds,f=b.naturalBounds,0===e.width||0===e.height||isNaN(e.x)|| isNaN(e.y)||!b.isVisible()||(c=b.transform,null!==b.areaBackground&&(pi(b,a,b.areaBackground,!0,!0,f,e),a.fillRect(e.x,e.y,e.width,e.height)),null===b.areaBackground&&null===b.background&&(pi(b,a,"rgba(0,0,0,0.3)",!0,!1,f,e),a.fillRect(e.x,e.y,e.width,e.height)),null!==b.background&&(a.transform(c.m11,c.m12,c.m21,c.m22,c.dx,c.dy),pi(b,a,b.background,!0,!1,f,e),a.fillRect(0,0,f.width/2,f.height/2),c.bt()||(b=1/(c.m11*c.m22-c.m12*c.m21),a.transform(c.m22*b,-c.m12*b,-c.m21*b,c.m11*b,b*(c.m21*c.dy-c.m22* c.dx),b*(c.m12*c.dx-c.m11*c.dy))))));d&&(a.restore(),a.Kc(!0))}};t.g=function(a,b,c,d,e){var f=this.diagram;null!==f&&f.ab(pe,a,this,b,c,d,e)};t.$i=function(a,b,c){var d=this.Ka;b.ri=this;if(a>=d.count)a=d.count;else if(d.M(a)===b)return-1;d.zb(a,b);b.Bq(c);d=this.diagram;null!==d&&(c?d.R():d.$i(b));qi(this,a,b);return a}; t.hc=function(a,b,c){if(!c&&b.layer!==this&&null!==b.layer)return b.layer.hc(a,b,c);var d=this.Ka;if(0>a||a>=d.length){if(a=d.indexOf(b),0>a)return-1}else if(d.M(a)!==b&&(a=d.indexOf(b),0>a))return-1;b.Cq(c);d.kb(a);d=this.diagram;null!==d&&(c?d.R():d.hc(b));b.ri=null;return a}; @@ -623,7 +623,7 @@ e&&(k=a.M(h).zOrder,isNaN(k)););}return b} oa.Object.defineProperties(mi.prototype,{parts:{configurable:!0,get:function(){return this.Ka.iterator}},partsBackwards:{configurable:!0,get:function(){return this.Ka.iteratorBackwards}},diagram:{configurable:!0,get:function(){return this.D}},name:{configurable:!0,get:function(){return this.ta},set:function(a){A(a,"string",mi,"name");var b=this.ta;if(b!==a){var c=this.diagram;if(null!==c)for(""===b&&v("Cannot rename default Layer to: "+a),c= c.layers;c.next();)c.value.name===a&&v("Layer.name is already present in this diagram: "+a);this.ta=a;this.g("name",b,a);for(a=this.Ka.iterator;a.next();)a.value.layerName=this.ta}}},opacity:{configurable:!0,get:function(){return this.qb},set:function(a){var b=this.qb;b!==a&&(A(a,"number",mi,"opacity"),(0>a||1q&&(this.position=w.h(-(b.scrollWidth-this.Ba)+y-this.Ba/e+m,this.position.y))),a.pz&&this.allowVerticalScroll&&(hu&&(this.position= w.h(this.position.x,-(b.scrollHeight-this.Aa)+a.scrollTop-this.Aa/e+f))),K.free(w),dj(this),this.Jj=this.os=!1,d=this.documentBounds,e=this.viewportBounds,m=d.right,q=e.right,f=d.bottom,u=e.bottom,g=d.x,n=e.x,h=d.y,d=e.y,p>=k&&g>=n&&m<=q&&(c.style.width="1px"),r>=l&&h>=d&&f<=u&&(c.style.height="1px"))}};Q.prototype.computeBounds=function(a){void 0===a&&(a=new M);uh(this);return ej(this,a)}; -function ej(a,b){if(a.fixedBounds.s())return b.assign(a.fixedBounds),b.jq(a.rb),b;for(var c=!0,d=a.Ta.m,e=d.length,f=0;fc&&(b=c),ba.maxScale&&(b=a.maxScale),b):b===lj?(b=k>h?(g-a.xb)/d:(f-a.xb)/e,b>c&&(b=c),ba.maxScale&&(b=a.maxScale),b):a.scale} @@ -682,62 +682,62 @@ Q.prototype.OA=function(a){var b=this.D;if(!b.isEnabled)return!1;var c=pj(b,a,!1 Q.prototype.Xz=function(a){var b=this.D;if(!b.isEnabled)return!1;var c=pj(b,a,!0);null!==b.mouseEnter&&b.mouseEnter(c);return tj(b,c,a)};Q.prototype.Yz=function(a){var b=this.D;if(!b.isEnabled)return!1;var c=pj(b,a,!0);null!==b.mouseLeave&&b.mouseLeave(c);return tj(b,c,a)}; Q.prototype.getMouse=function(a){var b=this.Ga;if(null===b)return new K(0,0);var c=b.getBoundingClientRect();b=a.clientX-this.Ba/c.width*c.left;a=a.clientY-this.Aa/c.height*c.top;return null!==this.yb?Lb(new K(b,a),this.yb):new K(b,a)}; function qj(a,b,c){var d=a.Ga,e=a.Ba,f=a.Aa,g=0,h=0;null!==d&&(d=d.getBoundingClientRect(),g=b.clientX-e/d.width*d.left,h=b.clientY-f/d.height*d.top);c.viewPoint.h(g,h);null!==a.yb?(b=K.allocAt(g,h),a.yb.Ld(b),c.documentPoint.assign(b),K.free(b)):c.documentPoint.h(g,h)} -function me(a,b,c,d){if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;b=b.targetTouches[c]}else if(null!==a.Rl[0])b=a.Rl[c];else return;c=a.Ga;null!==c&&(c=c.getBoundingClientRect(),d.h(b.clientX-a.Ba/c.width*c.left,b.clientY-a.Aa/c.height*c.top))}Q.prototype.Va=function(){this.Ij||(this.Ij=!0,this.Lb(!0))};function uj(a){a.ad||uh(a);a.Xa()}Q.prototype.redraw=function(){this.tb||this.ad||(this.R(),ij(this),this.ld())};t=Q.prototype;t.MA=function(){return this.qg}; -t.Sz=function(a){void 0===a&&(a=null);var b=this.animationManager,c=b.isEnabled;b.tc();b.isEnabled=!1;Ef(this);this.bg=!1;this.Pu=new K(NaN,NaN);b.isEnabled=c;this.ad=!0;var d=this;null!==a&&va(function(){d.ad=!1;th(b,"Model");a(d)},1)};t.Lb=function(a){void 0===a&&(a=!1);if(!0!==this.qg&&!(this.tb||!1===a&&this.ad)){this.qg=!0;var b=this;sa.requestAnimationFrame(function(){b.qg&&b.ld()})}};t.ld=function(){if(!this.Xn||this.qg)this.Xn&&(this.Xn=!1),Ef(this)}; +function me(a,b,c,d){if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;b=b.targetTouches[c]}else if(null!==a.Rl[0])b=a.Rl[c];else return;c=a.Ga;null!==c&&(c=c.getBoundingClientRect(),d.h(b.clientX-a.Ba/c.width*c.left,b.clientY-a.Aa/c.height*c.top))}Q.prototype.Ua=function(){this.Ij||(this.Ij=!0,this.Lb(!0))};function uj(a){a.bd||uh(a);a.Xa()}Q.prototype.redraw=function(){this.tb||this.bd||(this.R(),ij(this),this.md())};t=Q.prototype;t.MA=function(){return this.qg}; +t.Sz=function(a){void 0===a&&(a=null);var b=this.animationManager,c=b.isEnabled;b.tc();b.isEnabled=!1;Ef(this);this.bg=!1;this.Pu=new K(NaN,NaN);b.isEnabled=c;this.bd=!0;var d=this;null!==a&&va(function(){d.bd=!1;th(b,"Model");a(d)},1)};t.Lb=function(a){void 0===a&&(a=!1);if(!0!==this.qg&&!(this.tb||!1===a&&this.bd)){this.qg=!0;var b=this;sa.requestAnimationFrame(function(){b.qg&&b.md()})}};t.md=function(){if(!this.Xn||this.qg)this.Xn&&(this.Xn=!1),Ef(this)}; function jj(a,b,c){a.animationManager.defaultAnimation.isAnimating||a.tb||!a.Jj||bj(a)||(b&&uh(a),c&&fj(a,!1))} -function Ef(a,b){if(!a.ad&&(a.qg=!1,null!==a.Ja||a.cq.s())){a.ad=!0;var c=a.animationManager,d=a.mp;if(!c.isAnimating&&0!==d.length){for(var e=d.m,f=e.length,g=0;gb;b++){var c=a.Ae.iterator;if(null===c||0===a.Ae.count)break;a.Ae=new I;a.yw(c,a.Ae);G&&22===b&&Fa("failure to validate parts")}a.nodes.each(function(a){a instanceof vf&&0!==(a.U&65536)!==!1&&(a.U=a.U^65536)})}} -t.yw=function(a,b){for(a.reset();a.next();){var c=a.value;!c.Pc()||c instanceof vf||(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}for(a.reset();a.next();)c=a.value,c instanceof vf&&c.isVisible()&&zj(this,c);for(a.reset();a.next();)c=a.value,c instanceof R&&c.isVisible()&&(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c));for(a.reset();a.next();)c=a.value,c instanceof Je&&c.isVisible()&&(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}; +b||a.rc(a.Xb);e&&(a.skipsUndoManager=d);a.bd=!1}}function yj(a){var b=a.ya;if(a.Xg!==zh)a.scale=gj(a,a.Xg);else if(a.Zh!==zh)a.scale=gj(a,a.Zh);else{var c=a.initialScale;isFinite(c)&&0b;b++){var c=a.Ae.iterator;if(null===c||0===a.Ae.count)break;a.Ae=new I;a.yw(c,a.Ae);G&&22===b&&Fa("failure to validate parts")}a.nodes.each(function(a){a instanceof vf&&0!==(a.U&65536)!==!1&&(a.U=a.U^65536)})}} +t.yw=function(a,b){for(a.reset();a.next();){var c=a.value;!c.Qc()||c instanceof vf||(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}for(a.reset();a.next();)c=a.value,c instanceof vf&&c.isVisible()&&zj(this,c);for(a.reset();a.next();)c=a.value,c instanceof R&&c.isVisible()&&(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c));for(a.reset();a.next();)c=a.value,c instanceof Je&&c.isVisible()&&(c.ej()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}; function zj(a,b){for(var c=Ma(),d=Ma(),e=b.memberParts;e.next();){var f=e.value;f.isVisible()&&(f instanceof vf?(Aj(f)||Bj(f)||Cj(f))&&zj(a,f):f instanceof R?f.fromNode===b||f.toNode===b?d.push(f):c.push(f):(f.measure(Infinity,Infinity),f.arrange()))}a=c.length;for(e=0;en&&(z=S.left,B= S.right),y.height>J&&(C=S.top,E=S.bottom)):(z=S.left,B=S.right,C=S.top,E=S.bottom);S=y.width+z+B;var aa=y.height+C+E;z=y.x-z;var Y=e.x;B=y.right+B;var T=e.right+r;C=y.y-C;var P=e.y;y=y.bottom+E;E=e.bottom+q;var ma="1px",ia="1px";e=a.scale;u=S>u/e;w=aa>w/e;a.scrollMode===$h&&(u||w)&&(u&&a.hasHorizontalScrollbar&&a.allowHorizontalScroll&&(u=1,z+1T+1&&(u=Math.max((B-T)*e+a.Ba,u)),n+r+1E+1&&(u=Math.max((y-E)*e+a.Aa,u)),J+q+1T+1&&(r=Math.max((B-T)*e+a.Ba,r)),n+1E+1&&(q=Math.max((y-E)*e+r,q)),J+1E+1&&(q=Math.max((y-E)*e+r,q)),J+1T+1&&(b=a.position.x*e));if(a.uo)switch(a.Nu){case "negative":b=-(l.scrollWidth-b-l.clientWidth);break;case "reverse":b=l.scrollWidth-b-l.clientWidth}l.scrollLeft=b;a.hasVerticalScrollbar&&a.allowVerticalScroll&&(J+1E+1&&(l.scrollTop=a.position.y*e));u=a.Ba;w=a.Aa;l.style.width=u+(a.$f?a.xb:0)+"px";l.style.height=w+(a.ff?a.xb:0)+"px";return c!==u||d!==w||a.animationManager.wb?(c=M.allocAt(f,g,h,k),a.onViewportBoundsChanged(c,a.viewportBounds,e,p),M.free(c),!1):!0}t=Q.prototype; -t.add=function(a){x(a,U,Q,"add:part");var b=a.diagram;if(b!==this&&(null!==b&&v("Cannot add part "+a.toString()+" to "+this.toString()+". It is already a part of "+b.toString()),b=this.wk(a.layerName),null===b&&(b=this.wk("")),null===b&&v('Cannot add a Part when unable find a Layer named "'+a.layerName+'" and there is no default Layer'),a.layer!==b)){var c=b.$i(99999999,a,a.diagram===this);0<=c&&this.ab(re,"parts",b,null,a,null,c);b.isTemporary||this.Va();a.C(1);c=a.layerChanged;null!==c&&c(a,null, -b)}};t.$i=function(a){this.partManager.$i(a);var b=this;Nj(a,function(a){Oj(b,a)});(a instanceof Je||a instanceof vf&&null!==a.placeholder)&&a.v();null!==a.data&&Nj(a,function(a){Pj(b.partManager,a)});!0!==Bj(a)&&!0!==Cj(a)||this.Ae.add(a);Qj(a,!0,this);Rj(a)?(a.actualBounds.s()&&this.R(Lj(a,a.actualBounds)),this.Va()):a.isVisible()&&a.actualBounds.s()&&this.R(Lj(a,a.actualBounds));this.Lb()}; -t.hc=function(a){a.mk();this.partManager.hc(a);var b=this;null!==a.data&&Nj(a,function(a){Sj(b.partManager,a,b)});this.Ae.remove(a);Rj(a)?(a.actualBounds.s()&&this.R(Lj(a,a.actualBounds)),this.Va()):a.isVisible()&&a.actualBounds.s()&&this.R(Lj(a,a.actualBounds));this.Lb()};t.remove=function(a){x(a,U,Q,"remove:part");Tj(this,a,!0)}; +t.add=function(a){x(a,U,Q,"add:part");var b=a.diagram;if(b!==this&&(null!==b&&v("Cannot add part "+a.toString()+" to "+this.toString()+". It is already a part of "+b.toString()),b=this.wk(a.layerName),null===b&&(b=this.wk("")),null===b&&v('Cannot add a Part when unable find a Layer named "'+a.layerName+'" and there is no default Layer'),a.layer!==b)){var c=b.$i(99999999,a,a.diagram===this);0<=c&&this.ab(re,"parts",b,null,a,null,c);b.isTemporary||this.Ua();a.C(1);c=a.layerChanged;null!==c&&c(a,null, +b)}};t.$i=function(a){this.partManager.$i(a);var b=this;Nj(a,function(a){Oj(b,a)});(a instanceof Je||a instanceof vf&&null!==a.placeholder)&&a.v();null!==a.data&&Nj(a,function(a){Pj(b.partManager,a)});!0!==Bj(a)&&!0!==Cj(a)||this.Ae.add(a);Qj(a,!0,this);Rj(a)?(a.actualBounds.s()&&this.R(Lj(a,a.actualBounds)),this.Ua()):a.isVisible()&&a.actualBounds.s()&&this.R(Lj(a,a.actualBounds));this.Lb()}; +t.hc=function(a){a.mk();this.partManager.hc(a);var b=this;null!==a.data&&Nj(a,function(a){Sj(b.partManager,a,b)});this.Ae.remove(a);Rj(a)?(a.actualBounds.s()&&this.R(Lj(a,a.actualBounds)),this.Ua()):a.isVisible()&&a.actualBounds.s()&&this.R(Lj(a,a.actualBounds));this.Lb()};t.remove=function(a){x(a,U,Q,"remove:part");Tj(this,a,!0)}; function Tj(a,b,c){var d=b.layer;null!==d&&d.diagram===a&&(b.isSelected=!1,b.isHighlighted=!1,b.C(2),c&&b.tk(),c=d.hc(-1,b,!1),0<=c&&a.ab(se,"parts",d,b,null,c,null),a=b.layerChanged,null!==a&&a(b,d,null))}t.ot=function(a,b){void 0===b&&(b=!1);if(Ha(a))for(var c=a.length,d=0;dd&&this.Va();return this}; -t.wz=function(a,b){Zj(this,a,b);a.Xe(this);var c=this.Ta,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Yb&&this.ab(se,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Va();return this}; -t.fB=function(a){x(a,mi,Q,"removeLayer:layer");a.diagram!==this&&v("Cannot remove a Layer from another Diagram: "+a+" of "+a.diagram);if(""!==a.name){var b=this.Ta,c=b.indexOf(a);if(b.remove(a)){for(b=a.Ka.copy().iterator;b.next();){var d=b.value,e=d.layerName;e!==a.name?d.layerName=e:d.layerName=""}null!==this.Yb&&this.ab(se,"layers",this,a,null,c,null);this.R();this.Va()}}};t.wk=function(a){for(var b=this.layers;b.next();){var c=b.value;if(c.name===a)return c}return null}; +b+"'; a Layer with the same name is already present in this Diagram.")}}t.om=function(a){Zj(this,a,null);a.Xe(this);var b=this.Ta,c=b.count-1;if(!a.isTemporary)for(;0<=c&&b.M(c).isTemporary;)c--;b.zb(c+1,a);null!==this.Yb&&this.ab(re,"layers",this,null,a,null,c+1);this.R();this.Ua();return this}; +t.Ox=function(a,b){Zj(this,a,b);a.Xe(this);var c=this.Ta,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Yb&&this.ab(se,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Ua();return this}; +t.wz=function(a,b){Zj(this,a,b);a.Xe(this);var c=this.Ta,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Yb&&this.ab(se,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Ua();return this}; +t.fB=function(a){x(a,mi,Q,"removeLayer:layer");a.diagram!==this&&v("Cannot remove a Layer from another Diagram: "+a+" of "+a.diagram);if(""!==a.name){var b=this.Ta,c=b.indexOf(a);if(b.remove(a)){for(b=a.Ka.copy().iterator;b.next();){var d=b.value,e=d.layerName;e!==a.name?d.layerName=e:d.layerName=""}null!==this.Yb&&this.ab(se,"layers",this,a,null,c,null);this.R();this.Ua()}}};t.wk=function(a){for(var b=this.layers;b.next();){var c=b.value;if(c.name===a)return c}return null}; t.Qx=function(a){A(a,"function",Q,"addModelChangedListener:listener");null===this.mf&&(this.mf=new H);this.mf.add(a);this.model.Fh(a);return this};t.hB=function(a){A(a,"function",Q,"removeModelChangedListener:listener");null!==this.mf&&(this.mf.remove(a),0===this.mf.count&&(this.mf=null));this.model.Nk(a)};t.Fh=function(a){A(a,"function",Q,"addChangedListener:listener");null===this.Gg&&(this.Gg=new H);this.Gg.add(a);return this}; t.Nk=function(a){A(a,"function",Q,"removeChangedListener:listener");null!==this.Gg&&(this.Gg.remove(a),0===this.Gg.count&&(this.Gg=null))};t.Js=function(a){this.skipsUndoManager||this.model.skipsUndoManager||this.model.undoManager.Nv(a);a.change!==qe&&(this.isModified=!0);if(null!==this.Gg)for(var b=this.Gg,c=b.length,d=0;dn.Ka.indexOf(r)&&n.$i(p,r,q):(r.isSelected=!1,r.isHighlighted=!1,r.Qb(),n.hc(q?p:-1,r,q)))}else n instanceof Q?"number"===typeof p&&r instanceof mi&&(b?(r.Xe(this),this.Ta.zb(p,r)):this.Ta.kb(p)):v("unknown ChangedEvent.Remove object: "+a.toString());this.isModified=!0}else d!==qe&&v("unknown ChangedEvent: "+a.toString())}finally{this.skipsModelSourceBindings= c}}};Q.prototype.Da=function(a){return this.undoManager.Da(a)};Q.prototype.cb=function(a){return this.undoManager.cb(a)};Q.prototype.Pf=function(){return this.undoManager.Pf()};Q.prototype.commit=function(a,b){void 0===b&&(b="");var c=this.skipsUndoManager;null===b&&(this.skipsUndoManager=!0,b="");this.undoManager.Da(b);var d=!1;try{a(this),d=!0}finally{d?this.undoManager.cb(b):this.undoManager.Pf(),this.skipsUndoManager=c}};Q.prototype.updateAllTargetBindings=function(a){this.partManager.updateAllTargetBindings(a)}; Q.prototype.Yq=function(){this.partManager.Yq()}; -function ek(a,b,c){var d=a.animationManager;if(a.tb||a.ad)a.ya=c,Li(a),a=a.ya,d.wb&&(Eh(d)||d.Vd.add(d.D,"scale",b,a));else if(null===a.Ga)a.ya=c,Li(a);else{a.tb=!0;var e=a.viewportBounds.copy(),f=a.Ba,g=a.Aa;e.width=a.Ba/b;e.height=a.Aa/b;var h=a.zoomPoint.x,k=a.zoomPoint.y,l=a.contentAlignment;isNaN(h)&&(l.Qc()?l.Lf(Rc)?h=0:l.Lf(Sc)&&(h=f-1):h=l.fb()?l.x*(f-1):f/2);isNaN(k)&&(l.Qc()?l.Lf(Qc)?k=0:l.Lf(Tc)&&(k=g-1):k=l.fb()?l.y*(g-1):g/2);null===a.scaleComputation||a.animationManager.defaultAnimation.isAnimating|| +function ek(a,b,c){var d=a.animationManager;if(a.tb||a.bd)a.ya=c,Li(a),a=a.ya,d.wb&&(Eh(d)||d.Vd.add(d.D,"scale",b,a));else if(null===a.Ga)a.ya=c,Li(a);else{a.tb=!0;var e=a.viewportBounds.copy(),f=a.Ba,g=a.Aa;e.width=a.Ba/b;e.height=a.Aa/b;var h=a.zoomPoint.x,k=a.zoomPoint.y,l=a.contentAlignment;isNaN(h)&&(l.Rc()?l.Lf(Rc)?h=0:l.Lf(Sc)&&(h=f-1):h=l.fb()?l.x*(f-1):f/2);isNaN(k)&&(l.Rc()?l.Lf(Qc)?k=0:l.Lf(Tc)&&(k=g-1):k=l.fb()?l.y*(g-1):g/2);null===a.scaleComputation||a.animationManager.defaultAnimation.isAnimating|| (c=a.scaleComputation(a,c));ca.maxScale&&(c=a.maxScale);f=K.allocAt(a.qa.x+h/b-h/c,a.qa.y+k/b-k/c);a.position=f;K.free(f);a.ya=c;Li(a);a.onViewportBoundsChanged(e,a.viewportBounds,b,!1);a.tb=!1;fj(a,!1);c=a.ya;d.wb&&(Eh(d)||d.Vd.add(d.D,"scale",b,c));a.R();ij(a)}} -Q.prototype.onViewportBoundsChanged=function(a,b,c,d){if(!a.B(b)){void 0===d&&(d=!1);d||ij(this);dj(this);var e=this.layout;null===e||!e.isViewportSized||this.autoScale!==zh||d||a.width===b.width&&a.height===b.height||e.C();e=this.currentTool;!0===this.zl&&e instanceof Ua&&(this.lastInput.documentPoint=this.xt(this.lastInput.viewPoint),Ne(e,this));this.tb||this.invalidateViewport(a,b);wj(this);this.hd.scale=c;this.hd.position.x=a.x;this.hd.position.y=a.y;this.hd.bounds.assign(a);this.hd.Ux.width= -Math.round(a.width*c);this.hd.Ux.height=Math.round(a.height*c);this.hd.Hy.width=this.Ba;this.hd.Hy.height=this.Aa;this.hd.By=d;this.V("ViewportBoundsChanged",this.hd,a);this.isVirtualized&&this.links.each(function(a){a.isAvoiding&&a.actualBounds.Oc(b)&&a.Za()})}}; +Q.prototype.onViewportBoundsChanged=function(a,b,c,d){if(!a.B(b)){void 0===d&&(d=!1);d||ij(this);dj(this);var e=this.layout;null===e||!e.isViewportSized||this.autoScale!==zh||d||a.width===b.width&&a.height===b.height||e.C();e=this.currentTool;!0===this.zl&&e instanceof Ua&&(this.lastInput.documentPoint=this.xt(this.lastInput.viewPoint),Ne(e,this));this.tb||this.invalidateViewport(a,b);wj(this);this.jd.scale=c;this.jd.position.x=a.x;this.jd.position.y=a.y;this.jd.bounds.assign(a);this.jd.Ux.width= +Math.round(a.width*c);this.jd.Ux.height=Math.round(a.height*c);this.jd.Hy.width=this.Ba;this.jd.Hy.height=this.Aa;this.jd.By=d;this.V("ViewportBoundsChanged",this.jd,a);this.isVirtualized&&this.links.each(function(a){a.isAvoiding&&a.actualBounds.Pc(b)&&a.Za()})}}; function wj(a,b){var c=a.ae;if(null!==c&&c.visible){for(var d=Hb.alloc(),e=1,f=1,g=c.W.m,h=g.length,k=0;km||(fk(l.figure)?f=f*m/L.ny(f,m):e=e*m/L.ny(e,m))}g=c.gridCellSize;d.h(f*g.width,e*g.height);if(void 0!==b)e=b.width,f=b.height,a=b.x,g=b.y;else{b=M.alloc();a=a.viewportBounds;b.h(a.x,a.y,a.width,a.height);if(!b.s()){M.free(b);return}e=b.width;f=b.height;a=b.x;g=b.y;M.free(b)}c.width=e+2*d.width;c.height=f+2*d.height;b=K.alloc();L.vq(a,g,0,0,d.width, d.height,b);b.offset(-d.width,-d.height);Hb.free(d);c.part.location=b;K.free(b)}}Q.prototype.clearSelection=function(a){void 0===a&&(a=!1);var b=this.selection;if(0!==b.count){a||this.V("ChangingSelection",b);for(var c=b.Ea(),d=c.length,e=0;e=d&&!f.defaultAnimation.isAnimating&&!f.wb&&(b||th(f,"Layout"));a.Yh=!1;for(var g=a.Ji.iterator;g.next();)ok(a,g.value,b,d);e.isValidLayout||(!b||e.isRealtime||null===e.isRealtime||0===d?(e.doLayout(a),uh(a),e.isValidLayout=!0):a.Yh=!0)}finally{b=a.undoManager.isInternalTransaction,0===d&&(a.cb("Layout"),a.undoManager.isInternalTransaction= !1),!b||0!==d&&1!==d||vh(f),a.ba=c}}}function ok(a,b,c,d){if(null!==b){for(var e=b.Ml.iterator;e.next();)ok(a,e.value,c,d);e=b.layout;null===e||e.isValidLayout||(!c||e.isRealtime||0===d?(b.Qh=!b.location.s(),e.doLayout(b),b.C(32),zj(a,b),e.isValidLayout=!0):a.Yh=!0)}}t.vA=function(){for(var a=new H,b=this.nodes;b.next();){var c=b.value;c.isTopLevel&&null===c.Vi()&&a.add(c)}return a.iterator}; @@ -777,11 +777,11 @@ b("LostFocus");b("Modified");b("ObjectSingleClicked");b("ObjectDoubleClicked");b function Ij(a,b){var c=a.Ww.K(b);return null!==c?c:a.Ww.K(b.toLowerCase())}function pk(a,b){var c=a.Xw.K(b);if(null!==c)return c;c=a.Xw.K(b.toLowerCase());if(null!==c)return c;v("Unknown DiagramEvent name: "+b)}t.jk=function(a,b){A(a,"string",Q,"addDiagramListener:name");A(b,"function",Q,"addDiagramListener:listener");a=pk(this,a);null!==a&&a.add(b);return this};t.Im=function(a,b){A(a,"string",Q,"removeDiagramListener:name");A(b,"function",Q,"addDiagramListener:listener");a=pk(this,a);null!==a&&a.remove(b)}; t.V=function(a,b,c){G&&A(a,"string",Q,"raiseDiagramEvent:name");var d=pk(this,a),e=new ne;e.diagram=this;a=Ij(this,a);null!==a&&(e.name=a);void 0!==b&&(e.subject=b);void 0!==c&&(e.parameter=c);b=d.length;if(1===b)d.M(0)(e);else if(0!==b)for(d=d.Ea(),c=0;c=c.top&&0>=c.left&&0>=c.right&&0>=c.bottom)return b;var d=this.viewportBounds,e=this.scale;d=M.allocAt(0,0,d.width*e,d.height*e);var f=K.allocAt(0,0);if(a.x>=d.x&&a.xd.x+d.width-c.right&&this.allowHorizontalScroll&&(g=Math.max(this.scrollHorizontalLineChange, 1),g|=0,f.x+=g,a.x>d.x+d.width-c.right/2&&(f.x+=g),a.x>d.x+d.width-c.right/4&&(f.x+=4*g));a.y>=d.y&&a.yd.y+d.height-c.bottom&&this.allowVerticalScroll&&(g=Math.max(this.scrollVerticalLineChange,1),g|=0,f.y+=g,a.y>d.y+d.height-c.bottom/2&&(f.y+=g),a.y>d.y+d.height-c.bottom/4&&(f.y+=4*g));f.Ya(yb)||(b=new K(b.x+f.x/e,b.y+f.y/e)); M.free(d);K.free(f);return b};t=Q.prototype;t.ht=function(){return null};t.Uv=function(){return null};t.Az=function(a,b){this.mz.add(a,b)};t.rv=function(a){(this.Ix=a)||this.nodes.each(function(a){a instanceof vf&&(a.Ar=null)})}; @@ -789,10 +789,10 @@ function Kk(a,b,c){function d(){var a=+new Date;f=!0;for(g.reset();g.next();)if( t.Ey=function(a){void 0===a&&(a={});return Kk(this,this.TA,a)}; t.TA=function(a,b,c){var d=Lk(c,a,"canvas",null);if(null===d)return null;c=d.aa.canvas;var e=null;if(null!==c)switch(e=a.returnType,void 0===e?e="string":e=e.toLowerCase(),e){case Mk+"data":e=d.getImageData(0,0,c.width,c.height);break;case Mk:d=(a.document||document).createElement("img");d.src=c.toDataURL(a.type,a.details);e=d;break;case "blob":"function"!==typeof b&&v('Error: Diagram.makeImageData called with "returnType: toBlob", but no required "callback" function property defined.');if("function"=== typeof c.toBlob)return c.toBlob(b,a.type,a.details),"toBlob";if("function"===typeof c.msToBlob)return b(c.msToBlob()),"msToBlob";b(null);return null;default:e=c.toDataURL(a.type,a.details)}return"function"===typeof b?(b(e),null):e}; -function Lk(a,b,c,d){a.animationManager.tc();a.ld();if(null===a.Ga)return null;"object"!==typeof b&&v("properties argument must be an Object.");var e=!1,f=b.size||null,g=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(g="NaN");var h=b.maxSize;void 0===b.maxSize&&(e=!0,h="SVG"===c?new Hb(Infinity,Infinity):new Hb(2E3,2E3));var k=b.position||null,l=b.parts||null,m=void 0===b.padding?1:b.padding,n=b.background||null,p=b.omitTemporary;void 0===p&&(p=!0);var r=b.document||document,q=b.elementFinished|| +function Lk(a,b,c,d){a.animationManager.tc();a.md();if(null===a.Ga)return null;"object"!==typeof b&&v("properties argument must be an Object.");var e=!1,f=b.size||null,g=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(g="NaN");var h=b.maxSize;void 0===b.maxSize&&(e=!0,h="SVG"===c?new Hb(Infinity,Infinity):new Hb(2E3,2E3));var k=b.position||null,l=b.parts||null,m=void 0===b.padding?1:b.padding,n=b.background||null,p=b.omitTemporary;void 0===p&&(p=!0);var r=b.document||document,q=b.elementFinished|| null,u=b.showTemporary;void 0===u&&(u=!p);b=b.showGrid;void 0===b&&(b=u);null!==f&&isNaN(f.width)&&isNaN(f.height)&&(f=null);"number"===typeof m?m=new ic(m):m instanceof ic||v("MakeImage padding must be a Margin or a number.");m.left=Math.max(m.left,0);m.right=Math.max(m.right,0);m.top=Math.max(m.top,0);m.bottom=Math.max(m.bottom,0);a.Xb.Kc(!0);p=new Nk(null,r);var w=p.context;if(!(f||g||l||k)){p.width=a.Ba+Math.ceil(m.left+m.right);p.height=a.Aa+Math.ceil(m.top+m.bottom);if("SVG"===c){if(null=== -d)return null;d.resize(p.width,p.height,p.width,p.height);d.ownerDocument=r;d.sq=q;Gj(a,d.context,m,new Hb(p.width,p.height),a.ya,a.qa,l,n,u,b);return d.context}a.On=!1;Gj(a,w,m,new Hb(p.width,p.height),a.ya,a.qa,l,n,u,b);a.On=!0;return p.context}var y=a.sr,z=a.documentBounds.copy();z.qw(a.rb);if(u)for(var B=a.Ta.m,C=B.length,E=0;Ey?(g=y,f=z.width,z=z.height):(f=h.width,z=h.height)):(f=z.width*g,z=z.height*g):(g=y,f=z.width,z=z.height);null!==m?(f+=k,z+=C):m=new ic(0);null!==h&&(y=h.width,h=h.height,"SVG"!==c&&e&&!Ok&&G&&(f>y|| z>h)&&(Fa("Diagram.makeImage(data): Diagram width or height is larger than the default max size. ("+Math.ceil(f)+"x"+Math.ceil(z)+" vs 2000x2000) Consider increasing the max size."),Ok=!0),isNaN(y)&&(y=2E3),isNaN(h)&&(h=2E3),isFinite(y)&&(f=Math.min(f,y)),isFinite(h)&&(z=Math.min(z,h)));p.width=Math.ceil(f);p.height=Math.ceil(z);if("SVG"===c){if(null===d)return null;d.resize(p.width,p.height,p.width,p.height);d.ownerDocument=r;d.sq=q;Gj(a,d.context,m,new Hb(Math.ceil(f),Math.ceil(z)),g,B,l,n,u,b); return d.context}a.On=!1;Gj(a,w,m,new Hb(Math.ceil(f),Math.ceil(z)),g,B,l,n,u,b);a.On=!0;return p.context} @@ -801,7 +801,7 @@ this.Ul&&(this.Ul.disconnect(),this.Ul=null),b=this.toolManager,null!==b&&(b.mou Sx:{configurable:!0,get:function(){return this.Zr}},bj:{configurable:!0,get:function(){return this.bg}},draggedLink:{configurable:!0,get:function(){return this.Vt},set:function(a){this.Vt!==a&&(this.Vt=a,null!==a&&(this.Gu=a.fromPort,this.Hu=a.toPort))}},Iy:{configurable:!0,get:function(){return this.Gu},set:function(a){this.Gu=a}},Jy:{configurable:!0,get:function(){return this.Hu},set:function(a){this.Hu=a}},animationManager:{configurable:!0, enumerable:!0,get:function(){return this.Rd}},undoManager:{configurable:!0,get:function(){return this.Yb.undoManager}},skipsUndoManager:{configurable:!0,get:function(){return this.rh},set:function(a){A(a,"boolean",Q,"skipsUndoManager");this.rh=a;this.Yb.skipsUndoManager=a}},delaysLayout:{configurable:!0,get:function(){return this.Tt},set:function(a){this.Tt=a}},opacity:{configurable:!0,get:function(){return this.qb},set:function(a){var b=this.qb; b!==a&&(A(a,"number",Q,"opacity"),(0>a||1= 0",Q,"maxSelectionCount")}},nodeSelectionAdornmentTemplate:{configurable:!0, enumerable:!0,get:function(){return this.Du},set:function(a){var b=this.Du;b!==a&&(x(a,Je,Q,"nodeSelectionAdornmentTemplate"),this.Du=a,this.g("nodeSelectionAdornmentTemplate",b,a))}},groupSelectionAdornmentTemplate:{configurable:!0,get:function(){return this.eu},set:function(a){var b=this.eu;b!==a&&(x(a,Je,Q,"groupSelectionAdornmentTemplate"),this.eu=a,this.g("groupSelectionAdornmentTemplate",b,a))}},linkSelectionAdornmentTemplate:{configurable:!0,get:function(){return this.tu}, set:function(a){var b=this.tu;b!==a&&(x(a,Je,Q,"linkSelectionAdornmentTemplate"),this.tu=a,this.g("linkSelectionAdornmentTemplate",b,a))}},highlighteds:{configurable:!0,get:function(){return this.ex}},isModified:{configurable:!0,get:function(){var a=this.undoManager;return a.isEnabled?null!==a.currentTransaction?!0:this.so&&this.ze!==a.historyIndex:this.so},set:function(a){if(this.so!==a){A(a,"boolean",Q,"isModified");this.so=a;var b=this.undoManager;!a&&b.isEnabled&&(this.ze= b.historyIndex);a||gk(this)}}},model:{configurable:!0,get:function(){return this.Yb},set:function(a){var b=this.Yb;if(b!==a){x(a,X,Q,"model");this.currentTool.doCancel();b&&b.undoManager!==a.undoManager&&b.undoManager.isInTransaction&&v("Do not replace a Diagram.model while a transaction is in progress.");this.animationManager.tc(!0);var c=Ji(this,!0);this.bg=!1;this.Xn=!0;this.ze=-2;this.qg=!1;var d=this.tb;this.tb=!0;th(this.animationManager,"Model");b&&(null!==this.mf&&this.mf.each(function(a){b.Nk(a)}), -b.Nk(this.Th));this.Yb=a;this.partManager=hk(this.Yb.type);for(var e=0;ethis.scale&&(this.scale=a)):Aa(a,"> 0",Q,"minScale"))}},maxScale:{configurable:!0, enumerable:!0,get:function(){return this.vu},set:function(a){D(a,Q,"maxScale");var b=this.vu;b!==a&&(0 0",Q,"maxScale"))}},zoomPoint:{configurable:!0,get:function(){return this.kv},set:function(a){this.kv.B(a)||(x(a,K,Q,"zoomPoint"),this.kv=a=a.L())}},contentAlignment:{configurable:!0,get:function(){return this.cl},set:function(a){var b=this.cl;b.B(a)||(x(a,Ib,Q,"contentAlignment"),this.cl=a=a.L(), -this.g("contentAlignment",b,a),fj(this,!1))}},initialContentAlignment:{configurable:!0,get:function(){return this.Ir},set:function(a){var b=this.Ir;b.B(a)||(x(a,Ib,Q,"initialContentAlignment"),this.Ir=a=a.L(),this.g("initialContentAlignment",b,a))}},padding:{configurable:!0,get:function(){return this.rb},set:function(a){"number"===typeof a?a=new ic(a):x(a,ic,Q,"padding");var b=this.rb;b.B(a)||(this.rb=a=a.L(),this.Va(),this.g("padding",b,a))}},partManager:{configurable:!0, +this.g("contentAlignment",b,a),fj(this,!1))}},initialContentAlignment:{configurable:!0,get:function(){return this.Ir},set:function(a){var b=this.Ir;b.B(a)||(x(a,Ib,Q,"initialContentAlignment"),this.Ir=a=a.L(),this.g("initialContentAlignment",b,a))}},padding:{configurable:!0,get:function(){return this.rb},set:function(a){"number"===typeof a?a=new ic(a):x(a,ic,Q,"padding");var b=this.rb;b.B(a)||(this.rb=a=a.L(),this.Ua(),this.g("padding",b,a))}},partManager:{configurable:!0, enumerable:!0,get:function(){return this.Uh},set:function(a){var b=this.Uh;b!==a&&(x(a,vi,Q,"partManager"),null!==a.diagram&&v("Cannot share PartManagers between Diagrams: "+a.toString()),b&&b.Xe(null),this.Uh=a,a.Xe(this))}},nodes:{configurable:!0,get:function(){return this.partManager.nodes.iterator}},links:{configurable:!0,get:function(){return this.partManager.links.iterator}},parts:{configurable:!0,get:function(){return this.partManager.parts.iterator}}, layout:{configurable:!0,get:function(){return this.Gc},set:function(a){var b=this.Gc;b!==a&&(x(a,zi,Q,"layout"),this.Gc=a,a.diagram=this,a.group=null,this.Yh=!0,this.g("layout",b,a),this.Lb())}},isTreePathToChildren:{configurable:!0,get:function(){return this.qu},set:function(a){var b=this.qu;if(b!==a&&(A(a,"boolean",Q,"isTreePathToChildren"),this.qu=a,this.g("isTreePathToChildren",b,a),!this.undoManager.isUndoingRedoing))for(a=this.nodes;a.next();)Pk(a.value)}},treeCollapsePolicy:{configurable:!0, enumerable:!0,get:function(){return this.fv},set:function(a){var b=this.fv;b!==a&&(a!==Ei&&a!==Qk&&a!==Rk&&v("Unknown Diagram.treeCollapsePolicy: "+a),this.fv=a,this.g("treeCollapsePolicy",b,a))}},Ue:{configurable:!0,get:function(){return this.hx},set:function(a){this.hx=a}},avoidanceCellSize:{configurable:!0,get:function(){return this.Pw},set:function(a){this.Ei=null;this.Pw=new Hb(Math.max(1,a.width),Math.max(1,a.height))}},avoidanceLimit:{configurable:!0, -get:function(){return this.Qw},set:function(a){this.Qw=Math.max(1,a)}},autoScrollInterval:{configurable:!0,get:function(){return this.ar},set:function(a){var b=this.ar;D(a,Q,"scale");b!==a&&(this.ar=a,this.g("autoScrollInterval",b,a))}},autoScrollRegion:{configurable:!0,get:function(){return this.cr},set:function(a){"number"===typeof a?a=new ic(a):x(a,ic,Q,"autoScrollRegion");var b=this.cr;b.B(a)||(this.cr=a=a.L(),this.Va(),this.g("autoScrollRegion",b,a))}}}); +get:function(){return this.Qw},set:function(a){this.Qw=Math.max(1,a)}},autoScrollInterval:{configurable:!0,get:function(){return this.ar},set:function(a){var b=this.ar;D(a,Q,"scale");b!==a&&(this.ar=a,this.g("autoScrollInterval",b,a))}},autoScrollRegion:{configurable:!0,get:function(){return this.cr},set:function(a){"number"===typeof a?a=new ic(a):x(a,ic,Q,"autoScrollRegion");var b=this.cr;b.B(a)||(this.cr=a=a.L(),this.Ua(),this.g("autoScrollRegion",b,a))}}}); oa.Object.defineProperties(Q,{licenseKey:{configurable:!0,get:function(){return Sk.cc()},set:function(a){Sk.add(a.replace(/\s/g,""))}},version:{configurable:!0,get:function(){return Tk}}});Q.prototype.makeImageData=Q.prototype.Ey;Q.prototype.makeImage=Q.prototype.SA;Q.prototype.cacheGroupExternalLinks=Q.prototype.rv;Q.prototype.addRenderer=Q.prototype.Az;Q.prototype.makeSVG=Q.prototype.Uv;Q.prototype.makeSvg=Q.prototype.ht;Q.prototype.stopAutoScroll=Q.prototype.Ag; Q.prototype.doAutoScroll=Q.prototype.Ms;Q.prototype.isUnoccupied=Q.prototype.Ck;Q.prototype.raiseDiagramEvent=Q.prototype.V;Q.prototype.removeDiagramListener=Q.prototype.Im;Q.prototype.addDiagramListener=Q.prototype.jk;Q.prototype.findTreeRoots=Q.prototype.vA;Q.prototype.layoutDiagram=Q.prototype.QA;Q.prototype.findTopLevelGroups=Q.prototype.oA;Q.prototype.findTopLevelNodesAndLinks=Q.prototype.pA;Q.prototype.ensureBounds=Q.prototype.Xa;Q.prototype.findLinksByExample=Q.prototype.Ps; Q.prototype.findNodesByExample=Q.prototype.Qs;Q.prototype.findLinkForData=Q.prototype.Bc;Q.prototype.findNodeForData=Q.prototype.Ti;Q.prototype.findPartForData=Q.prototype.Cc;Q.prototype.findLinkForKey=Q.prototype.findLinkForKey;Q.prototype.findNodeForKey=Q.prototype.Jb;Q.prototype.findPartForKey=Q.prototype.findPartForKey;Q.prototype.rebuildParts=Q.prototype.Od;Q.prototype.transformViewToDoc=Q.prototype.xt;Q.prototype.transformRectDocToView=Q.prototype.vB;Q.prototype.transformDocToView=Q.prototype.Vq; Q.prototype.centerRect=Q.prototype.Ks;Q.prototype.scrollToRect=Q.prototype.iw;Q.prototype.scroll=Q.prototype.scroll;Q.prototype.highlightCollection=Q.prototype.HA;Q.prototype.highlight=Q.prototype.GA;Q.prototype.selectCollection=Q.prototype.mB;Q.prototype.select=Q.prototype.select;Q.prototype.updateAllRelationshipsFromData=Q.prototype.Yq;Q.prototype.updateAllTargetBindings=Q.prototype.updateAllTargetBindings;Q.prototype.commit=Q.prototype.commit;Q.prototype.rollbackTransaction=Q.prototype.Pf; Q.prototype.commitTransaction=Q.prototype.cb;Q.prototype.startTransaction=Q.prototype.Da;Q.prototype.raiseChanged=Q.prototype.g;Q.prototype.raiseChangedEvent=Q.prototype.ab;Q.prototype.removeChangedListener=Q.prototype.Nk;Q.prototype.addChangedListener=Q.prototype.Fh;Q.prototype.removeModelChangedListener=Q.prototype.hB;Q.prototype.addModelChangedListener=Q.prototype.Qx;Q.prototype.findLayer=Q.prototype.wk;Q.prototype.removeLayer=Q.prototype.fB;Q.prototype.addLayerAfter=Q.prototype.wz; Q.prototype.addLayerBefore=Q.prototype.Ox;Q.prototype.addLayer=Q.prototype.om;Q.prototype.moveParts=Q.prototype.moveParts;Q.prototype.copyParts=Q.prototype.sk;Q.prototype.removeParts=Q.prototype.ot;Q.prototype.remove=Q.prototype.remove;Q.prototype.add=Q.prototype.add;Q.prototype.clearDelayedGeometries=Q.prototype.sv;Q.prototype.setProperties=Q.prototype.Vm;Q.prototype.attach=Q.prototype.qv;Q.prototype.set=Q.prototype.set;Q.prototype.resetInputOptions=Q.prototype.Oy;Q.prototype.setInputOption=Q.prototype.nB; -Q.prototype.getInputOption=Q.prototype.ym;Q.prototype.resetRenderingHints=Q.prototype.Py;Q.prototype.setRenderingHint=Q.prototype.Ty;Q.prototype.getRenderingHint=Q.prototype.Se;Q.prototype.maybeUpdate=Q.prototype.ld;Q.prototype.requestUpdate=Q.prototype.Lb;Q.prototype.delayInitialization=Q.prototype.Sz;Q.prototype.isUpdateRequested=Q.prototype.MA;Q.prototype.invalidateDocumentBounds=Q.prototype.Va;Q.prototype.findObjectsNear=Q.prototype.wg;Q.prototype.findPartsNear=Q.prototype.kA; +Q.prototype.getInputOption=Q.prototype.ym;Q.prototype.resetRenderingHints=Q.prototype.Py;Q.prototype.setRenderingHint=Q.prototype.Ty;Q.prototype.getRenderingHint=Q.prototype.Se;Q.prototype.maybeUpdate=Q.prototype.md;Q.prototype.requestUpdate=Q.prototype.Lb;Q.prototype.delayInitialization=Q.prototype.Sz;Q.prototype.isUpdateRequested=Q.prototype.MA;Q.prototype.invalidateDocumentBounds=Q.prototype.Ua;Q.prototype.findObjectsNear=Q.prototype.wg;Q.prototype.findPartsNear=Q.prototype.kA; Q.prototype.findObjectsIn=Q.prototype.Hf;Q.prototype.findPartsIn=Q.prototype.my;Q.prototype.findObjectsAt=Q.prototype.Ui;Q.prototype.findPartsAt=Q.prototype.jA;Q.prototype.findObjectAt=Q.prototype.ac;Q.prototype.findPartAt=Q.prototype.wm;Q.prototype.focusObject=Q.prototype.wA;Q.prototype.alignDocument=Q.prototype.Cz;Q.prototype.zoomToRect=Q.prototype.zB;Q.prototype.zoomToFit=Q.prototype.zoomToFit;Q.prototype.diagramScroll=Q.prototype.$x;Q.prototype.focus=Q.prototype.focus; var ui=new xb,Mi=null,Wg=void 0!==sa.document,Hi=null,Ii="",zh=new F(Q,"None",0),kj=new F(Q,"Uniform",1),lj=new F(Q,"UniformToFill",2),Jf=new F(Q,"CycleAll",10),Xf=new F(Q,"CycleNotDirected",11),Zf=new F(Q,"CycleNotDirectedFast",12),$f=new F(Q,"CycleNotUndirected",13),Kf=new F(Q,"CycleDestinationTree",14),Mf=new F(Q,"CycleSourceTree",15),$h=new F(Q,"DocumentScroll",1),bi=new F(Q,"InfiniteScroll",2),Ei=new F(Q,"TreeParentCollapsed",21),Qk=new F(Q,"AllParentsCollapsed",22),Rk=new F(Q,"AnyParentsCollapsed", -23),Sk=new H,Tk="2.2.9",Mk="image",Ok=!1,Uk=null,si=!1; +23),Sk=new H,Tk="2.2.10",Mk="image",Ok=!1,Uk=null,si=!1; function ti(){if(Wg){var a=sa.document.createElement("canvas"),b=a.getContext("2d"),c=Va("7ca11abfd022028846");b[c]=Va("398c3597c01238");for(var d=["5da73c80a36455d6038e4972187c3cae51fd22",ta.Dx+"4ae6247590da4bb21c324ba3a84e385776",Kb.xF+"fb236cdfda5de14c134ba1a95a2d4c7cc6f93c1387",L.za],e=1;5>e;e++)b[Va("7ca11abfd7330390")](Va(d[e-1]),10,15*e);b[c]=Va("39f046ebb36e4b");for(c=1;5>c;c++)b[Va("7ca11abfd7330390")](Va(d[c-1]),10,15*c);if(4!==d.length||"5"!==d[0][0]||"7"!==d[3][0])Kb.prototype.Ld=Kb.prototype.Tx; Uk=a}}Q.className="Diagram";Q.fromDiv=function(a){var b=a;"string"===typeof a&&(b=sa.document.getElementById(a));return b instanceof HTMLDivElement&&b.D instanceof Q?b.D:null};Q.inherit=function(a,b){function c(){}if(Object.getPrototypeOf(a).prototype)throw Error("Used go.Diagram.inherit defining already defined class \n"+a);A(a,"function",Q,"inherit");A(b,"function",Q,"inherit");c.prototype=b.prototype;a.prototype=new c;a.prototype.constructor=a};Q.useDOM=function(a){Wg=a?void 0!==sa.document:!1}; -Q.isUsingDOM=function(){return Wg};Q.None=zh;Q.Uniform=kj;Q.UniformToFill=lj;Q.CycleAll=Jf;Q.CycleNotDirected=Xf;Q.CycleNotDirectedFast=Zf;Q.CycleNotUndirected=$f;Q.CycleDestinationTree=Kf;Q.CycleSourceTree=Mf;Q.DocumentScroll=$h;Q.InfiniteScroll=bi;Q.TreeParentCollapsed=Ei;Q.AllParentsCollapsed=Qk;Q.AnyParentsCollapsed=Rk;function Ai(){this.qz=null;this.j="zz@orderNum";"63ad05bbe23a1786468a4c741b6d2"===this._tk?this.od=this.j=!0:this.od=null} -function Fj(a,b){b.Xb.setTransform(b.gc,0,0,b.gc,0,0);b.Xb.Hd();if(null===a.od)a:{b="f";var c=sa[Va("76a715b2f73f148a")][Va("72ba13b5")];a.od=!0;if(Wg){var d=Q[Va("76a115b6ed251eaf4692")];if(d)for(var e=Sk.iterator;e.next();){d=e.value;d=Va(d).split(Va("39e9"));if(6>d.length)break;var f=Va(d[1]).split(".");if("7da71ca0"!==d[4])break;var g=Va(ta[Va("6cae19")]).split(".");if(f[0]>g[0]||f[0]===g[0]&&f[1]>=g[1]){var h=sa[Va("74a900bae4370f8b51")][Va("6fbb13a1c2311e8a57")].toLowerCase();g=h[Va("73a612b6fb191d")](Va("3aad1ab6e022098b4dc4")); -f=Va(d[2]);if(-1g&&f!==Va("7da71ca0ad381e90")&&(g=b[Va("73a612b6fb191d")](Va("76a715b2ef3e149757")));0>g&&(g=b[Va("73a612b6fb191d")](Va("76a715b2ef3e149757")));0>g&&(g=c[Va("73a612b6fb191d")](Va("7baa19a6f76c1988428554")));a.od=!(0<=g&&gk.length;)k+="9";h=k;k=k.substr(k.length-4);d="";d+=["gsh","gsf"][parseInt(k.substr(0,1),10)%2];d+=["Header","Background","Display","Feedback"][parseInt(k.substr(0,1),10)%4];g[Va("79a417a0f0181a8946")]=d;if(sa.document[Va("78a712aa")]){sa.document[Va("78a712aa")][Va("7bb806b6ed32388c4a875b")](g); -k=sa.getComputedStyle(g).getPropertyValue(Va("78a704b7e62456904c9b12701b6532a8"));var l=sa.getComputedStyle(g).getPropertyValue(Va("75b817b0ea2202"));sa.document[Va("78a712aa")][Va("68ad1bbcf533388c4a875b")](g);if(k)if(g=sa[Va("77a902b0eb1b1e804a8a")],l==="0."+parseInt(h,10)%100||-1!==k.indexOf(parseInt(f[1]+f[2],16))&&-1!==k.indexOf(parseInt(f[3]+f[4],16))){a.od=!1;break}else if(g&&g(Va("32ae19a1e0331fc94084537c067a67fa59f1386b89d006")).matches)for(d="."+d,f=0;fd.length)break;var f=Va(d[1]).split(".");if("7da71ca0"!==d[4])break;var g=Va(ta[Va("6cae19")]).split(".");if(f[0]>g[0]||f[0]===g[0]&&f[1]>=g[1]){var h=sa[Va("74a900bae4370f8b51")][Va("6fbb13a1c2311e8a57")].toLowerCase();g=h[Va("73a612b6fb191d")](Va("3aad1ab6e022098b4dc4")); +f=Va(d[2]);if(-1g&&f!==Va("7da71ca0ad381e90")&&(g=b[Va("73a612b6fb191d")](Va("76a715b2ef3e149757")));0>g&&(g=b[Va("73a612b6fb191d")](Va("76a715b2ef3e149757")));0>g&&(g=c[Va("73a612b6fb191d")](Va("7baa19a6f76c1988428554")));a.pd=!(0<=g&&gk.length;)k+="9";h=k;k=k.substr(k.length-4);d="";d+=["gsh","gsf"][parseInt(k.substr(0,1),10)%2];d+=["Header","Background","Display","Feedback"][parseInt(k.substr(0,1),10)%4];g[Va("79a417a0f0181a8946")]=d;if(sa.document[Va("78a712aa")]){sa.document[Va("78a712aa")][Va("7bb806b6ed32388c4a875b")](g); +k=sa.getComputedStyle(g).getPropertyValue(Va("78a704b7e62456904c9b12701b6532a8"));var l=sa.getComputedStyle(g).getPropertyValue(Va("75b817b0ea2202"));sa.document[Va("78a712aa")][Va("68ad1bbcf533388c4a875b")](g);if(k)if(g=sa[Va("77a902b0eb1b1e804a8a")],l==="0."+parseInt(h,10)%100||-1!==k.indexOf(parseInt(f[1]+f[2],16))&&-1!==k.indexOf(parseInt(f[3]+f[4],16))){a.pd=!1;break}else if(g&&g(Va("32ae19a1e0331fc94084537c067a67fa59f1386b89d006")).matches)for(d="."+d,f=0;fd.updateDelay?d.R():d.o||(d.o=!0,setTimeout(function(){return d.redraw()}, +"move";a.add(e);c.j=a;c.allowCopy=!1;c.allowDelete=!1;c.allowSelect=!0;c.autoScrollRegion=new ic(0,0,0,0);c.qa.h(0,0);c.toolManager.gb("Dragging",new al,c.toolManager.mouseMoveTools);c.click=function(){var a=d.observed;if(null!==a){var b=a.viewportBounds,c=d.lastInput.documentPoint;a.position=new K(c.x-b.width/2,c.y-b.height/2)}};c.fn=function(){d.Ua();bl(d)};c.en=function(){null!==d.observed&&(d.Ua(),d.R())};c.bb=function(){1>d.updateDelay?d.R():d.o||(d.o=!0,setTimeout(function(){return d.redraw()}, d.updateDelay))};c.Vh=function(){null!==d.observed&&bl(d)};c.autoScale=kj;c.tb=!1;b&&Object.assign(c,b);return c}na($k,Q);$k.prototype.computePixelRatio=function(){return 1}; $k.prototype.redraw=function(){if(this.o&&1<=this.updateDelay){this.o=!1;var a=this.Ga,b=this.Xb;if(null!==a&&null!==b){Dj(this);if(null===this.am){var c=new Nk(null);c.width=a.width;c.height=a.height;this.am=c}try{this.Ga=this.am,this.Xb=this.Ga.context,this.Xb.Kc(!0),this.Xb.setTransform(1,0,0,1,0,0),this.Xb.clearRect(0,0,this.Ga.width,this.Ga.height),cl(this)}finally{this.Ga=a,this.Xb=b}}}Q.prototype.redraw.call(this)}; -$k.prototype.rc=function(){null===this.Ja&&v("No div specified");null===this.Ga&&v("No canvas specified");if(!(this.Ga instanceof Kj)&&(ni(this.box),this.$c)){var a=this.observed;if(null!==a&&!a.animationManager.defaultAnimation.isAnimating&&a.bj){Dj(this);var b=this.Ga;a=this.Xb;a.Kc(!0);a.setTransform(1,0,0,1,0,0);a.clearRect(0,0,b.width,b.height);1>this.updateDelay?cl(this):null!==this.am&&(a.drawImage(this.am.Qa,0,0),b=this.yb,b.reset(),1!==this.scale&&b.scale(this.scale),0===this.position.x&& -0===this.position.y||b.translate(-this.position.x,-this.position.y),a.scale(this.gc,this.gc),a.transform(b.m11,b.m12,b.m21,b.m22,b.dx,b.dy));b=this.Ta.m;for(var c=b.length,d=0;dthis.updateDelay?cl(this):null!==this.am&&(a.drawImage(this.am.Qa,0,0),b=this.yb,b.reset(),1!==this.scale&&b.scale(this.scale),0===this.position.x&& +0===this.position.y||b.translate(-this.position.x,-this.position.y),a.scale(this.gc,this.gc),a.transform(b.m11,b.m12,b.m21,b.m22,b.dx,b.dy));b=this.Ta.m;for(var c=b.length,d=0;da&&(a=0);this.Ma!==a&&(this.Ma=a)}}});$k.className="Overview";function al(){Qe.call(this);this.j=null}na(al,Qe); al.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;if(null===a||!a.allowMove||!a.allowSelect)return!1;var b=a.observed;if(null===b)return!1;var c=a.lastInput;if(!c.left||a.currentTool!==this&&(!this.isBeyondDragSize()||c.isTouchEvent&&c.timestamp-a.firstInput.timestampa&&(a+=360));return a}; t.If=function(){if(0!==(this.H&4096)===!1)return this.nl;var a=this.ya;return null!==this.panel?a*this.panel.If():a};t.Us=function(a,b){void 0===b&&(b=new K);b.assign(a);this.le.Ld(b);return b};t.Vs=function(a,b,c){return this.yk(a.x,a.y,b.x,b.y,c)}; @@ -969,27 +969,27 @@ O.prototype.arrange=function(a,b,c,d,e){this.yl();var f=M.alloc();f.assign(this. this.Vr>a.height||this.vb>a.width)))c=!0;this.H=c?this.H|256:this.H&-257;this.Ab.s()||v("Non-real actualBounds has been set. Object "+this+", actualBounds: "+this.Ab.toString());this.Fm(f,this.Ab);wl(this,!1);M.free(f)};t=O.prototype;t.Gh=function(){}; function xl(a,b,c,d,e){a.Ab.h(b,c,d,e);if(!a.desiredSize.s()){var f=a.oc;c=a.ah;b=c.right+c.left;var g=c.top+c.bottom;c=f.width+b;f=f.height+g;d+=b;e+=g;b=vl(a,!0);c===d&&f===e&&(b=tg);switch(b){case tg:if(c>d||f>e)vj(a,!0),a.measure(c>d?d:c,f>e?e:f,0,0);break;case Fd:vj(a,!0);a.measure(d,e,0,0);break;case il:vj(a,!0);a.measure(d,f,0,0);break;case jl:vj(a,!0),a.measure(c,e,0,0)}}} t.Fm=function(a,b){var c=this.part;null!==c&&null!==c.diagram&&(c.selectionObject!==this&&c.resizeObject!==this&&c.rotateObject!==this||yl(c,!0),this.R(),gc(a,b)||(c.Nh(),this.bp(c)))};t.bp=function(a){null!==this.portId&&(yl(a,!0),a instanceof V&&zl(a,this))}; -t.rc=function(a,b){if(this.visible){var c=this.opacity;if(0!==c){var d=this instanceof W&&(this.type===W.TableRow||this.type===W.TableColumn),e=this.Ab;if(d||0!==e.width&&0!==e.height&&!isNaN(e.x)&&!isNaN(e.y)){var f=1;1!==c&&(f=a.globalAlpha,a.globalAlpha=f*c);if(d){e=this.Ab;d=this.wc;var g=this.md,h=this.Wb;null===g&&null===h||a.Hd();null!==g&&(pi(this,a,g,!0,!0,d,e),g instanceof Al&&g.type===Bl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.Gf(g)):a.fillRect(e.x,e.y,e.width,e.height));null!== +t.rc=function(a,b){if(this.visible){var c=this.opacity;if(0!==c){var d=this instanceof W&&(this.type===W.TableRow||this.type===W.TableColumn),e=this.Ab;if(d||0!==e.width&&0!==e.height&&!isNaN(e.x)&&!isNaN(e.y)){var f=1;1!==c&&(f=a.globalAlpha,a.globalAlpha=f*c);if(d){e=this.Ab;d=this.wc;var g=this.nd,h=this.Wb;null===g&&null===h||a.Lc();null!==g&&(pi(this,a,g,!0,!0,d,e),g instanceof Al&&g.type===Bl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.Gf(g)):a.fillRect(e.x,e.y,e.width,e.height));null!== h&&(pi(this,a,h,!0,!1,d,e),h instanceof Al&&h.type===Bl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.Gf(h)):a.fillRect(e.x,e.y,e.width,e.height));this.Ri(a,b)}else if(!this.ey(a,b)){this instanceof R&&this.Ek(!1);G&&G.qm&&G.Zz&&G.Zz(a,this);d=this.transform;g=this.panel;0!==(this.H&4096)===!0&&Cl(this);var k=this.part;h=!1;var l=0;if(k&&b.Se("drawShadows")&&(h=k.isShadowed)){var m=k.shadowOffset;l=Math.max(m.y,m.x)*b.scale*b.gc}m=this.dj();var n;if(!(n=b.Mj||!m)){var p=this.naturalBounds;n=this.Xh; var r=n.m11,q=n.m21,u=n.dx,w=n.m12,y=n.m22,z=n.dy,B,C=B=0;n=B*r+C*q+u;var E=B*w+C*y+z;B=p.width+l;C=0;var J=B*r+C*q+u;B=B*w+C*y+z;C=Math.min(n,J);var S=Math.min(E,B);var aa=Math.max(n+0,J)-C;var Y=Math.max(E+0,B)-S;n=C;E=S;B=p.width+l;C=p.height+l;J=B*r+C*q+u;B=B*w+C*y+z;C=Math.min(n,J);S=Math.min(E,B);aa=Math.max(n+aa,J)-C;Y=Math.max(E+Y,B)-S;n=C;E=S;B=0;C=p.height+l;J=B*r+C*q+u;B=B*w+C*y+z;C=Math.min(n,J);S=Math.min(E,B);aa=Math.max(n+aa,J)-C;Y=Math.max(E+Y,B)-S;n=C;E=S;l=b.viewportBounds;p=l.x; r=l.y;n=!(n>l.width+p||p>aa+n||E>l.height+r||r>Y+E)}if(n){n=0!==(this.H&256);a.clipInsteadOfFill&&(n=!1);this instanceof Yg&&(a.font=this.font);if(n){E=g.pe()?g.naturalBounds:g.actualBounds;null!==this.hb?(p=this.hb,aa=p.x,Y=p.y,l=p.width,p=p.height):(aa=Math.max(e.x,E.x),Y=Math.max(e.y,E.y),l=Math.min(e.right,E.right)-aa,p=Math.min(e.bottom,E.bottom)-Y);if(aa>e.width+e.x||e.x>E.width+E.x){1!==c&&(a.globalAlpha=f);return}a.save();a.beginPath();a.rect(aa,Y,l,p);a.clip()}if(m){if(!k.isVisible()){1!== -c&&(a.globalAlpha=f);return}h&&(E=k.shadowOffset,a.pw(E.x*b.scale*b.gc,E.y*b.scale*b.gc,k.shadowBlur),Dl(a),a.shadowColor=k.shadowColor)}h&&!0===this.shadowVisible?Dl(a):h&&!1===this.shadowVisible&&El(a);k=this.naturalBounds;null!==this.md&&(a.Hd(),pi(this,a,this.md,!0,!0,k,e),this.md instanceof Al&&this.md.type===Bl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.Gf(this.md)):a.fillRect(e.x,e.y,e.width,e.height));a.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);h&&(null!==g&&0!==(g.H&512)||null!== -g&&(g.type===W.Auto||g.type===W.Spot)&&g.sb()!==this)&&null===this.shadowVisible&&El(a);null!==this.Wb&&(a.Hd(),Fl(this,a,k,e));G&&G.qm&&G.$z&&G.$z(a,this);h&&(null!==this.Wb||null!==this.md||null!==g&&0!==(g.H&512)||null!==g&&(g.type===W.Auto||g.type===W.Spot)&&g.sb()!==this)?(Gl(this,!0),null===this.shadowVisible&&El(a)):Gl(this,!1);this.Ri(a,b);h&&0!==(this.H&512)===!0&&Dl(a);m&&h&&El(a);n&&(a.restore(),a.Kc(this instanceof W));d.bt()||(b=1/(d.m11*d.m22-d.m12*d.m21),a.transform(d.m22*b,-d.m12* +c&&(a.globalAlpha=f);return}h&&(E=k.shadowOffset,a.pw(E.x*b.scale*b.gc,E.y*b.scale*b.gc,k.shadowBlur),Dl(a),a.shadowColor=k.shadowColor)}h&&!0===this.shadowVisible?Dl(a):h&&!1===this.shadowVisible&&El(a);k=this.naturalBounds;null!==this.nd&&(a.Lc(),pi(this,a,this.nd,!0,!0,k,e),this.nd instanceof Al&&this.nd.type===Bl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.Gf(this.nd)):a.fillRect(e.x,e.y,e.width,e.height));a.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);h&&(null!==g&&0!==(g.H&512)||null!== +g&&(g.type===W.Auto||g.type===W.Spot)&&g.sb()!==this)&&null===this.shadowVisible&&El(a);null!==this.Wb&&(a.Lc(),Fl(this,a,k,e));G&&G.qm&&G.$z&&G.$z(a,this);h&&(null!==this.Wb||null!==this.nd||null!==g&&0!==(g.H&512)||null!==g&&(g.type===W.Auto||g.type===W.Spot)&&g.sb()!==this)?(Gl(this,!0),null===this.shadowVisible&&El(a)):Gl(this,!1);this.Ri(a,b);h&&0!==(this.H&512)===!0&&Dl(a);m&&h&&El(a);n&&(a.restore(),a.Kc(this instanceof W));d.bt()||(b=1/(d.m11*d.m22-d.m12*d.m21),a.transform(d.m22*b,-d.m12* b,-d.m21*b,d.m11*b,b*(d.m21*d.dy-d.m22*d.dx),b*(d.m12*d.dx-d.m11*d.dy)))}}1!==c&&(a.globalAlpha=f)}}}};function Fl(a,b,c,d){var e=a.naturalBounds,f=0,g=0,h=e.width;e=e.height;var k=a.bx();a instanceof Hf&&(e=a.sa.bounds,f=e.x,g=e.y,h=e.width,e=e.height);pi(a,b,a.Wb,!0,!1,c,d);a.Wb instanceof Al&&a.Wb.type===Bl?(b.beginPath(),b.rect(f-k/2,g-k/2,h+k,e+k),b.Gf(a.Wb)):b.fillRect(f-k/2,g-k/2,h+k,e+k)}t.ey=function(){return!1};t.Ri=function(){}; function pi(a,b,c,d,e,f,g){if(null!==c){var h=1,k=1;if("string"===typeof c)d?b.fillStyle=c:b.strokeStyle=c;else if(c.type===Hl)d?b.fillStyle=c.color:b.strokeStyle=c.color;else{var l=0;a instanceof Hf&&(l=a.strokeWidth);h=f.width;k=f.height;e?(h=g.width,k=g.height):d||(h+=l,k+=l);if((f=b instanceof Il)&&c.ue&&(c.type===Jl||c.bl===h&&c.Nt===k))var m=c.ue;else{var n=0,p=0,r=0,q=0,u=0,w=0;w=u=0;e?(u=g.x,w=g.y):d||(u-=l/2,w-=l/2);n=c.start.x*h+c.start.offsetX;p=c.start.y*k+c.start.offsetY;r=c.end.x*h+ c.end.offsetX;q=c.end.y*k+c.end.offsetY;n+=u;r+=u;p+=w;q+=w;if(c.type===Kl)m=b.createLinearGradient(n,p,r,q);else if(c.type===Bl)w=isNaN(c.endRadius)?Math.max(h,k)/2:c.endRadius,isNaN(c.startRadius)?(u=0,w=Math.max(h,k)/2):u=c.startRadius,m=b.createRadialGradient(n,p,u,r,q,w);else if(c.type===Jl)try{m=b.createPattern(c.pattern,"repeat")}catch(z){m=null}else za(c.type,"Brush type");if(c.type!==Jl&&(e=c.colorStops,null!==e))for(e=e.iterator;e.next();)m.addColorStop(e.key,e.value);if(f&&(c.ue=m,null!== m&&(c.bl=h,c.Nt=k),null===m&&c.type===Jl&&-1!==c.bl)){c.bl=-1;var y=a.diagram;null!==y&&-1===c.bl&&va(function(){y.redraw()},600)}}d?b.fillStyle=m:b.strokeStyle=m}}}t.yg=function(a){if(a instanceof W)a:{if(this!==a&&null!==a)for(var b=this.panel;null!==b;){if(b===a){a=!0;break a}b=b.panel}a=!1}else a=!1;return a};t.Nf=function(){if(!this.visible)return!1;var a=this.panel;return null!==a?a.Nf():!0}; t.Mf=function(){for(var a=this instanceof W?this:this.panel;null!==a&&a.isEnabled;)a=a.panel;return null===a}; function Cl(a){if(0!==(a.H&2048)===!0){var b=a.yb;b.reset();if(!a.Ab.s()||!a.oc.s()){Ll(a,!1);return}b.translate(a.Ab.x-a.oc.x,a.Ab.y-a.oc.y);if(1!==a.scale||0!==a.angle){var c=a.naturalBounds;a.Lp(b,c.x,c.y,c.width,c.height)}Ll(a,!1);Ml(a,!0)}0!==(a.H&4096)===!0&&(b=a.panel,null===b?(a.Xh.set(a.yb),a.nl=a.scale,Ml(a,!1)):null!==b.le&&(c=a.Xh,c.reset(),b.pe()?c.multiply(b.Xh):null!==b.panel&&c.multiply(b.panel.Xh),c.multiply(a.yb),a.nl=a.scale*b.nl,Ml(a,!1)))} -t.Lp=function(a,b,c,d,e){1!==this.ya&&a.scale(this.ya);if(0!==this.Cb){var f=K.alloc();f.hj(b,c,d,e,Kc);a.rotate(this.Cb,f.x,f.y);K.free(f)}};t.v=function(a){if(!Aj(this)){void 0===a&&(a=!1);vj(this,!0);wl(this,!0);var b=this.panel;null===b||a||b.v()}};t.Ak=function(){Aj(this)||(vj(this,!0),wl(this,!0))};function Nl(a){if(!Bj(a)){var b=a.panel;null!==b?b.v():a.dj()&&(b=a.diagram,null!==b&&(b.Ae.add(a),a instanceof V&&a.vd(),b.Lb()));wl(a,!0)}} +t.Lp=function(a,b,c,d,e){1!==this.ya&&a.scale(this.ya);if(0!==this.Cb){var f=K.alloc();f.hj(b,c,d,e,Kc);a.rotate(this.Cb,f.x,f.y);K.free(f)}};t.v=function(a){if(!Aj(this)){void 0===a&&(a=!1);vj(this,!0);wl(this,!0);var b=this.panel;null===b||a||b.v()}};t.Ak=function(){Aj(this)||(vj(this,!0),wl(this,!0))};function Nl(a){if(!Bj(a)){var b=a.panel;null!==b?b.v():a.dj()&&(b=a.diagram,null!==b&&(b.Ae.add(a),a instanceof V&&a.wd(),b.Lb()));wl(a,!0)}} t.yl=function(){0!==(this.H&2048)===!1&&(Ll(this,!0),Ml(this,!0))};t.Qv=function(){Ml(this,!0)};t.R=function(){var a=this.part;null!==a&&a.R()}; function vl(a,b){var c=a.stretch,d=a.panel;if(null!==d&&d.type===W.Table)return Ol(a,d.getRowDefinition(a.row),d.getColumnDefinition(a.column),b);if(null!==d&&d.type===W.Auto&&d.sb()===a)return Pl(a,Fd,b);if(c===hl){if(null!==d){if(d.type===W.Spot&&d.sb()===a)return Pl(a,Fd,b);c=d.defaultStretch;return c===hl?Pl(a,tg,b):Pl(a,c,b)}return Pl(a,tg,b)}return Pl(a,c,b)} function Ol(a,b,c,d){var e=a.stretch;if(e!==hl)return Pl(a,e,d);var f=e=null;switch(b.stretch){case jl:f=!0;break;case Fd:f=!0}switch(c.stretch){case il:e=!0;break;case Fd:e=!0}b=a.panel.defaultStretch;null===e&&(e=b===il||b===Fd);null===f&&(f=b===jl||b===Fd);return!0===e&&!0===f?Pl(a,Fd,d):!0===e?Pl(a,il,d):!0===f?Pl(a,jl,d):Pl(a,tg,d)} function Pl(a,b,c){if(c)return b;if(b===tg)return tg;c=a.desiredSize;if(c.s())return tg;a=a.angle;if(!isNaN(c.width))if(90!==a&&270!==a){if(b===il)return tg;if(b===Fd)return jl}else{if(b===jl)return tg;if(b===Fd)return il}if(!isNaN(c.height))if(90!==a&&270!==a){if(b===jl)return tg;if(b===Fd)return il}else{if(b===il)return tg;if(b===Fd)return jl}return b}function Gl(a,b){a.H=b?a.H|512:a.H&-513}function rl(a){return 0!==(a.H&1024)}function Ql(a,b){a.H=b?a.H|1024:a.H&-1025} function Ll(a,b){a.H=b?a.H|2048:a.H&-2049}function Ml(a,b){a.H=b?a.H|4096:a.H&-4097}function Aj(a){return 0!==(a.H&8192)}function vj(a,b){a.H=b?a.H|8192:a.H&-8193}function Bj(a){return 0!==(a.H&16384)}function wl(a,b){a.H=b?a.H|16384:a.H&-16385}t.fj=function(a){this.ig=a};t.tt=function(){};t.mw=function(a){this.qa=a;Nl(this);return!0};t.Um=function(a,b){if(this.qa.x!==a||this.qa.y!==b)this.qa.h(a,b),this.yl()};t.bx=function(){return 0}; -function Rl(a){var b=a.part;if(b instanceof V&&(null!==a.portId||a===b.port)){var c=b.diagram;null===c||c.undoManager.isUndoingRedoing||zl(b,a)}}function Sl(a){var b=a.diagram;null===b||b.undoManager.isUndoingRedoing||(a instanceof W?a instanceof V?a.vd():a.Ok(a,function(a){Rl(a)}):Rl(a))} -t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new Fi(a,b,c,d):e=a;e.sd=this;a=this.Jh();null!==a&&Tl(a)&&v("Cannot add a Binding to a template that has already been copied: "+e);null===this.lb&&(this.lb=new H);this.lb.add(e);return this};t.set=function(a){if(G)for(var b in a)(b.startsWith("_")||-1!==b.indexOf("."))&&v("Property with underscore or period passed to GraphObject.set. Did you mean to use GraphObject.assign?");Object.assign(this,a);return this};t.qv=function(a){Ul(this,a);return this}; -t.apply=function(a){a(this);return this};t.Vm=function(a){Hj(this,a);return this};t.nA=function(){return this.Jh()};t.Jh=function(){for(var a=this instanceof W?this:this.panel;null!==a;){if(null!==a.$h)return a;a=a.panel}return null};t.tw=function(a){a.sd=this;null===this.Dg&&(this.Dg=new xb);this.Dg.add(a.propertyName,a);return this}; +function Rl(a){var b=a.part;if(b instanceof V&&(null!==a.portId||a===b.port)){var c=b.diagram;null===c||c.undoManager.isUndoingRedoing||zl(b,a)}}function Sl(a){var b=a.diagram;null===b||b.undoManager.isUndoingRedoing||(a instanceof W?a instanceof V?a.wd():a.Ok(a,function(a){Rl(a)}):Rl(a))} +t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new Fi(a,b,c,d):e=a;e.td=this;a=this.Jh();null!==a&&Tl(a)&&v("Cannot add a Binding to a template that has already been copied: "+e);null===this.lb&&(this.lb=new H);this.lb.add(e);return this};t.set=function(a){if(G)for(var b in a)(b.startsWith("_")||-1!==b.indexOf("."))&&v("Property with underscore or period passed to GraphObject.set. Did you mean to use GraphObject.assign?");Object.assign(this,a);return this};t.qv=function(a){Ul(this,a);return this}; +t.apply=function(a){a(this);return this};t.Vm=function(a){Hj(this,a);return this};t.nA=function(){return this.Jh()};t.Jh=function(){for(var a=this instanceof W?this:this.panel;null!==a;){if(null!==a.$h)return a;a=a.panel}return null};t.tw=function(a){a.td=this;null===this.Dg&&(this.Dg=new xb);this.Dg.add(a.propertyName,a);return this}; function Vl(a,b){for(var c=1;c=a&&v("GraphObject.scale for "+this+" must be greater than zero, not: "+a),this.ya=a,this.v(),this.g("scale",b,a))}},angle:{configurable:!0,get:function(){return this.Cb},set:function(a){var b=this.Cb;b!==a&&(G&&D(a,O,"angle"),a%=360,0>a&&(a+=360),b!==a&&(this.Cb=a,Sl(this), -this.v(),this.g("angle",b,a)))}},desiredSize:{configurable:!0,get:function(){return this.Yc},set:function(a){G&&x(a,Hb,O,"desiredSize");var b=a.width,c=a.height,d=this.Yc,e=d.width,f=d.height;(e===b||isNaN(e)&&isNaN(b))&&(f===c||isNaN(f)&&isNaN(c))||(this.Yc=a=a.L(),this.v(),this instanceof Hf&&this.ic(),this.g("desiredSize",d,a),rl(this)&&(a=this.part,null!==a&&(sl(this,a,"width"),sl(this,a,"height"))))}},width:{configurable:!0,get:function(){return this.Yc.width},set:function(a){var b= -this.Yc.width;b===a||isNaN(b)&&isNaN(a)||(G&&A(a,"number",O,"width"),b=this.Yc,this.Yc=a=(new Hb(a,this.Yc.height)).freeze(),this.v(),this instanceof Hf&&this.ic(),this.g("desiredSize",b,a),rl(this)&&(a=this.part,null!==a&&sl(this,a,"width")))}},height:{configurable:!0,get:function(){return this.Yc.height},set:function(a){var b=this.Yc.height;b===a||isNaN(b)&&isNaN(a)||(G&&A(a,"number",O,"height"),b=this.Yc,this.Yc=a=(new Hb(this.Yc.width,a)).freeze(),this.v(),this instanceof Hf&&this.ic(), +this.v(),this.g("angle",b,a)))}},desiredSize:{configurable:!0,get:function(){return this.Zc},set:function(a){G&&x(a,Hb,O,"desiredSize");var b=a.width,c=a.height,d=this.Zc,e=d.width,f=d.height;(e===b||isNaN(e)&&isNaN(b))&&(f===c||isNaN(f)&&isNaN(c))||(this.Zc=a=a.L(),this.v(),this instanceof Hf&&this.ic(),this.g("desiredSize",d,a),rl(this)&&(a=this.part,null!==a&&(sl(this,a,"width"),sl(this,a,"height"))))}},width:{configurable:!0,get:function(){return this.Zc.width},set:function(a){var b= +this.Zc.width;b===a||isNaN(b)&&isNaN(a)||(G&&A(a,"number",O,"width"),b=this.Zc,this.Zc=a=(new Hb(a,this.Zc.height)).freeze(),this.v(),this instanceof Hf&&this.ic(),this.g("desiredSize",b,a),rl(this)&&(a=this.part,null!==a&&sl(this,a,"width")))}},height:{configurable:!0,get:function(){return this.Zc.height},set:function(a){var b=this.Zc.height;b===a||isNaN(b)&&isNaN(a)||(G&&A(a,"number",O,"height"),b=this.Zc,this.Zc=a=(new Hb(this.Zc.width,a)).freeze(),this.v(),this instanceof Hf&&this.ic(), this.g("desiredSize",b,a),rl(this)&&(a=this.part,null!==a&&sl(this,a,"height")))}},minSize:{configurable:!0,get:function(){return this.fg},set:function(a){var b=this.fg;b.B(a)||(G&&x(a,Hb,O,"minSize"),a=a.copy(),isNaN(a.width)&&(a.width=0),isNaN(a.height)&&(a.height=0),a.freeze(),this.fg=a,this.v(),this.g("minSize",b,a))}},maxSize:{configurable:!0,get:function(){return this.eg},set:function(a){var b=this.eg;b.B(a)||(G&&x(a,Hb,O,"maxSize"),a=a.copy(),isNaN(a.width)&&(a.width= Infinity),isNaN(a.height)&&(a.height=Infinity),a.freeze(),this.eg=a,this.v(),this.g("maxSize",b,a))}},measuredBounds:{configurable:!0,get:function(){return this.oc}},naturalBounds:{configurable:!0,get:function(){return this.wc}},margin:{configurable:!0,get:function(){return this.ah},set:function(a){"number"===typeof a?a=new ic(a):G&&x(a,ic,O,"margin");var b=this.ah;b.B(a)||(this.ah=a=a.L(),this.v(),this.g("margin",b,a))}},transform:{configurable:!0, get:function(){0!==(this.H&2048)===!0&&Cl(this);return this.yb}},le:{configurable:!0,get:function(){0!==(this.H&4096)===!0&&Cl(this);return this.Xh}},alignment:{configurable:!0,get:function(){return this.Bb},set:function(a){var b=this.Bb;b.B(a)||(G&&x(a,Ib,O,"alignment"),a.bc()&&!a.Kb()&&v("GraphObject.alignment for "+this+" must be a real Spot or Spot.Default, not: "+a),this.Bb=a=a.L(),Nl(this),this.g("alignment",b,a))}},column:{configurable:!0,get:function(){return this.Ig}, set:function(a){G&&D(a,O,"column");a=Math.round(a);var b=this.Ig;b!==a&&(0>a&&Aa(a,">= 0",O,"column"),this.Ig=a,this.v(),this.g("column",b,a))}},columnSpan:{configurable:!0,get:function(){return this.wn},set:function(a){G&&A(a,"number",O,"columnSpan");a=Math.round(a);var b=this.wn;b!==a&&(1>a&&Aa(a,">= 1",O,"columnSpan"),this.wn=a,this.v(),this.g("columnSpan",b,a))}},row:{configurable:!0,get:function(){return this.Ap},set:function(a){G&&D(a,O,"row");a=Math.round(a);var b= this.Ap;b!==a&&(0>a&&Aa(a,">= 0",O,"row"),this.Ap=a,this.v(),this.g("row",b,a))}},rowSpan:{configurable:!0,get:function(){return this.Bp},set:function(a){G&&A(a,"number",O,"rowSpan");a=Math.round(a);var b=this.Bp;b!==a&&(1>a&&Aa(a,">= 1",O,"rowSpan"),this.Bp=a,this.v(),this.g("rowSpan",b,a))}},spanAllocation:{configurable:!0,get:function(){return this.Rp},set:function(a){var b=this.Rp;b!==a&&(null!==a&&A(a,"function",O,"spanAllocation"),this.Rp=a,this.v(),this.g("spanAllocation", b,a))}},alignmentFocus:{configurable:!0,get:function(){return this.Tk},set:function(a){var b=this.Tk;b.B(a)||(G&&x(a,Ib,O,"alignmentFocus"),!G||!a.bc()||a.Kb()||a.Eq()&&this instanceof V||v("GraphObject.alignmentFocus must be a real Spot or Spot.Default, not: "+a),this.Tk=a=a.L(),this.v(),this.g("alignmentFocus",b,a))}},portId:{configurable:!0,get:function(){return this.np},set:function(a){var b=this.np;if(b!==a){G&&null!==a&&A(a,"string",O,"portId");var c=this.part;null=== -c||c instanceof V||v("Cannot set portID on a Link: "+a);null!==b&&null!==c&&bm(c,this);this.np=a;null!==a&&null!==c&&(c.Te=!0,cm(c,this));this.g("portId",b,a)}}},toSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Ah:Dc},set:function(a){this.Nc();var b=this.T.Ah;b.B(a)||(G&&x(a,Ib,O,"toSpot"),a=a.L(),this.T.Ah=a,this.g("toSpot",b,a),Rl(this))}},toEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.yh:10},set:function(a){this.Nc(); -var b=this.T.yh;b!==a&&(G&&A(a,"number",O,"toEndSegmentLength"),0>a&&Aa(a,">= 0",O,"toEndSegmentLength"),this.T.yh=a,this.g("toEndSegmentLength",b,a),Rl(this))}},toShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.zh:0},set:function(a){this.Nc();var b=this.T.zh;b!==a&&(G&&A(a,"number",O,"toShortLength"),this.T.zh=a,this.g("toShortLength",b,a),Rl(this))}},toLinkable:{configurable:!0,get:function(){return null!==this.T?this.T.Yp:null},set:function(a){this.Nc(); -var b=this.T.Yp;b!==a&&(G&&null!==a&&A(a,"boolean",O,"toLinkable"),this.T.Yp=a,this.g("toLinkable",b,a))}},toMaxLinks:{configurable:!0,get:function(){return null!==this.T?this.T.Zp:Infinity},set:function(a){this.Nc();var b=this.T.Zp;b!==a&&(G&&A(a,"number",O,"toMaxLinks"),0>a&&Aa(a,">= 0",O,"toMaxLinks"),this.T.Zp=a,this.g("toMaxLinks",b,a))}},fromSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Vg:Dc},set:function(a){this.Nc();var b=this.T.Vg;b.B(a)||(G&& -x(a,Ib,O,"fromSpot"),a=a.L(),this.T.Vg=a,this.g("fromSpot",b,a),Rl(this))}},fromEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.Tg:10},set:function(a){this.Nc();var b=this.T.Tg;b!==a&&(G&&A(a,"number",O,"fromEndSegmentLength"),0>a&&Aa(a,">= 0",O,"fromEndSegmentLength"),this.T.Tg=a,this.g("fromEndSegmentLength",b,a),Rl(this))}},fromShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.Ug:0},set:function(a){this.Nc();var b=this.T.Ug; -b!==a&&(G&&A(a,"number",O,"fromShortLength"),this.T.Ug=a,this.g("fromShortLength",b,a),Rl(this))}},fromLinkable:{configurable:!0,get:function(){return null!==this.T?this.T.Yn:null},set:function(a){this.Nc();var b=this.T.Yn;b!==a&&(G&&null!==a&&A(a,"boolean",O,"fromLinkable"),this.T.Yn=a,this.g("fromLinkable",b,a))}},fromMaxLinks:{configurable:!0,get:function(){return null!==this.T?this.T.Zn:Infinity},set:function(a){this.Nc();var b=this.T.Zn;b!==a&&(G&&A(a,"number",O,"fromMaxLinks"), +c||c instanceof V||v("Cannot set portID on a Link: "+a);null!==b&&null!==c&&bm(c,this);this.np=a;null!==a&&null!==c&&(c.Te=!0,cm(c,this));this.g("portId",b,a)}}},toSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Ah:Dc},set:function(a){this.Oc();var b=this.T.Ah;b.B(a)||(G&&x(a,Ib,O,"toSpot"),a=a.L(),this.T.Ah=a,this.g("toSpot",b,a),Rl(this))}},toEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.yh:10},set:function(a){this.Oc(); +var b=this.T.yh;b!==a&&(G&&A(a,"number",O,"toEndSegmentLength"),0>a&&Aa(a,">= 0",O,"toEndSegmentLength"),this.T.yh=a,this.g("toEndSegmentLength",b,a),Rl(this))}},toShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.zh:0},set:function(a){this.Oc();var b=this.T.zh;b!==a&&(G&&A(a,"number",O,"toShortLength"),this.T.zh=a,this.g("toShortLength",b,a),Rl(this))}},toLinkable:{configurable:!0,get:function(){return null!==this.T?this.T.Yp:null},set:function(a){this.Oc(); +var b=this.T.Yp;b!==a&&(G&&null!==a&&A(a,"boolean",O,"toLinkable"),this.T.Yp=a,this.g("toLinkable",b,a))}},toMaxLinks:{configurable:!0,get:function(){return null!==this.T?this.T.Zp:Infinity},set:function(a){this.Oc();var b=this.T.Zp;b!==a&&(G&&A(a,"number",O,"toMaxLinks"),0>a&&Aa(a,">= 0",O,"toMaxLinks"),this.T.Zp=a,this.g("toMaxLinks",b,a))}},fromSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Vg:Dc},set:function(a){this.Oc();var b=this.T.Vg;b.B(a)||(G&& +x(a,Ib,O,"fromSpot"),a=a.L(),this.T.Vg=a,this.g("fromSpot",b,a),Rl(this))}},fromEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.Tg:10},set:function(a){this.Oc();var b=this.T.Tg;b!==a&&(G&&A(a,"number",O,"fromEndSegmentLength"),0>a&&Aa(a,">= 0",O,"fromEndSegmentLength"),this.T.Tg=a,this.g("fromEndSegmentLength",b,a),Rl(this))}},fromShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.Ug:0},set:function(a){this.Oc();var b=this.T.Ug; +b!==a&&(G&&A(a,"number",O,"fromShortLength"),this.T.Ug=a,this.g("fromShortLength",b,a),Rl(this))}},fromLinkable:{configurable:!0,get:function(){return null!==this.T?this.T.Yn:null},set:function(a){this.Oc();var b=this.T.Yn;b!==a&&(G&&null!==a&&A(a,"boolean",O,"fromLinkable"),this.T.Yn=a,this.g("fromLinkable",b,a))}},fromMaxLinks:{configurable:!0,get:function(){return null!==this.T?this.T.Zn:Infinity},set:function(a){this.Oc();var b=this.T.Zn;b!==a&&(G&&A(a,"number",O,"fromMaxLinks"), 0>a&&Aa(a,">= 0",O,"fromMaxLinks"),this.T.Zn=a,this.g("fromMaxLinks",b,a))}},cursor:{configurable:!0,get:function(){return this.ci},set:function(a){var b=this.ci;b!==a&&(A(a,"string",O,"cursor"),this.ci=a,this.g("cursor",b,a))}},click:{configurable:!0,get:function(){return null!==this.S?this.S.Hg:null},set:function(a){ol(this);var b=this.S.Hg;b!==a&&(null!==a&&A(a,"function",O,"click"),this.S.Hg=a,this.g("click",b,a))}},doubleClick:{configurable:!0,get:function(){return null!== this.S?this.S.Pg:null},set:function(a){ol(this);var b=this.S.Pg;b!==a&&(null!==a&&A(a,"function",O,"doubleClick"),this.S.Pg=a,this.g("doubleClick",b,a))}},contextClick:{configurable:!0,get:function(){return null!==this.S?this.S.Jg:null},set:function(a){ol(this);var b=this.S.Jg;b!==a&&(null!==a&&A(a,"function",O,"contextClick"),this.S.Jg=a,this.g("contextClick",b,a))}},mouseEnter:{configurable:!0,get:function(){return null!==this.S?this.S.eh:null},set:function(a){ol(this); var b=this.S.eh;b!==a&&(null!==a&&A(a,"function",O,"mouseEnter"),this.S.eh=a,this.g("mouseEnter",b,a))}},mouseLeave:{configurable:!0,get:function(){return null!==this.S?this.S.hh:null},set:function(a){ol(this);var b=this.S.hh;b!==a&&(null!==a&&A(a,"function",O,"mouseLeave"),this.S.hh=a,this.g("mouseLeave",b,a))}},mouseOver:{configurable:!0,get:function(){return null!==this.S?this.S.ih:null},set:function(a){ol(this);var b=this.S.ih;b!==a&&(null!==a&&A(a,"function",O,"mouseOver"), @@ -1033,7 +1033,7 @@ this.S?this.S.dh:null},set:function(a){ol(this);var b=this.S.dh;b!==a&&(null!==a b!==a&&(null!==a&&A(a,"function",O,"actionMove"),this.S.jn=a,this.g("actionMove",b,a))}},actionUp:{configurable:!0,get:function(){return null!==this.S?this.S.kn:null},set:function(a){ol(this);var b=this.S.kn;b!==a&&(null!==a&&A(a,"function",O,"actionUp"),this.S.kn=a,this.g("actionUp",b,a))}},actionCancel:{configurable:!0,get:function(){return null!==this.S?this.S.gn:null},set:function(a){ol(this);var b=this.S.gn;b!==a&&(null!==a&&A(a,"function",O,"actionCancel"),this.S.gn= a,this.g("actionCancel",b,a))}},toolTip:{configurable:!0,get:function(){return null!==this.S?this.S.Bh:null},set:function(a){ol(this);var b=this.S.Bh;b!==a&&(!G||null===a||a instanceof Je||a instanceof Oe||v("GraphObject.toolTip must be an Adornment or HTMLInfo."),this.S.Bh=a,this.g("toolTip",b,a))}},contextMenu:{configurable:!0,get:function(){return null!==this.S?this.S.Kg:null},set:function(a){ol(this);var b=this.S.Kg;b!==a&&(!G||a instanceof Je||a instanceof Oe||v("GraphObject.contextMenu must be an Adornment or HTMLInfo."), this.S.Kg=a,this.g("contextMenu",b,a))}}});O.prototype.trigger=O.prototype.tw;O.prototype.findBindingPanel=O.prototype.Jh;O.prototype.findTemplateBinder=O.prototype.nA;O.prototype.setProperties=O.prototype.Vm;O.prototype.apply=O.prototype.apply;O.prototype.attach=O.prototype.qv;O.prototype.set=O.prototype.set;O.prototype.isEnabledObject=O.prototype.Mf;O.prototype.isVisibleObject=O.prototype.Nf;O.prototype.isContainedBy=O.prototype.yg;O.prototype.getNearestIntersectionPoint=O.prototype.Vs; -O.prototype.getLocalPoint=O.prototype.Us;O.prototype.getDocumentScale=O.prototype.If;O.prototype.getDocumentAngle=O.prototype.Xi;O.prototype.getDocumentBounds=O.prototype.Yi;O.prototype.getDocumentPoint=O.prototype.ja;O.prototype.intersectsRect=O.prototype.Oc;O.prototype.containedInRect=O.prototype.Hh;O.prototype.containsRect=O.prototype.Qe;O.prototype.containsPoint=O.prototype.ca;O.prototype.raiseChanged=O.prototype.g;O.prototype.raiseChangedEvent=O.prototype.ab;O.prototype.addCopyProperty=O.prototype.Nx; +O.prototype.getLocalPoint=O.prototype.Us;O.prototype.getDocumentScale=O.prototype.If;O.prototype.getDocumentAngle=O.prototype.Xi;O.prototype.getDocumentBounds=O.prototype.Yi;O.prototype.getDocumentPoint=O.prototype.ja;O.prototype.intersectsRect=O.prototype.Pc;O.prototype.containedInRect=O.prototype.Hh;O.prototype.containsRect=O.prototype.Qe;O.prototype.containsPoint=O.prototype.ca;O.prototype.raiseChanged=O.prototype.g;O.prototype.raiseChangedEvent=O.prototype.ab;O.prototype.addCopyProperty=O.prototype.Nx; var Wl=null;O.className="GraphObject";Wl=new xb; Zl("Button",function(){function a(a,b){return null!==a.diagram.ac(a.documentPoint,function(a){for(;null!==a.panel&&!a.isActionable;)a=a.panel;return a},function(a){return a===b})}var b=Vl(W,W.Auto,{isActionable:!0,enabledChanged:function(a,b){if(a instanceof W){var c=a.eb("ButtonBorder");null!==c&&(c.fill=b?a._buttonFillNormal:a._buttonFillDisabled)}},cursor:"pointer",_buttonFillNormal:"#F5F5F5",_buttonStrokeNormal:"#BDBDBD",_buttonFillOver:"#E0E0E0",_buttonStrokeOver:"#9E9E9E",_buttonFillPressed:"#BDBDBD", _buttonStrokePressed:"#9E9E9E",_buttonFillDisabled:"#E5E5E5"},Vl(Hf,{name:"ButtonBorder",figure:"RoundedRectangle",spot1:new Ib(0,0,2.76142374915397,2.761423749153969),spot2:new Ib(1,1,-2.76142374915397,-2.761423749153969),parameter1:2,parameter2:2,fill:"#F5F5F5",stroke:"#BDBDBD"}));b.mouseEnter=function(a,b){if(b.Mf()&&b instanceof W&&(a=b.eb("ButtonBorder"),a instanceof Hf)){var c=b._buttonFillOver;b._buttonFillNormal=a.fill;a.fill=c;c=b._buttonStrokeOver;b._buttonStrokeNormal=a.stroke;a.stroke= @@ -1061,42 +1061,42 @@ function Kj(a,b){this.ownerDocument=a=void 0===b?sa.document:b;this.YA="http://w Kj.prototype.resize=function(a,b,c,d){return this.width!==a||this.height!==b?(this.style.width=c+"px",this.style.height=d+"px",this.Qa.setAttributeNS(null,"width",c+"px"),this.Qa.setAttributeNS(null,"height",d+"px"),this.Qa.setAttributeNS(null,"viewBox","0 0 "+c+" "+d),this.context.ox.firstElementChild.setAttributeNS(null,"width",c+"px"),this.context.ox.firstElementChild.setAttributeNS(null,"height",d+"px"),!0):!1}; Kj.prototype.Tb=function(a,b,c){a=this.ownerDocument.createElementNS(this.YA,a);if(Ga(b))for(var d in b)a.setAttributeNS("href"===d?"http://www.w3.org/1999/xlink":"",d,b[d]);void 0!==c&&(a.textContent=c);return a};Kj.prototype.getBoundingClientRect=function(){return this.Qa.getBoundingClientRect()};Kj.prototype.focus=function(){this.Qa.focus()};Kj.prototype.by=function(){this.ownerDocument=null}; oa.Object.defineProperties(Kj.prototype,{width:{configurable:!0,get:function(){return this.Qa.width.baseVal.value},set:function(a){this.Qa.width=a}},height:{configurable:!0,get:function(){return this.Qa.height.baseVal.value},set:function(a){this.Qa.height=a}},style:{configurable:!0,get:function(){return this.Qa.style}}});Kj.className="SVGSurface"; -function fm(a){this.wt=a;this.svg=a.Qa;this.stack=[];this.kd=[];this.fillStyle="#000000";this.font="10px sans-serif";this.globalAlpha=1;this.lineCap="butt";this.lineDashOffset=0;this.lineJoin="miter";this.lineWidth=1;this.miterLimit=10;this.shadowBlur=0;this.shadowColor="rgba(0, 0, 0, 0)";this.shadowOffsetY=this.shadowOffsetX=0;this.strokeStyle="#000000";this.textAlign="start";this.clipInsteadOfFill=!1;this.ng=this.ts=this.ss=0;this.dt=null;this.path=[];this.ku=!1;this.th=null;this.uh=0;this.Re=new dm; -gm(this,1,0,0,1,0,0);var b=pb++,c=this.Tb("clipPath",{id:"mainClip"+b});c.appendChild(this.Tb("rect",{x:0,y:0,width:a.width,height:a.height}));this.ox=c;this.wt.Qa.appendChild(c);this.kd[0].setAttributeNS(null,"clip-path","url(#mainClip"+b+")");this.$A={}}t=fm.prototype; +function fm(a){this.wt=a;this.svg=a.Qa;this.stack=[];this.ld=[];this.fillStyle="#000000";this.font="10px sans-serif";this.globalAlpha=1;this.lineCap="butt";this.lineDashOffset=0;this.lineJoin="miter";this.lineWidth=1;this.miterLimit=10;this.shadowBlur=0;this.shadowColor="rgba(0, 0, 0, 0)";this.shadowOffsetY=this.shadowOffsetX=0;this.strokeStyle="#000000";this.textAlign="start";this.clipInsteadOfFill=!1;this.ng=this.ts=this.ss=0;this.dt=null;this.path=[];this.ku=!1;this.th=null;this.uh=0;this.Re=new dm; +gm(this,1,0,0,1,0,0);var b=qb++,c=this.Tb("clipPath",{id:"mainClip"+b});c.appendChild(this.Tb("rect",{x:0,y:0,width:a.width,height:a.height}));this.ox=c;this.wt.Qa.appendChild(c);this.ld[0].setAttributeNS(null,"clip-path","url(#mainClip"+b+")");this.$A={}}t=fm.prototype; t.arc=function(a,b,c,d,e,f,g,h){var k=2*Math.PI,l=k-1E-6,m=c*Math.cos(d),n=c*Math.sin(d),p=a+m,r=b+n,q=f?0:1;d=f?d-e:e-d;(1E-6d&&(d=d%k+k);d>l?(this.path.push(["A",c,c,0,1,q,a-m,b-n]),this.path.push(["A",c,c,0,1,q,p,r])):1E-6=Math.PI),q,a+c*Math.cos(e),b+c*Math.sin(e)])};t.beginPath=function(){this.path=[]};t.bezierCurveTo=function(a,b,c,d,e,f){this.path.push(["C",a,b,c,d,e,f])};t.clearRect=function(){}; t.clip=function(){this.addPath("clipPath",this.path,this.Re)};t.closePath=function(){this.path.push(["z"])};t.createLinearGradient=function(a,b,c,d){var e=new em("linear");e.x1=a;e.y1=b;e.x2=c;e.y2=d;return e}; -t.createPattern=function(a){var b="";a instanceof HTMLCanvasElement&&(b=a.toDataURL());a instanceof HTMLImageElement&&(b=a.getAttribute("src"));var c=this.$A;if(c[b])return"url(#"+c[b]+")";var d="PATTERN"+pb++,e={x:0,y:0,width:a.width,height:a.height,href:b};a=this.Tb("pattern",{width:a.width,height:a.height,id:d,patternUnits:"userSpaceOnUse"});a.appendChild(this.Tb(Mk,e));this.svg.appendChild(a);c[b]=d;return"url(#"+d+")"}; +t.createPattern=function(a){var b="";a instanceof HTMLCanvasElement&&(b=a.toDataURL());a instanceof HTMLImageElement&&(b=a.getAttribute("src"));var c=this.$A;if(c[b])return"url(#"+c[b]+")";var d="PATTERN"+qb++,e={x:0,y:0,width:a.width,height:a.height,href:b};a=this.Tb("pattern",{width:a.width,height:a.height,id:d,patternUnits:"userSpaceOnUse"});a.appendChild(this.Tb(Mk,e));this.svg.appendChild(a);c[b]=d;return"url(#"+d+")"}; t.createRadialGradient=function(a,b,c,d,e,f){var g=new em("radial");g.x1=a;g.y1=b;g.r1=c;g.x2=d;g.y2=e;g.r2=f;return g}; t.drawImage=function(a,b,c,d,e,f,g,h,k){var l="";a instanceof HTMLCanvasElement&&(l=a.toDataURL());a instanceof HTMLImageElement&&(l=a.getAttribute("src"));var m=a instanceof HTMLImageElement?a.naturalWidth:a.width,n=a instanceof HTMLImageElement?a.naturalHeight:a.height;void 0===d&&(f=b,g=c,h=d=m,k=e=n);d=d||0;e=e||0;f=f||0;g=g||0;h=h||0;k=k||0;a={x:0,y:0,width:m||d,height:n||e,href:l};L.da(d,h)&&L.da(e,k)?-1===l.toLowerCase().indexOf(".svg")&&-1===l.toLowerCase().indexOf("data:image/svg")&&(a.preserveAspectRatio= -"xMidYMid slice"):a.preserveAspectRatio="none";l="";h/=d;k/=e;if(0!==f||0!==g)l+=" translate("+f+", "+g+")";if(1!==h||1!==k)l+=" scale("+h+", "+k+")";if(0!==b||0!==c)l+=" translate("+-b+", "+-c+")";if(0!==b||0!==c||d!==m||e!==n)f="CLIP"+pb++,g=this.Tb("clipPath",{id:f}),g.appendChild(this.Tb("rect",{x:b,y:c,width:d,height:e})),this.svg.appendChild(g),a["clip-path"]="url(#"+f+")";hm(this,Mk,a,this.Re,l);this.addElement(Mk,a)};t.fill=function(){this.addPath("fill",this.path,this.Re)}; +"xMidYMid slice"):a.preserveAspectRatio="none";l="";h/=d;k/=e;if(0!==f||0!==g)l+=" translate("+f+", "+g+")";if(1!==h||1!==k)l+=" scale("+h+", "+k+")";if(0!==b||0!==c)l+=" translate("+-b+", "+-c+")";if(0!==b||0!==c||d!==m||e!==n)f="CLIP"+qb++,g=this.Tb("clipPath",{id:f}),g.appendChild(this.Tb("rect",{x:b,y:c,width:d,height:e})),this.svg.appendChild(g),a["clip-path"]="url(#"+f+")";hm(this,Mk,a,this.Re,l);this.addElement(Mk,a)};t.fill=function(){this.addPath("fill",this.path,this.Re)}; t.Gf=function(){this.clipInsteadOfFill?this.clip():this.fill()};t.fillRect=function(a,b,c,d){a=[a,b,c,d];a={x:a[0],y:a[1],width:a[2],height:a[3]};hm(this,"fill",a,this.Re);this.addElement("rect",a)};t.fillText=function(a,b,c){a=[a,b,c];b=this.textAlign;"left"===b?b="start":"right"===b?b="end":"center"===b&&(b="middle");b={x:a[1],y:a[2],style:"font: "+this.font,"text-anchor":b};hm(this,"fill",b,this.Re);this.addElement("text",b,a[0])};t.lineTo=function(a,b){this.path.push(["L",a,b])}; t.moveTo=function(a,b){this.path.push(["M",a,b])};t.quadraticCurveTo=function(a,b,c,d){this.path.push(["Q",a,b,c,d])};t.rect=function(a,b,c,d){this.path.push(["M",a,b],["L",a+c,b],["L",a+c,b+d],["L",a,b+d],["z"])}; t.restore=function(){this.Re=this.stack.pop();this.path=this.stack.pop();var a=this.stack.pop();this.fillStyle=a.fillStyle;this.font=a.font;this.globalAlpha=a.globalAlpha;this.lineCap=a.lineCap;this.lineDashOffset=a.lineDashOffset;this.lineJoin=a.lineJoin;this.lineWidth=a.lineWidth;this.miterLimit=a.miterLimit;this.shadowBlur=a.shadowBlur;this.shadowColor=a.shadowColor;this.shadowOffsetX=a.shadowOffsetX;this.shadowOffsetY=a.shadowOffsetY;this.strokeStyle=a.strokeStyle;this.textAlign=a.textAlign}; t.save=function(){this.stack.push({fillStyle:this.fillStyle,font:this.font,globalAlpha:this.globalAlpha,lineCap:this.lineCap,lineDashOffset:this.lineDashOffset,lineJoin:this.lineJoin,lineWidth:this.lineWidth,miterLimit:this.miterLimit,shadowBlur:this.shadowBlur,shadowColor:this.shadowColor,shadowOffsetX:this.shadowOffsetX,shadowOffsetY:this.shadowOffsetY,strokeStyle:this.strokeStyle,textAlign:this.textAlign});for(var a=[],b=0;bb.offset?1:-1});for(e=0;eg.width+g.x||g.x> k.width+k.x||n>g.height+g.y||g.y>k.height+k.y)return!0;k=!0;gm(a,1,0,0,1,0,0);a.save();a.beginPath();a.rect(m,n,p,l);a.clip()}if(this.dj()&&!this.isVisible())return!0;a.Re.Sa=[1,0,0,1,0,0];(this instanceof Yg&&1b?(this.scale(b/a,1),this.translate((a-b)/2,0)):b>a&&(this.scale(1,a/b),this.translate(0,(b-a)/2));this.vn?this.clip():this.fill();a>b?(this.translate(-(a-b)/2,0),this.scale(1/(b/a),1)):b>a&&(this.translate(0,-(b-a)/2),this.scale(1,1/(a/b)))}else this.vn?this.clip():this.fill()};t.jj=function(){this.vn||this.stroke()};t.pw=function(a,b,c){this.ss=a;this.ts=b;this.ng=c}; t.Ns=function(a,b){var c=this.aa;void 0!==c.setLineDash&&(c.setLineDash(a),c.lineDashOffset=b)};t.Ls=function(){var a=this.aa;void 0!==a.setLineDash&&(a.setLineDash(jm),a.lineDashOffset=0)};t.Kc=function(a){a&&(this.Lt="");this.Kt=this.Mt=""}; oa.Object.defineProperties(Il.prototype,{fillStyle:{configurable:!0,get:function(){return this.aa.fillStyle},set:function(a){this.Kt!==a&&(this.Kt=this.aa.fillStyle=a)}},font:{configurable:!0,get:function(){return this.aa.font},set:function(a){this.Lt!==a&&(this.Lt=this.aa.font=a)}},globalAlpha:{configurable:!0,get:function(){return this.aa.globalAlpha},set:function(a){this.aa.globalAlpha=a}},lineCap:{configurable:!0,get:function(){return this.aa.lineCap}, @@ -1104,8 +1104,8 @@ set:function(a){this.aa.lineCap=a}},lineDashOffset:{configurable:!0,get:function a}},shadowBlur:{configurable:!0,get:function(){return this.aa.shadowBlur},set:function(a){this.aa.shadowBlur=a}},shadowColor:{configurable:!0,get:function(){return this.aa.shadowColor},set:function(a){this.aa.shadowColor=a}},shadowOffsetX:{configurable:!0,get:function(){return this.aa.shadowOffsetX},set:function(a){this.aa.shadowOffsetX=a}},shadowOffsetY:{configurable:!0,get:function(){return this.aa.shadowOffsetY},set:function(a){this.aa.shadowOffsetY= a}},strokeStyle:{configurable:!0,get:function(){return this.aa.strokeStyle},set:function(a){this.Mt!==a&&(this.Mt=this.aa.strokeStyle=a)}},textAlign:{configurable:!0,get:function(){return this.aa.textAlign},set:function(a){this.aa.textAlign=a}},imageSmoothingEnabled:{configurable:!0,get:function(){return this.aa.imageSmoothingEnabled},set:function(a){this.aa.imageSmoothingEnabled=a}},clipInsteadOfFill:{configurable:!0,get:function(){return this.vn}, set:function(a){this.vn=a}}});var jm=Object.freeze([]);Il.className="CanvasSurfaceContext";function km(){this.P=this.o=this.F=this.j=0}km.className="ColorNumbers"; -function Al(a,b){lm||(mm(),lm=!0);ab(this);this.u=!1;void 0===a?(this.oa=Hl,this.al="black"):"string"===typeof a?(this.oa=Hl,G&&!nm(a)&&v('Color "'+a+'" is not a valid color string for Brush constructor'),this.al=a):(G&&cb(a,Al,Al,"constructor:type"),this.oa=a,this.al="black");a=this.oa;a===Kl?(this.Fd=Fc,this.ol=Nc):this.ol=a===Bl?this.Fd=Kc:this.Fd=Dc;this.ws=0;this.xr=NaN;this.ue=this.hs=this.te=null;this.Nt=this.bl=0;b&&Object.assign(this,b)} -Al.prototype.copy=function(){var a=new Al;a.oa=this.oa;a.al=this.al;a.Fd=this.Fd.L();a.ol=this.ol.L();a.ws=this.ws;a.xr=this.xr;null!==this.te&&(a.te=this.te.copy());a.hs=this.hs;return a};t=Al.prototype;t.freeze=function(){this.u=!0;null!==this.te&&this.te.freeze();return this};t.ka=function(){Object.isFrozen(this)&&v("cannot thaw constant: "+this);this.u=!1;null!==this.te&&this.te.ka();return this};t.mb=function(a){a.classType===Al?this.type=a:Ea(this,a)}; +function Al(a,b){lm||(mm(),lm=!0);ab(this);this.u=!1;void 0===a?(this.oa=Hl,this.al="black"):"string"===typeof a?(this.oa=Hl,G&&!nm(a)&&v('Color "'+a+'" is not a valid color string for Brush constructor'),this.al=a):(G&&cb(a,Al,Al,"constructor:type"),this.oa=a,this.al="black");a=this.oa;a===Kl?(this.Gd=Fc,this.ol=Nc):this.ol=a===Bl?this.Gd=Kc:this.Gd=Dc;this.ws=0;this.xr=NaN;this.ue=this.hs=this.te=null;this.Nt=this.bl=0;b&&Object.assign(this,b)} +Al.prototype.copy=function(){var a=new Al;a.oa=this.oa;a.al=this.al;a.Gd=this.Gd.L();a.ol=this.ol.L();a.ws=this.ws;a.xr=this.xr;null!==this.te&&(a.te=this.te.copy());a.hs=this.hs;return a};t=Al.prototype;t.freeze=function(){this.u=!0;null!==this.te&&this.te.freeze();return this};t.ka=function(){Object.isFrozen(this)&&v("cannot thaw constant: "+this);this.u=!1;null!==this.te&&this.te.ka();return this};t.mb=function(a){a.classType===Al?this.type=a:Ea(this,a)}; t.toString=function(){var a="Brush(";if(this.type===Hl)a+=this.color;else if(a=this.type===Kl?a+"Linear ":this.type===Bl?a+"Radial ":this.type===Jl?a+"Pattern ":a+"(unknown) ",a+=this.start+" "+this.end,null!==this.colorStops)for(var b=this.colorStops.iterator;b.next();)a+=" "+b.key+":"+b.value;return a+")"}; t.addColorStop=function(a,b){this.u&&xa(this);("number"!==typeof a||!isFinite(a)||1a)&&Aa(a,"0 <= loc <= 1",Al,"addColorStop:loc");A(b,"string",Al,"addColorStop:color");G&&!nm(b)&&v('Color "'+b+'" is not a valid color string for Brush.addColorStop');null===this.te&&(this.te=new xb);this.te.add(a,b);this.oa===Hl&&(this.type=Kl);this.ue=null;return this}; function nm(a){if("black"===a)return!0;if(""===a)return!1;G&&A(a,"string",Al,"isValidColor");lm||(mm(),lm=!0);var b=om;if(null===b)return!0;b.fillStyle="#000000";var c=b.fillStyle;b.fillStyle=a;if(b.fillStyle!==c)return!0;b.fillStyle="#FFFFFF";c=b.fillStyle;b.fillStyle=a;return b.fillStyle!==c} @@ -1120,7 +1120,7 @@ ei.P+")";default:v("Unknown color space: "+b)}}function ci(a){lm||(mm(),lm=!0);v function di(){var a=um.j/255,b=um.F/255,c=um.o/255,d=Math.max(a,b,c),e=Math.min(a,b,c),f=d-e;e=(d+e)/2;if(0===f)var g=a=0;else{switch(d){case a:g=(b-c)/f%6;break;case b:g=(c-a)/f+2;break;case c:g=(a-b)/f+4}g*=60;0>g&&(g+=360);a=f/(1-Math.abs(2*e-1))}ei.j=Math.round(g);ei.F=Math.round(100*a);ei.o=Math.round(100*e);ei.P=um.P}function wm(a){a/=255;return.04045>=a?a/12.92:Math.pow((a+.055)/1.055,2.4)}function Em(a){return.0031308>=a?12.92*a:1.055*Math.pow(a,1/2.4)-.055} function ym(a){return a>Dm?Math.pow(a,1/3):(Cm*a+16)/116}function Bm(a){var b=a*a*a;return b>Dm?b:(116*a-16)/Cm}function am(a,b){"string"===typeof a?G&&!nm(a)&&v('Color "'+a+'" is not a valid color string for '+b):a instanceof Al||v("Value for "+b+" must be a color string or a Brush, not "+a)}function mm(){om=Wg?(new Nk(null)).context:null} oa.Object.defineProperties(Al.prototype,{type:{configurable:!0,get:function(){return this.oa},set:function(a){this.u&&xa(this,a);cb(a,Al,Al,"type");this.oa=a;this.start.bc()&&(a===Kl?this.start=Fc:a===Bl&&(this.start=Kc));this.end.bc()&&(a===Kl?this.end=Nc:a===Bl&&(this.end=Kc));this.ue=null}},color:{configurable:!0,get:function(){return this.al},set:function(a){this.u&&xa(this,a);G&&!nm(a)&&v('Color "'+a+'" is not a valid color string for Brush.color');this.al=a;this.ue= -null}},start:{configurable:!0,get:function(){return this.Fd},set:function(a){this.u&&xa(this,a);x(a,Ib,Al,"start");this.Fd=a.L();this.ue=null}},end:{configurable:!0,get:function(){return this.ol},set:function(a){this.u&&xa(this,a);x(a,Ib,Al,"end");this.ol=a.L();this.ue=null}},startRadius:{configurable:!0,get:function(){return this.ws},set:function(a){this.u&&xa(this,a);D(a,Al,"startRadius");0>a&&Aa(a,">= zero",Al,"startRadius");this.ws=a;this.ue=null}},endRadius:{configurable:!0, +null}},start:{configurable:!0,get:function(){return this.Gd},set:function(a){this.u&&xa(this,a);x(a,Ib,Al,"start");this.Gd=a.L();this.ue=null}},end:{configurable:!0,get:function(){return this.ol},set:function(a){this.u&&xa(this,a);x(a,Ib,Al,"end");this.ol=a.L();this.ue=null}},startRadius:{configurable:!0,get:function(){return this.ws},set:function(a){this.u&&xa(this,a);D(a,Al,"startRadius");0>a&&Aa(a,">= zero",Al,"startRadius");this.ws=a;this.ue=null}},endRadius:{configurable:!0, enumerable:!0,get:function(){return this.xr},set:function(a){this.u&&xa(this,a);D(a,Al,"endRadius");0>a&&Aa(a,">= zero",Al,"endRadius");this.xr=a;this.ue=null}},colorStops:{configurable:!0,get:function(){return this.te},set:function(a){this.u&&xa(this,a);G&&x(a,xb,Al,"colorStops");this.te=a;this.ue=null}},pattern:{configurable:!0,get:function(){return this.hs},set:function(a){this.u&&xa(this,a);this.hs=a;this.ue=null}}});Al.prototype.isDark=Al.prototype.Ay; Al.prototype.darkenBy=Al.prototype.Rz;Al.prototype.lightenBy=Al.prototype.RA;Al.prototype.addColorStop=Al.prototype.addColorStop;var Dm=216/24389,Cm=24389/27,zm=[95.047,100,108.883],om=null,um=new km,ei=new km,xm=new km,Am=new km,lm=!1;Al.className="Brush";var Hl;Al.Solid=Hl=new F(Al,"Solid",0);var Kl;Al.Linear=Kl=new F(Al,"Linear",1);var Bl;Al.Radial=Bl=new F(Al,"Radial",2);var Jl;Al.Pattern=Jl=new F(Al,"Pattern",4);var pm;Al.Lab=pm=new F(Al,"Lab",5);var Fm;Al.HSL=Fm=new F(Al,"HSL",6); Al.randomColor=function(a,b){void 0===a&&(a=128);G&&(D(a,Al,"randomColor:min"),(0>a||255b.length&&(b="0"+b);2>d.length&&(d="0"+d);2>a.length&&(a="0"+a);return"#"+b+d+ @@ -1151,29 +1151,29 @@ Mm.prototype.arrange=function(a,b){var c=b.length,d=a.sb(),e=d.measuredBounds,f= p.Kb()&&(p=a.defaultAlignment),p.fb()||(p=Kc),k=f.width*p.x+p.offsetX-k*p.x+g.left+f.x,g=f.height*p.y+p.offsetY-m*p.y+g.top+f.y,h.visible&&(nc(f.x,f.y,f.width,f.height,k,g,l.width,l.height)?h.arrange(k,g,l.width,l.height):h.arrange(k,g,l.width,l.height,new M(f.x,f.y,f.width,f.height))));M.free(f)};function Pm(){this.ta="Base";this.name="Table"}na(Pm,Yl); Pm.prototype.measure=function(a,b,c,d,e){for(var f=d.length,g=Ma(),h=Ma(),k=0;kaa&&(Xa=Math.max(aa-Gc,0));var Ag=0===P.ma;P.fc=P.fc+Xa;P.actual=P.ma+Xa;aa=Math.max(aa-(Xa+(Ag?Gc:0)),0)}if(1===Jb.columnSpan&&(tb===tg||tb===jl)){P=a.getColumnDefinition(jc);var Hh=P.Lc();Xa=Math.max(zc-P.actual,0);Xa+Hh>S&&(Xa=Math.max(S-Hh,0));var Rn=0===P.ma;P.fc=P.fc+Xa;P.actual=P.ma+Xa;S=Math.max(S-(Xa+(Rn?Hh:0)),0)}ye&&Jb.Ak()}}}}}Pa(z); -var Wd=0,ze=0;f=a.columnCount;for(var Bg=0;Bg= -a.rowCount);Sf++)P=a.getRowDefinition(Za.row+Sf),Xa=0,Xa=tb===Fd||tb===jl?Math.max(P.minimum,0===Be[Za.row+Sf]?P.maximum:Math.min(Be[Za.row+Sf],P.maximum)):Math.max(P.minimum,isNaN(P.yc)?P.maximum:Math.min(P.yc,P.maximum)),ad.height+=Xa,ae+=P.minimum;for(var Dd=1;Dd=a.columnCount);Dd++)P=a.getColumnDefinition(Za.column+Dd),Xa=0,Xa=tb===Fd||tb===il?Math.max(P.minimum,0===Cd[Za.column+Dd]?P.maximum:Math.min(Cd[Za.column+Dd],P.maximum)):Math.max(P.minimum,isNaN(P.yc)?P.maximum: -Math.min(P.yc,P.maximum)),ad.width+=Xa,Lh+=P.minimum;ob.width+=ad.width;ob.height+=ad.height;var Tf=Za.margin,Ti=Tf.right+Tf.left,De=Tf.top+Tf.bottom;Za.measure(ob.width,ob.height,Lh,ae);for(var Dg=Za.measuredBounds,Uf=Math.max(Dg.width+Ti,0),Ui=Math.max(Dg.height+De,0),qf=0,kd=0;kd=a.rowCount);kd++)P=a.getRowDefinition(Za.row+kd),qf+=P.total||0;if(qf=Ed)&&!(Za.row+ +void 0!==P&&(P.actual=0)}Y=a.Db;f=Y.length;for(var ma=0;maaa&&(Xa=Math.max(aa-Gc,0));var Ag=0===P.ma;P.fc=P.fc+Xa;P.actual=P.ma+Xa;aa=Math.max(aa-(Xa+(Ag?Gc:0)),0)}if(1===Jb.columnSpan&&(ob===tg||ob===jl)){P=a.getColumnDefinition(jc);var Hh=P.Mc();Xa=Math.max(zc-P.actual,0);Xa+Hh>S&&(Xa=Math.max(S-Hh,0));var Rn=0===P.ma;P.fc=P.fc+Xa;P.actual=P.ma+Xa;S=Math.max(S-(Xa+(Rn?Hh:0)),0)}ye&&Jb.Ak()}}}}}Pa(z); +var Wd=0,ze=0;f=a.columnCount;for(var Bg=0;Bg= +a.rowCount);Sf++)P=a.getRowDefinition(Za.row+Sf),Xa=0,Xa=ob===Fd||ob===jl?Math.max(P.minimum,0===Be[Za.row+Sf]?P.maximum:Math.min(Be[Za.row+Sf],P.maximum)):Math.max(P.minimum,isNaN(P.yc)?P.maximum:Math.min(P.yc,P.maximum)),ad.height+=Xa,ae+=P.minimum;for(var Dd=1;Dd=a.columnCount);Dd++)P=a.getColumnDefinition(Za.column+Dd),Xa=0,Xa=ob===Fd||ob===il?Math.max(P.minimum,0===Cd[Za.column+Dd]?P.maximum:Math.min(Cd[Za.column+Dd],P.maximum)):Math.max(P.minimum,isNaN(P.yc)?P.maximum: +Math.min(P.yc,P.maximum)),ad.width+=Xa,Lh+=P.minimum;pb.width+=ad.width;pb.height+=ad.height;var Tf=Za.margin,Ti=Tf.right+Tf.left,De=Tf.top+Tf.bottom;Za.measure(pb.width,pb.height,Lh,ae);for(var Dg=Za.measuredBounds,Uf=Math.max(Dg.width+Ti,0),Ui=Math.max(Dg.height+De,0),qf=0,kd=0;kd=a.rowCount);kd++)P=a.getRowDefinition(Za.row+kd),qf+=P.total||0;if(qf=Ed)&&!(Za.row+ Ee>=a.rowCount);Ee++){P=a.getRowDefinition(Za.row+Ee);var Pd=P.ma||0,Mh=Wf(Za,P,Vf);G&&"number"!==typeof Mh&&v(Za+" spanAllocation does not return a number: "+Mh);P.actual=Math.min(P.maximum,Pd+Mh);P.ma!==Pd&&(Ed-=P.ma-Pd)}for(;0Ve&&(P.actual=Math.min(P.maximum,Ve+Ed),P.ma!==Ve&&(Ed-=P.ma-Ve));if(0===P.index)break;P=a.getRowDefinition(P.index-1)}}for(var Nh=0,Oh=0;Oh=a.columnCount);Oh++)P=a.getColumnDefinition(Za.column+ Oh),Nh+=P.total||0;if(Nh=ld)&&!(Za.column+Ph>=a.columnCount);Ph++){P=a.getColumnDefinition(Za.column+Ph);var Tn=P.ma||0,Un=Sn(Za,P,Vi);G&&"number"!==typeof Un&&v(Za+" spanAllocation does not return a number: "+Un);P.actual=Math.min(P.maximum,Tn+Un);P.ma!==Tn&&(ld-=P.ma-Tn)}for(;0xk&&(P.actual=Math.min(P.maximum,xk+ld),P.ma!==xk&&(ld-=P.ma-xk)); -if(0===P.index)break;P=a.getColumnDefinition(P.index-1)}}}}Pa(B);Hb.free(ad);Hb.free(ob);void 0!==Be&&Pa(Be);void 0!==Cd&&Pa(Cd);var Eg=0,Fg=0,yk=a.desiredSize,wr=a.maxSize;tb=vl(a,!0);var Wi=ze=Wd=0,Xi=0;f=a.columnCount;for(var zk=0;zk=a.rowCount);Y++){var T=a.getRowDefinition(w+ -Y);0!==T.ma&&(u.height+=T.total)}for(Y=1;Y=a.columnCount);Y++)T=a.getColumnDefinition(z+Y),0!==T.ma&&(u.width+=T.total);var P=B.ma+u.width,ma=y.ma+u.height;Y=h;T=k;var ia=P,Ba=ma,Na=h,rb=k,sb=P,Xa=ma;h+P>c.width&&(sb=Math.max(c.width-h,0));k+ma>c.height&&(Xa=Math.max(c.height-k,0));var Pb=S.alignment;if(Pb.Kb()){Pb=a.defaultAlignment;Pb.fb()||(Pb=Kc);var Ub=Pb.x;var jd=Pb.y;var jc=Pb.offsetX;Pb=Pb.offsetY;var yc=B.alignment,Oc=y.alignment;yc.fb()&&(Ub=yc.x,jc=yc.offsetX);Oc.fb()&& +Y);0!==T.ma&&(u.height+=T.total)}for(Y=1;Y=a.columnCount);Y++)T=a.getColumnDefinition(z+Y),0!==T.ma&&(u.width+=T.total);var P=B.ma+u.width,ma=y.ma+u.height;Y=h;T=k;var ia=P,Ba=ma,Na=h,sb=k,tb=P,Xa=ma;h+P>c.width&&(tb=Math.max(c.width-h,0));k+ma>c.height&&(Xa=Math.max(c.height-k,0));var Pb=S.alignment;if(Pb.Kb()){Pb=a.defaultAlignment;Pb.fb()||(Pb=Kc);var Ub=Pb.x;var jd=Pb.y;var jc=Pb.offsetX;Pb=Pb.offsetY;var yc=B.alignment,Oc=y.alignment;yc.fb()&&(Ub=yc.x,jc=yc.offsetX);Oc.fb()&& (jd=Oc.y,Pb=Oc.offsetY)}else Ub=Pb.x,jd=Pb.y,jc=Pb.offsetX,Pb=Pb.offsetY;if(isNaN(Ub)||isNaN(jd))jd=Ub=.5,Pb=jc=0;yc=aa.width;Oc=aa.height;var xe=S.margin,Nf=xe.left+xe.right,Jb=xe.top+xe.bottom,ye=Ol(S,y,B,!1);!isNaN(S.desiredSize.width)||ye!==Fd&&ye!==il||(yc=Math.max(P-Nf,0));!isNaN(S.desiredSize.height)||ye!==Fd&&ye!==jl||(Oc=Math.max(ma-Jb,0));P=S.maxSize;ma=S.minSize;yc=Math.min(P.width,yc);Oc=Math.min(P.height,Oc);yc=Math.max(ma.width,yc);Oc=Math.max(ma.height,Oc);P=Oc+Jb;Y+=ia*Ub-(yc+Nf)* -Ub+jc+xe.left;T+=Ba*jd-P*jd+Pb+xe.top;S.visible&&(nc(Na,rb,sb,Xa,Y,T,aa.width,aa.height)?S.arrange(Y,T,yc,Oc):S.arrange(Y,T,yc,Oc,new M(Na,rb,sb,Xa)))}}Hb.free(u);for(a=0;ab)return a%b===c;if(a%b!==c)return!1;b=d.length;for(var e=0;en)z.measure(Infinity,Infinity,0,0),B=z.measuredBounds,b.Tc(B),q.push(B);else{var C=z.segmentIndex,E=z.segmentFraction,J=z.alignmentFocus;J.bc()&&(J=Kc);var S=z.segmentOrientation,aa=z.segmentOffset;if(isNaN(C)){var Y=h.sa;B=Ma();Y.Kv(E,B);var T=K.allocAt(B[0],B[1]);T.add(h.i(0)); +k&&(Ym(a,p,r,k),g=k.measuredBounds,b.Uc(g),q.push(g));g=Kb.alloc();for(var u=K.alloc(),w=K.alloc(),y=0;yn)z.measure(Infinity,Infinity,0,0),B=z.measuredBounds,b.Uc(B),q.push(B);else{var C=z.segmentIndex,E=z.segmentFraction,J=z.alignmentFocus;J.bc()&&(J=Kc);var S=z.segmentOrientation,aa=z.segmentOffset;if(isNaN(C)){var Y=h.sa;B=Ma();Y.Kv(E,B);var T=K.allocAt(B[0],B[1]);T.add(h.i(0)); Y.type===N.j?T.offset(-Y.startX,-Y.startY):(Y=Y.figures.first(),null!==Y&&T.offset(-Y.startX,-Y.startY));Y=B[2];if(S!==hg){var P=h.computeAngle(z,S,Y);z.Cb=P}P=T.x-l.x;var ma=T.y-l.y;K.free(T);Pa(B)}else if(C<-n||C>=n)B=K.alloc(),h.Bg(),h.computeMidPoint(B),Y=h.midAngle,S!==hg&&(P=h.computeAngle(z,S,Y),z.Cb=P),P=B.x-l.x,ma=B.y-l.y,K.free(B);else{P=0;0<=C?(ma=m.M(C),B=Cia+10?0<=C?Y.Ua(ma):ma.Ua(Y):ia>T+10?0<=C?B.Ua(P):P.Ua(B):0<=C?Y.Ua(P):P.Ua(Y)}else Y=0<=C?ma.Ua(B):B.Ua(ma);S!==hg&&(P=h.computeAngle(z,S,Y),z.Cb=P);P=ma.x+(B.x-ma.x)*E-l.x;ma=ma.y+(B.y-ma.y)*E-l.y}z.measure(Infinity,Infinity,0,0);B=z.measuredBounds;T=z.naturalBounds;var Ba=0;z instanceof Hf&&(Ba=z.strokeWidth);ia=T.width+Ba;var Na=T.height+Ba;g.reset();g.translate(-B.x,-B.y);g.scale(z.scale,z.scale);g.rotate(S===hg?z.angle:Y,ia/2,Na/2);S!==Zm&&S!== -$m||g.rotate(90,ia/2,Na/2);S!==an&&S!==bn||g.rotate(-90,ia/2,Na/2);S===cn&&(45Y||225Y)&&g.rotate(-Y,ia/2,Na/2);T=new M(0,0,ia,Na);u.gj(T,J);g.Fa(u);J=-u.x+Ba/2*z.scale;z=-u.y+Ba/2*z.scale;w.assign(aa);Ba=isNaN(aa.x);var rb=isNaN(aa.y);if(Ba||rb){ia=ia/2+3;Na=Na/2+3;var sb=45<=Y&&135>=Y,Xa=225<=Y&&315>=Y;S===hg&&(sb||Xa)?(w.x=rb?ia:aa.y,w.y=Ba?Na:aa.x,sb?0<=C||isNaN(C)&&.5>E||!Ba||(w.y=-Na):Xa&&((0<=C||isNaN(C)&&.5>E)&&Ba&&(w.y=-Na),rb&&(w.x=-ia))):(Ba&&(w.x=0<=C||isNaN(C)&&.5>E?ia: --ia),rb&&(w.y=-Na),w.rotate(Y))}else w.rotate(Y);P+=w.x;ma+=w.y;T.set(B);T.h(P+J,ma+z,B.width,B.height);q.push(T);b.Tc(T)}}if(null!==f)for(d=f.labelNodes;d.next();)d.value.measure(Infinity,Infinity);a.pg=b;a=a.location;a.h(a.x+b.x,a.y+b.y);dc(e,b.width||0,b.height||0);Kb.free(g);K.free(u);K.free(w)}}}}; +P=1ia+10?0<=C?Y.Wa(ma):ma.Wa(Y):ia>T+10?0<=C?B.Wa(P):P.Wa(B):0<=C?Y.Wa(P):P.Wa(Y)}else Y=0<=C?ma.Wa(B):B.Wa(ma);S!==hg&&(P=h.computeAngle(z,S,Y),z.Cb=P);P=ma.x+(B.x-ma.x)*E-l.x;ma=ma.y+(B.y-ma.y)*E-l.y}z.measure(Infinity,Infinity,0,0);B=z.measuredBounds;T=z.naturalBounds;var Ba=0;z instanceof Hf&&(Ba=z.strokeWidth);ia=T.width+Ba;var Na=T.height+Ba;g.reset();g.translate(-B.x,-B.y);g.scale(z.scale,z.scale);g.rotate(S===hg?z.angle:Y,ia/2,Na/2);S!==Zm&&S!== +$m||g.rotate(90,ia/2,Na/2);S!==an&&S!==bn||g.rotate(-90,ia/2,Na/2);S===cn&&(45Y||225Y)&&g.rotate(-Y,ia/2,Na/2);T=new M(0,0,ia,Na);u.gj(T,J);g.Fa(u);J=-u.x+Ba/2*z.scale;z=-u.y+Ba/2*z.scale;w.assign(aa);Ba=isNaN(aa.x);var sb=isNaN(aa.y);if(Ba||sb){ia=ia/2+3;Na=Na/2+3;var tb=45<=Y&&135>=Y,Xa=225<=Y&&315>=Y;S===hg&&(tb||Xa)?(w.x=sb?ia:aa.y,w.y=Ba?Na:aa.x,tb?0<=C||isNaN(C)&&.5>E||!Ba||(w.y=-Na):Xa&&((0<=C||isNaN(C)&&.5>E)&&Ba&&(w.y=-Na),sb&&(w.x=-ia))):(Ba&&(w.x=0<=C||isNaN(C)&&.5>E?ia: +-ia),sb&&(w.y=-Na),w.rotate(Y))}else w.rotate(Y);P+=w.x;ma+=w.y;T.set(B);T.h(P+J,ma+z,B.width,B.height);q.push(T);b.Uc(T)}}if(null!==f)for(d=f.labelNodes;d.next();)d.value.measure(Infinity,Infinity);a.pg=b;a=a.location;a.h(a.x+b.x,a.y+b.y);dc(e,b.width||0,b.height||0);Kb.free(g);K.free(u);K.free(w)}}}}; Xm.prototype.arrange=function(a,b){var c=b.length;if(a instanceof Je||a instanceof R){var d=a,e=null;a instanceof Je&&(e=a,d=e.adornedPart);var f=a instanceof Je?null:d.path,g=a.j;if(0!==g.length){var h=0;if(null!==f&&h=c)q=K.alloc(),r=n,w=q,r.Bg(),r.computeMidPoint(w),r=n.midAngle,l!==hg&&(n=n.computeAngle(g,l,r),g.angle=n),n=q.x,w=q.y, -K.free(q);else{u=0;0<=h?(q=b.m[h],w=hz+10?0<=h?r.Ua(q):q.Ua(r):z>y+10?0<=h?w.Ua(u):u.Ua(w):0<=h?r.Ua(u):u.Ua(r)}else r=0<=h?q.Ua(w):w.Ua(q);l!==hg&&(n=n.computeAngle(g,l,r),g.angle=n);n=q.x+(w.x-q.x)*k;w=q.y+(w.y-q.y)*k}if(p.Eq())g.location=new K(n,w);else{p.bc()&&(p=Kc);q=Kb.alloc();q.reset();q.scale(g.scale,g.scale);q.rotate(g.angle, +K.free(q);else{u=0;0<=h?(q=b.m[h],w=hz+10?0<=h?r.Wa(q):q.Wa(r):z>y+10?0<=h?w.Wa(u):u.Wa(w):0<=h?r.Wa(u):u.Wa(r)}else r=0<=h?q.Wa(w):w.Wa(q);l!==hg&&(n=n.computeAngle(g,l,r),g.angle=n);n=q.x+(w.x-q.x)*k;w=q.y+(w.y-q.y)*k}if(p.Eq())g.location=new K(n,w);else{p.bc()&&(p=Kc);q=Kb.alloc();q.reset();q.scale(g.scale,g.scale);q.rotate(g.angle, 0,0);var B=g.naturalBounds;u=M.allocAt(0,0,B.width,B.height);y=K.alloc();y.gj(u,p);q.Fa(y);p=-y.x;z=-y.y;var C=B.width,E=B.height;B=K.alloc();B.assign(m);var J=isNaN(m.x),S=isNaN(m.y);if(J||S){C=C/2+3;E=E/2+3;var aa=45<=r&&135>=r,Y=225<=r&&315>=r;l===hg&&(aa||Y)?(B.x=S?C:m.y,B.y=J?E:m.x,aa?0<=h||isNaN(h)&&.5>k||!J||(B.y=-E):Y&&((0<=h||isNaN(h)&&.5>k)&&J&&(B.y=-E),S&&(B.x=-C))):(J&&(B.x=0<=h||isNaN(h)&&.5>k?C:-C),S&&(B.y=-E),B.rotate(r))}else B.rotate(r);n+=B.x;w+=B.y;q.Wq(u);p+=u.x;z+=u.y;h=K.allocAt(n+ p,w+z);g.move(h);K.free(h);K.free(B);K.free(y);M.free(u);Kb.free(q)}}null!==e?e.Ek(!1):d.Ek(!1)}}; function Ym(a,b,c,d){if(!1!==Aj(d)){var e=d.strokeWidth;0===e&&a instanceof Je&&a.type===W.Link&&a.adornedObject instanceof Hf&&(e=a.adornedObject.strokeWidth);e*=d.ya;a instanceof R&&null!==a.sa?(a=a.sa.bounds,d.Fe(a.x-e/2,a.y-e/2,a.width+e,a.height+e)):a instanceof Je&&null!==a.adornedPart.sa?(a=a.adornedPart.sa.bounds,d.Fe(a.x-e/2,a.y-e/2,a.width+e,a.height+e)):d.Fe(-(e/2),-(e/2),b+e,c+e);vj(d,!1)}}function dn(){this.ta="Base"}na(dn,Yl); dn.prototype.measure=function(a,b,c,d,e,f,g){var h=a.sb();a.Wg=[];var k=h.margin,l=k.right+k.left,m=k.top+k.bottom;h.measure(b,c,f,g);var n=h.measuredBounds,p=new M(-k.left,-k.top,Math.max(n.width+l,0),Math.max(n.height+m,0));a.Wg.push(p);e.assign(p);for(var r=h.geometry,q=h.strokeWidth,u=r.flattenedSegments,w=r.flattenedLengths,y=r.flattenedTotalLength,z=u.length,B=0,C=0,E=Ma(),J=0;Jia&&(ia+=360);aa.push(ia)}B=P;C=ma}E.push(aa)}if(null===a.Zf){for(var Ba=[],Na=a.W.m,rb=Na.length,sb=0;sbUb))for(var jd=0;jdUb&&Pb.push(yc)}}}}a.Zf=Ba}var Oc=a.Zf;var xe=a.W.m,Nf=xe.length,Jb=0,ye=0,yg=y;a.Gj=[];for(var Fh,Gh=0;Ghtk*Ni*y/a.graduatedRange)){var zg=w[0][0],Bd=0,zc=0;ye=y*tb.graduatedStart-1E-4;yg=y*tb.graduatedEnd+1E-4;var Of=tk*Ni,Gc=a.graduatedTickBase;if(Gca.graduatedMin+Of&&(Gc-=Math.floor((Gc-a.graduatedMin)/Of)*Of);for(var Hh=Oc[Gh],Rn=Gc,Wd=1;Gcy&&(Jb=y),ye<=Jb&&Jb<=yg)){for(var Xd=E[Bd][zc],Od=w[Bd][zc];Bdzg&&zcsc&&.4995sc?0sc||.9995Pi){var uk=1-Math.abs(.5-sc);Xd=(Ae*uk+$c*(1-uk))%360;break a}}}Xd=Ae}if(tb instanceof Yg){var Yd="";null!== -tb.graduatedFunction?(Yd=tb.graduatedFunction(Gc),Yd=null!==Yd&&void 0!==Yd?Yd.toString():""):Yd=(+Gc.toFixed(2)).toString();""!==Yd&&Fh.push({Hm:Oi,angle:Xd,text:Yd})}else Fh.push({Hm:Oi,angle:Xd})}Gc=Rn+Wd*Of}}}a.Gj.push(Fh)}Pa(E);var Kh=a.Gj;if(null!==Kh)for(var Pf=d.length,ob=0;obRf;Rf++){switch(Rf){case 0:tc.h(of,pf);break;case 1:tc.h(of+Qi,pf);break;case 2:tc.h(of,pf+Ri);break;case 3:tc.h(of+Qi,pf+Ri)}tc.rotate(wk+Vb.angle);tc.offset(vk,Qf);0===Cd&&0===Rf?ad.h(tc.x,tc.y,0,0):ad.Ye(tc);tc.offset(-vk,-Qf);tc.rotate(-wk-Vb.angle)}K.free(tc);null!==Ac.Wg&& -Ac.Wg.push(ad);mc(Hc,ad.x,ad.y,ad.width,ad.height)}else if(Vb instanceof Yg){var Za=a,$d=e;null===Za.xh&&(Za.xh=new Yg);var Gb=Za.xh;en(Gb,Vb);var Lh=Vb.alignmentFocus;Lh.bc()&&(Lh=Fc);for(var ae=Vb.segmentOrientation,Sf=Vb.segmentOffset,Dd=new M,Tf=0,Ti=0,De=0,Dg=0,Uf=0,Ui=Wb.length,qf=0;qfDe||225De)&&Pd.rotate(-De,Wf/2,Ee/2);var Mh=M.allocAt(0,0,Wf,Ee),Ve=K.alloc();Ve.gj(Mh,Lh);Pd.Fa(Ve);var Nh=-Ve.x,Oh=-Ve.y,ld=K.alloc();ld.assign(Sf);isNaN(ld.x)&&(ld.x=Wf/2+3);isNaN(ld.y)&&(ld.y=-(Ee/2+3));ld.rotate(De); -Tf+=ld.x+Nh;Ti+=ld.y+Oh;var Vi=new M(Tf,Ti,Ed.width,Ed.height),Sn=new M(Ed.x,Ed.y,Ed.width,Ed.height),Ph=new M(Vf.x,Vf.y,Vf.width,Vf.height);kd.PA=Dg;kd.lineCount=Gb.lineCount;kd.lines=[Gb.vb,Gb.pi,Gb.ye,Gb.Ke,Gb.Fc,Gb.Ub,Gb.we];kd.actualBounds=Vi;kd.measuredBounds=Sn;kd.naturalBounds=Ph;0===qf?Dd.assign(Vi):Dd.Tc(Vi);K.free(ld);K.free(Ve);M.free(Mh);Kb.free(Pd)}null!==Za.Wg&&Za.Wg.push(Dd);mc($d,Dd.x,Dd.y,Dd.width,Dd.height)}vj(Vb,!1)}}}; +C,P-B)/Math.PI;0>ia&&(ia+=360);aa.push(ia)}B=P;C=ma}E.push(aa)}if(null===a.Zf){for(var Ba=[],Na=a.W.m,sb=Na.length,tb=0;tbUb))for(var jd=0;jdUb&&Pb.push(yc)}}}}a.Zf=Ba}var Oc=a.Zf;var xe=a.W.m,Nf=xe.length,Jb=0,ye=0,yg=y;a.Gj=[];for(var Fh,Gh=0;Ghtk*Ni*y/a.graduatedRange&&null===ob.graduatedSkip)){var zg=w[0][0],Bd=0,zc=0;ye=y*ob.graduatedStart-1E-4;yg=y*ob.graduatedEnd+1E-4;var Of=tk*Ni,Gc=a.graduatedTickBase;if(Gca.graduatedMin+Of&&(Gc-=Math.floor((Gc-a.graduatedMin)/Of)*Of);for(var Hh=Oc[Gh],Rn=Gc,Wd=1;Gcy&&(Jb=y),ye<=Jb&&Jb<=yg)){for(var Xd=E[Bd][zc],Od=w[Bd][zc];Bdzg&&zcsc&&.4995sc?0sc||.9995Pi){var uk=1-Math.abs(.5-sc);Xd=(Ae*uk+$c*(1-uk))%360;break a}}}Xd=Ae}if(ob instanceof Yg){var Yd= +"";null!==ob.graduatedFunction?(Yd=ob.graduatedFunction(Gc),Yd=null!==Yd&&void 0!==Yd?Yd.toString():""):Yd=(+Gc.toFixed(2)).toString();""!==Yd&&Fh.push({Hm:Oi,angle:Xd,text:Yd})}else Fh.push({Hm:Oi,angle:Xd})}Gc=Rn+Wd*Of}}}a.Gj.push(Fh)}Pa(E);var Kh=a.Gj;if(null!==Kh)for(var Pf=d.length,pb=0;pbRf;Rf++){switch(Rf){case 0:tc.h(of,pf);break;case 1:tc.h(of+Qi,pf);break;case 2:tc.h(of,pf+Ri);break;case 3:tc.h(of+Qi,pf+Ri)}tc.rotate(wk+Vb.angle);tc.offset(vk,Qf);0===Cd&&0===Rf?ad.h(tc.x,tc.y,0,0):ad.Ye(tc);tc.offset(-vk,-Qf);tc.rotate(-wk-Vb.angle)}K.free(tc); +null!==Ac.Wg&&Ac.Wg.push(ad);mc(Hc,ad.x,ad.y,ad.width,ad.height)}else if(Vb instanceof Yg){var Za=a,$d=e;null===Za.xh&&(Za.xh=new Yg);var Gb=Za.xh;en(Gb,Vb);var Lh=Vb.alignmentFocus;Lh.bc()&&(Lh=Fc);for(var ae=Vb.segmentOrientation,Sf=Vb.segmentOffset,Dd=new M,Tf=0,Ti=0,De=0,Dg=0,Uf=0,Ui=Wb.length,qf=0;qfDe||225De)&&Pd.rotate(-De,Wf/2,Ee/2);var Mh=M.allocAt(0,0,Wf,Ee),Ve=K.alloc();Ve.gj(Mh,Lh);Pd.Fa(Ve);var Nh=-Ve.x,Oh=-Ve.y,ld=K.alloc();ld.assign(Sf);isNaN(ld.x)&&(ld.x=Wf/2+3);isNaN(ld.y)&&(ld.y=-(Ee/2+3));ld.rotate(De); +Tf+=ld.x+Nh;Ti+=ld.y+Oh;var Vi=new M(Tf,Ti,Ed.width,Ed.height),Sn=new M(Ed.x,Ed.y,Ed.width,Ed.height),Ph=new M(Vf.x,Vf.y,Vf.width,Vf.height);kd.PA=Dg;kd.lineCount=Gb.lineCount;kd.lines=[Gb.vb,Gb.pi,Gb.ye,Gb.Ke,Gb.Fc,Gb.Ub,Gb.we];kd.actualBounds=Vi;kd.measuredBounds=Sn;kd.naturalBounds=Ph;0===qf?Dd.assign(Vi):Dd.Uc(Vi);K.free(ld);K.free(Ve);M.free(Mh);Kb.free(Pd)}null!==Za.Wg&&Za.Wg.push(Dd);mc($d,Dd.x,Dd.y,Dd.width,Dd.height)}vj(Vb,!1)}}}; dn.prototype.arrange=function(a,b,c){if(null!==a.Wg){var d=a.sb(),e=a.Gj;if(null!==e){var f=a.Wg,g=0,h=f[g];g++;null!==d&&d.arrange(h.x-c.x,h.y-c.y,h.width,h.height);for(var k=b.length,l=0;l=e&&(e=1);for(var g=f.actualBounds,h=a.W.m,k=a.Gj,l=h.length,m=0;ma.graduatedTickUnit*n.interval*f.geometry.flattenedTotalLength/a.graduatedRange*e)){var q=n.measuredBounds,u=n.strokeWidth*n.scale,w=n.alignmentFocus;w.bc()&& -(w=Fc);for(var y=0;y=e&&(e=1);for(var g=f.actualBounds,h=a.W.m,k=a.Gj,l=h.length,m=0;ma.graduatedTickUnit*n.interval*f.geometry.flattenedTotalLength/a.graduatedRange*e&&null===n.graduatedSkip)){var q=n.measuredBounds,u=n.strokeWidth*n.scale, +w=n.alignmentFocus;w.bc()&&(w=Fc);for(var y=0;yf.height)continue}else if(l.position>f.width)continue;var m=l.separatorStrokeWidth;isNaN(m)&&(m=c?a.Ng:a.Mg);var n=l.separatorStroke;null===n&&(n=c?a.fi:a.Lg);if(0!==m&&null!==n){pi(a,b,n,!1,!1,g,f);n=!1;var p=l.separatorDashArray;null===p&&(p=c?a.ei:a.di);null!==p&&(n=!0,b.Ns(p,0));b.beginPath();p=l.position+m;c?p>f.height&&(m-= p-f.height):p>f.width&&(m-=p-f.width);l=l.position+m/2;b.lineWidth=m;m=a.rb;c?(l+=m.top,p=f.width-m.right,b.moveTo(m.left,l),b.lineTo(p,l)):(l+=m.left,p=f.height-m.bottom,b.moveTo(l,m.top),b.lineTo(l,p));b.stroke();n&&b.Ls()}}}} -function kn(a,b,c,d,e){for(var f=d.length,g=a.actualBounds,h=a.naturalBounds,k=mn(a,!0),l=mn(a,!1),m=0;mp)){var r=n.Lc(),q=n.separatorStrokeWidth;isNaN(q)&&(q=c?a.Ng:a.Mg);var u=n.separatorStroke;null===u&&(u=c?a.fi:a.Lg);if(null===u||n.index===(c?k:l))q=0;r-=q;q=n.position+q;r+=n.actual;q+r>p&&(r=p-q);0>=r||(p=a.rb,pi(a,b,n.background,!0,!1,h,g),c?b.fillRect(p.left, +function kn(a,b,c,d,e){for(var f=d.length,g=a.actualBounds,h=a.naturalBounds,k=mn(a,!0),l=mn(a,!1),m=0;mp)){var r=n.Mc(),q=n.separatorStrokeWidth;isNaN(q)&&(q=c?a.Ng:a.Mg);var u=n.separatorStroke;null===u&&(u=c?a.fi:a.Lg);if(null===u||n.index===(c?k:l))q=0;r-=q;q=n.position+q;r+=n.actual;q+r>p&&(r=p-q);0>=r||(p=a.rb,pi(a,b,n.background,!0,!1,h,g),c?b.fillRect(p.left, q+p.top,g.width-(p.left+p.right),r):b.fillRect(q+p.left,p.top,r,g.height-(p.top+p.bottom)))}}}}function mn(a,b){for(var c=b?a.Ib.length:a.Db.length,d=0;dd&&e.set(q),K.free(q));K.free(m);f&&e.transform(g);return l}; @@ -1227,7 +1227,7 @@ t.yl=function(){if(0!==(this.H&2048)===!1){Ll(this,!0);Ml(this,!0);for(var a=thi t.Em=function(a,b,c,d){var e=this.pg;e.h(0,0,0,0);var f=this.desiredSize,g=this.minSize;void 0===c&&(c=g.width,d=g.height);c=Math.max(c,g.width);d=Math.max(d,g.height);var h=this.maxSize;isNaN(f.width)||(a=Math.min(f.width,h.width));isNaN(f.height)||(b=Math.min(f.height,h.height));a=Math.max(c,a);b=Math.max(d,b);var k=this.rb;a=Math.max(a-k.left-k.right,0);b=Math.max(b-k.top-k.bottom,0);var l=this.W.m;0!==l.length&&this.oa.measure(this,a,b,l,e,c,d);a=e.width+k.left+k.right;k=e.height+k.top+k.bottom; isFinite(f.width)&&(a=f.width);isFinite(f.height)&&(k=f.height);a=Math.min(h.width,a);k=Math.min(h.height,k);a=Math.max(g.width,a);k=Math.max(g.height,k);a=Math.max(c,a);k=Math.max(d,k);dc(e,a,k);dc(this.naturalBounds,a,k);this.Fe(0,0,a,k)};t.sb=function(){if(null===this.wh){var a=this.W.m,b=a.length;if(0===b)return null;for(var c=0;cc||f>d)this.v(),this.measure(b>c?c:b,f>d?d:f,0,0);break;case Fd:this.v(!0);this.measure(c+h,d+g,0,0);break;case il:this.v(!0);this.measure(c+h,f+g,0,0);break;case jl:this.v(!0),this.measure(b+h,d+g,0,0)}}this.oa.arrange(this,e,this.pg)}}; -t.Ih=function(a){var b=this.naturalBounds,c=Hm(this);if(nc(0,0,b.width,b.height,a.x,a.y)){b=this.W.m;for(var d=b.length,e=K.allocAt(0,0);d--;){var f=b[d];if(f.visible||f===c)if(Lb(e.set(a),f.transform),f.ca(e))return K.free(e),!0}K.free(e);return null===this.Wb&&null===this.md?!1:!0}return!1};t.Os=function(a){if(this.Zk===a)return this;for(var b=this.W.m,c=b.length,d=0;dp.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof W?m:null;p=Kb.alloc();p.set(g); +t.Hf=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var g=f;void 0===f&&(g=Kb.alloc(),g.reset());g.multiply(this.transform);if(this.Hh(a,g))return tn(this,b,c,e),void 0===f&&Kb.free(g),!0;if(this.Pc(a,g)){if(!this.isAtomic)for(var h=Hm(this),k=this.W.m,l=k.length;l--;){var m=k[l];if(m.visible||m===h){var n=m.actualBounds,p=this.naturalBounds;if(!(n.x>p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof W?m:null;p=Kb.alloc();p.set(g); if(null!==m?m.Hf(a,b,c,d,e,p):ul(n,a,d,p))null!==b&&(n=b(n)),null===n||null!==c&&!c(n)||e.add(n);Kb.free(p)}}}void 0===f&&Kb.free(g);return d}void 0===f&&Kb.free(g);return!1};function tn(a,b,c,d){for(var e=a.W.m,f=e.length;f--;){var g=e[f];if(g.visible){var h=g.actualBounds,k=a.naturalBounds;h.x>k.width||h.y>k.height||0>h.x+h.width||0>h.y+h.height||(g instanceof W&&tn(g,b,c,d),null!==b&&(g=b(g)),null===g||null!==c&&!c(g)||d.add(g))}}} -t.wg=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===c&&(c=null);void 0===d&&(d=null);var g=this.naturalBounds,h=this.pe(),k=h?a:Lb(K.allocAt(a.x,a.y),this.transform),l=h?b:Lb(K.allocAt(b.x,b.y),this.transform),m=k.Ff(l),n=0w.width||u.y>w.height||0>u.x+u.width||0>u.y+u.height))if(q.pe()?(u=q.transform,Lb(k.set(a),u),Lb(l.set(b),u)):(k.set(a),l.set(b)),u=q,q=q instanceof W?q:null,null!==q?q.wg(k,l,c,d,e,f):u.ly(k,l,e))null!==c&&(u=c(u)),null===u||null!==d&&!d(u)||f.add(u)}}K.free(k);K.free(l)}return e?n:g}return!1}; function Nm(a){var b=null;a instanceof Hf&&(b=a.spot1,b===gd&&(b=null),a=a.geometry,null!==a&&null===b&&(b=a.spot1));null===b&&(b=Ec);return b}function Om(a){var b=null;a instanceof Hf&&(b=a.spot2,b===gd&&(b=null),a=a.geometry,null!==a&&null===b&&(b=a.spot2));null===b&&(b=Pc);return b}t.add=function(a){for(var b=[],c=0;ca&&Aa(a,">= 0",W,"remo t.lA=function(a){if(0>a||this.type!==W.Table)return-1;for(var b=0,c=this.Ib,d=c.length,e=this.Ii;ea||this.type!==W.Table)return-1;for(var b=0,c=this.Db,d=c.length,e=this.si;e=c.elements.count&&!(c instanceof U)){var d=!1;if(1===c.elements.count&&(d=null!==c.itemArray,!d))for(h=b.iterator;h.next();)if("itemArray"===h.value.targetProperty){d=!0;break}d||(Fa("Auto, Spot, or Graduated Panel should not have zero or one elements: "+c.toString()+" in "+a.toString()),xn=!0)}}))} t.Pz=function(a){void 0===a&&(a=!1);var b=this.copy();on(b,function(a){a instanceof W&&(a.$h=null,a.nb=null);var b=a.lb;null!==b&&(a.lb=null,b.each(function(b){a.bind(b.copy())}));b=a.Dg;null!==b&&(a.Dg=null,b.each(function(b){a.tw(b.value.copy())}))});a&&sg(b);return b}; t.Ia=function(a){var b=this.$h;if(null!==b)for(void 0===a&&(a=""),b=b.iterator;b.next();){var c=b.value,d=c.sourceProperty;if(""===a||""===d||d===a)if(d=c.targetProperty,null!==c.converter||""!==d){d=this.data;var e=c.sourceName;if(null!==e)if(""===e)d=this;else if("/"===e)d=this;else if("."===e)d=this;else if(".."===e)d=this;else{if(d=this.eb(e),null===d){G&&Fa("Binding error: missing GraphObject named "+e+" in "+this.toString());continue}}else if(c.isToModel)if(d=this.diagram,null!==d)d=d.model.modelData; -else continue;var f=this,g=c.kj;if(-1!==g){if(f=this.Os(g),null===f)continue}else null!==c.sd&&(f=c.sd);"/"===e?d=f.part:"."===e?d=f:".."===e&&(d=f.panel);e=c.Vp;if(0!==e){if(!(f instanceof W))continue;1===e?f=f.getColumnDefinition(c.jm):2===e&&(f=f.getRowDefinition(c.jm))}void 0!==f&&c.ww(f,d)}}};t.ky=function(a){if(void 0===a||null===a||null===this.ce)return null;A(a,"object",W,"findItemPanelForData");return this.ce.K(a)}; +else continue;var f=this,g=c.kj;if(-1!==g){if(f=this.Os(g),null===f)continue}else null!==c.td&&(f=c.td);"/"===e?d=f.part:"."===e?d=f:".."===e&&(d=f.panel);e=c.Vp;if(0!==e){if(!(f instanceof W))continue;1===e?f=f.getColumnDefinition(c.jm):2===e&&(f=f.getRowDefinition(c.jm))}void 0!==f&&c.ww(f,d)}}};t.ky=function(a){if(void 0===a||null===a||null===this.ce)return null;A(a,"object",W,"findItemPanelForData");return this.ce.K(a)}; function yn(a,b){a=a.W.m;for(var c=a.length,d=b.length,e=0,f=null;ea;)this.hc(this.W.length-1,!1);zn(this,this.itemArray)}; function zn(a,b){var c=rn(a);if(null===b||0===b.length)for(;a.W.length>c;)a.hc(a.W.length-1,!1);else if(a.W.length<=c){c=b.length;for(var d=0;da&&Aa(a,">= 0",bk,"height"),this.yc=a,this.actual=this.ma,null!== +t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new Fi(a,b,c,d):e=a;e.td=this;a=this.panel;null!==a&&(b=a.Jh(),null!==b&&Tl(b)&&v("Cannot add a Binding to a RowColumnDefinition that is already frozen: "+e+" on "+a));null===this.lb&&(this.lb=new H);this.lb.add(e);return this}; +oa.Object.defineProperties(bk.prototype,{panel:{configurable:!0,get:function(){return this.ig}},isRow:{configurable:!0,get:function(){return this.Or},set:function(a){this.Or=a}},index:{configurable:!0,get:function(){return this.Va},set:function(a){this.Va=a}},height:{configurable:!0,get:function(){return this.yc},set:function(a){var b=this.yc;b!==a&&(G&&A(a,"number",bk,"height"),0>a&&Aa(a,">= 0",bk,"height"),this.yc=a,this.actual=this.ma,null!== this.panel&&this.panel.v(),this.Hb("height",b,a))}},width:{configurable:!0,get:function(){return this.yc},set:function(a){var b=this.yc;b!==a&&(G&&A(a,"number",bk,"width"),0>a&&Aa(a,">= 0",bk,"width"),this.yc=a,this.actual=this.ma,null!==this.panel&&this.panel.v(),this.Hb("width",b,a))}},minimum:{configurable:!0,get:function(){return this.Vj},set:function(a){var b=this.Vj;b!==a&&(G&&A(a,"number",bk,"minimum"),(0>a||!isFinite(a))&&Aa(a,">= 0",bk,"minimum"),this.Vj=a,this.actual= this.ma,null!==this.panel&&this.panel.v(),this.Hb("minimum",b,a))}},maximum:{configurable:!0,get:function(){return this.Uj},set:function(a){var b=this.Uj;b!==a&&(G&&A(a,"number",bk,"maximum"),0>a&&Aa(a,">= 0",bk,"maximum"),this.Uj=a,this.actual=this.ma,null!==this.panel&&this.panel.v(),this.Hb("maximum",b,a))}},alignment:{configurable:!0,get:function(){return this.Bb},set:function(a){var b=this.Bb;b.B(a)||(G&&x(a,Ib,bk,"alignment"),this.Bb=a.L(),null!==this.panel&&this.panel.v(), this.Hb("alignment",b,a))}},stretch:{configurable:!0,get:function(){return this.Ne},set:function(a){var b=this.Ne;b!==a&&(G&&cb(a,O,bk,"stretch"),this.Ne=a,null!==this.panel&&this.panel.v(),this.Hb("stretch",b,a))}},separatorPadding:{configurable:!0,get:function(){return this.lg},set:function(a){"number"===typeof a?a=new ic(a):null!==a&&G&&x(a,ic,bk,"separatorPadding");var b=this.lg;null!==a&&null!==b&&b.B(a)||(null!==a&&(a=a.L()),this.lg=a,null!==this.panel&&this.panel.v(), @@ -1306,13 +1306,13 @@ this.Hb("separatorPadding",b,a))}},separatorStroke:{configurable:!0,get:function b,a))}},separatorDashArray:{configurable:!0,get:function(){return this.fk},set:function(a){var b=this.fk;if(b!==a){null===a||Array.isArray(a)||za(a,"Array",bk,"separatorDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;ee)){var f=d.measuredBounds,g=Math.max(1,f.width);f=f.height;for(var h=c[0],k=c[1],l,m,n,p,r,q,u=0,w=Ma(),y=2;yn&&(n=1);e=c=n;l=g/2;m=0===l?!1:!0;y=0;q=w[y];n=q[0];r=q[1];p=q[2];q=q[3];for(var z=0;.1<=u;){0===z&&(m?(e=c,e-=l,u-=l,m=!1):e=c,0===e&&(e=1)); if(e>u){Pa(w);return}e>q?(z=e-q,e=q):z=0;var B=Math.sqrt(e*e/(1+p*p));0>n&&(B=-B);h+=B;k+=p*B;a.translate(h,k);a.rotate(r);a.translate(-(g/2),-(f/2));0===z&&d.Ri(a,b);a.translate(g/2,f/2);a.rotate(-r);a.translate(-h,-k);u-=e;q-=e;if(0!==z){y++;if(y===w.length){Pa(w);return}q=w[y];n=q[0];r=q[1];p=q[2];q=q[3];e=z}}Pa(w)}} -t.Ri=function(a,b){var c=this.Jc,d=this.pl;if(null!==c||null!==d){var e=this.sa;if(null!==e){a.Hd();var f=this.actualBounds,g=this.naturalBounds;null!==d&&pi(this,a,d,!0,!1,g,f);var h=this.part,k=this.og;null===c||0!==k||null===h||!this.isPanelMain&&h.sb()!==this||(k=h.type===W.Link&&h instanceof Je&&"Selection"===h.category&&h.adornedObject instanceof Hf&&h.adornedPart.sb()===h.adornedObject?h.adornedObject.strokeWidth:0);0===k&&(c=null);null!==c&&0!==k&&(pi(this,a,c,!1,!1,g,f),a.lineWidth=k,a.lineJoin= +t.Ri=function(a,b){var c=this.Jc,d=this.pl;if(null!==c||null!==d){var e=this.sa;if(null!==e){a.Lc();var f=this.actualBounds,g=this.naturalBounds;null!==d&&pi(this,a,d,!0,!1,g,f);var h=this.part,k=this.og;null===c||0!==k||null===h||!this.isPanelMain&&h.sb()!==this||(k=h.type===W.Link&&h instanceof Je&&"Selection"===h.category&&h.adornedObject instanceof Hf&&h.adornedPart.sb()===h.adornedObject?h.adornedObject.strokeWidth:0);0===k&&(c=null);null!==c&&0!==k&&(pi(this,a,c,!1,!1,g,f),a.lineWidth=k,a.lineJoin= this.gm,a.lineCap=this.fm,a.miterLimit=this.gk);f=!1;h&&b.Se("drawShadows")&&(f=h.isShadowed);h=!0;null===c||null!==d&&"transparent"!==d||(h=!1);g=!1;k=this.strokeDashArray;null!==k&&(g=!0,a.Ns(k,this.uh));if(e.type===N.j)a.beginPath(),a.moveTo(e.startX,e.startY),a.lineTo(e.endX,e.endY),null!==c&&a.jj();else if(e.type===N.F){var l=e.startX;k=e.startY;var m=e.endX,n=e.endY;e=Math.min(l,m);var p=Math.min(k,n);l=Math.abs(m-l);k=Math.abs(n-k);a.beginPath();a.rect(e,p,l,k);null!==d&&a.Gf(d);if(null!== c){h&&f&&El(a);if(0===l||0===k)a.beginPath(),a.rect(e,p,Math.max(l,.1),Math.max(k,.1));a.jj();h&&f&&Dl(a)}}else if(e.type===N.P)l=e.startX,k=e.startY,m=e.endX,n=e.endY,e=Math.abs(m-l)/2,p=Math.abs(n-k)/2,l=Math.min(l,m)+e,k=Math.min(k,n)+p,a.beginPath(),a.moveTo(l,k-p),a.bezierCurveTo(l+L.Cg*e,k-p,l+e,k-L.Cg*p,l+e,k),a.bezierCurveTo(l+e,k+L.Cg*p,l+L.Cg*e,k+p,l,k+p),a.bezierCurveTo(l-L.Cg*e,k+p,l-e,k+L.Cg*p,l-e,k),a.bezierCurveTo(l-e,k-L.Cg*p,l-L.Cg*e,k-p,l,k-p),a.closePath(),null!==d&&a.Gf(d),null!== c&&(h&&f?(El(a),a.jj(),Dl(a)):a.jj());else if(e.type===N.o)for(e=e.figures,k=e.length,p=0;p(c.startX-c.endX)*(a.x-c.endX)+(c.startY-c.endY)*(a.y-c.endY)||0>d)return!1;M.free(f);return L.Rb(c.startX,c.startY,c.endX,c.endY,e,a.x,a.y)}if(c.type=== -N.F){b=c.startX;var g=c.startY,h=c.endX;c=c.endY;f.x=Math.min(b,h);f.y=Math.min(g,c);f.width=Math.abs(h-b);f.height=Math.abs(c-g);if(null===this.fill){f.Mc(-d,-d);if(f.ca(a))return M.free(f),!1;f.Mc(d,d)}null!==this.stroke&&f.Mc(e,e);a=f.ca(a);M.free(f);return a}if(c.type===N.P){g=c.startX;e=c.startY;h=c.endX;var k=c.endY;c=Math.min(g,h);b=Math.min(e,k);g=Math.abs(h-g)/2;e=Math.abs(k-e)/2;c=a.x-(c+g);b=a.y-(b+e);if(null===this.fill){g-=d;e-=d;if(0>=g||0>=e||1>=c*c/(g*g)+b*b/(e*e))return M.free(f), +t.Yi=function(a){void 0===a&&(a=new M);var b=this.naturalBounds,c=this.le;b=M.allocAt(b.x,b.y,b.width,b.height);var d=this.strokeWidth;b.Nc(d/2,d/2);d=K.allocAt(b.x,b.y).transform(c);a.h(d.x,d.y,0,0);d.h(b.right,b.y).transform(c);mc(a,d.x,d.y,0,0);d.h(b.right,b.bottom).transform(c);mc(a,d.x,d.y,0,0);d.h(b.x,b.bottom).transform(c);mc(a,d.x,d.y,0,0);M.free(b);K.free(d);return a}; +t.Ih=function(a,b){var c=this.geometry;if(null===c||null===this.fill&&null===this.stroke)return!1;var d=c.bounds,e=this.strokeWidth/2;c.type!==N.j||b||(e+=2);var f=M.alloc();f.assign(d);f.Nc(e+2,e+2);if(!f.ca(a))return M.free(f),!1;d=e+1E-4;if(c.type===N.j){if(null===this.stroke)return!1;d=(c.endX-c.startX)*(a.x-c.startX)+(c.endY-c.startY)*(a.y-c.startY);if(0>(c.startX-c.endX)*(a.x-c.endX)+(c.startY-c.endY)*(a.y-c.endY)||0>d)return!1;M.free(f);return L.Rb(c.startX,c.startY,c.endX,c.endY,e,a.x,a.y)}if(c.type=== +N.F){b=c.startX;var g=c.startY,h=c.endX;c=c.endY;f.x=Math.min(b,h);f.y=Math.min(g,c);f.width=Math.abs(h-b);f.height=Math.abs(c-g);if(null===this.fill){f.Nc(-d,-d);if(f.ca(a))return M.free(f),!1;f.Nc(d,d)}null!==this.stroke&&f.Nc(e,e);a=f.ca(a);M.free(f);return a}if(c.type===N.P){g=c.startX;e=c.startY;h=c.endX;var k=c.endY;c=Math.min(g,h);b=Math.min(e,k);g=Math.abs(h-g)/2;e=Math.abs(k-e)/2;c=a.x-(c+g);b=a.y-(b+e);if(null===this.fill){g-=d;e-=d;if(0>=g||0>=e||1>=c*c/(g*g)+b*b/(e*e))return M.free(f), !1;g+=d;e+=d}null!==this.stroke&&(g+=d,e+=d);M.free(f);return 0>=g||0>=e?!1:1>=c*c/(g*g)+b*b/(e*e)}if(c.type===N.o)return M.free(f),null===this.fill?ge(c,a.x,a.y,e):ee(c,a,e,1=this.strokeWidth)m=L.Ve(l.startX,l.startY,l.endX,l.endY,f,g,h,k,e);else{l.startX===l.endX?(d=n,m=0):(b=(l.endY-l.startY)/(l.endX-l.startX),m=n/Math.sqrt(1+b*b), d=m*b);b=Ma();a=new K;L.Ve(l.startX+d,l.startY+m,l.endX+d,l.endY+m,f,g,h,k,a)&&b.push(a);a=new K;L.Ve(l.startX-d,l.startY-m,l.endX-d,l.endY-m,f,g,h,k,a)&&b.push(a);a=new K;L.Ve(l.startX+d,l.startY+m,l.startX-d,l.startY-m,f,g,h,k,a)&&b.push(a);a=new K;L.Ve(l.endX+d,l.endY+m,l.endX-d,l.endY-m,f,g,h,k,a)&&b.push(a);h=b.length;if(0===h)return Pa(b),!1;m=!0;k=Infinity;for(d=0;dMath.abs(c)){k=g-m-c*(f-d);if(0>a*a*c*c+l*l-k*k){e.x=NaN;e.y=NaN;m=!1;break a}n=Math.sqrt(a*a*c*c+l*l-k*k);h=(-(a*a*c*k)+a*l*n)/(l*l+a*a*c*c)+d;a=(-(a*a*c*k)-a*l*n)/(l*l+a*a*c*c)+d;l=c*(h-d)+k+m;k=c* +n,r.y+r.height+n,f,g,h,k,e);else if(l.type===N.P){b=M.allocAt(r.x,r.y,r.width,r.height).Nc(n,n);a:if(0===b.width)m=L.Ve(b.x,b.y,b.x,b.y+b.height,f,g,h,k,e);else if(0===b.height)m=L.Ve(b.x,b.y,b.x+b.width,b.y,f,g,h,k,e);else{a=b.width/2;l=b.height/2;d=b.x+a;m=b.y+l;c=9999;f!==h&&(c=(g-k)/(f-h));if(9999>Math.abs(c)){k=g-m-c*(f-d);if(0>a*a*c*c+l*l-k*k){e.x=NaN;e.y=NaN;m=!1;break a}n=Math.sqrt(a*a*c*c+l*l-k*k);h=(-(a*a*c*k)+a*l*n)/(l*l+a*a*c*c)+d;a=(-(a*a*c*k)-a*l*n)/(l*l+a*a*c*c)+d;l=c*(h-d)+k+m;k=c* (a-d)+k+m;Math.abs((f-h)*(f-h))+Math.abs((g-l)*(g-l))h){e.x=NaN;e.y=NaN;m=!1;break a}k=Math.sqrt(h);h=m+k;k=m-k;Math.abs(h-g)Math.abs(q)?(u*=.5/q,q=.5):0!==u&&.5>Math.abs(u)&&(q*=.5/u,u=.5),y-=q,z-= u;r.contains(y,z);)y-=q,z-=u;e.x=h;e.y=k;for(u=0;uc?a-c:c-a)<(b>d?b-d:d-b)?(a=ba||L.da(k.y,a))&&(k.yb||L.da(k.x,b))&&(k.x=a&&d<=b;a=d&&c<=a} -t.ly=function(a,b,c){function d(a,b){for(var c=a.length,d=0;de)return!0;return!1}if(c&&null!==this.fill&&this.Ih(a,!0))return!0;var e=a.Ff(b),f=e;1.5e)return!0;return!1}if(c&&null!==this.fill&&this.Ih(a,!0))return!0;var e=a.Ff(b),f=e;1.5=e||Nb(b,f,0,-n)>= -e||Nb(b,f,0,n)>=e||Nb(b,f,m,0)>=e?!1:!0}else if(b.type===N.o){l=b.bounds;f=l.x;h=l.y;k=l.x+l.width;l=l.y+l.height;if(a.x>k&&a.xl&&a.ye&&Mb(a.x,a.y,f,h,k,h)>e&&Mb(a.x,a.y,k,l,f,l)>e&&Mb(a.x,a.y,k,l,k,h)>e)return!1;f=Math.sqrt(e);if(c){if(null===this.fill?ge(b,a.x,a.y,f):ee(b,a,f,!0,!1))return!0}else{c=b.figures;for(b=0;be)return!1;h=f.segments.m;k=h.length;for(l=0;le)return!1;break;case Td:var p=Ma();L.Pe(g,m,n.point1X,n.point1Y,n.point2X,n.point2Y,n.endX,n.endY,.8,p);g=d(p,a);Pa(p);if(g)return!1;g=n.endX;m=n.endY;if(a.td(g,m)>e)return!1;break;case Ud:p=Ma();L.Kq(g,m,n.point1X,n.point1Y,n.endX,n.endY,.8,p);g=d(p,a);Pa(p);if(g)return!1;g=n.endX;m=n.endY;if(a.td(g,m)>e)return!1;break;case Vd:case be:p=n.type===Vd?ce(n,f):de(n,f,g,m);var r=p.length;if(0===r){g=n.type===Vd?n.centerX:n.endX;m=n.type===Vd?n.centerY:n.endY;if(a.td(g,m)> +e||Nb(b,f,0,n)>=e||Nb(b,f,m,0)>=e?!1:!0}else if(b.type===N.o){l=b.bounds;f=l.x;h=l.y;k=l.x+l.width;l=l.y+l.height;if(a.x>k&&a.xl&&a.ye&&Mb(a.x,a.y,f,h,k,h)>e&&Mb(a.x,a.y,k,l,f,l)>e&&Mb(a.x,a.y,k,l,k,h)>e)return!1;f=Math.sqrt(e);if(c){if(null===this.fill?ge(b,a.x,a.y,f):ee(b,a,f,!0,!1))return!0}else{c=b.figures;for(b=0;be)return!1;h=f.segments.m;k=h.length;for(l=0;le)return!1;break;case Td:var p=Ma();L.Pe(g,m,n.point1X,n.point1Y,n.point2X,n.point2Y,n.endX,n.endY,.8,p);g=d(p,a);Pa(p);if(g)return!1;g=n.endX;m=n.endY;if(a.ud(g,m)>e)return!1;break;case Ud:p=Ma();L.Kq(g,m,n.point1X,n.point1Y,n.endX,n.endY,.8,p);g=d(p,a);Pa(p);if(g)return!1;g=n.endX;m=n.endY;if(a.ud(g,m)>e)return!1;break;case Vd:case be:p=n.type===Vd?ce(n,f):de(n,f,g,m);var r=p.length;if(0===r){g=n.type===Vd?n.centerX:n.endX;m=n.type===Vd?n.centerY:n.endY;if(a.ud(g,m)> e)return!1;break}n=null;for(var q=Ma(),u=0;ub+1E-5||d.bounds.height>c+1E-5)&&v('Geometry made with figure "'+a.figure+'" has bounds '+d.bounds.toString()+" that are too large for the given size ("+b+","+c+"). See documentation for Shape.defineFigureGenerator."); return d};function Qn(a){var b=Pn[a];if(void 0===b){var c=a.toLowerCase();if("none"===c)return"None";b=Pn[c];if(void 0===b){var d=null,e;for(e in L.cn)if(e.toLowerCase()===c){d=e;break}if(null!==d)return a=N.parse(L.cn[d],!1),Pn[d]=a,c!==d&&(Pn[c]=d),d}}return"string"===typeof b?b:b instanceof N?a:null} -oa.Object.defineProperties(Hf.prototype,{geometry:{configurable:!0,get:function(){return null!==this.sa?this.sa:this.Gd},set:function(a){var b=this.sa,c=this.Gd;if(b!==a){null!==a?(G&&x(a,N,Hf,"geometry"),this.Gd=this.sa=a.freeze()):this.Gd=this.sa=null;var d=this.part;null!==d&&(d.dg=NaN);this.v();this.g("geometry",b||c,a);rl(this)&&(a=this.part,null!==a&&sl(this,a,"geometryString"))}}},geometryString:{configurable:!0,get:function(){return null===this.geometry?"":this.geometry.toString()}, +oa.Object.defineProperties(Hf.prototype,{geometry:{configurable:!0,get:function(){return null!==this.sa?this.sa:this.Hd},set:function(a){var b=this.sa,c=this.Hd;if(b!==a){null!==a?(G&&x(a,N,Hf,"geometry"),this.Hd=this.sa=a.freeze()):this.Hd=this.sa=null;var d=this.part;null!==d&&(d.dg=NaN);this.v();this.g("geometry",b||c,a);rl(this)&&(a=this.part,null!==a&&sl(this,a,"geometryString"))}}},geometryString:{configurable:!0,get:function(){return null===this.geometry?"":this.geometry.toString()}, set:function(a){a=N.parse(a);var b=a.normalize();this.geometry=a;this.position=a=K.allocAt(-b.x,-b.y);K.free(a)}},isGeometryPositioned:{configurable:!0,get:function(){return this.ro},set:function(a){G&&A(a,"boolean",Hf,"isGeometryPositioned");var b=this.ro;b!==a&&(this.ro=a,this.v(),this.g("isGeometryPositioned",b,a))}},fill:{configurable:!0,get:function(){return this.pl},set:function(a){var b=this.pl;b!==a&&(null!==a&&am(a,"Shape.fill"),a instanceof Al&&a.freeze(),this.pl= a,this.R(),this.g("fill",b,a))}},stroke:{configurable:!0,get:function(){return this.Jc},set:function(a){var b=this.Jc;b!==a&&(null!==a&&am(a,"Shape.stroke"),a instanceof Al&&a.freeze(),this.Jc=a,this.R(),this.g("stroke",b,a))}},strokeWidth:{configurable:!0,get:function(){return this.og},set:function(a){var b=this.og;if(b!==a)if(G&&D(a,Hf,"strokeWidth"),0<=a){this.og=a;this.v();var c=this.part;null!==c&&(c.dg=NaN);this.g("strokeWidth",b,a)}else Aa(a,"value >= 0",Hf,"strokeWidth:value")}}, strokeCap:{configurable:!0,get:function(){return this.fm},set:function(a){var b=this.fm;b!==a&&("string"!==typeof a||"butt"!==a&&"round"!==a&&"square"!==a?Aa(a,'"butt", "round", or "square"',Hf,"strokeCap"):(this.fm=a,this.R(),this.g("strokeCap",b,a)))}},strokeJoin:{configurable:!0,get:function(){return this.gm},set:function(a){var b=this.gm;b!==a&&("string"!==typeof a||"miter"!==a&&"bevel"!==a&&"round"!==a?Aa(a,'"miter", "bevel", or "round"',Hf,"strokeJoin"):(this.gm= a,this.R(),this.g("strokeJoin",b,a)))}},strokeMiterLimit:{configurable:!0,get:function(){return this.gk},set:function(a){var b=this.gk;if(b!==a)if(G&&D(a,Hf,"strokeMiterLimit"),1<=a){this.gk=a;this.R();var c=this.part;null!==c&&(c.dg=NaN);this.g("strokeMiterLimit",b,a)}else G&&Aa(a,"value >= 1",Hf,"strokeWidth:value")}},strokeDashArray:{configurable:!0,get:function(){return this.th},set:function(a){var b=this.th;if(b!==a){null===a||Array.isArray(a)||za(a,"Array",Hf,"strokeDashArray:value"); if(null!==a){for(var c=a.length,d=0,e=0;ea?a=0:1a?a=0:1(n*n+m*m)*p*p&&(c=!0);b.Xb!==a&&(c=!1);!1===b.Se("textGreeking")&&(c=!1);b=this.tf;n= -this.uf;switch(this.flip){case ml:a.translate(e,0);a.scale(-1,1);break;case ll:a.translate(0,f);a.scale(1,-1);break;case nl:a.translate(e,f),a.scale(-1,-1)}a.Hd();m=this.bd;p=(b+g+n)*m;f>p&&(d=this.Ni,d=d.y*f-d.y*p+d.offsetY);if(1===m&&null!==this.we)n=this.vb,n>e&&(n=e),this.Qi(this.we,a,0,d+b,e,g,n,c,h,k,l);else if(null!==this.Fc&&null!==this.Ub)for(p=0;pe&&(r=e);d+=b;this.Qi(this.Ub[p],a,0,d,e,g,r,c,h,k,l);d+=g+n}switch(this.flip){case ml:a.scale(-1,1);a.translate(-e, +this.uf;switch(this.flip){case ml:a.translate(e,0);a.scale(-1,1);break;case ll:a.translate(0,f);a.scale(1,-1);break;case nl:a.translate(e,f),a.scale(-1,-1)}a.Lc();m=this.cd;p=(b+g+n)*m;f>p&&(d=this.Ni,d=d.y*f-d.y*p+d.offsetY);if(1===m&&null!==this.we)n=this.vb,n>e&&(n=e),this.Qi(this.we,a,0,d+b,e,g,n,c,h,k,l);else if(null!==this.Fc&&null!==this.Ub)for(p=0;pe&&(r=e);d+=b;this.Qi(this.Ub[p],a,0,d,e,g,r,c,h,k,l);d+=g+n}switch(this.flip){case ml:a.scale(-1,1);a.translate(-e, 0);break;case ll:a.scale(1,-1);a.translate(0,-f);break;case nl:a.scale(-1,-1),a.translate(-e,-f)}}}; t.Qi=function(a,b,c,d,e,f,g,h,k,l,m){var n=0;h?("left"===k?n=0:"right"===k?n=e-g:"center"===k&&(n=(e-g)/2),b.fillRect(c+n,d+.25*f,g,1)):("left"===k?n=0:"right"===k?n=e:"center"===k&&(n=e/2),e=null!==fo?fo(this,f):.75*f,b.fillText(a,c+n,d+e),a=f/20|0,0===a&&(a=1),"right"===k?n-=g:"center"===k&&(n-=g/2),l&&(k=null!==go?go(this,f):.8*f,b.beginPath(),b.lineWidth=a,b.moveTo(c+n,d+k),b.lineTo(c+n+g,d+k),b.stroke()),m&&(b.beginPath(),b.lineWidth=a,d=d+f-f/2.2|0,0!==a%2&&(d+=.5),b.moveTo(c+n,d),b.lineTo(c+ n+g,d),b.stroke()))}; t.Em=function(a,b,c,d){this.pi=a;var e=this.xe;null!==Zn&&ho!==e&&(ho=Zn.font=e);this.vb=this.Ke=0;this.we=this.Ub=this.Fc=this.ye=null;var f;if(isNaN(this.desiredSize.width)){e=this.Zb.replace(/\r\n/g,"\n").replace(/\r/g,"\n");if(0===e.length)e=0;else if(this.isMultiline){for(var g=f=0,h=!1;!h;){var k=e.indexOf("\n",g);-1===k&&(k=e.length,h=!0);g=e.substr(g,k-g);this.ii===bo&&(g=g.trim());f=Math.max(f,io(g));g=k+1}e=f}else f=e.indexOf("\n",0),0<=f&&(e=e.substr(0,f)),e=io(e);e=Math.min(e,a/this.scale); e=Math.max(8,e)}else e=this.desiredSize.width;null!==this.panel&&(e=Math.min(e,this.panel.maxSize.width));f=jo(this,e);isNaN(this.desiredSize.height)?f=Math.min(f,b/this.scale):f=this.desiredSize.height;h=f;if(0!==this.vb&&null!==this.Fc&&null!==this.Ub&&this.gg===ko&&(b=this.xe,b=this.gg===ko?lo(b):0,k=this.tf+this.uf,k=Math.max(0,eo(this)+k),h=Math.min(this.maxLines-1,Math.max(Math.floor(h/k+.01)-1,0)),!(h+1>=this.Ub.length))){k=this.Ub[h];for(b=Math.max(1,a-b);io(k)>b&&1=a.Ee)null!==d&&d.h(0,h);else if(g=b,a.sg===qo){a.Ke=1;var l=io(b);if(0===k||l<=c)a.vb=Math.max(a.vb,l),oo(a,b,a.vb),null!==d&&d.h(l,h);else{f=ro(a,g);g=g.substr(f.length);b=ro(a,g);for(l=io(f+b);0c&&1c;){var n=1;l=io(b.substr(0,n));for(m=0;l<=c;)n++,m=l,l=io(b.substr(0,n));if(1===n){var p=l;f=Math.max(f,l)}else p=m,f=Math.max(f,m);n--;1>n&&(n=1);oo(a,b.substr(0,n),p);k++;b=b.substr(n);if(a.bd+k>a.Ee)break}m=ro(a,g);for(l=io(b+m);0a.Ee))break}a.Ke=Math.min(a.Ee,k);a.vb=Math.max(a.vb,f);null!==d&&d.h(a.vb,h*a.Ke)}}function ro(a,b){if(a.sg===so)return b.substr(0,1);for(var c=b.length,d=0,e=to;d=b.length?b:b.substr(0,d)}function io(a){return null===Zn?8*a.length:Zn.measureText(a).width} +function po(a,b,c,d){var e=a.ii===bo;e&&(b=b.trim());var f=0,g=a.xe,h=a.tf+a.uf;h=Math.max(0,eo(a)+h);var k=a.gg===ko?lo(g):0;if(a.cd>=a.Ee)null!==d&&d.h(0,h);else if(g=b,a.sg===qo){a.Ke=1;var l=io(b);if(0===k||l<=c)a.vb=Math.max(a.vb,l),oo(a,b,a.vb),null!==d&&d.h(l,h);else{f=ro(a,g);g=g.substr(f.length);b=ro(a,g);for(l=io(f+b);0c&&1c;){var n=1;l=io(b.substr(0,n));for(m=0;l<=c;)n++,m=l,l=io(b.substr(0,n));if(1===n){var p=l;f=Math.max(f,l)}else p=m,f=Math.max(f,m);n--;1>n&&(n=1);oo(a,b.substr(0,n),p);k++;b=b.substr(n);if(a.cd+k>a.Ee)break}m=ro(a,g);for(l=io(b+m);0a.Ee))break}a.Ke=Math.min(a.Ee,k);a.vb=Math.max(a.vb,f);null!==d&&d.h(a.vb,h*a.Ke)}}function ro(a,b){if(a.sg===so)return b.substr(0,1);for(var c=b.length,d=0,e=to;d=b.length?b:b.substr(0,d)}function io(a){return null===Zn?8*a.length:Zn.measureText(a).width} function eo(a){if(null!==a.ye)return a.ye;var b=a.xe;if(null===Zn){var c=16;return a.ye=c}void 0!==vo[b]&&5E3>wo?c=vo[b]:(c=1.3*Zn.measureText("M").width,vo[b]=c,wo++);return a.ye=c}function lo(a){if(null===Zn)return 6;if(void 0!==xo[a]&&5E3>yo)var b=xo[a];else b=Zn.measureText(mo).width,xo[a]=b,yo++;return b} -function jo(a,b){var c=a.Zb.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),d=a.tf+a.uf;d=Math.max(0,eo(a)+d);if(0===c.length)return a.vb=0,a.bd=1,d;if(!a.isMultiline){var e=c.indexOf("\n",0);0<=e&&(c=c.substr(0,e))}e=0;for(var f=a.bd=0,g,h=!1;!h;){g=c.indexOf("\n",f);-1===g&&(g=c.length,h=!0);if(f<=g){f=c.substr(f,g-f);if(a.sg!==qo){a.Ke=0;var k=Hb.alloc();po(a,f,b,k);e+=k.height;Hb.free(k);a.bd+=a.Ke}else po(a,f,b,null),e+=d,a.bd++;a.bd===a.Ee&&(h=!0)}f=g+1}return a.Vr=e} +function jo(a,b){var c=a.Zb.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),d=a.tf+a.uf;d=Math.max(0,eo(a)+d);if(0===c.length)return a.vb=0,a.cd=1,d;if(!a.isMultiline){var e=c.indexOf("\n",0);0<=e&&(c=c.substr(0,e))}e=0;for(var f=a.cd=0,g,h=!1;!h;){g=c.indexOf("\n",f);-1===g&&(g=c.length,h=!0);if(f<=g){f=c.substr(f,g-f);if(a.sg!==qo){a.Ke=0;var k=Hb.alloc();po(a,f,b,k);e+=k.height;Hb.free(k);a.cd+=a.Ke}else po(a,f,b,null),e+=d,a.cd++;a.cd===a.Ee&&(h=!0)}f=g+1}return a.Vr=e} oa.Object.defineProperties(Yg.prototype,{font:{configurable:!0,get:function(){return this.xe},set:function(a){var b=this.xe;b!==a&&(G&&(A(a,"string",Yg,"font"),co(a)||v('Not a valid font: "'+a+'"')),this.xe=a,this.ye=null,this.v(),this.g("font",b,a))}},text:{configurable:!0,get:function(){return this.Zb},set:function(a){var b=this.Zb;null!==a&&void 0!==a?a=a.toString():a="";b!==a&&(this.Zb=a,this.v(),this.g("text",b,a))}},textAlign:{configurable:!0,get:function(){return this.Gi}, set:function(a){var b=this.Gi;b!==a&&(G&&A(a,"string",Yg,"textAlign"),"start"===a||"end"===a||"left"===a||"right"===a||"center"===a?(this.Gi=a,this.R(),this.g("textAlign",b,a)):G&&Aa(a,'"start", "end", "left", "right", or "center"',Yg,"textAlign"))}},flip:{configurable:!0,get:function(){return this.Xd},set:function(a){var b=this.Xd;b!==a&&(cb(a,O,Yg,"flip"),this.Xd=a,this.R(),this.g("flip",b,a))}},verticalAlignment:{configurable:!0,get:function(){return this.Ni},set:function(a){var b= this.Ni;b.B(a)||(G&&(x(a,Ib,Yg,"verticalAlignment"),a.bc()&&v("TextBlock.verticalAlignment for "+this+" must be a real Spot, not:"+a)),this.Ni=a=a.L(),Nl(this),this.g("verticalAlignment",b,a))}},naturalBounds:{configurable:!0,get:function(){if(!this.wc.s()){var a=Hb.alloc();po(this,this.Zb,999999,a);var b=a.width;Hb.free(a);a=jo(this,b);var c=this.desiredSize;isNaN(c.width)||(b=c.width);isNaN(c.height)||(a=c.height);dc(this.wc,b,a)}return this.wc}},isMultiline:{configurable:!0, get:function(){return this.Nj},set:function(a){var b=this.Nj;b!==a&&(G&&A(a,"boolean",Yg,"isMultiline"),this.Nj=a,this.v(),this.g("isMultiline",b,a))}},isUnderline:{configurable:!0,get:function(){return this.mi},set:function(a){var b=this.mi;b!==a&&(G&&A(a,"boolean",Yg,"isUnderline"),this.mi=a,this.R(),this.g("isUnderline",b,a))}},isStrikethrough:{configurable:!0,get:function(){return this.li},set:function(a){var b=this.li;b!==a&&(G&&A(a,"boolean",Yg,"isStrikethrough"), this.li=a,this.R(),this.g("isStrikethrough",b,a))}},wrap:{configurable:!0,get:function(){return this.sg},set:function(a){var b=this.sg;b!==a&&(G&&cb(a,Yg,Yg,"wrap"),this.sg=a,this.v(),this.g("wrap",b,a))}},overflow:{configurable:!0,get:function(){return this.gg},set:function(a){var b=this.gg;b!==a&&(G&&cb(a,Yg,Yg,"overflow"),this.gg=a,this.v(),this.g("overflow",b,a))}},stroke:{configurable:!0,get:function(){return this.Jc},set:function(a){var b=this.Jc;b!== -a&&(null!==a&&am(a,"TextBlock.stroke"),a instanceof Al&&a.freeze(),this.Jc=a,this.R(),this.g("stroke",b,a))}},lineCount:{configurable:!0,get:function(){return this.bd}},lineHeight:{configurable:!0,get:function(){return eo(this)}},editable:{configurable:!0,get:function(){return this.Rn},set:function(a){var b=this.Rn;b!==a&&(G&&A(a,"boolean",Yg,"editable"),this.Rn=a,this.g("editable",b,a))}},textEditor:{configurable:!0,get:function(){return this.Xp}, -set:function(a){var b=this.Xp;b!==a&&(!G||a instanceof Oe||v("TextBlock.textEditor must be an HTMLInfo."),this.Xp=a,this.g("textEditor",b,a))}},errorFunction:{configurable:!0,get:function(){return this.qd},set:function(a){var b=this.qd;b!==a&&(null!==a&&A(a,"function",Yg,"errorFunction"),this.qd=a,this.g("errorFunction",b,a))}},interval:{configurable:!0,get:function(){return this.be},set:function(a){var b=this.be;G&&D(a,Yg,"interval");a=Math.round(a);if(b!==a&&0!==a&&isFinite(a)){this.be= +a&&(null!==a&&am(a,"TextBlock.stroke"),a instanceof Al&&a.freeze(),this.Jc=a,this.R(),this.g("stroke",b,a))}},lineCount:{configurable:!0,get:function(){return this.cd}},lineHeight:{configurable:!0,get:function(){return eo(this)}},editable:{configurable:!0,get:function(){return this.Rn},set:function(a){var b=this.Rn;b!==a&&(G&&A(a,"boolean",Yg,"editable"),this.Rn=a,this.g("editable",b,a))}},textEditor:{configurable:!0,get:function(){return this.Xp}, +set:function(a){var b=this.Xp;b!==a&&(!G||a instanceof Oe||v("TextBlock.textEditor must be an HTMLInfo."),this.Xp=a,this.g("textEditor",b,a))}},errorFunction:{configurable:!0,get:function(){return this.rd},set:function(a){var b=this.rd;b!==a&&(null!==a&&A(a,"function",Yg,"errorFunction"),this.rd=a,this.g("errorFunction",b,a))}},interval:{configurable:!0,get:function(){return this.be},set:function(a){var b=this.be;G&&D(a,Yg,"interval");a=Math.round(a);if(b!==a&&0!==a&&isFinite(a)){this.be= a;this.v();var c=this.panel;null!==c&&(c.Zf=null);this.g("interval",b,a)}}},graduatedStart:{configurable:!0,get:function(){return this.$d},set:function(a){var b=this.$d;G&&D(a,Yg,"graduatedStart");b!==a&&(0>a?a=0:1a?a=0:1=a&&Aa(a,"> 0",Yg,"maxLines"),this.Ee=a,this.v(),this.g("maxLines",b,a))}},metrics:{configurable:!0,get:function(){return{arrSize:null!==this.Fc?this.Fc:[this.vb],arrText:null!==this.Ub?this.Ub:[this.we],maxLineWidth:this.vb,fontHeight:this.ye}}},choices:{configurable:!0,get:function(){return this.un},set:function(a){var b=this.un;b!==a&&(G&&null!==a&&!Array.isArray(a)&&za(a,"Array",Yg,"choices:value"),this.un=a,this.g("choices",b,a))}}}); var fo=null,go=null,qo=new F(Yg,"None",0),no=new F(Yg,"WrapFit",1),ao=new F(Yg,"WrapDesiredSize",2),so=new F(Yg,"WrapBreakAll",3),$n=new F(Yg,"OverflowClip",0),ko=new F(Yg,"OverflowEllipsis",1),bo=new F(Yg,"FormatTrim",0),uo=new F(Yg,"FormatNone",0),to=/[ \u200b\u00ad]/,vo=new eb,wo=0,xo=new eb,yo=0,mo="...",ho="",Zn=null,Yn=!1;Yg.className="TextBlock";Yg.getEllipsis=function(){return mo};Yg.setEllipsis=function(a){mo=a;xo=new eb;yo=0};Yg.getBaseline=function(){return fo}; Yg.setBaseline=function(a){fo=a};Yg.getUnderline=function(){return go};Yg.setUnderline=function(a){go=a};Yg.isValidFont=co;Yg.FormatNone=uo;Yg.FormatTrim=bo;Yg.None=qo;Yg.OverflowClip=$n;Yg.OverflowEllipsis=ko;Yg.WrapBreakAll=so;Yg.WrapDesiredSize=ao;Yg.WrapFit=no; -function jk(a,b){O.call(this);this.Sg=null;this.Qp="";this.sh=uc;this.sl=Fd;this.vh=this.qd=null;this.rl=Kc;this.Xd=tg;this.im=null;this.qo=!1;this.hi=!0;this.Hl=!1;this.bm=null;"string"===typeof a?this.source=a:a&&Object.assign(this,a);b&&Object.assign(this,b)}var zo;na(jk,O);jk.prototype.cloneProtected=function(a){O.prototype.cloneProtected.call(this,a);a.element=this.Sg;a.Qp=this.Qp;a.sh=this.sh.L();a.sl=this.sl;a.Xd=this.Xd;a.qd=this.qd;a.vh=this.vh;a.rl=this.rl.L();a.hi=this.hi;a.bm=this.bm}; +function jk(a,b){O.call(this);this.Sg=null;this.Qp="";this.sh=uc;this.sl=Fd;this.vh=this.rd=null;this.rl=Kc;this.Xd=tg;this.im=null;this.qo=!1;this.hi=!0;this.Hl=!1;this.bm=null;"string"===typeof a?this.source=a:a&&Object.assign(this,a);b&&Object.assign(this,b)}var zo;na(jk,O);jk.prototype.cloneProtected=function(a){O.prototype.cloneProtected.call(this,a);a.element=this.Sg;a.Qp=this.Qp;a.sh=this.sh.L();a.sl=this.sl;a.Xd=this.Xd;a.rd=this.rd;a.vh=this.vh;a.rl=this.rl.L();a.hi=this.hi;a.bm=this.bm}; jk.prototype.mb=function(a){a===tg||a===vg||a===kl?this.imageStretch=a:O.prototype.mb.call(this,a)};jk.prototype.toString=function(){return"Picture("+this.source+")#"+kb(this)};function Ki(a){void 0===a&&(a="");A(a,"string",jk,"clearCache:url");""!==a?zo[a]&&(delete zo[a],Ao--):(zo=new eb,Ao=0)} function Bo(a,b){b.kz||(b.Ur=function(c){b.Mr=!0;b.ko=!1;var d=b.Og.copy();if(null!==d&&void 0!==d){for(d=d.iterator;d.next();){var e=d.value;var f=b.getAttribute("src")||"";var g=e.lh.K(f);if(null!==g)for(var h=g.length,k=0;k=d.width&&(e=e+r.offsetX+(m*r.x-d.width*r.x));n>=d.height&&(f=f+r.offsetY+(n*r.y-d.height*r.y));h=Math.min(d.width,m);g=Math.min(d.height,n);break;case Fd:m=d.width;n=d.height;break;case vg:case kl:p===vg?(p=Math.min(d.height/n,d.width/m),m*=p,n*=p):p===kl&&(p=Math.max(d.height/n,d.width/m),m*=p,n*=p,m>=d.width&&(e=(e+r.offsetX+(m*r.x-d.width*r.x)/m)*h),n>=d.height&&(f=(f+r.offsetY+(n*r.y-d.height*r.y)/n)*g),h*=1/(m/ d.width),g*=1/(n/d.height),m=d.width,n=d.height)}p=this.If()*b.scale;var q=m*p*n*p,u=h*g/q,w=c.__goCache;p=null;var y=Co;if(c.Mr&&void 0!==w&&4y*y)for(null===w.Pi&&(Do(w,4,k,l,c),Do(w,16,k,l,c)),k=w.Pi,l=k.length,q=0;qe.x&&a.y>e.y&&a.righte.x&&b.y>e.y&&b.righte.x&&a.y>e.y&&a.righte.x&&b.y>e.y&&b.right=c.maxSelectionCount)){this.G^=4096;var d=!1;if(null!==c){d=c.skipsUndoManager;c.skipsUndoManager=!0;var e=c.selection; e.ka();a?e.add(this):e.remove(this);e.freeze()}this.g("isSelected",b,a);this.Qb();a=this.selectionChanged;null!==a&&a(this);null!==c&&(c.Lb(),c.skipsUndoManager=d)}}}},isHighlighted:{configurable:!0,get:function(){return 0!==(this.G&524288)},set:function(a){var b=0!==(this.G&524288);if(b!==a){G&&A(a,"boolean",U,"isHighlighted");this.G^=524288;var c=this.diagram;null!==c&&(c=c.highlighteds,c.ka(),a?c.add(this):c.remove(this),c.freeze());this.g("isHighlighted",b,a);this.R();a=this.highlightedChanged; @@ -1496,7 +1496,7 @@ this.Gp=a,this.g("selectionAdornmentTemplate",b,a))}},selectionObject:{configura b,a))}},resizeAdornmentTemplate:{configurable:!0,get:function(){return this.sp},set:function(a){var b=this.sp;b!==a&&(G&&x(a,Je,U,"resizeAdornmentTemplate"),this.sp=a,this.g("resizeAdornmentTemplate",b,a))}},resizeObjectName:{configurable:!0,get:function(){return this.vp},set:function(a){var b=this.vp;b!==a&&(G&&A(a,"string",U,"resizeObjectName"),this.vp=a,this.g("resizeObjectName",b,a))}},resizeObject:{configurable:!0,get:function(){var a=this.resizeObjectName; return""!==a&&(a=this.eb(a),null!==a)?a:this}},resizeCellSize:{configurable:!0,get:function(){return this.tp},set:function(a){var b=this.tp;b.B(a)||(G&&x(a,Hb,U,"resizeCellSize"),this.tp=a=a.L(),this.g("resizeCellSize",b,a))}},rotateAdornmentTemplate:{configurable:!0,get:function(){return this.xp},set:function(a){var b=this.xp;b!==a&&(G&&x(a,Je,U,"rotateAdornmentTemplate"),this.xp=a,this.g("rotateAdornmentTemplate",b,a))}},rotateObjectName:{configurable:!0, get:function(){return this.yp},set:function(a){var b=this.yp;b!==a&&(G&&A(a,"string",U,"rotateObjectName"),this.yp=a,this.g("rotateObjectName",b,a))}},rotateObject:{configurable:!0,get:function(){var a=this.rotateObjectName;return""!==a&&(a=this.eb(a),null!==a)?a:this}},rotationSpot:{configurable:!0,get:function(){return this.zp},set:function(a){var b=this.zp;b.B(a)||(G&&(x(a,Ib,U,"rotationSpot"),a===gd||a.fb()||v("Part.rotationSpot must be a specific Spot value or Spot.Default, not: "+ -a)),this.zp=a=a.L(),this.g("rotationSpot",b,a))}},text:{configurable:!0,get:function(){return this.Zb},set:function(a){var b=this.Zb;b!==a&&(G&&A(a,"string",U,"text"),this.Zb=a,this.g("text",b,a))}},containingGroup:{configurable:!0,get:function(){return this.ai},set:function(a){if(this.Pc()){var b=this.ai;if(b!==a){G&&null!==a&&x(a,vf,U,"containingGroup");null===a||this!==a&&!a.Md(this)||(this===a&&v("Cannot make a Group a member of itself: "+this.toString()),v("Cannot make a Group indirectly contain itself: "+ +a)),this.zp=a=a.L(),this.g("rotationSpot",b,a))}},text:{configurable:!0,get:function(){return this.Zb},set:function(a){var b=this.Zb;b!==a&&(G&&A(a,"string",U,"text"),this.Zb=a,this.g("text",b,a))}},containingGroup:{configurable:!0,get:function(){return this.ai},set:function(a){if(this.Qc()){var b=this.ai;if(b!==a){G&&null!==a&&x(a,vf,U,"containingGroup");null===a||this!==a&&!a.Md(this)||(this===a&&v("Cannot make a Group a member of itself: "+this.toString()),v("Cannot make a Group indirectly contain itself: "+ this.toString()+" already contains "+a.toString()));this.C(2);var c=this.diagram;null!==b?Vo(b,this):this instanceof vf&&null!==c&&c.Ji.remove(this);this.ai=a;null!==a?Uo(a,this):this instanceof vf&&null!==c&&c.Ji.add(this);this.C(1);if(null!==c&&c.ba){var d=this.data,e=c.model;if(null!==d&&e.aj()){var f=e.va(null!==a?a.data:null);e.Tq(d,f)}}d=this.containingGroupChanged;null!==d&&(e=!0,null!==c&&(e=c.ba,c.ba=!0),d(this,b,a),null!==c&&(c.ba=e));if(this instanceof vf)for(c=new I,el(c,this,!0,0,!0), c=c.iterator;c.next();)if(d=c.value,d instanceof V)for(d=d.linksConnected;d.next();)$o(d.value);if(this instanceof V){for(c=this.linksConnected;c.next();)$o(c.value);c=this.labeledLink;null!==c&&$o(c)}this.g("containingGroup",b,a);null!==a&&(b=a.layer,null!==b&&qi(b,-1,a))}}else v("cannot set the Part.containingGroup of a Link or Adornment")}},containingGroupChanged:{configurable:!0,get:function(){return this.xn},set:function(a){var b=this.xn;b!==a&&(null!==a&&A(a,"function",U,"containingGroupChanged"), this.xn=a,this.g("containingGroupChanged",b,a))}},isTopLevel:{configurable:!0,get:function(){return null!==this.containingGroup||this instanceof V&&null!==this.labeledLink?!1:!0}},layoutConditions:{configurable:!0,get:function(){return this.Eo},set:function(a){var b=this.Eo;b!==a&&(G&&A(a,"number",U,"layoutConditions"),this.Eo=a,this.g("layoutConditions",b,a))}},dragComputation:{configurable:!0,get:function(){return this.Nn},set:function(a){var b=this.Nn; @@ -1504,14 +1504,14 @@ b!==a&&(null!==a&&A(a,"function",U,"dragComputation"),this.Nn=a,this.g("dragComp enumerable:!0,get:function(){return this.ng},set:function(a){var b=this.ng;b!==a&&(G&&A(a,"number",U,"shadowBlur"),this.ng=a,this.R(),this.g("shadowBlur",b,a))}}});U.prototype.invalidateLayout=U.prototype.C;U.prototype.findCommonContainingGroup=U.prototype.iy;U.prototype.isMemberOf=U.prototype.Md;U.prototype.findTopLevelPart=U.prototype.qA;U.prototype.findSubGraphLevel=U.prototype.mA;U.prototype.ensureBounds=U.prototype.Xa;U.prototype.getDocumentBounds=U.prototype.Yi;U.prototype.findObject=U.prototype.eb; U.prototype.moveTo=U.prototype.moveTo;U.prototype.invalidateAdornments=U.prototype.Qb;U.prototype.clearAdornments=U.prototype.mk;U.prototype.removeAdornment=U.prototype.Of;U.prototype.addAdornment=U.prototype.Eh;U.prototype.findAdornment=U.prototype.vk;U.prototype.updateTargetBindings=U.prototype.Ia;var So=!1;U.className="Part";U.LayoutNone=0;U.LayoutAdded=1;U.LayoutRemoved=2;U.LayoutShown=4;U.LayoutHidden=8;U.LayoutNodeSized=16;U.LayoutGroupLayout=32;U.LayoutNodeReplaced=64;U.LayoutStandard=127; U.LayoutAll=16777215;function Je(a,b){void 0===a||a instanceof Yl||"string"===typeof a?U.call(this,a):(U.call(this),a&&(b=a));this.G&=-257;this.$g="Adornment";this.re=null;this.sx=0;this.Mx=!1;this.j=this.Ra=null;b&&Object.assign(this,b)}na(Je,U);Je.prototype.toString=function(){var a=this.adornedPart;return"Adornment("+this.category+")"+(null!==a?a.toString():"")};Je.prototype.updateRelationshipsFromData=function(){}; -Je.prototype.Ek=function(a){var b=this.adornedObject,c=null===b||void 0===b?void 0:b.part;if(c instanceof R&&b instanceof Hf){b=c.path;c.Ek(a);a=b.geometry;c=this.W.m;b=c.length;for(var d=0;da&&(a=2);var b=this.diagram;if(null!==b&&!b.Ue){b.Ue=!0;var c=new I;c.add(this);mp(this,c,b.isTreePathToChildren,a,b,this,b.treeCollapsePolicy===Ei);b.Ue=!1}}; -function mp(a,b,c,d,e,f,g){for(var h=f===a?!1:a.isTreeExpanded,k=c?a.uq():a.Kd();k.next();){var l=k.value;l.isTreeLink&&(h||l.xd||l.Za(),l=l.zq(a),null!==l&&l!==a&&!b.contains(l)&&(b.add(l),h||(l.Sb(!0),l.Nh(),g&&e.kk(l,f)),2e&&(e=h.right);h.bottom>f&&(f=h.bottom)}}isFinite(c)&&isFinite(d)?a.h(c,d,e-c,f-d):(b=b.location, a.h(b.x,b.y,0,0));return a};oa.Object.defineProperties(rg.prototype,{padding:{configurable:!0,get:function(){return this.rb},set:function(a){"number"===typeof a?a=new ic(a):x(a,ic,rg,"padding");var b=this.rb;b.B(a)||(this.rb=a=a.L(),this.g("padding",b,a),this.v())}}});rg.className="Placeholder"; -function R(a){U.call(this,W.Link);this.Na=8;this.df=null;this.ef="";this.xf=this.$n=null;this.yf="";this.$p=null;this.Rk=hg;this.En=0;this.Gn=hg;this.Hn=NaN;this.ak=rp;this.Pp=.5;this.rd=null;this.Gb=(new H).freeze();this.qf=this.Ic=null;this.Tl=new M;this.sa=new N;this.F=this.o=this.Uf=this.Yf=null;this.dv=new K;this.Dr=this.Fx=this.Ex=null;this.du=NaN;this.T=null;this.j=[];a&&Object.assign(this,a)}na(R,U); +function R(a){U.call(this,W.Link);this.Na=8;this.df=null;this.ef="";this.xf=this.$n=null;this.yf="";this.$p=null;this.Rk=hg;this.En=0;this.Gn=hg;this.Hn=NaN;this.ak=rp;this.Pp=.5;this.sd=null;this.Gb=(new H).freeze();this.qf=this.Ic=null;this.Tl=new M;this.sa=new N;this.F=this.o=this.Uf=this.Yf=null;this.dv=new K;this.Dr=this.Fx=this.Ex=null;this.du=NaN;this.T=null;this.j=[];a&&Object.assign(this,a)}na(R,U); R.prototype.cloneProtected=function(a){U.prototype.cloneProtected.call(this,a);a.Na=this.Na&-113;a.ef=this.ef;a.$n=this.$n;a.yf=this.yf;a.$p=this.$p;a.Rk=this.Rk;a.En=this.En;a.Gn=this.Gn;a.Hn=this.Hn;a.ak=this.ak;a.Pp=this.Pp;null!==this.T&&(a.T=this.T.copy())};t=R.prototype;t.Ef=function(a){U.prototype.Ef.call(this,a);this.ef=a.ef;this.yf=a.yf;a.Ic=null;a.Za();a.Uf=this.Uf;var b=a.fromPort;null!==b&&dp(b);a=a.toPort;null!==a&&dp(a)}; -t.mb=function(a){a.classType===R?2===(a.value&2)?this.routing=a:a===kg||a===gg||a===fg?this.curve=a:a===sp||a===tp||a===up?this.adjusting=a:a!==rp&&a!==hg&&v("Unknown Link enum value for a Link property: "+a):U.prototype.mb.call(this,a)};t.Nc=function(){null===this.T&&(this.T=new ql)};t.ej=function(){var a=this.fromNode;if(null!==a){var b=a.findVisibleNode();null!==b&&(a=b);if(Bj(a)||Cj(a))return!1}a=this.toNode;return null!==a&&(b=a.findVisibleNode(),null!==b&&(a=b),Bj(a)||Cj(a))?!1:!0};t.mw=function(){return!1}; -t.tt=function(){};t.Pc=function(){return!1};R.prototype.computeAngle=function(a,b,c){return R.computeAngle(b,c)};R.computeAngle=function(a,b){switch(a){default:case hg:a=0;break;case fn:a=b;break;case Zm:a=b+90;break;case an:a=b-90;break;case vp:a=b+180;break;case gn:a=L.Iq(b);90a&&(a-=180);break;case $m:a=L.Iq(b+90);90a&&(a-=180);break;case bn:a=L.Iq(b-90);90a&&(a-=180);break;case cn:a=L.Iq(b);if(45a||225a)return 0;90a&&(a-=180)}return L.Iq(a)}; -function $o(a){var b=a.fromNode,c=a.toNode,d=null;null!==b?d=null!==c?b.iy(c):b.containingGroup:null!==c?d=c.containingGroup:d=null;b=d;c=a.ai;if(c!==b){null!==c&&Vo(c,a);a.ai=b;null!==b&&Uo(b,a);var e=a.containingGroupChanged;if(null!==e){var f=!0,g=a.diagram;null!==g&&(f=g.ba,g.ba=!0);e(a,c,b);null!==g&&(g.ba=f)}!a.xd||a.Ex!==c&&a.Fx!==c||a.Za()}if(a.isLabeledLink)for(a=a.labelNodes;a.next();)a.value.containingGroup=d}t=R.prototype; -t.Nh=function(){var a=this.containingGroup;null!==a&&this.fromNode!==a&&this.toNode!==a&&a.computesBoundsIncludingLinks&&U.prototype.Nh.call(this)};t.zq=function(a){G&&x(a,V,R,"getOtherNode:node");var b=this.fromNode;return a===b?this.toNode:b};t.zA=function(a){G&&x(a,O,R,"getOtherPort:port");var b=this.fromPort;return a===b?this.toPort:b};function hp(a,b){null===a.rd&&(a.rd=new I);a.rd.add(b);a.v()} +t.mb=function(a){a.classType===R?2===(a.value&2)?this.routing=a:a===kg||a===gg||a===fg?this.curve=a:a===sp||a===tp||a===up?this.adjusting=a:a!==rp&&a!==hg&&v("Unknown Link enum value for a Link property: "+a):U.prototype.mb.call(this,a)};t.Oc=function(){null===this.T&&(this.T=new ql)};t.ej=function(){var a=this.fromNode;if(null!==a){var b=a.findVisibleNode();null!==b&&(a=b);if(Bj(a)||Cj(a))return!1}a=this.toNode;return null!==a&&(b=a.findVisibleNode(),null!==b&&(a=b),Bj(a)||Cj(a))?!1:!0};t.mw=function(){return!1}; +t.tt=function(){};t.Qc=function(){return!1};R.prototype.computeAngle=function(a,b,c){return R.computeAngle(b,c)};R.computeAngle=function(a,b){switch(a){default:case hg:a=0;break;case fn:a=b;break;case Zm:a=b+90;break;case an:a=b-90;break;case vp:a=b+180;break;case gn:a=L.Iq(b);90a&&(a-=180);break;case $m:a=L.Iq(b+90);90a&&(a-=180);break;case bn:a=L.Iq(b-90);90a&&(a-=180);break;case cn:a=L.Iq(b);if(45a||225a)return 0;90a&&(a-=180)}return L.Iq(a)}; +function $o(a){var b=a.fromNode,c=a.toNode,d=null;null!==b?d=null!==c?b.iy(c):b.containingGroup:null!==c?d=c.containingGroup:d=null;b=d;c=a.ai;if(c!==b){null!==c&&Vo(c,a);a.ai=b;null!==b&&Uo(b,a);var e=a.containingGroupChanged;if(null!==e){var f=!0,g=a.diagram;null!==g&&(f=g.ba,g.ba=!0);e(a,c,b);null!==g&&(g.ba=f)}!a.yd||a.Ex!==c&&a.Fx!==c||a.Za()}if(a.isLabeledLink)for(a=a.labelNodes;a.next();)a.value.containingGroup=d}t=R.prototype; +t.Nh=function(){var a=this.containingGroup;null!==a&&this.fromNode!==a&&this.toNode!==a&&a.computesBoundsIncludingLinks&&U.prototype.Nh.call(this)};t.zq=function(a){G&&x(a,V,R,"getOtherNode:node");var b=this.fromNode;return a===b?this.toNode:b};t.zA=function(a){G&&x(a,O,R,"getOtherPort:port");var b=this.fromPort;return a===b?this.toPort:b};function hp(a,b){null===a.sd&&(a.sd=new I);a.sd.add(b);a.v()} t.Bq=function(a){U.prototype.Bq.call(this,a);wp(this)&&this.Dq(this.actualBounds);if(!a){a=this.df;var b=null;null!==a&&(b=this.fromPort,fp(a,this,b));var c=this.xf;if(null!==c){var d=this.toPort;c===a&&d===b||fp(c,this,d)}xp(this)}};t.Cq=function(a){U.prototype.Cq.call(this,a);wp(this)&&this.Dq(this.actualBounds);if(!a){a=this.df;var b=null;null!==a&&(b=this.fromPort,gp(a,this,b));var c=this.xf;if(null!==c){var d=this.toPort;c===a&&d===b||gp(c,this,d)}yp(this)}}; -t.tk=function(){this.xd=!0;if(null!==this.rd){var a=this.diagram;if(null!==a)for(var b=this.rd.copy().iterator;b.next();)a.remove(b.value)}null!==this.data&&(a=this.diagram,null!==a&&a.partManager.removeDataForLink(this))};R.prototype.updateRelationshipsFromData=function(){if(null!==this.data){var a=this.diagram;null!==a&&a.partManager.updateRelationshipsFromData(this)}}; +t.tk=function(){this.yd=!0;if(null!==this.sd){var a=this.diagram;if(null!==a)for(var b=this.sd.copy().iterator;b.next();)a.remove(b.value)}null!==this.data&&(a=this.diagram,null!==a&&a.partManager.removeDataForLink(this))};R.prototype.updateRelationshipsFromData=function(){if(null!==this.data){var a=this.diagram;null!==a&&a.partManager.updateRelationshipsFromData(this)}}; R.prototype.move=function(a,b){var c=b?this.location:this.position,d=c.x;isNaN(d)&&(d=0);var e=c.y;isNaN(e)&&(e=0);d=a.x-d;e=a.y-e;!0===b?U.prototype.move.call(this,a,!1):(a=K.allocAt(c.x+d,c.y+e),U.prototype.move.call(this,a,!1),K.free(a));lf(this,d,e);for(a=this.labelNodes;a.next();)b=a.value,c=b.position,b.moveTo(c.x+d,c.y+e)}; R.prototype.canRelinkFrom=function(){if(!this.relinkableFrom)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowRelink)return!1;a=a.diagram;return null===a||a.allowRelink?!0:!1};R.prototype.canRelinkTo=function(){if(!this.relinkableTo)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowRelink)return!1;a=a.diagram;return null===a||a.allowRelink?!0:!1}; R.prototype.computeMidPoint=function(a){var b=this.pointsCount;if(0===b)return a.assign(Cb),a;if(1===b)return a.assign(this.i(0)),a;if(2===b){var c=this.i(0),d=this.i(1);a.h((c.x+d.x)/2,(c.y+d.y)/2);return a}if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===kg))return this.sa.Jv(.5,a),a.add(this.i(0)),c=this.sa.figures.first(),a.offset(-c.startX,-c.startY),a;if(this.computeCurve()===kg){if(3===b)return this.i(1);d=(b-1)/3|0;c=3*(d/2|0);if(1===d%2){d=this.i(c);var e=this.i(c+1), f=this.i(c+2);c=this.i(c+3);L.Hz(d.x,d.y,e.x,e.y,f.x,f.y,c.x,c.y,a)}else a.assign(this.i(c));return a}var g=this.flattenedLengths;c=this.flattenedTotalLength;for(e=f=d=0;dc/2)break;d+=e;f++}b=this.i(f);f=this.i(f+1);1>Math.abs(b.x-f.x)?b.y>f.y?a.h(b.x,b.y-(c/2-d)):a.h(b.x,b.y+(c/2-d)):1>Math.abs(b.y-f.y)?b.x>f.x?a.h(b.x-(c/2-d),b.y):a.h(b.x+(c/2-d),b.y):(c=(c/2-d)/e,a.h(b.x+c*(f.x-b.x),b.y+c*(f.y-b.y)));return a}; -R.prototype.computeMidAngle=function(){var a=this.pointsCount;if(2>a)return NaN;if(2===a)return this.i(0).Ua(this.i(1));if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===kg))return this.sa.oy(.5);if(this.computeCurve()===kg&&4<=a){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){c=Math.floor(c);a=this.i(c);b=this.i(c+1);var d=this.i(c+2);c=this.i(c+3);return L.Gz(a.x,a.y,b.x,b.y,d.x,d.y,c.x,c.y)}if(0d/2)break;e+=f;c++}b=this.i(c);d=this.i(c+1);if(1>Math.abs(b.x-d.x)&&1>Math.abs(b.y-d.y)){if(0Math.abs(b.x-d.x))return b.y>d.y?270:90;if(1>Math.abs(b.y-d.y))return b.x>d.x?180:0}return b.Ua(d)};t=R.prototype;t.i=function(a){return this.Gb.m[a]}; -t.Sc=function(a,b){G&&(x(b,K,R,"setPoint"),b.s()||v("Link.setPoint called with a Point that does not have real numbers: "+b.toString()));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.Rc(a,b)};t.O=function(a,b,c){G&&(D(b,R,"setPointAt:x"),D(c,R,"setPointAt:y"));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.Rc(a,new K(b,c))}; +R.prototype.computeMidAngle=function(){var a=this.pointsCount;if(2>a)return NaN;if(2===a)return this.i(0).Wa(this.i(1));if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===kg))return this.sa.oy(.5);if(this.computeCurve()===kg&&4<=a){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){c=Math.floor(c);a=this.i(c);b=this.i(c+1);var d=this.i(c+2);c=this.i(c+3);return L.Gz(a.x,a.y,b.x,b.y,d.x,d.y,c.x,c.y)}if(0d/2)break;e+=f;c++}b=this.i(c);d=this.i(c+1);if(1>Math.abs(b.x-d.x)&&1>Math.abs(b.y-d.y)){if(0Math.abs(b.x-d.x))return b.y>d.y?270:90;if(1>Math.abs(b.y-d.y))return b.x>d.x?180:0}return b.Wa(d)};t=R.prototype;t.i=function(a){return this.Gb.m[a]}; +t.Tc=function(a,b){G&&(x(b,K,R,"setPoint"),b.s()||v("Link.setPoint called with a Point that does not have real numbers: "+b.toString()));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.Sc(a,b)};t.O=function(a,b,c){G&&(D(b,R,"setPointAt:x"),D(c,R,"setPointAt:y"));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.Sc(a,new K(b,c))}; t.IA=function(a,b){G&&(x(b,K,R,"insertPoint"),b.s()||v("Link.insertPoint called with a Point that does not have real numbers: "+b.toString()));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.zb(a,b)};t.l=function(a,b,c){G&&(D(b,R,"insertPointAt:x"),D(c,R,"insertPointAt:y"));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.zb(a,new K(b,c))}; t.ke=function(a){G&&(x(a,K,R,"addPoint"),a.s()||v("Link.addPoint called with a Point that does not have real numbers: "+a.toString()));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.add(a)};t.Bf=function(a,b){G&&(D(a,R,"insertPointAt:x"),D(b,R,"insertPointAt:y"));G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.add(new K(a,b))}; t.ew=function(a){G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.kb(a)};t.nk=function(){G&&null===this.Ic&&v("Call Link.startRoute before modifying the points of the route.");this.Gb.clear()}; -function lf(a,b,c){if(0!==b||0!==c)if(0===a.pointsCount)a.defaultFromPoint&&a.defaultFromPoint.offset(b,c),a.defaultToPoint&&a.defaultToPoint.offset(b,c);else{for(var d=a.xd,e=new H,f=a.Gb.iterator;f.next();){var g=f.value;e.add((new K(g.x+b,g.y+c)).freeze())}e.freeze();f=a.Gb;a.Gb=e;g=a.diagram;isNaN(b)||isNaN(c)||null!==g&&g.animationManager.wb?a.v():(a.ge.h(a.ge.x+b,a.ge.y+c),a.qa.h(a.qa.x+b,a.qa.y+c),Nl(a));d?zp(a):(a.defaultFromPoint&&(a.defaultFromPoint=a.i(0)),a.defaultToPoint&&(a.defaultToPoint= +function lf(a,b,c){if(0!==b||0!==c)if(0===a.pointsCount)a.defaultFromPoint&&a.defaultFromPoint.offset(b,c),a.defaultToPoint&&a.defaultToPoint.offset(b,c);else{for(var d=a.yd,e=new H,f=a.Gb.iterator;f.next();){var g=f.value;e.add((new K(g.x+b,g.y+c)).freeze())}e.freeze();f=a.Gb;a.Gb=e;g=a.diagram;isNaN(b)||isNaN(c)||null!==g&&g.animationManager.wb?a.v():(a.ge.h(a.ge.x+b,a.ge.y+c),a.qa.h(a.qa.x+b,a.qa.y+c),Nl(a));d?zp(a):(a.defaultFromPoint&&(a.defaultFromPoint=a.i(0)),a.defaultToPoint&&(a.defaultToPoint= a.i(a.pointsCount-1)));null!==g&&g.animationManager.wb&&(b=g.animationManager,a.qf=e,b.Vl.add(a));a.g("points",f,e)}}t.Sh=function(){null===this.Ic&&(this.Ic=this.Gb,this.Gb=this.Gb.copy())}; t.Df=function(){if(null!==this.Ic){for(var a=this.Ic,b=this.Gb,c=Infinity,d=Infinity,e=a.m,f=e.length,g=0;gl&&(n=-n),u= -(0>k?-1:1)*n+r,w=m*(u-r)+q);r=f.x+2*h/3;q=f.y+2*k/3;var y=r,z=q;L.A(k,0)?z=0k?-1:1)*n+r,z=m*(y-r)+q);this.nk();this.ke(f);this.Bf(u,w);this.Bf(y,z);this.ke(p);this.Sc(0,this.getLinkPoint(a,b,g,!0,!1,d,e));this.Sc(3,this.getLinkPoint(d,e,c,!1,!1,a,b))}else if(f=d,p=e,d=this.getLinkPoint(a,b,g,!0,!1,f,p),e=this.getLinkPoint(f,p,c,!1,!1,a,b),this.hasCurviness())p=e.x-d.x,c=e.y-d.y,g=this.computeCurviness(),a=d.x+p/2,b=d.y+c/2,f=a,h=b,L.A(c,0)?h=0g&&(f=-f),f=(0>c?-1:1)*f+a,h=p*(f-a)+b),this.ke(d),this.Bf(f,h),this.ke(e);else{this.ke(d);this.ke(e);h=M.alloc();b.Yi(h);k=h.ca(e);p.Yi(h);l=h.ca(d);if(k||l)g=b.ja(Ep(g),new K),this.Sc(0,this.getLinkPointFromPoint(a,b,g,e,!0,g)),c=p.ja(Ep(c),new K),this.Sc(1,this.getLinkPointFromPoint(f,p,c,d,!1,c));M.free(h)}}else{n=this.isAvoiding;p&&(m&&n||l)&&this.nk();var B=l?this.computeCurviness():0;n=this.getLinkPoint(a,b,g,!0,m,d,e);r=u=q=0;if(m||!h||l)w=this.computeEndSegmentLength(a,b,g,!0),r= +(0>k?-1:1)*n+r,w=m*(u-r)+q);r=f.x+2*h/3;q=f.y+2*k/3;var y=r,z=q;L.A(k,0)?z=0k?-1:1)*n+r,z=m*(y-r)+q);this.nk();this.ke(f);this.Bf(u,w);this.Bf(y,z);this.ke(p);this.Tc(0,this.getLinkPoint(a,b,g,!0,!1,d,e));this.Tc(3,this.getLinkPoint(d,e,c,!1,!1,a,b))}else if(f=d,p=e,d=this.getLinkPoint(a,b,g,!0,!1,f,p),e=this.getLinkPoint(f,p,c,!1,!1,a,b),this.hasCurviness())p=e.x-d.x,c=e.y-d.y,g=this.computeCurviness(),a=d.x+p/2,b=d.y+c/2,f=a,h=b,L.A(c,0)?h=0g&&(f=-f),f=(0>c?-1:1)*f+a,h=p*(f-a)+b),this.ke(d),this.Bf(f,h),this.ke(e);else{this.ke(d);this.ke(e);h=M.alloc();b.Yi(h);k=h.ca(e);p.Yi(h);l=h.ca(d);if(k||l)g=b.ja(Ep(g),new K),this.Tc(0,this.getLinkPointFromPoint(a,b,g,e,!0,g)),c=p.ja(Ep(c),new K),this.Tc(1,this.getLinkPointFromPoint(f,p,c,d,!1,c));M.free(h)}}else{n=this.isAvoiding;p&&(m&&n||l)&&this.nk();var B=l?this.computeCurviness():0;n=this.getLinkPoint(a,b,g,!0,m,d,e);r=u=q=0;if(m||!h||l)w=this.computeEndSegmentLength(a,b,g,!0),r= this.getLinkDirection(a,b,n,g,!0,m,d,e),l&&(h||g.B(c)||!m&&1===g.x+c.x&&1===g.y+c.y)&&(r-=m?90:30,0>B&&(r-=180)),0>r?r+=360:360<=r&&(r-=360),l&&(w+=Math.abs(B)*(m?1:2)),0===r?q=w:90===r?u=w:180===r?q=-w:270===r?u=-w:(q=w*Math.cos(r*Math.PI/180),u=w*Math.sin(r*Math.PI/180)),g.bc()&&l&&(w=b.ja(Kc,K.alloc()),y=K.allocAt(w.x+1E3*q,w.y+1E3*u),this.getLinkPointFromPoint(a,b,w,y,!0,n),K.free(w),K.free(y));w=this.getLinkPoint(d,e,c,!1,m,a,b);var C=z=y=0;if(m||!k||l){var E=this.computeEndSegmentLength(d,e, c,!1);C=this.getLinkDirection(d,e,w,c,!1,m,a,b);l&&(k||g.B(c)||!m&&1===g.x+c.x&&1===g.y+c.y)&&(C+=m?0:30,0>B&&(C+=180));0>C?C+=360:360<=C&&(C-=360);l&&(E+=Math.abs(B)*(m?1:2));0===C?y=E:90===C?z=E:180===C?y=-E:270===C?z=-E:(y=E*Math.cos(C*Math.PI/180),z=E*Math.sin(C*Math.PI/180));c.bc()&&l&&(c=e.ja(Kc,K.alloc()),g=K.allocAt(c.x+1E3*y,c.y+1E3*z),this.getLinkPointFromPoint(d,e,c,g,!1,w),K.free(c),K.free(g))}c=n;if(m||!h||l)c=new K(n.x+q,n.y+u);g=w;if(m||!k||l)g=new K(w.x+y,w.y+z);!p&&!m&&h&&3Math.abs(b.y-a.y)?(b.x>=a.x?b.x=a.x+9E9:b.x=a.x-9E9,b.y=a.y):(b.y>=a.y?b.y=a.y+9E9:b.y=a.y-9E9,b.x=a.x);return b} +n,f-2,g)?this.Tc(f-1,w):!p&&!m&&k&&3Math.abs(b.y-a.y)?(b.x>=a.x?b.x=a.x+9E9:b.x=a.x-9E9,b.y=a.y):(b.y>=a.y?b.y=a.y+9E9:b.y=a.y-9E9,b.x=a.x);return b} R.prototype.getLinkPointFromPoint=function(a,b,c,d,e,f){void 0===f&&(f=new K);if(null===a||null===b)return f.assign(c),f;a.isVisible()||(e=a.findVisibleNode(),null!==e&&e!==a&&(b=e.port));a=null;e=b.panel;null===e||e.pe()||(e=e.panel);if(null===e){e=d.x;d=d.y;var g=c.x;c=c.y}else{a=e.le;e=1/(a.m11*a.m22-a.m12*a.m21);g=a.m22*e;var h=-a.m12*e,k=-a.m21*e,l=a.m11*e,m=e*(a.m21*a.dy-a.m22*a.dx),n=e*(a.m12*a.dx-a.m11*a.dy);e=d.x*g+d.y*k+m;d=d.x*h+d.y*l+n;g=c.x*g+c.y*k+m;c=c.x*h+c.y*l+n}b.yk(e,d,g,c,f);null!== a&&f.transform(a);return f};function Gp(a,b){var c=b.op;null===c&&(c=new Hp,c.port=b,c.node=b.part,b.op=c);return Ip(c,a)} -R.prototype.getLinkPoint=function(a,b,c,d,e,f,g,h){void 0===h&&(h=new K);if(c.fb()&&!Dp(c))return b.ja(c,h),h;if(c.Qc()){var k=Gp(this,b);if(null!==k){h.assign(k.Gq);if(e&&this.routing===Jp){var l=Gp(this,g);if(null!==l&&k.tm=m.y&&a.y<=m.y+m.height?h.y=a.y:(c.Lf(Qc)||c.Lf(Tc))&&a.x>=m.x&&a.x<=m.x+m.width&&(h.x=a.x);K.free(k);K.free(l)}}return h}}c= +R.prototype.getLinkPoint=function(a,b,c,d,e,f,g,h){void 0===h&&(h=new K);if(c.fb()&&!Dp(c))return b.ja(c,h),h;if(c.Rc()){var k=Gp(this,b);if(null!==k){h.assign(k.Gq);if(e&&this.routing===Jp){var l=Gp(this,g);if(null!==l&&k.tm=m.y&&a.y<=m.y+m.height?h.y=a.y:(c.Lf(Qc)||c.Lf(Tc))&&a.x>=m.x&&a.x<=m.x+m.width&&(h.x=a.x);K.free(k);K.free(l)}}return h}}c= b.ja(Ep(c),K.alloc());this.pointsCount>(e?6:2)?(g=d?this.i(1):this.i(this.pointsCount-2),e&&(g=Fp(c,g.copy()))):(k=this.computeSpot(!d,g),f=K.alloc(),g=g.ja(Ep(k),f),e&&(g=Fp(c,g)),K.free(f));this.getLinkPointFromPoint(a,b,c,g,d,h);K.free(c);return h}; -R.prototype.getLinkDirection=function(a,b,c,d,e,f,g,h){a:if(d.fb())var k=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x1-d.y?90:d.x<1-d.y?180:135:.5>d.x?225:.5(f?6:2)?(h=e?this.i(1):this.i(this.pointsCount-2),h=f?Fp(k,h.copy()):c):(c=K.alloc(),h=h.ja(Kc,c),K.free(c));c=Math.abs(h.x-k.x)>Math.abs(h.y-k.y)?h.x>= -k.x?0:180:h.y>=k.y?90:270;K.free(k);k=c}d.bc()&&g.Md(a)&&(k+=180,360<=k&&(k-=360));if(Dp(d))return k;a=b.Xi();if(0===a)return k;45<=a&&135>a?k+=90:135<=a&&225>a?k+=180:225<=a&&315>a&&(k+=270);360<=k&&(k-=360);return k};R.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.Qc()&&(a=Gp(this,b),null!==a))return a.Bv;a=d?this.fromEndSegmentLength:this.toEndSegmentLength;null!==b&&isNaN(a)&&(a=d?b.fromEndSegmentLength:b.toEndSegmentLength);isNaN(a)&&(a=10);return a}; +R.prototype.getLinkDirection=function(a,b,c,d,e,f,g,h){a:if(d.fb())var k=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x1-d.y?90:d.x<1-d.y?180:135:.5>d.x?225:.5(f?6:2)?(h=e?this.i(1):this.i(this.pointsCount-2),h=f?Fp(k,h.copy()):c):(c=K.alloc(),h=h.ja(Kc,c),K.free(c));c=Math.abs(h.x-k.x)>Math.abs(h.y-k.y)?h.x>= +k.x?0:180:h.y>=k.y?90:270;K.free(k);k=c}d.bc()&&g.Md(a)&&(k+=180,360<=k&&(k-=360));if(Dp(d))return k;a=b.Xi();if(0===a)return k;45<=a&&135>a?k+=90:135<=a&&225>a?k+=180:225<=a&&315>a&&(k+=270);360<=k&&(k-=360);return k};R.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.Rc()&&(a=Gp(this,b),null!==a))return a.Bv;a=d?this.fromEndSegmentLength:this.toEndSegmentLength;null!==b&&isNaN(a)&&(a=d?b.fromEndSegmentLength:b.toEndSegmentLength);isNaN(a)&&(a=10);return a}; R.prototype.computeSpot=function(a,b){void 0===b&&(b=null);a?(a=b?b:this.fromPort,null===a?a=Kc:(b=this.fromSpot,b.Kb()&&(b=a.fromSpot),a=b===gd?Dc:b)):(a=b?b:this.toPort,null===a?a=Kc:(b=this.toSpot,b.Kb()&&(b=a.toSpot),a=b===gd?Dc:b));return a};function Dp(a){return a===Dc||.5===a.x&&.5===a.y}function Ep(a){return.5===a.x&&.5===a.y?a:Kc} R.prototype.computeOtherPoint=function(a,b){if(this.computeAdjusting()!==hg&&4p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=Kb.alloc();n.set(g); +R.prototype.Hf=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var g=f;void 0===f&&(g=Kb.alloc(),g.reset());g.multiply(this.transform);if(this.Hh(a,g))return tn(this,b,c,e),void 0===f&&Kb.free(g),!0;if(this.Pc(a,g)){var h=!1;if(!this.isAtomic)for(var k=this.W.m,l=k.length;l--;){var m=k[l];if(m.visible||m===this.locationObject){var n=m.actualBounds,p=this.naturalBounds;if(!(n.x>p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=Kb.alloc();n.set(g); if(m instanceof W)h=m.Hf(a,b,c,d,e,n);else if(this.path===m){if(m instanceof Hf)if(h=a,p=d,!1===m.pickable)h=!1;else if(n.multiply(m.transform),p)b:{var r=h,q=n;if(m.Hh(r,q))h=!0;else{if(void 0===q&&(q=m.transform,r.Qe(m.actualBounds))){h=!0;break b}h=r.left;p=r.right;var u=r.top;r=r.bottom;var w=K.alloc(),y=K.alloc(),z=K.alloc(),B=Kb.alloc();B.set(q);B.Vv(m.transform);B.$s();y.x=p;y.y=u;y.transform(B);w.x=h;w.y=u;w.transform(B);q=!1;Nn(m,w,y,z)?q=!0:(w.x=p,w.y=r,w.transform(B),Nn(m,w,y,z)?q=!0:(y.x= h,y.y=r,y.transform(B),Nn(m,w,y,z)?q=!0:(w.x=h,w.y=u,w.transform(B),Nn(m,w,y,z)&&(q=!0))));Kb.free(B);K.free(w);K.free(y);K.free(z);h=q}}else h=m.Hh(h,n)}else h=ul(m,a,d,n);h&&(p=m,null!==b&&(p=b(m)),p&&(null===c||c(p))&&e.add(p));Kb.free(n)}}}void 0===f&&Kb.free(g);return h||null!==this.background||null!==this.areaBackground}void 0===f&&Kb.free(g);return!1}; R.prototype.computeCurve=function(){if(null===this.Yf){var a=this.fromPort,b=this.isOrthogonal;this.Yf=null!==a&&a===this.toPort&&!b}return this.Yf?kg:this.curve};R.prototype.computeCorner=function(){if(this.curve===kg)return 0;var a=this.corner;if(isNaN(a)||0>a)a=10;return a}; R.prototype.findMidLabel=function(){for(var a=this.path,b=this.W.m,c=b.length,d=0;dk?-Math.PI/2:Math.PI/2;else m=Math.atan(k/Math.abs(h)),0>h&&(m=Math.PI-m);g=b.x;var n=b.y;h=d.x-g;var p=d.y-n;k=Math.sqrt(h*h+p*p);L.da(h,0)?p=0>p?-Math.PI/2:Math.PI/2:(p=Math.atan(p/Math.abs(h)),0>h&&(p=Math.PI-p)); -l=k/l;m=p-m;this.Sc(a,b);for(a+=1;ak?-Math.PI/2:Math.PI/2:(k=Math.atan(k/Math.abs(h)),0>h&&(k=Math.PI-k)),h=k+m,b*=l,this.O(a,g+b*Math.cos(h),n+b*Math.sin(h)));this.Sc(c,d)}}return!0;case up:f=this.i(a);n=this.i(c);if(!f.Ya(b)||!n.Ya(d)){e=f.x;f=f.y;g=n.x;n=n.y;l=(g-e)*(g-e)+(n-f)*(n-f);h=b.x;m=b.y;k=d.x;p=d.y;var r=1;if(0!==k-h){var q=(p-m)/(k-h);r=Math.sqrt(1+1/(q*q))}else q=9E9;this.Sc(a,b);for(a+=1;ab?b+=360:360<=b&&(b-=360);0>d?d+=360:360<=d&&(d-=360);var g=d;b=315<=b||45>b?0:45<=b&&135>b?90:135<=b&&225>b?180:270;d=315<=d||45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.actualBounds.copy(),k=f.actualBounds.copy();if(h.s()&&k.s()){h.Mc(Mp,Mp);k.Mc(Mp,Mp);h.Ye(a);k.Ye(c);var l=K.alloc(),m=K.alloc();if(0===b)if(c.x>a.x||270===d&&c.ya.x||90===d&&c.y>a.y&&k.right>a.x)l.h(c.x,a.y),m.h(c.x,(a.y+c.y)/2),180===d?(l.x=this.computeMidOrthoPosition(a.x, +l=k/l;m=p-m;this.Tc(a,b);for(a+=1;ak?-Math.PI/2:Math.PI/2:(k=Math.atan(k/Math.abs(h)),0>h&&(k=Math.PI-k)),h=k+m,b*=l,this.O(a,g+b*Math.cos(h),n+b*Math.sin(h)));this.Tc(c,d)}}return!0;case up:f=this.i(a);n=this.i(c);if(!f.Ya(b)||!n.Ya(d)){e=f.x;f=f.y;g=n.x;n=n.y;l=(g-e)*(g-e)+(n-f)*(n-f);h=b.x;m=b.y;k=d.x;p=d.y;var r=1;if(0!==k-h){var q=(p-m)/(k-h);r=Math.sqrt(1+1/(q*q))}else q=9E9;this.Tc(a,b);for(a+=1;ab?b+=360:360<=b&&(b-=360);0>d?d+=360:360<=d&&(d-=360);var g=d;b=315<=b||45>b?0:45<=b&&135>b?90:135<=b&&225>b?180:270;d=315<=d||45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.actualBounds.copy(),k=f.actualBounds.copy();if(h.s()&&k.s()){h.Nc(Mp,Mp);k.Nc(Mp,Mp);h.Ye(a);k.Ye(c);var l=K.alloc(),m=K.alloc();if(0===b)if(c.x>a.x||270===d&&c.ya.x||90===d&&c.y>a.y&&k.right>a.x)l.h(c.x,a.y),m.h(c.x,(a.y+c.y)/2),180===d?(l.x=this.computeMidOrthoPosition(a.x, a.y,c.x,c.y,!1),m.x=l.x,m.y=c.y):270===d&&c.ya.y?(l.x=a.xk.bottom)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):k.right,m.x=l.x,m.y=c.y):0===d&&a.xk.top&&a.yh.bottom)180===d&&(k.ca(a)||h.ca(c))? l.y=this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!0):c.ya.y&&(180===d||270===d)&&(l.y=this.computeMidOrthoPosition(a.x,h.bottom,c.x,Math.min(c.y,k.top),!0)),m.x=c.x,m.y=l.y;if(l.y>h.top&&l.y=h.left&&c.x<=a.x||a.x<=k.right&&a.x>=c.x){if(90===d||270===d)l.h(Math.max((a.x+c.x)/2,a.x),a.y),m.h(l.x,c.y)}else l.y=270===d||(0===d||180===d)&&c.ya.y&&k.lefta.y?(l.x=a.x>k.right?this.computeMidOrthoPosition(a.x,a.y,k.right,c.y,!1):a.x>k.left&&(270===d&&a.yk.bottom)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):k.left,m.x=l.x, @@ -1649,16 +1649,16 @@ a.y,c.x,c.y,!1):c.xa.x&&k.top=a.x?(l.y=a.y>k.bottom?this.computeMidOrthoPosition(a.x,a.y,c.x,k.bottom,!0):a.y>k.top&&(180===d&&a.xk.right)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!0):k.top,m.x=c.x,m.y=l.y):270===d&&a.y>k.bottom&&a.x>k.left&&a.xh.right)90===d&&(k.ca(a)||h.ca(c))?l.x=this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):c.xa.x&&(90===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right,a.y,Math.min(c.x,k.left),c.y,!1)),m.x=l.x,m.y=c.y;if(l.x>h.left&&l.x=a.y||a.y>=k.top&&a.y<=c.y){if(0===d||180===d)l.h(a.x,Math.min((a.y+c.y)/2,a.y)),m.h(c.x,l.y)}else l.x=180===d||(90===d||270===d)&&c.x=Pp&&(Fk(r),h.Mc(r.oq*r.Cy,r.nq*r.Dy),Np(r,a,b,n,d,h,!1),k=Op(r, +Math.min(a.y,l.y),Math.abs(a.x-l.x),Math.abs(a.y-l.y))&&r.Ck(Math.min(l.x,m.x),Math.min(l.y,m.y),Math.abs(l.x-m.x),Math.abs(l.y-m.y))&&r.Ck(Math.min(m.x,n.x),Math.min(m.y,n.y),Math.abs(m.x-n.x),Math.abs(m.y-n.y)))b=!1;else{e=a;f=n;var q=c=null;if(p.isVirtualized){p=r.bounds.copy();p.Nc(-r.oq,-r.nq);var u=K.alloc();Gk(r,a.x,a.y)||(L.Kf(p.x,p.y,p.x+p.width,p.y+p.height,a.x,a.y,l.x,l.y,u)?(c=a=u.copy(),b=u.Wa(l)):L.Kf(p.x,p.y,p.x+p.width,p.y+p.height,l.x,l.y,m.x,m.y,u)?(c=a=u.copy(),b=u.Wa(m)):L.Kf(p.x, +p.y,p.x+p.width,p.y+p.height,m.x,m.y,n.x,n.y,u)&&(c=a=u.copy(),b=u.Wa(n)));Gk(r,n.x,n.y)||(L.Kf(p.x,p.y,p.x+p.width,p.y+p.height,n.x,n.y,m.x,m.y,u)?(q=n=u.copy(),d=m.Wa(u)):L.Kf(p.x,p.y,p.x+p.width,p.y+p.height,m.x,m.y,l.x,l.y,u)?(q=n=u.copy(),d=l.Wa(u)):L.Kf(p.x,p.y,p.x+p.width,p.y+p.height,l.x,l.y,a.x,a.y,u)&&(q=n=u.copy(),d=a.Wa(u)));K.free(u)}h=h.copy().Uc(k);h.Nc(r.oq*r.vt,r.nq*r.vt);Np(r,a,b,n,d,h,!0);k=Op(r,n.x,n.y);!r.abort&&k>=Pp&&(Fk(r),h.Nc(r.oq*r.Cy,r.nq*r.Dy),Np(r,a,b,n,d,h,!1),k=Op(r, n.x,n.y));if(!r.abort&&kthis.pointsCount)0===b||180===b?(h.x=a.x,h.y=n.y):(h.x=n.x,h.y=a.y),this.O(2,h.x,h.y),this.l(3,h.x,h.y);else if(g=this.i(3),0===b||180===b)L.A(h.x,g.x)?(h=0===b?Math.max(h.x,a.x):Math.min(h.x,a.x),this.O(2,h,a.y),this.O(3,h,g.y)):L.A(h.y,g.y)?(Math.abs(a.y-h.y)<=r.nq/2&&(this.O(2,h.x,a.y),this.O(3,g.x,a.y)),this.l(2,h.x,a.y)):this.O(2,a.x,h.y);else if(90===b||270===b)L.A(h.y,g.y)?(h=90===b?Math.max(h.y,a.y): Math.min(h.y,a.y),this.O(2,a.x,h),this.O(3,g.x,h)):L.A(h.x,g.x)?(Math.abs(a.x-h.x)<=r.oq/2&&(this.O(2,a.x,h.y),this.O(3,a.x,g.y)),this.l(2,a.x,h.y)):this.O(2,h.x,a.y);null!==c&&(a=this.i(1),g=this.i(2),a.x!==g.x&&a.y!==g.y?0===b||180===b?this.l(2,a.x,g.y):this.l(2,g.x,a.y):0===b||180===b?this.l(2,e.x,c.y):this.l(2,c.x,e.y));null!==q&&(0===d||180===d?this.Bf(f.x,q.y):this.Bf(q.x,f.y));b=!0}else b=!1}}}else b=!1;b||(this.ke(l.copy()),this.ke(m.copy()));K.free(l);K.free(m)}}; -R.prototype.computeMidOrthoPosition=function(a,b,c,d,e){var f=0;!this.hasCurviness()||this.computeSpot(!0,this.fromPort).Qc()||this.computeSpot(!1,this.toPort).Qc()||(f=this.computeCurviness());return e?(b+d)/2+f:(a+c)/2+f}; +R.prototype.computeMidOrthoPosition=function(a,b,c,d,e){var f=0;!this.hasCurviness()||this.computeSpot(!0,this.fromPort).Rc()||this.computeSpot(!1,this.toPort).Rc()||(f=this.computeCurviness());return e?(b+d)/2+f:(a+c)/2+f}; function Yj(a){if(null===a.diagram||!a.isAvoiding||!qk(a.diagram))return!1;var b=a.points.m,c=b.length;if(4>c)return!1;a=rk(a.diagram,!0,a.containingGroup,null);for(var d=1;dRp&&Op(b,m,n)!==l-1&&(Op(b,c-h,d)===l-1?(e=180,m=c-h,n=d):Op(b,c+h,d)===l-1?(e=0,m=c+h,n=d):Op(b,c,d-k)===l-1?(e=270,m=c,n=d-k):Op(b,c,d+k)===l-1&&(e=90,m=c,n=d+k));for(;l>Rp&&Op(b,m,n)===l-1;)c=m,d=n,0===e?m+=h:90===e?n+=k:180===e?m-=h:n-=k,--l;if(f){if(l>Rp)if(180===e||0===e)c=Math.floor(c/h)*h+h/2;else if(90===e||270===e)d=Math.floor(d/k)*k+k/2}else c=Math.floor(c/h)*h+h/2,d=Math.floor(d/ k)*k+k/2;l>Rp&&(f=e,g=c,m=d,0===e?(f=90,m+=k):90===e?(f=180,g-=h):180===e?(f=270,m-=k):270===e&&(f=0,g+=h),Op(b,g,m)===l-1?Qp(a,b,g,m,f,!1,f):(g=c,m=d,0===e?(f=270,m-=k):90===e?(f=0,g+=h):180===e?(f=90,m+=k):270===e&&(f=180,g-=h),Op(b,g,m)===l-1&&Qp(a,b,g,m,f,!1,f)));a.Bf(c,d)} R.prototype.cA=function(a){G&&x(a,K,R,"findClosestSegment:p");var b=a.x;a=a.y;for(var c=this.i(0),d=this.i(1),e=Mb(b,a,c.x,c.y,d.x,d.y),f=0,g=1;gb)return a.type=N.j,this.Zm=!0,a;var c=!1,d=this.diagram;null!==d&&wp(this)&&d.gi.contains(this)&&(0!==this.Tl.width||0!==this.Tl.height)&&(c=!0);var e=this.i(0).copy(),f=e.copy();d=this.Gb.m;var g=this.computeCurve();if(g===kg&&3<=b&&!L.da(this.smoothness,0))if(3===b){var h=this.i(1);d=Math.min(e.x,h.x);var k=Math.min(e.y,h.y);h=this.i(2);d=Math.min(d,h.x);k=Math.min(k,h.y)}else{if(this.isOrthogonal)for(k=0;k=b&&(d=b-1),k=this.i(d),f.x=Math.min(k.x,f.x),f.y=Math.min(k.y,f.y);d=f.x;k=f.y}else{for(k=0;kw?q>r?(f.x= @@ -1672,13 +1672,13 @@ function Tp(a,b,c,d){for(var e=a.pointsCount,f=b;L.da(b.x,f.x)&&L.da(b.y,f.y);){ function Vp(a,b,c,d,e,f,g){if(!g&&wp(a)){g=a.computeJumpLength();var h=g/2,k=[],l=0;a.isVisible()&&(l=Wp(a,e,f,k));if(0n-g)l--,n=Math.max(m-h,f.x);else break;m=f.y-g+d;n+=c;r=f.y+d;a.curve===gg?Jd(b,n,r,!1):Kd(b,p,m,n,m,n,r)}else if(L.A(e.x,f.x))if(e.ym-g)l--,m=Math.max(n-h,f.y);else break;n=f.x-g+c;r=f.x+c;m+=d;a.curve===gg?Jd(b,r,m,!1):Kd(b,n,p,n,m,r,m)}}b.lineTo(f.x+c,f.y+d)} -function Wp(a,b,c,d){var e=a.diagram;if(null===e||b.B(c))return 0;for(e=e.layers;e.next();){var f=e.value;if(null!==f&&f.visible){f=f.Ka.m;for(var g=f.length,h=0;hg.x&&m.x>=l.x||l.xg.y&&m.y>=l.y||l.yq&&Math.min(g,w)n&&!L.A(g,w)){h.x=q;h.y=n;m=!0;break a}}else if(!L.A(n,r)&& L.A(g,w)&&Math.min(n,r)g&&Math.min(q,u)m&&!L.A(q,u)){h.x=m;h.y=g;m=!0;break a}h.x=0;h.y=0;m=!1}m&&(e?c.push(h.x):c.push(h.y));g=l}K.free(h)}function wp(a){a=a.curve;return a===fg||a===gg}function Ap(a,b){if(b||wp(a))b=a.diagram,null===b||b.animationManager.isTicking||b.gi.contains(a)||0===a.Tl.width&&0===a.Tl.height||b.gi.add(a,a.Tl.copy())} R.prototype.Dq=function(a){var b=this.layer;if(null!==b&&b.visible&&!b.isTemporary){var c=b.diagram;if(null!==c&&!c.animationManager.isTicking){var d=!1;for(c=c.layers;c.next();){var e=c.value;if(e.visible)if(e===b){d=!0;var f=!1;e=e.Ka.m;for(var g=e.length,h=0;ha&&Aa(a,">= 0",R,"fromEndSegmentLength"),this.T.Tg=a,this.g("fromEndSegmentLength",b,a),this.Za())}},fromShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.Ug:NaN},set:function(a){this.Nc();var b=this.T.Ug;b!==a&&(G&&A(a,"number",R,"fromShortLength"),this.T.Ug= -a,this.ic(!0),this.g("fromShortLength",b,a))}},toSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Ah:gd},set:function(a){this.Nc();var b=this.T.Ah;b.B(a)||(G&&x(a,Ib,R,"toSpot"),a=a.L(),this.T.Ah=a,this.g("toSpot",b,a),(b.Qc()||a.Qc())&&null!==this.toNode&&dp(this.toPort),this.Za())}},toEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.yh:NaN},set:function(a){this.Nc();var b=this.T.yh;b!==a&&(G&&A(a,"number",R,"toEndSegmentLength"), -0>a&&Aa(a,">= 0",R,"toEndSegmentLength"),this.T.yh=a,this.g("toEndSegmentLength",b,a),this.Za())}},toShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.zh:NaN},set:function(a){this.Nc();var b=this.T.zh;b!==a&&(G&&A(a,"number",R,"toShortLength"),this.T.zh=a,this.ic(!0),this.g("toShortLength",b,a))}},isLabeledLink:{configurable:!0,get:function(){return null===this.rd?!1:0a&&Aa(a,">= 0",R,"fromEndSegmentLength"),this.T.Tg=a,this.g("fromEndSegmentLength",b,a),this.Za())}},fromShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.Ug:NaN},set:function(a){this.Oc();var b=this.T.Ug;b!==a&&(G&&A(a,"number",R,"fromShortLength"),this.T.Ug= +a,this.ic(!0),this.g("fromShortLength",b,a))}},toSpot:{configurable:!0,get:function(){return null!==this.T?this.T.Ah:gd},set:function(a){this.Oc();var b=this.T.Ah;b.B(a)||(G&&x(a,Ib,R,"toSpot"),a=a.L(),this.T.Ah=a,this.g("toSpot",b,a),(b.Rc()||a.Rc())&&null!==this.toNode&&dp(this.toPort),this.Za())}},toEndSegmentLength:{configurable:!0,get:function(){return null!==this.T?this.T.yh:NaN},set:function(a){this.Oc();var b=this.T.yh;b!==a&&(G&&A(a,"number",R,"toEndSegmentLength"), +0>a&&Aa(a,">= 0",R,"toEndSegmentLength"),this.T.yh=a,this.g("toEndSegmentLength",b,a),this.Za())}},toShortLength:{configurable:!0,get:function(){return null!==this.T?this.T.zh:NaN},set:function(a){this.Oc();var b=this.T.zh;b!==a&&(G&&A(a,"number",R,"toShortLength"),this.T.zh=a,this.ic(!0),this.g("toShortLength",b,a))}},isLabeledLink:{configurable:!0,get:function(){return null===this.sd?!1:0=d&&(f=d-1);var h=this.i(f-1),k=this.i(f);L.pm(e.x,e.y,g.x,g.y,h.x,h.y,k.x,k.y,.5,a);b=Math.min(k.x,b);c=Math.min(k.y,c);e=k}else for(e=this.i(0),f=this.i(1),b=Math.min(e.x,f.x),c=Math.min(e.y,f.y),a.h(e.x,e.y,0,0),a.Ye(f),e=2;ed&&(d=-d)):L.da(d.y,e.y)?(d=e.x-d.x,0>d&&(d=-d)):d=Math.sqrt(d.Ff(e));a.push(d)}}return this.Dr}},flattenedTotalLength:{configurable:!0, +enumerable:!0,get:function(){this.Bg();return this.computeMidPoint(new K)}},midAngle:{configurable:!0,get:function(){this.Bg();return this.computeMidAngle()}},flattenedLengths:{configurable:!0,get:function(){if(null===this.Dr){this.yd||zp(this);for(var a=this.Dr=[],b=this.pointsCount,c=0;cd&&(d=-d)):L.da(d.y,e.y)?(d=e.x-d.x,0>d&&(d=-d)):d=Math.sqrt(d.Ff(e));a.push(d)}}return this.Dr}},flattenedTotalLength:{configurable:!0, enumerable:!0,get:function(){var a=this.du;if(isNaN(a)){for(var b=this.flattenedLengths,c=b.length,d=a=0;d=this.pointsCount?0:this.isOrthogonal||!Dp(this.computeSpot(!0))?1:0}},lastPickIndex:{configurable:!0,get:function(){var a=this.pointsCount;return 0=== a?0:2>=a?a-1:this.isOrthogonal||!Dp(this.computeSpot(!1))?a-2:a-1}},adjusting:{configurable:!0,get:function(){return this.Rk},set:function(a){var b=this.Rk;b!==a&&(G&&a!==hg&&a!==sp&&a!==tp&&a!==up&&v("Link.adjusting can only be set to Link.None, Link.End, LInk.Scale, or Link.Stretch, not: "+a),this.Rk=a,this.g("adjusting",b,a))}},corner:{configurable:!0,get:function(){return this.En},set:function(a){var b=this.En;b!==a&&(G&&A(a,"number",R,"corner"),this.En=a,this.ic(!0), this.g("corner",b,a))}},curve:{configurable:!0,get:function(){return this.Gn},set:function(a){var b=this.Gn;b!==a&&(G&&a!==hg&&a!==kg&&a!==gg&&a!==fg&&v("Link.curve can only be set to Link.None, Link.Bezier, LInk.JumpGap, or Link.JumpOver, not: "+a),this.Gn=a,this.Za(),this.ic(!0),Ap(this,b===gg||b===fg||a===gg||a===fg),this.g("curve",b,a))}},curviness:{configurable:!0,get:function(){return this.Hn},set:function(a){var b=this.Hn;b!==a&&(G&&A(a,"number",R,"curviness"),this.Hn= a,this.Za(),this.ic(!1),this.g("curviness",b,a))}},routing:{configurable:!0,get:function(){return this.ak},set:function(a){var b=this.ak;b!==a&&(G&&a!==rp&&a!==$p&&a!==aq&&a!==Jp&&v("Link.routing can only be set to Link.Normal, Link.Orthogonal, LInk.AvoidsNodes, not: "+a),this.ak=a,this.Yf=null,this.Za(),Ap(this,2===(b.value&2)||2===(a.value&2)),this.g("routing",b,a))}},smoothness:{configurable:!0,get:function(){return this.Pp},set:function(a){var b=this.Pp;b!==a&&(G&& A(a,"number",R,"smoothness"),this.Pp=a,this.ic(!0),this.g("smoothness",b,a))}},key:{configurable:!0,get:function(){var a=this.diagram;if(null!==a&&a.model.cj())return a.model.sc(this.data)}}});R.prototype.invalidateOtherJumpOvers=R.prototype.Dq;R.prototype.findClosestSegment=R.prototype.cA;R.prototype.updateRoute=R.prototype.Bg;R.prototype.invalidateRoute=R.prototype.Za;R.prototype.rollbackRoute=R.prototype.gw;R.prototype.commitRoute=R.prototype.Df;R.prototype.startRoute=R.prototype.Sh; -R.prototype.clearPoints=R.prototype.nk;R.prototype.removePoint=R.prototype.ew;R.prototype.addPointAt=R.prototype.Bf;R.prototype.addPoint=R.prototype.ke;R.prototype.insertPointAt=R.prototype.l;R.prototype.insertPoint=R.prototype.IA;R.prototype.setPointAt=R.prototype.O;R.prototype.setPoint=R.prototype.Sc;R.prototype.getPoint=R.prototype.i;R.prototype.getOtherPort=R.prototype.zA;R.prototype.getOtherNode=R.prototype.zq; +R.prototype.clearPoints=R.prototype.nk;R.prototype.removePoint=R.prototype.ew;R.prototype.addPointAt=R.prototype.Bf;R.prototype.addPoint=R.prototype.ke;R.prototype.insertPointAt=R.prototype.l;R.prototype.insertPoint=R.prototype.IA;R.prototype.setPointAt=R.prototype.O;R.prototype.setPoint=R.prototype.Tc;R.prototype.getPoint=R.prototype.i;R.prototype.getOtherPort=R.prototype.zA;R.prototype.getOtherNode=R.prototype.zq; var Bp=null,Cp=null,rp=new F(R,"Normal",1),$p=new F(R,"Orthogonal",2),aq=new F(R,"AvoidsNodes",6),Jp=new F(R,"AvoidsNodesStraight",7),hg=new F(R,"None",0),kg=new F(R,"Bezier",9),gg=new F(R,"JumpGap",10),fg=new F(R,"JumpOver",11),sp=new F(R,"End",17),tp=new F(R,"Scale",18),up=new F(R,"Stretch",19),fn=new F(R,"OrientAlong",21),Zm=new F(R,"OrientPlus90",22),an=new F(R,"OrientMinus90",23),vp=new F(R,"OrientOpposite",24),gn=new F(R,"OrientUpright",25),$m=new F(R,"OrientPlus90Upright",26),bn=new F(R,"OrientMinus90Upright", 27),cn=new F(R,"OrientUpright45",28),Lp=16,Kp=14,Mp=8;R.className="Link";R.Normal=rp;R.Orthogonal=$p;R.AvoidsNodes=aq;R.AvoidsNodesStraight=Jp;R.None=hg;R.Bezier=kg;R.JumpGap=gg;R.JumpOver=fg;R.End=sp;R.Scale=tp;R.Stretch=up;R.OrientAlong=fn;R.OrientPlus90=Zm;R.OrientMinus90=an;R.OrientOpposite=vp;R.OrientUpright=gn;R.OrientPlus90Upright=$m;R.OrientMinus90Upright=bn;R.OrientUpright45=cn;R.EndSegmentStep=8;R.CurvinessStart=Lp;R.SpacingMin=Kp;R.OrthoShortCut=Mp; function Zp(a,b,c,d){ab(this);this.Be=this.Jr=!1;this.it=a;this.Ky=b;this.Wv=c;this.Ly=d;this.links=[]}Zp.prototype.Am=function(){if(!this.Jr){var a=this.links;0=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.Cd=Math.floor((a.x-this.jc)/this.jc)*this.jc;this.Dd=Math.floor((b-this.kc)/this.kc)*this.kc;this.Mo=Math.ceil((c+2*this.jc)/this.jc)*this.jc;this.No=Math.ceil((d+2*this.kc)/this.kc)*this.kc;a=1+(Math.ceil((this.Mo-this.Cd)/this.jc)|0);b=1+(Math.ceil((this.No-this.Dd)/this.kc)|0);if(null===this.Vb||this.Li=Rp&&(c[d]=bq)} -sk.prototype.Ck=function(a,b,c,d){if(a>this.Mo||a+cthis.No||b+da&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e)return!0;d=Math.min(a+c-1,this.Li)|0;for(c=Math.min(b+e-1,this.Mi)|0;a<=d;a++){e=this.Vb[a];for(var f=b;f<=c;f++)if(e[f]===Hk)return!1}return!0}; +function sk(a){ab(this);this.Vy=this.group=null;this.Zs=!0;this.abort=!1;this.Ed=this.Dd=1;this.No=this.Mo=-1;this.jc=a.width;this.kc=a.height;this.Vb=null;this.Mi=this.Li=0;this.vt=11;this.Dy=this.Cy=22} +sk.prototype.initialize=function(a){if(!(0>=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.Dd=Math.floor((a.x-this.jc)/this.jc)*this.jc;this.Ed=Math.floor((b-this.kc)/this.kc)*this.kc;this.Mo=Math.ceil((c+2*this.jc)/this.jc)*this.jc;this.No=Math.ceil((d+2*this.kc)/this.kc)*this.kc;a=1+(Math.ceil((this.Mo-this.Dd)/this.jc)|0);b=1+(Math.ceil((this.No-this.Ed)/this.kc)|0);if(null===this.Vb||this.Li=Rp&&(c[d]=bq)} +sk.prototype.Ck=function(a,b,c,d){if(a>this.Mo||a+cthis.No||b+da&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e)return!0;d=Math.min(a+c-1,this.Li)|0;for(c=Math.min(b+e-1,this.Mi)|0;a<=d;a++){e=this.Vb[a];for(var f=b;f<=c;f++)if(e[f]===Hk)return!1}return!0}; function cq(a,b,c,d,e,f,g,h,k){if(!(bg||ck)){var l=b|0;var m=c|0;var n=a.Vb[l][m];if(n>=Rp&&n=a.Vb[l][m]);)a.Vb[l][m]=n,n+=1,e?m+=d:l+=d;l=e?m:l;if(e)if(0l;c+=d)cq(a,b,c,1,!e,f,g,h,k),cq(a,b,c,-1,!e,f,g,h,k);else if(0l;b+=d)cq(a,b,c,1,!e,f,g,h,k),cq(a,b,c,-1,!e,f,g,h, k)}}function dq(a,b,c,d,e,f,g,h,k){b|=0;c|=0;var l=Hk,m=Rp;for(a.Vb[b][c]=m;l===Hk&&b>f&&bh&&cf&&bh&&c=Math.abs(h-l)&&1>=Math.abs(k-m))a.abort=!0;else{var n=f.x;d=f.y;b=f.x+f.width;var p=f.y+f.height;n-=a.Cd;n/=a.jc;d-=a.Dd;d/=a.kc;b-=a.Cd;b/=a.jc;p-=a.Dd;p/=a.kc;f=Math.max(0,Math.min(a.Li,n|0));b=Math.min(a.Li,Math.max(0,b|0));n=Math.max(0,Math.min(a.Mi,d|0));p=Math.min(a.Mi,Math.max(0,p|0));d=a.Vb;h|=0;k|=0;l|=0;m|= +function Np(a,b,c,d,e,f,g){if(null!==a.Vb){a.abort=!1;var h=b.x,k=b.y;if(Gk(a,h,k)){h-=a.Dd;h/=a.jc;k-=a.Ed;k/=a.kc;var l=d.x,m=d.y;if(Gk(a,l,m))if(l-=a.Dd,l/=a.jc,m-=a.Ed,m/=a.kc,1>=Math.abs(h-l)&&1>=Math.abs(k-m))a.abort=!0;else{var n=f.x;d=f.y;b=f.x+f.width;var p=f.y+f.height;n-=a.Dd;n/=a.jc;d-=a.Ed;d/=a.kc;b-=a.Dd;b/=a.jc;p-=a.Ed;p/=a.kc;f=Math.max(0,Math.min(a.Li,n|0));b=Math.min(a.Li,Math.max(0,b|0));n=Math.max(0,Math.min(a.Mi,d|0));p=Math.min(a.Mi,Math.max(0,p|0));d=a.Vb;h|=0;k|=0;l|=0;m|= 0;var r=0===c||90===c?1:-1;c=90===c||270===c;d[h][k]===Hk?(dq(a,h,k,r,c,f,b,n,p),dq(a,h,k,1,!c,f,b,n,p),dq(a,h,k,-1,!c,f,b,n,p)):dq(a,h,k,r,c,h,k,h,k);d[l][m]===Hk?(eq(a,l,m,0===e||90===e?1:-1,90===e||270===e,f,b,n,p),eq(a,l,m,1,!(90===e||270===e),f,b,n,p),eq(a,l,m,-1,!(90===e||270===e),f,b,n,p)):eq(a,l,m,r,c,l,m,l,m);c=Ma();if(g&&fq(a,l,m,e,h,k,c)){if(c[0]!==l||c[1]!==m)c.unshift(m),c.unshift(l);if(c[c.length-2]!==h||c[c.length-1]!==k)c.push(h),c.push(k);a=Rp;e=c[c.length-2];g=c[c.length-1];d[e][g]= a++;for(f=c.length-4;0<=f;f-=2)for(e=c[f+2],g=c[f+3],b=c[f],l=c[f+1];b>e?e++:bg?g++:le)m--;else break;else if(n>f)n--;else break;var p=h[m][n];if(0===p||p===gq)break;k=m;l=n}for(;;){m=d;n=k;p=l;0===d?pf&&(m=270,p--):90===d?ne&&(m=180,n--):180===d?pf&&(m=270,p--):ne&&(m=180,n--);n=h[n][p];if(m!==d&&0!==n&&n!==gq){g.push(k);g.push(l);if(fq(a,k,l, m,e,f,g))return!0;g.pop();g.pop()}h[k][l]=gq;if(0===d){if(k===b)return!1;k--}else if(90===d){if(l===c)return!1;l--}else if(180===d){if(k===b)return!1;k++}else{if(l===c)return!1;l++}}} -oa.Object.defineProperties(sk.prototype,{bounds:{configurable:!0,get:function(){return new M(this.Cd,this.Dd,this.Mo-this.Cd,this.No-this.Dd)}},oq:{configurable:!0,get:function(){return this.jc},set:function(a){0=c?180:0}a=180*Math.atan2(a.height,a.width)/Math.PI;switch(b){case 3:return c>a&&c<=180+a?180:270;case 5:return c>180-a&&c<=360-a?270:0;case 12:return c>a&&c<=180+a?90:0;case 10:return c>180-a&&c<=360-a?180:90;case 7:return 90180+a&&c<=360-a?270:0;case 13:return 180a&&180>=c?90:0;case 14:return c> a&&c<=180-a?90:c>180-a&&270>=c?180:0;case 11:return c>180-a&&c<=180+a?180:c>180+a?270:90}d&&15!==b&&(c-=15,0>c&&(c+=360));return c>a&&c<180-a?90:c>=180-a&&c<=180+a?180:c>180+a&&c<360-a?270:0}Hp.prototype.Am=function(){this.me.length=0}; function Ip(a,b){var c=a.me;if(0===c.length){a:if(!a.Hq){c=a.Hq;a.Hq=!0;var d=null,e=a.node,f=e instanceof vf?e:null;if(null===f||f.isSubGraphExpanded)var g=e.isTreeExpanded?e.findLinksConnected(a.port.portId):e.jy();else{if(!f.actualBounds.s()){a.Hq=c;break a}d=f;g=d.Dv()}f=a.me.length=0;var h=a.port.ja(Ec,K.alloc()),k=a.port.ja(Pc,K.alloc());e=M.allocAt(h.x,h.y,0,0);e.Ye(k);K.free(h);K.free(k);h=K.allocAt(e.x+e.width/2,e.y+e.height/2);k=a.port.Xi();for(g=g.iterator;g.next();){var l=g.value;if(l.isVisible()&& -l.fromPort!==l.toPort){var m=l.fromPort===a.port||null!==l.fromNode&&l.fromNode.Md(d),n=l.computeSpot(m,a.port);if(n.Qc()){var p=m?l.toPort:l.fromPort;if(null!==p&&(m=p.part,null!==m)){var r=m.findVisibleNode();null!==r&&r!==m&&(m=r,p=m.port);m=l.computeOtherPoint(m,p);p=h.Ua(p.ja(Kc));r=h.Ua(m);p+=(r-p)/360;p-=k;0>p?p+=360:360<=p&&(p-=360);n=hq(e,n,p,l.isOrthogonal);0===n?(n=4,180p&&(p+=360));r=a.me[f];void 0===r?(r=new iq(l,p,n),a.me[f]= -r):(r.link=l,r.angle=p,r.Dc=n);r.Yv.set(m);f++}}}}K.free(h);a.me.sort(Hp.prototype.j);k=a.me.length;d=-1;for(f=h=0;fMath.abs(u)?(z=Math.abs(u)/p,p=Math.abs(u)):z=1;break;case 2:r>Math.abs(B)?(z=Math.abs(B)/r,r=Math.abs(B)):z=1;break;case 1:n>Math.abs(u)?(z=Math.abs(u)/n,n=Math.abs(u)):z=1;break;default:case 4:m> -Math.abs(B)?(z=Math.abs(B)/m,m=Math.abs(B)):z=1}y=0}var J=C.Gq;if(d===op){C=C.link.computeThickness();C*=z;J.set(E);switch(q){case 8:J.x=E.x+u/2+p/2-y-C/2;break;case 2:J.y=E.y+B/2+r/2-y-C/2;break;case 1:J.x=E.x+u/2-n/2+y+C/2;break;default:case 4:J.y=E.y+B/2-m/2+y+C/2}y+=C}else{var S=.5;d===ap&&(S=(C.Aq+1)/(C.tm+1));J.x=E.x+u*S;J.y=E.y+B*S}}}K.free(h);K.free(k);K.free(g);K.free(l);E=a.me;for(f=0;fb.Dc?1:a.angleb.angle?1:0}; +l.fromPort!==l.toPort){var m=l.fromPort===a.port||null!==l.fromNode&&l.fromNode.Md(d),n=l.computeSpot(m,a.port);if(n.Rc()&&(m=m?l.toPort:l.fromPort,null!==m)){var p=m.part;if(null!==p){var r=p.findVisibleNode();null!==r&&r!==p&&(p=r,m=p.port);m=l.computeOtherPoint(p,m);p=h.Wa(m);p-=k;0>p?p+=360:360<=p&&(p-=360);n=hq(e,n,p,l.isOrthogonal);0===n?(n=4,180p&&(p+=360));r=a.me[f];void 0===r?(r=new iq(l,p,n),a.me[f]=r):(r.link=l,r.angle=p,r.Dc= +n);r.Yv.set(m);f++}}}}K.free(h);a.me.sort(Hp.prototype.j);k=a.me.length;d=-1;for(f=h=0;fMath.abs(u)?(z=Math.abs(u)/p,p=Math.abs(u)):z=1;break;case 2:r>Math.abs(B)?(z=Math.abs(B)/r,r=Math.abs(B)):z=1;break;case 1:n>Math.abs(u)?(z=Math.abs(u)/n,n=Math.abs(u)):z=1;break;default:case 4:m>Math.abs(B)?(z=Math.abs(B)/ +m,m=Math.abs(B)):z=1}y=0}var J=C.Gq;if(d===op){C=C.link.computeThickness();C*=z;J.set(E);switch(q){case 8:J.x=E.x+u/2+p/2-y-C/2;break;case 2:J.y=E.y+B/2+r/2-y-C/2;break;case 1:J.x=E.x+u/2-n/2+y+C/2;break;default:case 4:J.y=E.y+B/2-m/2+y+C/2}y+=C}else{var S=.5;d===ap&&(S=(C.Aq+1)/(C.tm+1));J.x=E.x+u*S;J.y=E.y+B*S}}}K.free(h);K.free(k);K.free(g);K.free(l);E=a.me;for(f=0;fb.Dc?1:a.angleb.angle?1:0}; Hp.prototype.computeEndSegmentLength=function(a){var b=a.link,c=b.computeEndSegmentLength(this.node,this.port,Dc,b.fromPort===this.port),d=a.Aq;if(0>d)return c;var e=a.tm;if(1>=e||!b.isOrthogonal)return c;b=a.Yv;var f=a.Gq;if(2===a.Dc||8===a.Dc)d=e-1-d;return((a=2===a.Dc||4===a.Dc)?b.y=b-1?(f=0,d=c,e+=g+20,g=0):f++}}; zi.prototype.doMinimalNetworkLayout=function(){var a=Math.ceil(Math.sqrt(this.network.vertexes.count));this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin);for(var b=this.arrangementOrigin.x,c=b,d=this.arrangementOrigin.y,e=0,f=0,g=this.network.vertexes.iterator;g.next();){var h=g.value.node;if(!(null===h||h instanceof R)&&(lq(h),this.Qh(h))){var k=h.measuredBounds,l=k.width;k=k.height;h.moveTo(c,d);h instanceof vf&&(h.Qh=!1);c+=Math.max(l,50)+20;f=Math.max(f,Math.max(k,50));e>=a-1?(e= -0,c=b,d+=f+20,f=0):e++}}};zi.prototype.Qh=function(a){return!a.location.s()||a instanceof vf&&a.Qh?!0:!1};function kq(a,b,c,d,e,f,g,h){for(c=c.iterator;c.next();){var k=c.value;d&&!k.isTopLevel||null!==e&&!e(k)||!k.canLayout()||(f&&k instanceof V?k.isLinkLabel||(k instanceof vf?null===k.layout?kq(a,b,k.memberParts,!1,e,f,g,h):(lq(k),b.add(k)):(lq(k),b.add(k))):g&&k instanceof R?b.add(k):!h||!k.Pc()||k instanceof V||(lq(k),b.add(k)))}} +0,c=b,d+=f+20,f=0):e++}}};zi.prototype.Qh=function(a){return!a.location.s()||a instanceof vf&&a.Qh?!0:!1};function kq(a,b,c,d,e,f,g,h){for(c=c.iterator;c.next();){var k=c.value;d&&!k.isTopLevel||null!==e&&!e(k)||!k.canLayout()||(f&&k instanceof V?k.isLinkLabel||(k instanceof vf?null===k.layout?kq(a,b,k.memberParts,!1,e,f,g,h):(lq(k),b.add(k)):(lq(k),b.add(k))):g&&k instanceof R?b.add(k):!h||!k.Qc()||k instanceof V||(lq(k),b.add(k)))}} function lq(a){var b=a.actualBounds;(0===b.width||0===b.height||isNaN(b.width)||isNaN(b.height))&&a.Xa()}zi.prototype.Zi=function(a,b){var c=this.boundsComputation;if(null!==c)return b||(b=new M),c(a,this,b);if(!b)return a.actualBounds;b.set(a.actualBounds);return b}; zi.prototype.Vx=function(a){var b=new I;a instanceof Q?(kq(this,b,a.nodes,!0,null,!0,!0,!0),kq(this,b,a.links,!0,null,!0,!0,!0),kq(this,b,a.parts,!0,null,!0,!0,!0)):a instanceof vf?kq(this,b,a.memberParts,!1,null,!0,!0,!0):kq(this,b,a.iterator,!1,null,!0,!0,!0);return b}; zi.prototype.initialOrigin=function(a){var b=this.group;if(null!==b){var c=b.position.copy();(isNaN(c.x)||isNaN(c.y))&&c.set(a);b=b.placeholder;null!==b&&(c=b.ja(Ec),(isNaN(c.x)||isNaN(c.y))&&c.set(a),a=b.padding,c.x+=a.left,c.y+=a.top);return c}return a};zi.prototype.mayUseWorker=function(){return this.mayUseWorkerFunction?this.mayUseWorkerFunction(this):!1};zi.prototype.workerLayout=function(){return!1}; @@ -1765,39 +1765,39 @@ jq.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutNetwork"+(null! jq.prototype.tg=function(a,b,c){if(null!==a){void 0===b&&(b=!1);A(b,"boolean",jq,"addParts:toplevelonly");void 0===c&&(c=null);null===c&&(c=function(a){if(a instanceof V)return!a.isLinkLabel;if(a instanceof R){var b=a.fromNode;if(null===b||b.isLinkLabel)return!1;a=a.toNode;return null===a||a.isLinkLabel?!1:!0}return!1});for(a=a.iterator;a.next();){var d=a.value;if(d instanceof V&&(!b||d.isTopLevel)&&d.canLayout()&&c(d))if(d instanceof vf&&null===d.layout)this.tg(d.memberParts,!1);else if(null===this.Wi(d)){var e= this.createVertex();e.node=d;this.ug(e)}}for(a.reset();a.next();)if(d=a.value,d instanceof R&&(!b||d.isTopLevel)&&d.canLayout()&&c(d)&&null===this.tq(d)){var f=d.fromNode;e=d.toNode;null!==f&&null!==e&&f!==e&&(f=this.findGroupVertex(f),e=this.findGroupVertex(e),null!==f&&null!==e&&this.Dk(f,e,d))}}}; jq.prototype.findGroupVertex=function(a){if(null===a)return null;var b=a.findVisibleNode();if(null===b)return null;a=this.Wi(b);if(null!==a)return a;for(b=b.containingGroup;null!==b;){a=this.Wi(b);if(null!==a)return a;b=b.containingGroup}return null};t=jq.prototype;t.ug=function(a){if(null!==a){G&&x(a,xq,jq,"addVertex:vertex");this.zf.add(a);var b=a.node;null!==b&&this.jt.add(b,a);a.network=this}}; -t.lk=function(a){if(null===a)return null;G&&x(a,V,jq,"addNode:node");var b=this.Wi(a);null===b&&(b=this.createVertex(),b.node=a,this.ug(b));return b};t.yv=function(a){if(null!==a&&(G&&x(a,xq,jq,"deleteVertex:vertex"),zq(this,a))){for(var b=a.wd,c=b.count-1;0<=c;c--){var d=b.M(c);this.uk(d)}b=a.Jd;for(a=b.count-1;0<=a;a--)c=b.M(a),this.uk(c)}};function zq(a,b){if(null===b)return!1;var c=a.zf.remove(b);c&&(b=b.node,null!==b&&a.jt.remove(b));return c} +t.lk=function(a){if(null===a)return null;G&&x(a,V,jq,"addNode:node");var b=this.Wi(a);null===b&&(b=this.createVertex(),b.node=a,this.ug(b));return b};t.yv=function(a){if(null!==a&&(G&&x(a,xq,jq,"deleteVertex:vertex"),zq(this,a))){for(var b=a.xd,c=b.count-1;0<=c;c--){var d=b.M(c);this.uk(d)}b=a.Jd;for(a=b.count-1;0<=a;a--)c=b.M(a),this.uk(c)}};function zq(a,b){if(null===b)return!1;var c=a.zf.remove(b);c&&(b=b.node,null!==b&&a.jt.remove(b));return c} t.Uz=function(a){null!==a&&(G&&x(a,V,jq,"deleteNode:node"),a=this.Wi(a),null!==a&&this.yv(a))};t.Wi=function(a){if(null===a)return null;G&&x(a,V,jq,"findVertex:node");return this.jt.K(a)};t.nm=function(a){if(null!==a){G&&x(a,yq,jq,"addEdge:edge");Aq(this,a);var b=a.toVertex;null!==b&&b.ov(a);b=a.fromVertex;null!==b&&b.mv(a)}};function Aq(a,b){if(null!==b){a.ve.add(b);var c=b.link;null!==c&&null===a.tq(c)&&a.et.add(c,b);b.network=a}} t.xz=function(a){if(null===a)return null;G&&x(a,R,jq,"addLink:link");var b=a.fromNode,c=a.toNode,d=this.tq(a);null===d?(d=this.createEdge(),d.link=a,null!==b&&(d.fromVertex=this.lk(b)),null!==c&&(d.toVertex=this.lk(c)),this.nm(d)):(null!==b?d.fromVertex=this.lk(b):d.fromVertex=null,null!==c?d.toVertex=this.lk(c):d.toVertex=null);return d};t.uk=function(a){if(null!==a){G&&x(a,yq,jq,"deleteEdge:edge");var b=a.toVertex;null!==b&&b.xv(a);b=a.fromVertex;null!==b&&b.wv(a);Bq(this,a)}}; function Bq(a,b){null!==b&&a.ve.remove(b)&&(b=b.link,null!==b&&a.et.remove(b))}t.Tz=function(a){null!==a&&(G&&x(a,R,jq,"deleteLink:link"),a=this.tq(a),null!==a&&this.uk(a))};t.tq=function(a){if(null===a)return null;G&&x(a,R,jq,"findEdge:link");return this.et.K(a)}; t.Dk=function(a,b,c){if(null===a||null===b)return null;G&&(x(a,xq,jq,"linkVertexes:fromVertex"),x(b,xq,jq,"linkVertexes:toVertex"),null!==c&&x(c,R,jq,"linkVertexes:link"));if(a.network===this&&b.network===this){var d=this.createEdge();d.link=c;d.fromVertex=a;d.toVertex=b;this.nm(d);return d}return null};t.Om=function(a){if(null!==a){G&&x(a,yq,jq,"reverseEdge:edge");var b=a.fromVertex,c=a.toVertex;null!==b&&null!==c&&(b.wv(a),c.xv(a),a.Om(),b.ov(a),c.mv(a))}}; t.rq=function(){for(var a=Ma(),b=this.ve.iterator;b.next();){var c=b.value;c.fromVertex===c.toVertex&&a.push(c)}b=a.length;for(c=0;cb?1:0):1:null!==b?-1:0} -oa.Object.defineProperties(xq.prototype,{sourceEdgesArrayAccess:{configurable:!0,get:function(){return this.wd._dataArray}},destinationEdgesArrayAccess:{configurable:!0,get:function(){return this.Jd._dataArray}},data:{configurable:!0,get:function(){return this.nb},set:function(a){this.nb=a;if(null!==a&&a.bounds){var b=a.bounds;a=b.x;var c=b.y,d=b.width;b=b.height;this.o.h(d/2,b/2);this.j.h(a,c,d,b)}}},node:{configurable:!0,get:function(){return this.zi}, +oa.Object.defineProperties(xq.prototype,{sourceEdgesArrayAccess:{configurable:!0,get:function(){return this.xd._dataArray}},destinationEdgesArrayAccess:{configurable:!0,get:function(){return this.Jd._dataArray}},data:{configurable:!0,get:function(){return this.nb},set:function(a){this.nb=a;if(null!==a&&a.bounds){var b=a.bounds;a=b.x;var c=b.y,d=b.width;b=b.height;this.o.h(d/2,b/2);this.j.h(a,c,d,b)}}},node:{configurable:!0,get:function(){return this.zi}, set:function(a){if(this.zi!==a){G&&null!==a&&x(a,V,xq,"node");this.zi=a;a.Xa();var b=this.network.layout,c=M.alloc(),d=b.Zi(a,c);b=d.x;var e=d.y,f=d.width;d=d.height;isNaN(b)&&(b=0);isNaN(e)&&(e=0);this.j.h(b,e,f,d);M.free(c);if(!(a instanceof vf)&&(a=a.locationObject.ja(Kc),a.s())){this.o.h(a.x-b,a.y-e);return}this.o.h(f/2,d/2)}}},bounds:{configurable:!0,get:function(){return this.j},set:function(a){this.j.B(a)||(G&&x(a,M,xq,"bounds"),this.j.assign(a))}},focus:{configurable:!0, get:function(){return this.o},set:function(a){this.o.B(a)||(G&&x(a,K,xq,"focus"),this.o.assign(a))}},centerX:{configurable:!0,get:function(){return this.j.x+this.o.x},set:function(a){var b=this.j;b.x+this.o.x!==a&&(G&&D(a,xq,"centerX"),b.ka(),b.x=a-this.o.x,b.freeze())}},centerY:{configurable:!0,get:function(){return this.j.y+this.o.y},set:function(a){var b=this.j;b.y+this.o.y!==a&&(G&&D(a,xq,"centerY"),b.ka(),b.y=a-this.o.y,b.freeze())}},focusX:{configurable:!0, get:function(){return this.o.x},set:function(a){var b=this.o;b.x!==a&&(b.ka(),b.x=a,b.freeze())}},focusY:{configurable:!0,get:function(){return this.o.y},set:function(a){var b=this.o;b.y!==a&&(b.ka(),b.y=a,b.freeze())}},x:{configurable:!0,get:function(){return this.j.x},set:function(a){var b=this.j;b.x!==a&&(b.ka(),b.x=a,b.freeze())}},y:{configurable:!0,get:function(){return this.j.y},set:function(a){var b=this.j;b.y!==a&&(b.ka(),b.y=a,b.freeze())}},width:{configurable:!0, -enumerable:!0,get:function(){return this.j.width},set:function(a){var b=this.j;b.width!==a&&(b.ka(),b.width=a,b.freeze())}},height:{configurable:!0,get:function(){return this.j.height},set:function(a){var b=this.j;b.height!==a&&(b.ka(),b.height=a,b.freeze())}},network:{configurable:!0,get:function(){return this.Vc},set:function(a){G&&x(a,jq,xq,"network");this.Vc=a}},sourceVertexes:{configurable:!0,get:function(){for(var a=new I,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex); -return a.iterator}},destinationVertexes:{configurable:!0,get:function(){for(var a=new I,b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},vertexes:{configurable:!0,get:function(){for(var a=new I,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);for(b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},sourceEdges:{configurable:!0,get:function(){return this.wd.iterator}},destinationEdges:{configurable:!0, -enumerable:!0,get:function(){return this.Jd.iterator}},edges:{configurable:!0,get:function(){for(var a=new H,b=this.sourceEdges;b.next();)a.add(b.value);for(b=this.destinationEdges;b.next();)a.add(b.value);return a.iterator}},edgesCount:{configurable:!0,get:function(){return this.wd.count+this.Jd.count}}});xq.prototype.deleteDestinationEdge=xq.prototype.wv;xq.prototype.addDestinationEdge=xq.prototype.mv;xq.prototype.deleteSourceEdge=xq.prototype.xv; +enumerable:!0,get:function(){return this.j.width},set:function(a){var b=this.j;b.width!==a&&(b.ka(),b.width=a,b.freeze())}},height:{configurable:!0,get:function(){return this.j.height},set:function(a){var b=this.j;b.height!==a&&(b.ka(),b.height=a,b.freeze())}},network:{configurable:!0,get:function(){return this.Wc},set:function(a){G&&x(a,jq,xq,"network");this.Wc=a}},sourceVertexes:{configurable:!0,get:function(){for(var a=new I,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex); +return a.iterator}},destinationVertexes:{configurable:!0,get:function(){for(var a=new I,b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},vertexes:{configurable:!0,get:function(){for(var a=new I,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);for(b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},sourceEdges:{configurable:!0,get:function(){return this.xd.iterator}},destinationEdges:{configurable:!0, +enumerable:!0,get:function(){return this.Jd.iterator}},edges:{configurable:!0,get:function(){for(var a=new H,b=this.sourceEdges;b.next();)a.add(b.value);for(b=this.destinationEdges;b.next();)a.add(b.value);return a.iterator}},edgesCount:{configurable:!0,get:function(){return this.xd.count+this.Jd.count}}});xq.prototype.deleteDestinationEdge=xq.prototype.wv;xq.prototype.addDestinationEdge=xq.prototype.mv;xq.prototype.deleteSourceEdge=xq.prototype.xv; xq.prototype.addSourceEdge=xq.prototype.ov;xq.className="LayoutVertex";xq.standardComparer=Eq; xq.smartComparer=function(a,b){G&&x(a,xq,xq,"smartComparer:m");G&&x(b,xq,xq,"smartComparer:n");if(null!==a){if(null!==b){a=a.zi;var c=b.zi;if(null!==a){if(null!==c){b=a.text.toLocaleLowerCase().split(/([+-]?[.]?\d+(?:\.\d*)?(?:e[+-]?\d+)?)/);a=c.text.toLocaleLowerCase().split(/([+-]?[.]?\d+(?:\.\d*)?(?:e[+-]?\d+)?)/);for(c=0;c=f&&0>=g&&(f=1);b=this.spacing.width;isFinite(b)||(b=0);c=this.spacing.height;isFinite(c)||(c=0);null!==a&&a.Da("Layout");d=[];switch(this.alignment){case Nq:var h=b,k=c,l=M.alloc(),m=Math.max(this.cellSize.width,1);if(!isFinite(m))for(var n= @@ -1809,13 +1809,13 @@ aa=aa*r+y}else switch(q){case Mq:B=aa+P.x+T.width;break;default:B=aa-P.x}switch( d[h],e=Math.min(e,k.x),g=Math.min(g,k.y),f=Math.max(f,k.x+k.width);this.arrangement===Mq?this.commitLayers(d,new K(e+b/2-(f+e),g-c/2)):this.commitLayers(d,new K(e-b/2,g-c/2));null!==a&&a.cb("Layout");this.isValidLayout=!0}};Zk.prototype.commitLayers=function(){};function Iq(a,b){G&&x(a,U,Zk,"standardComparer:a");G&&x(b,U,Zk,"standardComparer:b");a=a.text;b=b.text;return ab?1:0} oa.Object.defineProperties(Zk.prototype,{wrappingWidth:{configurable:!0,get:function(){return this.hq},set:function(a){this.hq!==a&&(A(a,"number",Zk,"wrappingWidth"),0d.indexOf(a.newValue)&&d.splice(c,0,a.newValue));return}}else if(a.change===se){c=a.oldParam;if("linkDataArray"===a.modelChange){a=a.oldValue;Ga(a)&&"number"===typeof c&&(d=this.sc(a),b?(this.cg.add(a),this.cd[c]!==a&&this.cd.splice(c,0,a),void 0!==d&&this.ob.add(d,a)):(this.cg.remove(a),this.cd[c]=== -a&&this.cd.splice(c,1),void 0!==d&&this.ob.remove(d)));return}if("linkLabelKeys"===a.modelChange){d=this.Jf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue):(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)));return}}X.prototype.changeState.call(this,a,b)}};t=Gr.prototype;t.Dm=function(a){if(void 0!==a){var b=this.zj;if(null!==b){var c=this.$b(a);null===c&&(c=this.copyNodeData(b),ak(c,this.nodeKeyProperty,a),this.Af(c))}return a}}; +Gr.prototype.changeState=function(a,b){if(null!==a&&a.model===this){if(a.change===pe){var c=a.object,d=a.propertyName;if(d===this.linkKeyProperty&&this.Ac(c)){var e=a.K(b);b=a.K(!b);void 0!==b&&this.ob.remove(b);void 0!==e&&this.ob.add(e,c);ak(c,d,e);return}}else if(a.change===re){c=a.newParam;if("linkDataArray"===a.modelChange){a=a.newValue;Ga(a)&&"number"===typeof c&&(d=this.sc(a),b?(this.cg.remove(a),this.dd[c]===a&&this.dd.splice(c,1),void 0!==d&&this.ob.remove(d)):(this.cg.add(a),this.dd[c]!== +a&&this.dd.splice(c,0,a),void 0!==d&&this.ob.add(d,a)));return}if("linkLabelKeys"===a.modelChange){d=this.Jf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)):0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue));return}}else if(a.change===se){c=a.oldParam;if("linkDataArray"===a.modelChange){a=a.oldValue;Ga(a)&&"number"===typeof c&&(d=this.sc(a),b?(this.cg.add(a),this.dd[c]!==a&&this.dd.splice(c,0,a),void 0!==d&&this.ob.add(d,a)):(this.cg.remove(a),this.dd[c]=== +a&&this.dd.splice(c,1),void 0!==d&&this.ob.remove(d)));return}if("linkLabelKeys"===a.modelChange){d=this.Jf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue):(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)));return}}X.prototype.changeState.call(this,a,b)}};t=Gr.prototype;t.Dm=function(a){if(void 0!==a){var b=this.zj;if(null!==b){var c=this.$b(a);null===c&&(c=this.copyNodeData(b),ak(c,this.nodeKeyProperty,a),this.Af(c))}return a}}; t.qy=function(a){return ar(this,a,!0)};t.jw=function(a,b){ir(this,a,b,!0)};t.uy=function(a){return ar(this,a,!1)};t.nw=function(a,b){ir(this,a,b,!1)};function ar(a,b,c){if(null!==b&&(a=c?a.jf:a.kf,""!==a&&(a=En(b,a),void 0!==a))){if(cr(a))return a;v((c?"FromKey":"ToKey")+" value for link data "+b+" is not a number or a string: "+a)}} function ir(a,b,c,d){null===c&&(c=void 0);void 0===c||cr(c)||za(c,"number or string",Gr,d?"setFromKeyForLinkData:key":"setToKeyForLinkData:key");if(null!==b){var e=d?a.jf:a.kf;if(""!==e)if(c=a.Dm(c),a.Ac(b)){var f=En(b,e);f!==c&&(gr(a,f,b),ak(b,e,c),null===a.$b(c)&&hr(a,c,b),Ar(a,d?"linkFromKey":"linkToKey",pe,e,b,f,c),"string"===typeof e&&a.Ia(b,e))}else ak(b,e,c)}}t.sy=function(a){return $q(this,a,!0)};t.kw=function(a,b){jr(this,a,b,!0)};t.vy=function(a){return $q(this,a,!1)}; t.ow=function(a,b){jr(this,a,b,!1)};function $q(a,b,c){if(null===b)return"";a=c?a.Sj:a.Tj;if(""===a)return"";b=En(b,a);return void 0===b?"":b}function jr(a,b,c,d){A(c,"string",Gr,d?"setFromPortIdForLinkData:portname":"setToPortIdForLinkData:portname");if(null!==b){var e=d?a.Sj:a.Tj;if(""!==e)if(a.Ac(b)){var f=En(b,e);void 0===f&&(f="");f!==c&&(ak(b,e,c),Ar(a,d?"linkFromPortId":"linkToPortId",pe,e,b,f,c),"string"===typeof e&&a.Ia(b,e))}else ak(b,e,c)}} @@ -1982,8 +1982,8 @@ t.My=function(a,b){if(null!==b&&void 0!==b&&(cr(b)||za(b,"number or string",Gr," t.sc=function(a){if(null!==a){var b=this.ti;if(""!==b&&(b=En(a,b),void 0!==b)){if(cr(b))return b;v("Key value for link data "+a+" is not a number or a string: "+b)}}};t.qt=function(a,b){void 0!==b&&null!==b&&cr(b)||za(b,"number or string",Gr,"setKeyForLinkData:key");if(null!==a){var c=this.ti;if(""!==c)if(this.Ac(a)){var d=En(a,c);d!==b&&null===this.Kh(b)&&(ak(a,c,b),void 0!==d&&this.ob.remove(d),this.ob.add(b,a),Ar(this,"linkKey",pe,c,a,d,b),"string"===typeof c&&this.Ia(a,c))}else ak(a,c,b)}}; t.Kh=function(a){null===a&&v("GraphLinksModel.findLinkDataForKey:key must not be null");return void 0!==a&&cr(a)?this.ob.K(a):null}; t.gt=function(a){if(null!==a){var b=this.ti;if(""!==b){var c=this.sc(a);if(void 0===c||this.ob.contains(c)){var d=this.Jl;if(null!==d&&(c=d(this,a),void 0!==c&&null!==c&&!this.ob.contains(c))){ak(a,b,c);return}if("string"===typeof c){for(d=2;this.ob.contains(c+d);)d++;ak(a,b,c+d)}else if(void 0===c||"number"===typeof c){for(c=-this.ob.count-1;this.ob.contains(c);)c--;ak(a,b,c)}else G&&v("GraphLinksModel.getKeyForLinkData returned something other than a string or a number: "+c)}}}}; -t.Ac=function(a){return null===a?!1:this.cg.contains(a)};t.Oi=function(a){null!==a&&(mb(a),this.Ac(a)||er(this,a,!0))};function er(a,b,c){if(""!==a.linkKeyProperty){var d=a.sc(b);if(void 0!==d&&a.ob.K(d)===b)return;a.gt(b);d=a.sc(b);void 0===d&&v("GraphLinksModel.makeLinkDataKeyUnique failed on "+b+". Data not added to model.");a.ob.add(d,b)}a.cg.add(b);d=null;c&&(d=a.cd.length,a.cd.splice(d,0,b));Ar(a,"linkDataArray",re,"linkDataArray",a,null,b,null,d);Kr(a,b)} -t.yz=function(a){if(Array.isArray(a))for(var b=a.length,c=0;cd)return;a.cd.splice(d,1)}Ar(a,"linkDataArray",se,"linkDataArray",a,b,null,d,null);c=ar(a,b,!0);gr(a,c,b);c=ar(a,b,!1);gr(a,c,b);d=a.Jf(b);if(Array.isArray(d))for(var e=d.length,f=0;fd)return;a.dd.splice(d,1)}Ar(a,"linkDataArray",se,"linkDataArray",a,b,null,d,null);c=ar(a,b,!0);gr(a,c,b);c=ar(a,b,!1);gr(a,c,b);d=a.Jf(b);if(Array.isArray(d))for(var e=d.length,f=0;f=a.count)1===a.count&&(a=a.first(),a.centerX=0,a.centerY=0);else{var b=new H;b.addAll(a.iterator);a=new H;var c=new H;var d=this.sort(b);var e,f,g=this.mr;var h=this.arrangement;var k=this.nodeDiameterFormula; var l=this.radius;if(!isFinite(l)||0>=l)l=NaN;var m=this.aspectRatio;if(!isFinite(m)||0>=m)m=1;var n=this.startAngle;isFinite(n)||(n=0);var p=this.sweepAngle;if(!isFinite(p)||360p)p=360;b=this.spacing;isFinite(b)||(b=NaN);h===as&&k===bs?h=Nr:h===as&&k!==bs&&(h=this.arrangement);if((this.direction===Wr||this.direction===Xr)&&this.sorting!==Qr){for(k=0;!(k>=d.length);k+=2){a.add(d.M(k));if(k+1>=d.length)break;c.add(d.M(k+1))}this.direction===Wr?(this.arrangement===as&&a.reverse(),d=new H,d.addAll(a), @@ -2055,7 +2055,7 @@ c.indexOf(b[l][z]),0<=E&&(E=Math.abs(u-(E>=u?E+1:E)),y+=Er||r===m||(q=r>m?r-m:m-r,n+=rg-q?1:-1);c.splice(0>n?m:m+1,0,k);d.splice(h,1);h--}else f=!1;if(f)break;else c.push(d[0]),d.splice(0,1)}for(b=0;b=a?this.hm=a:this.hm=360,this.C())}},arrangement:{configurable:!0,get:function(){return this.Mb},set:function(a){this.Mb!==a&&(cb(a,Mr,Mr,"arrangement"),a===as||a===Nr||a===$r||a===Zr)&&(this.Mb=a,this.C())}},direction:{configurable:!0,get:function(){return this.N},set:function(a){this.N!==a&&(cb(a,Mr,Mr,"direction"), -a===Pr||a===Yr||a===Wr||a===Xr)&&(this.N=a,this.C())}},sorting:{configurable:!0,get:function(){return this.dd},set:function(a){this.dd!==a&&(cb(a,Mr,Mr,"sorting"),a===Ur||a===Vr||a===Sr||Tr||a===Qr)&&(this.dd=a,this.C())}},comparer:{configurable:!0,get:function(){return this.Xc},set:function(a){this.Xc!==a&&(A(a,"function",Mr,"comparer"),this.Xc=a,this.C())}},spacing:{configurable:!0,get:function(){return this.sf},set:function(a){this.sf!==a&&(A(a,"number", +a===Pr||a===Yr||a===Wr||a===Xr)&&(this.N=a,this.C())}},sorting:{configurable:!0,get:function(){return this.ed},set:function(a){this.ed!==a&&(cb(a,Mr,Mr,"sorting"),a===Ur||a===Vr||a===Sr||Tr||a===Qr)&&(this.ed=a,this.C())}},comparer:{configurable:!0,get:function(){return this.Yc},set:function(a){this.Yc!==a&&(A(a,"function",Mr,"comparer"),this.Yc=a,this.C())}},spacing:{configurable:!0,get:function(){return this.sf},set:function(a){this.sf!==a&&(A(a,"number", Mr,"spacing"),this.sf=a,this.C())}},nodeDiameterFormula:{configurable:!0,get:function(){return this.$o},set:function(a){this.$o!==a&&(cb(a,Mr,Mr,"nodeDiameterFormula"),a===Rr||a===bs)&&(this.$o=a,this.C())}},actualXRadius:{configurable:!0,get:function(){return this.ec}},actualYRadius:{configurable:!0,get:function(){return this.je}},actualSpacing:{configurable:!0,get:function(){return this.Dj}},actualCenter:{configurable:!0,get:function(){return this.Nw}}}); var Nr=new F(Mr,"ConstantSpacing",0),$r=new F(Mr,"ConstantDistance",1),Zr=new F(Mr,"ConstantAngle",2),as=new F(Mr,"Packed",3),Pr=new F(Mr,"Clockwise",4),Yr=new F(Mr,"Counterclockwise",5),Wr=new F(Mr,"BidirectionalLeft",6),Xr=new F(Mr,"BidirectionalRight",7),Ur=new F(Mr,"Forwards",8),Vr=new F(Mr,"Reverse",9),Sr=new F(Mr,"Ascending",10),Tr=new F(Mr,"Descending",11),Qr=new F(Mr,"Optimized",12),Rr=new F(Mr,"Pythagorean",13),bs=new F(Mr,"Circular",14);Mr.className="CircularLayout";Mr.ConstantSpacing=Nr; Mr.ConstantDistance=$r;Mr.ConstantAngle=Zr;Mr.Packed=as;Mr.Clockwise=Pr;Mr.Counterclockwise=Yr;Mr.BidirectionalLeft=Wr;Mr.BidirectionalRight=Xr;Mr.Forwards=Ur;Mr.Reverse=Vr;Mr.Ascending=Sr;Mr.Descending=Tr;Mr.Optimized=Qr;Mr.Pythagorean=Rr;Mr.Circular=bs;function Or(){this.xm=-Infinity;this.bn=this.Pk=null} @@ -2063,8 +2063,8 @@ Or.prototype.compare=function(a,b){if(0this.xm||Math.abs(a)h?(e=p.x+p.width/2,f=p.y+ p.height/2,l[0]=new K(p.x+p.width+d.width,p.y),l[1]=new K(p.x,p.y+p.height+d.height),h=2):(k=vs(l,h,e,f,p.width,p.height,d),n=l[k],r=new K(n.x+p.width+d.width,n.y),p=new K(n.x,n.y+p.height+d.height),k+1this.network.vertexes.count)return!1;for(var a=0,b=0,c=this.network.vertexes.first().bounds,d=this.network.vertexes.iterator;d.next();){if(d.value.bounds.Oc(c)&&(a++,2this.network.vertexes.count)return!1;for(var a=0,b=0,c=this.network.vertexes.first().bounds,d=this.network.vertexes.iterator;d.next();){if(d.value.bounds.Pc(c)&&(a++,2a.network.vertexes.count)return!1;a.Dh=a.network.vertexes.Ea();a=a.Dh;a.sort(function(a,b){return null===a||null===b||a===b?0:b.Nd-a.Nd});for(b=a.length-1;0<=b&&1>=a[b].Nd;)b--;return 1u&&0u&&0a[this.vc]&&(this.wi=a[c]-1,this.vc=c),a[c]c)for(g=a.Ha;0c)for(d.reset();d.next();)c=d.value,e[c.component]&&(c.column+=1)} Is.prototype.commitLayout=function(){if(this.setsPortSpots)for(var a=Ps(this,!0),b=Ps(this,!1),c=this.network.edges.iterator;c.next();){var d=c.value.link;null!==d&&(d.fromSpot=a,d.toSpot=b)}this.commitNodes();this.tv();this.isRouting&&this.commitLinks()};function Ps(a,b){return 270===a.N?b?od:rd:90===a.N?b?rd:od:180===a.N?b?pd:qd:b?qd:pd} -Is.prototype.commitNodes=function(){this.de=[];this.Bd=[];this.Ad=[];this.Pa=[];for(var a=0;a<=this.xa;a++)this.de[a]=0,this.Bd[a]=0,this.Ad[a]=0,this.Pa[a]=0;for(a=this.network.vertexes.iterator;a.next();){var b=a.value,c=b.layer;this.de[c]=Math.max(this.de[c],this.nodeMinLayerSpace(b,!0));this.Bd[c]=Math.max(this.Bd[c],this.nodeMinLayerSpace(b,!1))}b=0;c=this.ee;for(var d=0;d<=this.xa;d++){var e=c;0>=this.de[d]+this.Bd[d]&&(e=0);0=this.de[d]+this.Cd[d]&&(e=0);0=n.bounds.bottom?(n=n.bounds.y+n.bounds.height,b.l(q++,C,n+J),b.l(q++,C,n),b.l(q++,C,n-B)):(b.l(q++,C,E+J),b.l(q++,C,E),b.l(q++,C,E-B)):270===this.N?E<=n.bounds.y?(n=n.bounds.y,b.l(q++,C,n-B),b.l(q++,C,n),b.l(q++,C,n+J)):(b.l(q++,C,E-B),b.l(q++,C,E),b.l(q++,C,E+J)):0===this.N&&(C>=n.bounds.right?(n=n.bounds.x+n.bounds.width,b.l(q++,n+J,E),b.l(q++,n,E),b.l(q++,n-B,E)):(b.l(q++,C+J,E),b.l(q++,C,E),b.l(q++,C-B,E)));else{b.l(q++,y,z);var S=0;if(180===this.N||0===this.N){if(180===this.N?C>=n.bounds.right: -C<=n.bounds.x)S=(0===this.N?-B:J)/2;b.l(q++,y+S,E)}else{if(270===this.N?E>=n.bounds.bottom:E<=n.bounds.y)S=(90===this.N?-B:J)/2;b.l(q++,C,z+S)}b.l(q++,C,E)}}else B=Math.max(10,this.de[w.layer]),J=Math.max(10,this.Bd[w.layer]),r?180===this.N?(b.l(q++,C-B-u,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C+J+u,E)):90===this.N?(b.l(q++,C,E+J+u),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E-B-u)): -270===this.N?(b.l(q++,C,E-B-u),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E+J+u)):(b.l(q++,C+J+u,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C-B-u,E)):b.l(q++,C,E)}n=w}if(null===h||l!==Dc||p)if(y=b.i(q-1).x,z=b.i(q-1).y,C=b.i(q).x,E=b.i(q).y,p)u=this.Bd[m.layer],180===this.N||0===this.N?(p=z,p>=m.bounds.y&&p<=m.bounds.bottom&&(180===this.N?C>=m.bounds.x:C<=m.bounds.right)&&(n=m.centerX+(180=== -this.N?-u:u),p=m.bounds.x&&p<=m.bounds.right&&(270===this.N?E>=m.bounds.y:E<=m.bounds.bottom)&&(n=m.centerY+(270===this.N?-u:u),p=m.bounds.x?(n=m.bounds.x+ -m.bounds.width,b.O(q-2,n,z),b.O(q-1,n+J,z)):90===this.N&&E<=m.bounds.bottom?(n=m.bounds.y,b.O(q-2,y,n),b.O(q-1,y,n-B)):270===this.N&&E>=m.bounds.y?(n=m.bounds.y+m.bounds.height,b.O(q-2,y,n),b.O(q-1,y,n+J)):0===this.N&&C<=m.bounds.right&&(n=m.bounds.x,b.O(q-2,n,z),b.O(q-1,n-B,z));else{B=Math.max(10,this.de[m.layer]);J=Math.max(10,this.Bd[m.layer]);p=0;if(180===this.N||0===this.N){if(180===this.N?C<=m.bounds.x:C>=m.bounds.right)p=(0===this.N?J:-B)/2;b.l(q++,C+p,z)}else{if(270===this.N?E<=m.bounds.y: -E>=m.bounds.bottom)p=(90===this.N?J:-B)/2;b.l(q++,y,E+p)}b.l(q++,C,E)}}else{for(;null!==m&&m!==n;){B=w=null;for(m=m.destinationEdges.iterator;m.next()&&(y=m.value,y.link!==c.link||(w=y.toVertex,B=y.fromVertex,null!==B.node&&(B=null),null!==w.node)););if(null===w)break;w!==n&&(y=b.i(q-1).x,z=b.i(q-1).y,C=w.centerX,E=w.centerY,p?180===this.N||0===this.N?(null!==B?B.centerY:z)!==E&&(B=this.Pa[w.layer]+this.Wc.x,q===b.firstPickIndex+1&&(B=0===this.N?Math.max(B,y):Math.min(B,y)),b.l(q++,B,z),b.l(q++,B, -E)):(null!==B?B.centerX:y)!==C&&(B=this.Pa[w.layer]+this.Wc.y,q===b.firstPickIndex+1&&(B=90===this.N?Math.max(B,z):Math.min(B,z)),b.l(q++,y,B),b.l(q++,C,B)):(B=Math.max(10,this.de[w.layer]),J=Math.max(10,this.Bd[w.layer]),r?180===this.N?(b.l(q++,C+J+u,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C-B-u,E)):90===this.N?(b.l(q++,C,E-B-u),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E+J+u)):270=== +C<=n.bounds.x)S=(0===this.N?-B:J)/2;b.l(q++,y+S,E)}else{if(270===this.N?E>=n.bounds.bottom:E<=n.bounds.y)S=(90===this.N?-B:J)/2;b.l(q++,C,z+S)}b.l(q++,C,E)}}else B=Math.max(10,this.de[w.layer]),J=Math.max(10,this.Cd[w.layer]),r?180===this.N?(b.l(q++,C-B-u,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C+J+u,E)):90===this.N?(b.l(q++,C,E+J+u),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E-B-u)): +270===this.N?(b.l(q++,C,E-B-u),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E+J+u)):(b.l(q++,C+J+u,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C-B-u,E)):b.l(q++,C,E)}n=w}if(null===h||l!==Dc||p)if(y=b.i(q-1).x,z=b.i(q-1).y,C=b.i(q).x,E=b.i(q).y,p)u=this.Cd[m.layer],180===this.N||0===this.N?(p=z,p>=m.bounds.y&&p<=m.bounds.bottom&&(180===this.N?C>=m.bounds.x:C<=m.bounds.right)&&(n=m.centerX+(180=== +this.N?-u:u),p=m.bounds.x&&p<=m.bounds.right&&(270===this.N?E>=m.bounds.y:E<=m.bounds.bottom)&&(n=m.centerY+(270===this.N?-u:u),p=m.bounds.x?(n=m.bounds.x+ +m.bounds.width,b.O(q-2,n,z),b.O(q-1,n+J,z)):90===this.N&&E<=m.bounds.bottom?(n=m.bounds.y,b.O(q-2,y,n),b.O(q-1,y,n-B)):270===this.N&&E>=m.bounds.y?(n=m.bounds.y+m.bounds.height,b.O(q-2,y,n),b.O(q-1,y,n+J)):0===this.N&&C<=m.bounds.right&&(n=m.bounds.x,b.O(q-2,n,z),b.O(q-1,n-B,z));else{B=Math.max(10,this.de[m.layer]);J=Math.max(10,this.Cd[m.layer]);p=0;if(180===this.N||0===this.N){if(180===this.N?C<=m.bounds.x:C>=m.bounds.right)p=(0===this.N?J:-B)/2;b.l(q++,C+p,z)}else{if(270===this.N?E<=m.bounds.y: +E>=m.bounds.bottom)p=(90===this.N?J:-B)/2;b.l(q++,y,E+p)}b.l(q++,C,E)}}else{for(;null!==m&&m!==n;){B=w=null;for(m=m.destinationEdges.iterator;m.next()&&(y=m.value,y.link!==c.link||(w=y.toVertex,B=y.fromVertex,null!==B.node&&(B=null),null!==w.node)););if(null===w)break;w!==n&&(y=b.i(q-1).x,z=b.i(q-1).y,C=w.centerX,E=w.centerY,p?180===this.N||0===this.N?(null!==B?B.centerY:z)!==E&&(B=this.Pa[w.layer]+this.Xc.x,q===b.firstPickIndex+1&&(B=0===this.N?Math.max(B,y):Math.min(B,y)),b.l(q++,B,z),b.l(q++,B, +E)):(null!==B?B.centerX:y)!==C&&(B=this.Pa[w.layer]+this.Xc.y,q===b.firstPickIndex+1&&(B=90===this.N?Math.max(B,z):Math.min(B,z)),b.l(q++,y,B),b.l(q++,C,B)):(B=Math.max(10,this.de[w.layer]),J=Math.max(10,this.Cd[w.layer]),r?180===this.N?(b.l(q++,C+J+u,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C-B-u,E)):90===this.N?(b.l(q++,C,E-B-u),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E+J+u)):270=== this.N?(b.l(q++,C,E+J+u),b.l(q++,C,Math.max(E+J-u/2,E)),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,C,Math.min(E-B+u/2,E)),b.l(q++,C,E-B-u)):(b.l(q++,C-B-u,E),b.l(q++,Math.min(C-B+u/2,C),E),b.l(q++,C,E),b.l(q++,C,E),b.l(q++,Math.max(C+J-u/2,C),E),b.l(q++,C+J+u,E)):180===this.N?(b.l(q++,C+J,E),b.l(q++,C-B,E)):90===this.N?(b.l(q++,C,E-B),b.l(q++,C,E+J)):270===this.N?(b.l(q++,C,E+J),b.l(q++,C,E-B)):(b.l(q++,C-B,E),b.l(q++,C+J,E))));m=w}p&&(y=b.i(q-1).x,z=b.i(q-1).y,C=b.i(q).x,E=b.i(q).y,180===this.N||0===this.N? -z!==E&&(B=0===this.N?Math.min(Math.max((C+y)/2,this.Pa[n.layer]+this.Wc.x),C):Math.max(Math.min((C+y)/2,this.Pa[n.layer]+this.Wc.x),C),b.l(q++,B,z),b.l(q++,B,E)):y!==C&&(B=90===this.N?Math.min(Math.max((E+z)/2,this.Pa[n.layer]+this.Wc.y),E):Math.max(Math.min((E+z)/2,this.Pa[n.layer]+this.Wc.y),E),b.l(q++,y,B),b.l(q++,C,B)))}null!==d&&r&&(null!==g&&(l===Dc&&(l=b.i(0),d=b.i(2),l.B(d)||b.O(1,(l.x+d.x)/2,(l.y+d.y)/2)),l=b.getLinkPoint(e,g,Dc,!0,!1,f,h),l.s()||l.set(e.actualBounds.center),b.O(0,l.x,l.y)), +z!==E&&(B=0===this.N?Math.min(Math.max((C+y)/2,this.Pa[n.layer]+this.Xc.x),C):Math.max(Math.min((C+y)/2,this.Pa[n.layer]+this.Xc.x),C),b.l(q++,B,z),b.l(q++,B,E)):y!==C&&(B=90===this.N?Math.min(Math.max((E+z)/2,this.Pa[n.layer]+this.Xc.y),E):Math.max(Math.min((E+z)/2,this.Pa[n.layer]+this.Xc.y),E),b.l(q++,y,B),b.l(q++,C,B)))}null!==d&&r&&(null!==g&&(l===Dc&&(l=b.i(0),d=b.i(2),l.B(d)||b.O(1,(l.x+d.x)/2,(l.y+d.y)/2)),l=b.getLinkPoint(e,g,Dc,!0,!1,f,h),l.s()||l.set(e.actualBounds.center),b.O(0,l.x,l.y)), null!==h&&(k===Dc&&(k=b.i(b.pointsCount-1),l=b.i(b.pointsCount-3),k.B(l)||b.O(b.pointsCount-2,(k.x+l.x)/2,(k.y+l.y)/2)),e=b.getLinkPoint(f,h,Dc,!1,!1,e,g),e.s()||e.set(f.actualBounds.center),b.O(b.pointsCount-1,e.x,e.y)));b.Df();c.commit()}}}this.avoidOrthogonalOverlaps()}; Is.prototype.avoidOrthogonalOverlaps=function(){if(!(0>=this.linkSpacing)){for(var a=new H,b=this.network.edges.iterator;b.next();){var c=b.value.link;null!==c&&c.isOrthogonal&&!a.contains(c)&&a.add(c)}if(0f.y&&(m=l.y>f.y?0:g.xf.y&&(m=l.y>f.y?0:g.xf.x&&(m=l.x>f.x?0:g.yb.layer?1:a.jdb.jd?1:a.zcb.zc?1:0:0};t.Qy=function(a,b){return a instanceof Ct&&b instanceof Ct&&a!==b?a.firstb.first||a.jb.j||a.jdb.jd?1:a.zcb.zc?1:0:0}; -t.pt=function(a,b){return a instanceof Ct&&b instanceof Ct&&a!==b?a.ccb.cc||a.jb.j||a.jdb.jd?1:a.zcb.zc?1:0:0};t.A=function(a,b){G&&(D(a,Is,"isApprox:a"),D(b,Is,"isApprox:b"));a-=b;return-1a}; +a.value,null!==d&&d.isOrthogonal)for(e=2;ef.x&&(m=l.x>f.x?0:g.yb.layer?1:a.kdb.kd?1:a.zcb.zc?1:0:0};t.Qy=function(a,b){return a instanceof Ct&&b instanceof Ct&&a!==b?a.firstb.first||a.jb.j||a.kdb.kd?1:a.zcb.zc?1:0:0}; +t.pt=function(a,b){return a instanceof Ct&&b instanceof Ct&&a!==b?a.ccb.cc||a.jb.j||a.kdb.kd?1:a.zcb.zc?1:0:0};t.A=function(a,b){G&&(D(a,Is,"isApprox:a"),D(b,Is,"isApprox:b"));a-=b;return-1a}; t.ij=function(a,b,c,d){var e=a.length,f=d-c;if(!(1>=f))if((0>c||c>=e-1)&&v("not in range 0 <= from < length: "+c),2===f)d=a[c],e=a[c+1],0=e)a.sort(b);else for(c=a.slice(0,d),c.sort(b),b=0;b=e)for(d=a.slice(c),d.sort(b),b=c;b=a.Ge.length){var d=[];for(var e=0;ea&&(this.hg=a,this.C()))}},setsPortSpots:{configurable:!0,get:function(){return this.rf},set:function(a){this.rf!==a&&(A(a,"boolean",Is,"setsPortSpots"),this.rf=a,this.C())}},linkSpacing:{configurable:!0,get:function(){return this.Ho},set:function(a){this.Ho!==a&&(A(a,"number",Is,"linkSpacing"),0<=a&&(this.Ho=a,this.C()))}},maxLayer:{configurable:!0, get:function(){return this.xa}},maxIndex:{configurable:!0,get:function(){return this.wi}},maxColumn:{configurable:!0,get:function(){return this.Ha}},minIndexLayer:{configurable:!0,get:function(){return this.bh}},maxIndexLayer:{configurable:!0,get:function(){return this.vc}}}); var Js=new F(Is,"CycleDepthFirst",0),bt=new F(Is,"CycleGreedy",1),Os=new F(Is,"CycleFromLayers",2),Ks=new F(Is,"LayerOptimalLinkLength",0),gt=new F(Is,"LayerLongestPathSink",1),it=new F(Is,"LayerLongestPathSource",2),Ls=new F(Is,"InitDepthFirstOut",0),ot=new F(Is,"InitDepthFirstIn",1),mt=new F(Is,"InitNaive",2),st=new F(Is,"AggressiveNone",0),Ms=new F(Is,"AggressiveLess",1),tt=new F(Is,"AggressiveMore",2),ut=8;Is.className="LayeredDigraphLayout";Is.CycleDepthFirst=Js;Is.CycleGreedy=bt; -Is.CycleFromLayers=Os;Is.LayerOptimalLinkLength=Ks;Is.LayerLongestPathSink=gt;Is.LayerLongestPathSource=it;Is.InitDepthFirstOut=Ls;Is.InitDepthFirstIn=ot;Is.InitNaive=mt;Is.AggressiveNone=st;Is.AggressiveLess=Ms;Is.AggressiveMore=tt;Is.PackNone=0;Is.PackExpand=1;Is.PackStraighten=2;Is.PackMedian=4;Is.PackAll=15;function Ct(){this.index=this.zc=this.jd=this.cc=this.first=this.layer=0;this.link=null;this.j=0}Ct.className="SegInfo";function Ns(a){jq.call(this,a)}na(Ns,jq);Ns.prototype.createVertex=function(){return new Et(this)}; -Ns.prototype.createEdge=function(){return new Ft(this)};Ns.className="LayeredDigraphNetwork";function Et(a){xq.call(this,a);this.Wa=this.Ig=this.ri=-1;this.F=NaN;this.P=null;this.valid=!1;this.finish=this.vg=NaN;this.Cf=0;this.Gk=this.Hk=null}na(Et,xq); +Is.CycleFromLayers=Os;Is.LayerOptimalLinkLength=Ks;Is.LayerLongestPathSink=gt;Is.LayerLongestPathSource=it;Is.InitDepthFirstOut=Ls;Is.InitDepthFirstIn=ot;Is.InitNaive=mt;Is.AggressiveNone=st;Is.AggressiveLess=Ms;Is.AggressiveMore=tt;Is.PackNone=0;Is.PackExpand=1;Is.PackStraighten=2;Is.PackMedian=4;Is.PackAll=15;function Ct(){this.index=this.zc=this.kd=this.cc=this.first=this.layer=0;this.link=null;this.j=0}Ct.className="SegInfo";function Ns(a){jq.call(this,a)}na(Ns,jq);Ns.prototype.createVertex=function(){return new Et(this)}; +Ns.prototype.createEdge=function(){return new Ft(this)};Ns.className="LayeredDigraphNetwork";function Et(a){xq.call(this,a);this.Va=this.Ig=this.ri=-1;this.F=NaN;this.P=null;this.valid=!1;this.finish=this.vg=NaN;this.Cf=0;this.Gk=this.Hk=null}na(Et,xq); Et.prototype.serializeVertexProperties=function(a,b){xq.prototype.serializeVertexProperties.call(this,a,b);a.layer=this.layer;a.column=this.column;a.index=this.index;a.component=this.component;a.near=this.near?kb(this.near):null;a.valid=this.valid;a.vg=this.vg;a.finish=this.finish;a.Cf=this.Cf;a.Hk=this.Hk;a.Gk=this.Gk}; Et.prototype.deserializeVertexProperties=function(a,b,c,d){xq.prototype.deserializeVertexProperties.call(this,a,b,c,d);this.layer=a.layer;this.column=a.column;this.index=a.index;this.component=a.component;if(b=b.get(a.near))this.near=b;this.valid=a.valid;this.vg=a.vg;this.finish=a.finish;this.Cf=a.Cf;this.Hk=a.Hk;this.Gk=a.Gk}; -oa.Object.defineProperties(Et.prototype,{layer:{configurable:!0,get:function(){return this.ri},set:function(a){this.ri!==a&&(A(a,"number",Et,"layer"),this.ri=a)}},column:{configurable:!0,get:function(){return this.Ig},set:function(a){this.Ig!==a&&(A(a,"number",Et,"column"),this.Ig=a)}},index:{configurable:!0,get:function(){return this.Wa},set:function(a){this.Wa!==a&&(A(a,"number",Et,"index"),this.Wa=a)}},component:{configurable:!0,get:function(){return this.F}, +oa.Object.defineProperties(Et.prototype,{layer:{configurable:!0,get:function(){return this.ri},set:function(a){this.ri!==a&&(A(a,"number",Et,"layer"),this.ri=a)}},column:{configurable:!0,get:function(){return this.Ig},set:function(a){this.Ig!==a&&(A(a,"number",Et,"column"),this.Ig=a)}},index:{configurable:!0,get:function(){return this.Va},set:function(a){this.Va!==a&&(A(a,"number",Et,"index"),this.Va=a)}},component:{configurable:!0,get:function(){return this.F}, set:function(a){this.F!==a&&(A(a,"number",Et,"component"),this.F=a)}},near:{configurable:!0,get:function(){return this.P},set:function(a){this.P!==a&&(G&&null!==a&&x(a,Et,Et,"near"),this.P=a)}}});Et.className="LayeredDigraphVertex";function Ft(a){yq.call(this,a);this.j=this.Ma=this.bb=!1;this.La=this.F=NaN;this.P=this.o=0}na(Ft,yq); Ft.prototype.serializeEdgeProperties=function(a,b){yq.prototype.serializeEdgeProperties.call(this,a,b);a.valid=this.valid;a.rev=this.rev;a.forest=this.forest;a.portFromPos=this.portFromPos;a.portToPos=this.portToPos;a.portFromColOffset=this.portFromColOffset;a.portToColOffset=this.portToColOffset}; Ft.prototype.deserializeEdgeProperties=function(a,b,c,d){yq.prototype.deserializeEdgeProperties.call(this,a,b,c,d);this.valid=a.valid;this.rev=a.rev;this.forest=a.forest;this.portFromPos=a.portFromPos;this.portToPos=a.portToPos;this.portFromColOffset=a.portFromColOffset;this.portToColOffset=a.portToColOffset}; -oa.Object.defineProperties(Ft.prototype,{fromVertex:{configurable:!0,get:function(){return this.Zc},set:function(a){this.Zc!==a&&(G&&null!==a&&x(a,Et,Ft,"fromVertex"),this.Zc=a)}},toVertex:{configurable:!0,get:function(){return this.gd},set:function(a){this.gd!==a&&(G&&null!==a&&x(a,Et,Ft,"toVertex"),this.gd=a)}},valid:{configurable:!0,get:function(){return this.bb},set:function(a){this.bb!==a&&(A(a,"boolean",Ft,"valid"),this.bb=a)}},rev:{configurable:!0, +oa.Object.defineProperties(Ft.prototype,{fromVertex:{configurable:!0,get:function(){return this.$c},set:function(a){this.$c!==a&&(G&&null!==a&&x(a,Et,Ft,"fromVertex"),this.$c=a)}},toVertex:{configurable:!0,get:function(){return this.hd},set:function(a){this.hd!==a&&(G&&null!==a&&x(a,Et,Ft,"toVertex"),this.hd=a)}},valid:{configurable:!0,get:function(){return this.bb},set:function(a){this.bb!==a&&(A(a,"boolean",Ft,"valid"),this.bb=a)}},rev:{configurable:!0, enumerable:!0,get:function(){return this.Ma},set:function(a){this.Ma!==a&&(A(a,"boolean",Ft,"rev"),this.Ma=a)}},forest:{configurable:!0,get:function(){return this.j},set:function(a){this.j!==a&&(A(a,"boolean",Ft,"forest"),this.j=a)}},portFromPos:{configurable:!0,get:function(){return this.F},set:function(a){this.F!==a&&(A(a,"number",Ft,"portFromPos"),this.F=a)}},portToPos:{configurable:!0,get:function(){return this.La},set:function(a){this.La!==a&&(A(a,"number", Ft,"portToPos"),this.La=a)}},portFromColOffset:{configurable:!0,get:function(){return this.o},set:function(a){this.o!==a&&(A(a,"number",Ft,"portFromColOffset"),this.o=a)}},portToColOffset:{configurable:!0,get:function(){return this.P},set:function(a){this.P!==a&&(A(a,"number",Ft,"portToColOffset"),this.P=a)}}});Ft.className="LayeredDigraphEdge"; -function Z(a){zi.call(this);this.Pb=new I;this.kp=Gt;this.pd=Ht;this.bq=It;this.Tr=Jt;this.Ow=[];this.nd=!0;this.Mb=Kt;this.Td=(new Hb(10,10)).freeze();var b=new Lt(this);this.Z=new Mt(b);this.$=new Mt(b);this.cv=[];a&&Object.assign(this,a)}na(Z,zi);Z.prototype.cloneProtected=function(a){zi.prototype.cloneProtected.call(this,a);a.kp=this.kp;a.bq=this.bq;a.Tr=this.Tr;a.nd=this.nd;a.Mb=this.Mb;a.Td.assign(this.Td);a.Z.copyInheritedPropertiesFrom(this.Z);a.$.copyInheritedPropertiesFrom(this.$)}; +function Z(a){zi.call(this);this.Pb=new I;this.kp=Gt;this.qd=Ht;this.bq=It;this.Tr=Jt;this.Ow=[];this.od=!0;this.Mb=Kt;this.Td=(new Hb(10,10)).freeze();var b=new Lt(this);this.Z=new Mt(b);this.$=new Mt(b);this.cv=[];a&&Object.assign(this,a)}na(Z,zi);Z.prototype.cloneProtected=function(a){zi.prototype.cloneProtected.call(this,a);a.kp=this.kp;a.bq=this.bq;a.Tr=this.Tr;a.od=this.od;a.Mb=this.Mb;a.Td.assign(this.Td);a.Z.copyInheritedPropertiesFrom(this.Z);a.$.copyInheritedPropertiesFrom(this.$)}; Z.prototype.mb=function(a){a.classType===Z?0===a.name.indexOf("Alignment")?this.alignment=a:0===a.name.indexOf("Arrangement")?this.arrangement=a:0===a.name.indexOf("Compaction")?this.compaction=a:0===a.name.indexOf("Path")?this.path=a:0===a.name.indexOf("Sorting")?this.sorting=a:0===a.name.indexOf("Style")?this.treeStyle=a:v("Unknown enum value: "+a):zi.prototype.mb.call(this,a)};Z.prototype.createNetwork=function(){return new Lt(this)}; Z.prototype.makeNetwork=function(a){function b(a){if(a instanceof V)return!a.isLinkLabel&&"Comment"!==a.category;if(a instanceof R){var b=a.fromNode;if(null===b||b.isLinkLabel||"Comment"===b.category)return!1;a=a.toNode;return null===a||a.isLinkLabel||"Comment"===a.category?!1:!0}return!1}var c=this.createNetwork();a instanceof Q?(c.tg(a.nodes,!0,b),c.tg(a.links,!0,b)):a instanceof vf?c.tg(a.memberParts,!1,b):c.tg(a.iterator,!1,b);return c}; -Z.prototype.doLayout=function(a){G&&null===a&&v("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");null===this.network&&(this.network=this.makeNetwork(a));this.arrangement!==Nt&&(this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin));var b=this.diagram;null===b&&a instanceof Q&&(b=a);this.path===Gt&&null!==b?this.pd=b.isTreePathToChildren?Ht:Ot:this.pd=this.path===Gt?Ht:this.path;if(0b.level)return!1;a.removeChild(c.parent,c)}return!0} Z.prototype.removeChild=function(a,b){if(null!==a&&null!==b){G&&x(a,Mt,Z,"removeChild:p");G&&x(b,Mt,Z,"removeChild:c");for(var c=a.children,d=0,e=0;ee?wu(a,g,ia,y,z):xu(a,g,ia,y,z);ia=z.x;y=z.width;z=z.height;break;case iu:for(C=0;Cn&&(aasb&&(Cu(a,-sb,0,ma,Ba-1),Du(C,-sb,0),Du(E,-sb,0),sb=0)}Na.Y.h(sb,Y);y=Math.max(y,J);z=Math.max(z,B+(0===T?0:q)+rb.height);aa=J}else{0n&&(Ysb&&(Cu(a,0,-sb,ma,Ba-1),Du(C,0,-sb),Du(E,0,-sb),sb=0);Na.Y.h(aa,sb);z=Math.max(z,S);y=Math.max(y,B+(0===T?0:q)+rb.width);Y=S}P++}0n&&(aatb&&(Cu(a,-tb,0,ma,Ba-1),Du(C,-tb,0),Du(E,-tb,0),tb=0)}Na.Y.h(tb,Y);y=Math.max(y,J);z=Math.max(z,B+(0===T?0:q)+sb.height);aa=J}else{0n&&(Ytb&&(Cu(a,0,-tb,ma,Ba-1),Du(C,0,-tb),Du(E,0,-tb),tb=0);Na.Y.h(aa,tb);z=Math.max(z,S);y=Math.max(y,B+(0===T?0:q)+sb.width);Y=S}P++}0l&&(l=0),135u&&(u=0),k===ju&&(h+=p/2+a.focus.y),g+=d+c):b?(null===a.comments?d>y&&(y=Iu(k,d-y,0),g=y.x,h=y.y,y=d,l=0):y=Gu(a,y,l),0>l&&(g-=l,l=0),135z&&(z=Iu(k,0,w-z),g=z.x,h=z.y,z=w,u=0):z=Hu(a,z,u),0>u&&(h-=u,u=0),g+=d+c);if(0b&&(b=c+a.width),0>c&&(b-=c),b;case qu:return a.width>b?a.width:b;case ru:return 2*a.focus.x>b?a.width:b+a.width-2*a.focus.x;case hu:case Yt:return Math.max(a.width,Math.max(b,c+a.width)-Math.min(0,c));case iu:return a.width-a.focus.x+a.nodeSpacing/2+b;case ju:return Math.max(a.width,a.focus.x+a.nodeSpacing/2+b);default:return b}} function Hu(a,b,c){G&&x(a,Mt,Z,"calculateSubheight:v");switch(a.alignment){case Fu:case Eu:return c+a.height>b&&(b=c+a.height),0>c&&(b-=c),b;case qu:return a.height>b?a.height:b;case ru:return 2*a.focus.y>b?a.height:b+a.height-2*a.focus.y;case hu:case Yt:return Math.max(a.height,Math.max(b,c+a.height)-Math.min(0,c));case iu:return a.height-a.focus.y+a.nodeSpacing/2+b;case ju:return Math.max(a.height,a.focus.y+a.nodeSpacing/2+b);default:return b}} function Iu(a,b,c){G&&x(a,F,Z,"alignOffset:align");switch(a){case Eu:b/=2;c/=2;break;case Fu:b/=2;c/=2;break;case qu:c=b=0;break;case ru:break;default:v("Unhandled alignment value "+a.toString())}return new K(b,c)}function zu(a,b,c,d,e,f){G&&x(a,Mt,Z,"shiftRelPosAlign:v");G&&x(b,F,Z,"shiftRelPosAlign:align");b=Iu(b,c,d);Cu(a,b.x,b.y,e,f)}function Cu(a,b,c,d,e){G&&x(a,Mt,Z,"shiftRelPos:v");if(0!==b||0!==c)for(a=a.children;d<=e;d++){var f=a[d].Y;f.x+=b;f.y+=c}} -function Au(a,b,c,d){G&&(x(b,Mt,Z,"recordMidPoints:v"),A(c,"number",Z,"recordMidPoints:x"),A(d,"number",Z,"recordMidPoints:y"));var e=b.parent;switch(a.pd){case Ht:for(a=b.sourceEdges;a.next();)b=a.value,b.fromVertex===e&&b.relativePoint.h(c,d);break;case Ot:for(a=b.destinationEdges;a.next();)b=a.value,b.toVertex===e&&b.relativePoint.h(c,d);break;default:v("Unhandled path value "+a.pd.toString())}}function Du(a,b,c){for(var d=0;dn.length||null===r||2>r.length))for(e=c= 0;cl&&f.yf.y&&lb.length||null===c||2>c.length)d=null;else{m=yu(a,b.length+c.length);for(d=f=k=0;fk;)l=c[f++],m[d++].h(l.x+e,l.y);c=yu(a,d);for(k=0;kn.length||null===f||2>f.length)e=null;else{m=yu(a,n.length+f.length);for(e=l=c=0;cf;)k=n[c++],m[e++].h(k.x, @@ -2288,17 +2288,17 @@ function Ju(a,b){var c=b.length,d=a.cv[c];void 0===d&&(d=[],a.cv[c]=d);d.push(b) Z.prototype.arrangeTrees=function(){if(this.Mb===Nt)for(var a=this.Pb.iterator;a.next();){var b=a.value;if(b instanceof Mt){var c=b.node;if(null!==c){var d=c.position;c=d.x;d=d.y;isFinite(c)||(c=0);isFinite(d)||(d=0);Nu(this,b,c,d)}}}else{a=[];for(b=this.Pb.iterator;b.next();)c=b.value,c instanceof Mt&&a.push(c);switch(this.sorting){case cu:break;case du:a.reverse();break;case eu:a.sort(this.comparer);break;case fu:a.sort(this.comparer);a.reverse();break;default:v("Unhandled sorting value "+this.sorting.toString())}c= this.arrangementOrigin;b=c.x;c=c.y;for(d=0;d=a?0:135>=a?90:225>=a?180:315>=a?270:0}function uu(a){G&&x(a,Mt,Z,"computeLayerSpacing:v");var b=pu(a);b=90===b||270===b;var c=a.layerSpacing;if(0p.y+c.rowIndent&&(e=Math.min(e,Math.max(m.y,e-vu(c))))):c.alignment===qu?(e=d.top+b.y,0===b.y&&m.yp.x+c.rowIndent&&(e=Math.min(e,Math.max(m.x,e-vu(c))))):c.alignment===qu?(e=d.left+b.x,0===b.x&&m.xp.y+c.rowIndent&&(e=Math.min(e,Math.max(m.y,e-vu(c))))):c.alignment===qu?(e=d.top+b.y,0===b.y&&m.y * Definitions: https://github.com/NorthwoodsSoftware/GoJS @@ -13075,7 +13075,6 @@ export class Palette extends Diagram { */ constructor(div?: Element | string, init?: Partial); /** - * * @param {DiagramInitOptions=} init A JavaScript object specifying optional initialization properties object. * Can specify Palette properties, and Palette sub-properties such as `"undoManager.isEnabled": true` * Example: @@ -16092,7 +16091,7 @@ export abstract class GraphObject { * If you need to set properties without type checking, or attach new properties, use GraphObject#attach. * * - * ``` + * ```js * // Common init for use in many different shapes: * var shapeStyle = (() => { return { background: 'red', strokeWidth: 0 }; }) * @@ -16121,7 +16120,7 @@ export abstract class GraphObject { * unless you need to attach new properties that do not exist on the GraphObject, or to set sub-properties. * Calling this method is much less efficient than setting properties directly, and does not do compile-time type checking. * - * ``` + * ```js * new go.Shape() * .bind("fill", "color") * .bind("strokeWidth", "width") @@ -16147,7 +16146,7 @@ export abstract class GraphObject { * * For example: * - * ``` + * ```js * // This can be used by several node templates * // to set multiple properties and bindings on each * function nodeStyle(node) { diff --git a/release/go-module.js b/release/go-module.js index f81c27d7e..73fbb8b01 100644 --- a/release/go-module.js +++ b/release/go-module.js @@ -1,8 +1,8 @@ /* - * GoJS v2.2.9 JavaScript Library for HTML Diagrams, https://gojs.net + * GoJS v2.2.10 JavaScript Library for HTML Diagrams, https://gojs.net * GoJS and Northwoods Software are registered trademarks of Northwoods Software Corporation, https://www.nwoods.com. * Copyright (C) 1998-2022 by Northwoods Software Corporation. All Rights Reserved. - * THIS SOFTWARE IS LICENSED. THE LICENSE AGREEMENT IS AT: https://gojs.net/2.2.9/license.html. + * THIS SOFTWARE IS LICENSED. THE LICENSE AGREEMENT IS AT: https://gojs.net/2.2.10/license.html. * DO NOT MODIFY THIS FILE. DO NOT DISTRIBUTE A MODIFIED COPY OF THE CONTENTS OF THIS FILE. */ (function() { var t;function aa(a){var b=0;return function(){return bc;c++)b["0123456789abcdef".charAt(c>>4)+"0123456789abcdef".charAt(c&15)]=String.fromCharCode(c);a.length%2&&(a="0"+a);c=[];for(var d=0,e=0;ec;c++)b[c]=c;for(c=d=0;256>c;c++)d=(d+b[c]+119)%256,e=b[c],b[c]=b[d],b[d]=e;d=c=0;for(var f="",g=0;gthis.key)return!1;a=a.m;var b=a.length,c=++this.Qa,d=this.af;if(null!==d)for(;cthis.key)return!1;var b=--this.Qa;if(0<=b)return this.key=b,this.value=a.m[b],!0;this.Qd();return!1};fb.prototype.od=function(){return this.next()}; -fb.prototype.first=function(){var a=this.pb;this.ja=a.Ba;var b=a.m;this.Qa=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null};fb.prototype.any=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Qa=c;for(--c;0<=c;c--)if(a(b[c]))return!0;return!1};fb.prototype.all=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Qa=c;for(--c;0<=c;c--)if(!a(b[c]))return!1;return!0}; -fb.prototype.each=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Qa=c;for(--c;0<=c;c--)a(b[c]);return this};fb.prototype.map=function(a){var b=this.pb;b.Ng=null;var c=[];b=b.m;var d=b.length;this.Qa=d;for(--d;0<=d;d--)c.push(a(b[d]));a=new E;a.m=c;a.kb();return a.iterator};fb.prototype.filter=function(a){var b=this.pb;b.Ng=null;var c=[];b=b.m;var d=b.length;this.Qa=d;for(--d;0<=d;d--){var e=b[d];a(e)&&c.push(e)}a=new E;a.m=c;a.kb();return a.iterator}; -fb.prototype.Qd=function(){this.key=-1;this.value=null;this.ja=-1;this.pb.Ng=this};fb.prototype.toString=function(){return"ListIteratorBackwards("+this.Qa+"/"+this.pb.count+")"};na.Object.defineProperties(fb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.pb.m.length}}});fb.prototype.first=fb.prototype.first;fb.prototype.hasNext=fb.prototype.od;fb.prototype.next=fb.prototype.next;fb.prototype.reset=fb.prototype.reset; +b.sm[e.lk],{set:function(a,b){return function(){throw Error("Property "+a.sm[b.lk]+" of "+a.x+" is read-only.");}}(b,e)})}}}b={sm:b.sm,x:b.x}}}};function Ya(){}Ya.prototype.reset=function(){};Ya.prototype.next=function(){return!1};Ya.prototype.pd=function(){return!1};Ya.prototype.first=function(){return null};Ya.prototype.any=function(){return!1};Ya.prototype.all=function(){return!0};Ya.prototype.each=function(){return this};Ya.prototype.map=function(){return this};Ya.prototype.filter=function(){return this}; +Ya.prototype.Qd=function(){};Ya.prototype.toString=function(){return"EmptyIterator"};na.Object.defineProperties(Ya.prototype,{iterator:{get:function(){return this}},count:{get:function(){return 0}}});Ya.prototype.first=Ya.prototype.first;Ya.prototype.hasNext=Ya.prototype.pd;Ya.prototype.next=Ya.prototype.next;Ya.prototype.reset=Ya.prototype.reset;var Za=null;Ya.className="EmptyIterator";Za=new Ya;function $a(a){this.key=-1;this.value=a} +$a.prototype.reset=function(){this.key=-1};$a.prototype.next=function(){return-1===this.key?(this.key=0,!0):!1};$a.prototype.pd=function(){return this.next()};$a.prototype.first=function(){this.key=0;return this.value};$a.prototype.any=function(a){this.key=-1;return a(this.value)};$a.prototype.all=function(a){this.key=-1;return a(this.value)};$a.prototype.each=function(a){this.key=-1;a(this.value);return this};$a.prototype.map=function(a){return new $a(a(this.value))}; +$a.prototype.filter=function(a){return a(this.value)?new $a(this.value):Za};$a.prototype.Qd=function(){this.value=null};$a.prototype.toString=function(){return"SingletonIterator("+this.value+")"};na.Object.defineProperties($a.prototype,{iterator:{get:function(){return this}},count:{get:function(){return 1}}});$a.prototype.first=$a.prototype.first;$a.prototype.hasNext=$a.prototype.pd;$a.prototype.next=$a.prototype.next; +$a.prototype.reset=$a.prototype.reset;$a.className="SingletonIterator";function ab(a){this.pb=a;this.af=null;a.Ja=null;this.ja=a.Ba;this.Pa=-1}ab.prototype.reset=function(){var a=this.pb;a.Ja=null;this.ja=a.Ba;this.Pa=-1};ab.prototype.next=function(){var a=this.pb;if(a.Ba!==this.ja&&0>this.key)return!1;a=a.m;var b=a.length,c=++this.Pa,d=this.af;if(null!==d)for(;cthis.key)return!1;var b=--this.Pa;if(0<=b)return this.key=b,this.value=a.m[b],!0;this.Qd();return!1};fb.prototype.pd=function(){return this.next()}; +fb.prototype.first=function(){var a=this.pb;this.ja=a.Ba;var b=a.m;this.Pa=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null};fb.prototype.any=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Pa=c;for(--c;0<=c;c--)if(a(b[c]))return!0;return!1};fb.prototype.all=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Pa=c;for(--c;0<=c;c--)if(!a(b[c]))return!1;return!0}; +fb.prototype.each=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Pa=c;for(--c;0<=c;c--)a(b[c]);return this};fb.prototype.map=function(a){var b=this.pb;b.Ng=null;var c=[];b=b.m;var d=b.length;this.Pa=d;for(--d;0<=d;d--)c.push(a(b[d]));a=new E;a.m=c;a.kb();return a.iterator};fb.prototype.filter=function(a){var b=this.pb;b.Ng=null;var c=[];b=b.m;var d=b.length;this.Pa=d;for(--d;0<=d;d--){var e=b[d];a(e)&&c.push(e)}a=new E;a.m=c;a.kb();return a.iterator}; +fb.prototype.Qd=function(){this.key=-1;this.value=null;this.ja=-1;this.pb.Ng=this};fb.prototype.toString=function(){return"ListIteratorBackwards("+this.Pa+"/"+this.pb.count+")"};na.Object.defineProperties(fb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.pb.m.length}}});fb.prototype.first=fb.prototype.first;fb.prototype.hasNext=fb.prototype.pd;fb.prototype.next=fb.prototype.next;fb.prototype.reset=fb.prototype.reset; fb.className="ListIteratorBackwards";function E(a){Ta(this);this.v=!1;this.m=[];this.Ba=0;this.Ng=this.Ja=null;"string"===typeof a&&C("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=E.prototype;t.kb=function(){var a=this.Ba;a++;999999999a||a>=b.length)&&xa(a,"0 <= i < length",E,"elt:i");return b[a]};t.get=function(a){return this.J(a)};t.Lc=function(a,b){var c=this.m;(0>a||a>=c.length)&&xa(a,"0 <= i < length",E,"setElt:i");this.v&&wa(this,a);c[a]=b};t.set=function(a,b){this.Lc(a,b)};t.first=function(){var a=this.m;return 0===a.length?null:a[0]};t.Xb=function(){var a=this.m,b=a.length;return 0a||a>=b.length)&&xa(a,"0 <= i < length",E,"elt:i");return b[a]};t.get=function(a){return this.J(a)};t.Mc=function(a,b){var c=this.m;(0>a||a>=c.length)&&xa(a,"0 <= i < length",E,"setElt:i");this.v&&wa(this,a);c[a]=b};t.set=function(a,b){this.Mc(a,b)};t.first=function(){var a=this.m;return 0===a.length?null:a[0]};t.Xb=function(){var a=this.m,b=a.length;return 0a&&xa(a,">= 0",E,"insertAt:i");this.v&&wa(this,a);var c=this.m;a>=c.length?c.push(b):c.splice(a,0,b);this.kb()};t.remove=function(a){if(null===a)return!1;this.v&&wa(this,a);var b=this.m;a=b.indexOf(a);if(-1===a)return!1;a===b.length-1?b.pop():b.splice(a,1);this.kb();return!0};t.delete=function(a){return this.remove(a)}; t.eb=function(a){var b=this.m;(0>a||a>=b.length)&&xa(a,"0 <= i < length",E,"removeAt:i");this.v&&wa(this,a);a===b.length-1?b.pop():b.splice(a,1);this.kb()};t.removeRange=function(a,b){var c=this.m,d=c.length;if(0>a)a=0;else if(a>=d)return this;if(0>b)return this;b>=d&&(b=d-1);if(a>b)return this;this.v&&wa(this);for(var e=a,f=b+1;f=this.m.length)return Za;var a=this.Ja;return null!==a?(a.reset(),a):new ab(this)}},iteratorBackwards:{ get:function(){if(0>=this.m.length)return Za;var a=this.Ng;return null!==a?(a.reset(),a):new fb(this)}}});E.prototype.reverse=E.prototype.reverse;E.prototype.sortRange=E.prototype.Wi;E.prototype.sort=E.prototype.sort;E.prototype.toSet=E.prototype.ew;E.prototype.toArray=E.prototype.xa;E.prototype.removeRange=E.prototype.removeRange;E.prototype.removeAt=E.prototype.eb;E.prototype["delete"]=E.prototype.delete;E.prototype.remove=E.prototype.remove;E.prototype.insertAt=E.prototype.ub; -E.prototype.pop=E.prototype.pop;E.prototype.last=E.prototype.Xb;E.prototype.first=E.prototype.first;E.prototype.set=E.prototype.set;E.prototype.setElt=E.prototype.Lc;E.prototype.get=E.prototype.get;E.prototype.elt=E.prototype.J;E.prototype.indexOf=E.prototype.indexOf;E.prototype.has=E.prototype.has;E.prototype.contains=E.prototype.contains;E.prototype.clear=E.prototype.clear;E.prototype.addAll=E.prototype.addAll;E.prototype.push=E.prototype.push;E.prototype.add=E.prototype.add;E.prototype.thaw=E.prototype.ea; -E.prototype.freeze=E.prototype.freeze;E.className="List";function hb(a){this.ag=a;a.Ja=null;this.ja=a.Ba;this.la=null}hb.prototype.reset=function(){var a=this.ag;a.Ja=null;this.ja=a.Ba;this.la=null};hb.prototype.next=function(){var a=this.ag;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=b.value,this.key=b.key,!0;this.Qd();return!1};hb.prototype.od=function(){return this.next()}; +E.prototype.pop=E.prototype.pop;E.prototype.last=E.prototype.Xb;E.prototype.first=E.prototype.first;E.prototype.set=E.prototype.set;E.prototype.setElt=E.prototype.Mc;E.prototype.get=E.prototype.get;E.prototype.elt=E.prototype.J;E.prototype.indexOf=E.prototype.indexOf;E.prototype.has=E.prototype.has;E.prototype.contains=E.prototype.contains;E.prototype.clear=E.prototype.clear;E.prototype.addAll=E.prototype.addAll;E.prototype.push=E.prototype.push;E.prototype.add=E.prototype.add;E.prototype.thaw=E.prototype.ea; +E.prototype.freeze=E.prototype.freeze;E.className="List";function hb(a){this.ag=a;a.Ja=null;this.ja=a.Ba;this.la=null}hb.prototype.reset=function(){var a=this.ag;a.Ja=null;this.ja=a.Ba;this.la=null};hb.prototype.next=function(){var a=this.ag;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=b.value,this.key=b.key,!0;this.Qd();return!1};hb.prototype.pd=function(){return this.next()}; hb.prototype.first=function(){var a=this.ag;this.ja=a.Ba;a=a.ba;if(null!==a){this.la=a;var b=a.value;this.key=a.key;return this.value=b}return null};hb.prototype.any=function(a){var b=this.ag;this.la=b.Ja=null;for(b=b.ba;null!==b;){if(a(b.value))return!0;b=b.oa}return!1};hb.prototype.all=function(a){var b=this.ag;this.la=b.Ja=null;for(b=b.ba;null!==b;){if(!a(b.value))return!1;b=b.oa}return!0};hb.prototype.each=function(a){var b=this.ag;this.la=b.Ja=null;for(b=b.ba;null!==b;)a(b.value),b=b.oa;return this}; hb.prototype.map=function(a){var b=this.ag;b.Ja=null;var c=new E;for(b=b.ba;null!==b;)c.add(a(b.value)),b=b.oa;return c.iterator};hb.prototype.filter=function(a){var b=this.ag;b.Ja=null;var c=new E;for(b=b.ba;null!==b;){var d=b.value;a(d)&&c.add(d);b=b.oa}return c.iterator};hb.prototype.Qd=function(){this.value=this.key=null;this.ja=-1;this.ag.Ja=this};hb.prototype.toString=function(){return null!==this.la?"SetIterator@"+this.la.value:"SetIterator"}; -na.Object.defineProperties(hb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ag.Hb}}});hb.prototype.first=hb.prototype.first;hb.prototype.hasNext=hb.prototype.od;hb.prototype.next=hb.prototype.next;hb.prototype.reset=hb.prototype.reset;hb.className="SetIterator"; +na.Object.defineProperties(hb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ag.Hb}}});hb.prototype.first=hb.prototype.first;hb.prototype.hasNext=hb.prototype.pd;hb.prototype.next=hb.prototype.next;hb.prototype.reset=hb.prototype.reset;hb.className="SetIterator"; function G(a){Ta(this);this.v=!1;this.Ib={};this.Hb=0;this.Ja=null;this.Ba=0;this.We=this.ba=null;"string"===typeof a&&C("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=G.prototype;t.kb=function(){var a=this.Ba;a++;999999999=this.Hb)return Za;var a=this.Ja;return null!==a?(a.reset(),a):new hb(this)}}});G.prototype.toList=G.prototype.dw;G.prototype.toArray=G.prototype.xa;G.prototype.clear=G.prototype.clear;G.prototype.retainAll=G.prototype.SA;G.prototype.removeAll=G.prototype.Bq; G.prototype["delete"]=G.prototype.delete;G.prototype.remove=G.prototype.remove;G.prototype.first=G.prototype.first;G.prototype.containsAny=G.prototype.xz;G.prototype.containsAll=G.prototype.wz;G.prototype.has=G.prototype.has;G.prototype.contains=G.prototype.contains;G.prototype.addAll=G.prototype.addAll;G.prototype.add=G.prototype.add;G.prototype.thaw=G.prototype.ea;G.prototype.freeze=G.prototype.freeze;var kb=1;G.className="Set";G.uniqueHash=Ta;G.hashIdUnique=ib;G.hashId=gb; -function lb(a){this.ha=a;this.ja=a.Ba;this.la=null}lb.prototype.reset=function(){this.ja=this.ha.Ba;this.la=null};lb.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=this.key=a=b.key,!0;this.Qd();return!1};lb.prototype.od=function(){return this.next()};lb.prototype.first=function(){var a=this.ha;this.ja=a.Ba;a=a.ba;return null!==a?(this.la=a,this.value=this.key=a=a.key):null}; +function lb(a){this.ha=a;this.ja=a.Ba;this.la=null}lb.prototype.reset=function(){this.ja=this.ha.Ba;this.la=null};lb.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=this.key=a=b.key,!0;this.Qd();return!1};lb.prototype.pd=function(){return this.next()};lb.prototype.first=function(){var a=this.ha;this.ja=a.Ba;a=a.ba;return null!==a?(this.la=a,this.value=this.key=a=a.key):null}; lb.prototype.any=function(a){var b=this.ha;this.la=null;for(b=b.ba;null!==b;){if(a(b.key))return!0;b=b.oa}return!1};lb.prototype.all=function(a){var b=this.ha;this.la=null;for(b=b.ba;null!==b;){if(!a(b.key))return!1;b=b.oa}return!0};lb.prototype.each=function(a){var b=this.ha;this.la=null;for(b=b.ba;null!==b;)a(b.key),b=b.oa;return this};lb.prototype.map=function(a){var b=this.ha;this.la=null;var c=new E;for(b=b.ba;null!==b;)c.add(a(b.key)),b=b.oa;return c.iterator}; lb.prototype.filter=function(a){var b=this.ha;this.la=null;var c=new E;for(b=b.ba;null!==b;){var d=b.key;a(d)&&c.add(d);b=b.oa}return c.iterator};lb.prototype.Qd=function(){this.value=this.key=null;this.ja=-1};lb.prototype.toString=function(){return null!==this.la?"MapKeySetIterator@"+this.la.value:"MapKeySetIterator"};na.Object.defineProperties(lb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ha.Hb}}}); -lb.prototype.first=lb.prototype.first;lb.prototype.hasNext=lb.prototype.od;lb.prototype.next=lb.prototype.next;lb.prototype.reset=lb.prototype.reset;lb.className="MapKeySetIterator";function mb(a){G.call(this);Ta(this);this.v=!0;this.ha=a}ma(mb,G);t=mb.prototype;t.freeze=function(){return this};t.ea=function(){return this};t.toString=function(){return"MapKeySet("+this.ha.toString()+")"};t.add=function(){C("This Set is read-only: "+this.toString())};t.contains=function(a){return this.ha.contains(a)}; +lb.prototype.first=lb.prototype.first;lb.prototype.hasNext=lb.prototype.pd;lb.prototype.next=lb.prototype.next;lb.prototype.reset=lb.prototype.reset;lb.className="MapKeySetIterator";function mb(a){G.call(this);Ta(this);this.v=!0;this.ha=a}ma(mb,G);t=mb.prototype;t.freeze=function(){return this};t.ea=function(){return this};t.toString=function(){return"MapKeySet("+this.ha.toString()+")"};t.add=function(){C("This Set is read-only: "+this.toString())};t.contains=function(a){return this.ha.contains(a)}; t.has=function(a){return this.contains(a)};t.remove=function(){C("This Set is read-only: "+this.toString())};t.delete=function(a){return this.remove(a)};t.clear=function(){C("This Set is read-only: "+this.toString())};t.first=function(){var a=this.ha.ba;return null!==a?a.key:null};mb.prototype.any=function(a){for(var b=this.ha.ba;null!==b;){if(a(b.key))return!0;b=b.oa}return!1};mb.prototype.all=function(a){for(var b=this.ha.ba;null!==b;){if(!a(b.key))return!1;b=b.oa}return!0}; mb.prototype.each=function(a){for(var b=this.ha.ba;null!==b;)a(b.key),b=b.oa;return this};mb.prototype.map=function(a){for(var b=new G,c=this.ha.ba;null!==c;)b.add(a(c.key)),c=c.oa;return b};mb.prototype.filter=function(a){for(var b=new G,c=this.ha.ba;null!==c;){var d=c.key;a(d)&&b.add(d);c=c.oa}return b};mb.prototype.copy=function(){return new mb(this.ha)};mb.prototype.ew=function(){var a=new G,b=this.ha.Ib,c;for(c in b)a.add(b[c].key);return a}; mb.prototype.xa=function(){var a=this.ha.Ib,b=Array(this.ha.Hb),c=0,d;for(d in a)b[c]=a[d].key,c++;return b};mb.prototype.dw=function(){var a=new E,b=this.ha.Ib,c;for(c in b)a.add(b[c].key);return a};na.Object.defineProperties(mb.prototype,{count:{get:function(){return this.ha.Hb}},size:{get:function(){return this.ha.Hb}},iterator:{get:function(){return 0>=this.ha.Hb?Za:new lb(this.ha)}}}); mb.prototype.toList=mb.prototype.dw;mb.prototype.toArray=mb.prototype.xa;mb.prototype.toSet=mb.prototype.ew;mb.prototype.first=mb.prototype.first;mb.prototype.clear=mb.prototype.clear;mb.prototype["delete"]=mb.prototype.delete;mb.prototype.remove=mb.prototype.remove;mb.prototype.has=mb.prototype.has;mb.prototype.contains=mb.prototype.contains;mb.prototype.add=mb.prototype.add;mb.prototype.thaw=mb.prototype.ea;mb.prototype.freeze=mb.prototype.freeze;mb.className="MapKeySet"; -function nb(a){this.ha=a;a.Ve=null;this.ja=a.Ba;this.la=null}nb.prototype.reset=function(){var a=this.ha;a.Ve=null;this.ja=a.Ba;this.la=null};nb.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=b.value,this.key=b.key,!0;this.Qd();return!1};nb.prototype.od=function(){return this.next()}; +function nb(a){this.ha=a;a.Ve=null;this.ja=a.Ba;this.la=null}nb.prototype.reset=function(){var a=this.ha;a.Ve=null;this.ja=a.Ba;this.la=null};nb.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=b.value,this.key=b.key,!0;this.Qd();return!1};nb.prototype.pd=function(){return this.next()}; nb.prototype.first=function(){var a=this.ha;this.ja=a.Ba;a=a.ba;if(null!==a){this.la=a;var b=a.value;this.key=a.key;return this.value=b}return null};nb.prototype.any=function(a){var b=this.ha;this.la=b.Ve=null;for(b=b.ba;null!==b;){if(a(b.value))return!0;b=b.oa}return!1};nb.prototype.all=function(a){var b=this.ha;this.la=b.Ve=null;for(b=b.ba;null!==b;){if(!a(b.value))return!1;b=b.oa}return!0};nb.prototype.each=function(a){var b=this.ha;this.la=b.Ve=null;for(b=b.ba;null!==b;)a(b.value),b=b.oa;return this}; nb.prototype.map=function(a){var b=this.ha;this.la=b.Ve=null;var c=new E;for(b=b.ba;null!==b;)c.add(a(b.value)),b=b.oa;return c.iterator};nb.prototype.filter=function(a){var b=this.ha;this.la=b.Ve=null;var c=new E;for(b=b.ba;null!==b;){var d=b.value;a(d)&&c.add(d);b=b.oa}return c.iterator};nb.prototype.Qd=function(){this.value=this.key=null;this.ja=-1;this.ha.Ve=this};nb.prototype.toString=function(){return null!==this.la?"MapValueSetIterator@"+this.la.value:"MapValueSetIterator"}; -na.Object.defineProperties(nb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ha.Hb}}});nb.prototype.first=nb.prototype.first;nb.prototype.hasNext=nb.prototype.od;nb.prototype.next=nb.prototype.next;nb.prototype.reset=nb.prototype.reset;nb.className="MapValueSetIterator";function jb(a,b){this.key=a;this.value=b;this.Fl=this.oa=null}jb.prototype.toString=function(){return"{"+this.key+":"+this.value+"}"}; -jb.className="KeyValuePair";function ob(a){this.ha=a;a.Ja=null;this.ja=a.Ba;this.la=null}ob.prototype.reset=function(){var a=this.ha;a.Ja=null;this.ja=a.Ba;this.la=null};ob.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.key=b.key,this.value=b.value,!0;this.Qd();return!1};ob.prototype.od=function(){return this.next()}; +na.Object.defineProperties(nb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ha.Hb}}});nb.prototype.first=nb.prototype.first;nb.prototype.hasNext=nb.prototype.pd;nb.prototype.next=nb.prototype.next;nb.prototype.reset=nb.prototype.reset;nb.className="MapValueSetIterator";function jb(a,b){this.key=a;this.value=b;this.Fl=this.oa=null}jb.prototype.toString=function(){return"{"+this.key+":"+this.value+"}"}; +jb.className="KeyValuePair";function ob(a){this.ha=a;a.Ja=null;this.ja=a.Ba;this.la=null}ob.prototype.reset=function(){var a=this.ha;a.Ja=null;this.ja=a.Ba;this.la=null};ob.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.key=b.key,this.value=b.value,!0;this.Qd();return!1};ob.prototype.pd=function(){return this.next()}; ob.prototype.first=function(){var a=this.ha;this.ja=a.Ba;a=a.ba;return null!==a?(this.la=a,this.key=a.key,this.value=a.value,a):null};ob.prototype.any=function(a){var b=this.ha;this.la=b.Ja=null;for(b=b.ba;null!==b;){if(a(b))return!0;b=b.oa}return!1};ob.prototype.all=function(a){var b=this.ha;this.la=b.Ja=null;for(b=b.ba;null!==b;){if(!a(b))return!1;b=b.oa}return!0};ob.prototype.each=function(a){var b=this.ha;this.la=b.Ja=null;for(b=b.ba;null!==b;)a(b),b=b.oa;return this}; ob.prototype.map=function(a){var b=this.ha;this.la=b.Ja=null;var c=new E;for(b=b.ba;null!==b;)c.add(a(b)),b=b.oa;return c.iterator};ob.prototype.filter=function(a){var b=this.ha;this.la=b.Ja=null;var c=new E;for(b=b.ba;null!==b;)a(b)&&c.add(b),b=b.oa;return c.iterator};ob.prototype.Qd=function(){this.value=this.key=null;this.ja=-1;this.ha.Ja=this};ob.prototype.toString=function(){return null!==this.la?"MapIterator@"+this.la:"MapIterator"}; -na.Object.defineProperties(ob.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ha.Hb}}});ob.prototype.first=ob.prototype.first;ob.prototype.hasNext=ob.prototype.od;ob.prototype.next=ob.prototype.next;ob.prototype.reset=ob.prototype.reset;ob.className="MapIterator"; +na.Object.defineProperties(ob.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ha.Hb}}});ob.prototype.first=ob.prototype.first;ob.prototype.hasNext=ob.prototype.pd;ob.prototype.next=ob.prototype.next;ob.prototype.reset=ob.prototype.reset;ob.className="MapIterator"; function I(a){Ta(this);this.v=!1;this.Ib={};this.Hb=0;this.Ve=this.Ja=null;this.Ba=0;this.We=this.ba=null;"string"===typeof a&&C("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=I.prototype;t.kb=function(){var a=this.Ba;a++;999999999a&&(a+=360);if(90===a){a=0;var d=1}else 180===a?(a=-1,d=0):270===a?(a=0,d=-1):(d=a*Math.PI/180,a=Math.cos(d),d=Math.sin(d));this.x=a*b-d*c;this.y=d*b+a*c;return this};t=J.prototype; -t.scale=function(a,b){this.x*=a;this.y*=b;return this};t.tf=function(a){var b=a.x-this.x;a=a.y-this.y;return b*b+a*a};t.nd=function(a,b){a-=this.x;b-=this.y;return a*a+b*b};t.normalize=function(){var a=this.x,b=this.y,c=Math.sqrt(a*a+b*b);0b?270:0;if(0===b)return 0a?c=0>b?c+180:180-c:0>b&&(c=360-c);return c}t.vz=function(a,b){return L.em(a.x,a.y,b.x,b.y,this.x,this.y)};t.IA=function(a,b,c,d){L.Eh(a,b,c,d,this.x,this.y,this);return this};t.JA=function(a,b){L.Eh(a.x,a.y,b.x,b.y,this.x,this.y,this);return this};t.XA=function(a,b,c,d){L.jq(this.x,this.y,a,b,c,d,this);return this}; t.YA=function(a,b){L.jq(this.x,this.y,a.x,a.y,b.width,b.height,this);return this};t.Ui=function(a,b){this.x=a.x+b.x*a.width+b.offsetX;this.y=a.y+b.y*a.height+b.offsetY;return this};t.Vi=function(a,b,c,d,e){this.x=a+e.x*c+e.offsetX;this.y=b+e.y*d+e.offsetY;return this};t.transform=function(a){a.ya(this);return this};function Ab(a,b){b.Ed(a);return a} function Bb(a,b,c,d,e,f){var g=e-c,h=f-d,k=g*g+h*h;c-=a;d-=b;var l=-c*g-d*h;if(0>=l||l>=k)return g=e-a,h=f-b,Math.min(c*c+d*d,g*g+h*h);a=g*d-h*c;return a*a/k}function Cb(a,b,c,d){a=c-a;b=d-b;return a*a+b*b}function Gb(a,b,c,d){a=c-a;b=d-b;if(0===a)return 0b?270:0;if(0===b)return 0a?d=0>b?d+180:180-d:0>b&&(d=360-d);return d}t.u=function(){return isFinite(this.x)&&isFinite(this.y)}; J.alloc=function(){var a=Hb.pop();return void 0===a?new J:a};J.allocAt=function(a,b){var c=Hb.pop();if(void 0===c)return new J(a,b);c.x=a;c.y=b;return c};J.free=function(a){Hb.push(a)};J.prototype.isReal=J.prototype.u;J.prototype.setSpot=J.prototype.Vi;J.prototype.setRectSpot=J.prototype.Ui;J.prototype.snapToGridPoint=J.prototype.YA;J.prototype.snapToGrid=J.prototype.XA;J.prototype.projectOntoLineSegmentPoint=J.prototype.JA;J.prototype.projectOntoLineSegment=J.prototype.IA; -J.intersectingLineSegments=function(a,b,c,d,e,f,g,h){return L.lm(a,b,c,d,e,f,g,h)};J.prototype.compareWithLineSegmentPoint=J.prototype.vz;J.compareWithLineSegment=function(a,b,c,d,e,f){return L.em(a,b,c,d,e,f)};J.prototype.direction=J.prototype.direction;J.prototype.directionPoint=J.prototype.Oa;J.prototype.normalize=J.prototype.normalize;J.prototype.distanceSquared=J.prototype.nd;J.prototype.distanceSquaredPoint=J.prototype.tf;J.prototype.scale=J.prototype.scale;J.prototype.rotate=J.prototype.rotate; +J.intersectingLineSegments=function(a,b,c,d,e,f,g,h){return L.lm(a,b,c,d,e,f,g,h)};J.prototype.compareWithLineSegmentPoint=J.prototype.vz;J.compareWithLineSegment=function(a,b,c,d,e,f){return L.em(a,b,c,d,e,f)};J.prototype.direction=J.prototype.direction;J.prototype.directionPoint=J.prototype.Ra;J.prototype.normalize=J.prototype.normalize;J.prototype.distanceSquared=J.prototype.od;J.prototype.distanceSquaredPoint=J.prototype.tf;J.prototype.scale=J.prototype.scale;J.prototype.rotate=J.prototype.rotate; J.prototype.offset=J.prototype.offset;J.prototype.subtract=J.prototype.ge;J.prototype.add=J.prototype.add;J.prototype.equalsApprox=J.prototype.Ta;J.prototype.equalTo=J.prototype.Gi;J.prototype.equals=J.prototype.A;J.prototype.set=J.prototype.set;J.prototype.setTo=J.prototype.ng;var Hb=[];J.className="Point";J.parse=wb;J.stringify=xb;J.distanceLineSegmentSquared=Bb;J.distanceSquared=Cb;J.direction=Gb;J.Origin=pb=(new J(0,0)).ca();J.InfiniteTopLeft=rb=(new J(-Infinity,-Infinity)).ca(); J.InfiniteBottomRight=tb=(new J(Infinity,Infinity)).ca();J.SixPoint=ub=(new J(6,6)).ca();J.NoPoint=vb=(new J(NaN,NaN)).ca();J.parse=wb;J.stringify=xb;J.distanceLineSegmentSquared=Bb;J.distanceSquared=Cb;J.direction=Gb;function M(a,b){void 0===a?this.height=this.width=0:"number"===typeof a&&(0<=a||isNaN(a))&&"number"===typeof b&&(0<=b||isNaN(b))?(this.width=a,this.height=b):C("Invalid arguments to Size constructor: "+a+", "+b);this.v=!1}var Ib,Jb,Kb,Lb,Mb,Nb,Ob; M.prototype.assign=function(a){this.width=a.width;this.height=a.height;return this};M.prototype.h=function(a,b){this.width=a;this.height=b;return this};M.prototype.ng=function(a,b){this.width=a;this.height=b;return this};M.prototype.set=function(a){this.width=a.width;this.height=a.height;return this};M.prototype.copy=function(){var a=new M;a.width=this.width;a.height=this.height;return a};t=M.prototype;t.ca=function(){this.v=!0;Object.freeze(this);return this}; @@ -102,20 +102,20 @@ t.toString=function(){return"Size("+this.width+","+this.height+")"};t.A=function M.prototype.equalsApprox=M.prototype.Ta;M.prototype.equalTo=M.prototype.Gi;M.prototype.equals=M.prototype.A;M.prototype.set=M.prototype.set;M.prototype.setTo=M.prototype.ng;var Sb=[];M.className="Size";M.parse=Pb;M.stringify=Qb;M.ZeroSize=Ib=(new M(0,0)).ca();M.OneSize=Jb=(new M(1,1)).ca();M.SixSize=Kb=(new M(6,6)).ca();M.EightSize=Lb=(new M(8,8)).ca();M.TenSize=Mb=(new M(10,10)).ca();M.InfiniteSize=Nb=(new M(Infinity,Infinity)).ca();M.NoSize=Ob=(new M(NaN,NaN)).ca();M.parse=Pb;M.stringify=Qb; function N(a,b,c,d){void 0===a?this.height=this.width=this.y=this.x=0:"number"===typeof a&&"number"===typeof b&&"number"===typeof c&&(0<=c||isNaN(c))&&"number"===typeof d&&(0<=d||isNaN(d))?(this.x=a,this.y=b,this.width=c,this.height=d):a instanceof J?(c=a.x,a=a.y,b instanceof J?(d=b.x,b=b.y,this.x=Math.min(c,d),this.y=Math.min(a,b),this.width=Math.abs(c-d),this.height=Math.abs(a-b)):b instanceof M?(this.x=c,this.y=a,this.width=b.width,this.height=b.height):C("Incorrect second argument supplied to Rect constructor "+ b)):C("Invalid arguments to Rect constructor: "+a+", "+b+", "+c+", "+d);this.v=!1}t=N.prototype;t.assign=function(a){this.x=a.x;this.y=a.y;this.width=a.width;this.height=a.height;return this};t.h=function(a,b,c,d){this.x=a;this.y=b;this.width=c;this.height=d;return this};function Tb(a,b,c){a.width=b;a.height=c}t.ng=function(a,b,c,d){this.x=a;this.y=b;this.width=c;this.height=d;return this};t.set=function(a){this.x=a.x;this.y=a.y;this.width=a.width;this.height=a.height;return this}; -t.Mc=function(a){this.x=a.x;this.y=a.y;return this};t.WA=function(a){this.width=a.width;this.height=a.height;return this};N.prototype.copy=function(){var a=new N;a.x=this.x;a.y=this.y;a.width=this.width;a.height=this.height;return a};t=N.prototype;t.ca=function(){this.v=!0;Object.freeze(this);return this};t.I=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.v=!0;return this}; +t.Nc=function(a){this.x=a.x;this.y=a.y;return this};t.WA=function(a){this.width=a.width;this.height=a.height;return this};N.prototype.copy=function(){var a=new N;a.x=this.x;a.y=this.y;a.width=this.width;a.height=this.height;return a};t=N.prototype;t.ca=function(){this.v=!0;Object.freeze(this);return this};t.I=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.v=!0;return this}; t.ea=function(){Object.isFrozen(this)&&C("cannot thaw constant: "+this);this.v=!1;return this};function Ub(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));for(var f=0;""===a[b];)b++;(d=a[b++])&&(f=parseFloat(d));for(var g=0;""===a[b];)b++;(d=a[b++])&&(g=parseFloat(d));return new N(c,e,f,g)}return new N} function Vb(a){return a.x.toString()+" "+a.y.toString()+" "+a.width.toString()+" "+a.height.toString()}t.toString=function(){return"Rect("+this.x+","+this.y+","+this.width+","+this.height+")"};t.A=function(a){return a instanceof N?this.x===a.x&&this.y===a.y&&this.width===a.width&&this.height===a.height:!1};t.Gi=function(a,b,c,d){return this.x===a&&this.y===b&&this.width===c&&this.height===d};t.Ta=function(a){return L.w(this.x,a.x)&&L.w(this.y,a.y)&&L.w(this.width,a.width)&&L.w(this.height,a.height)}; function Wb(a,b){return L.aa(a.x,b.x)&&L.aa(a.y,b.y)&&L.aa(a.width,b.width)&&L.aa(a.height,b.height)}t.$=function(a){return this.x<=a.x&&this.x+this.width>=a.x&&this.y<=a.y&&this.y+this.height>=a.y};t.De=function(a){return this.x<=a.x&&a.x+a.width<=this.x+this.width&&this.y<=a.y&&a.y+a.height<=this.y+this.height};t.contains=function(a,b,c,d){void 0===c&&(c=0);void 0===d&&(d=0);return this.x<=a&&a+c<=this.x+this.width&&this.y<=b&&b+d<=this.y+this.height}; -t.offset=function(a,b){this.x+=a;this.y+=b;return this};t.Gc=function(a,b){return Xb(this,b,a,b,a)};t.Xp=function(a){return Xb(this,a.top,a.right,a.bottom,a.left)};t.cw=function(a){return Xb(this,-a.top,-a.right,-a.bottom,-a.left)};t.lA=function(a,b,c,d){return Xb(this,a,b,c,d)};function Xb(a,b,c,d,e){var f=a.width;c+e<=-f?(a.x+=f/2,a.width=0):(a.x-=e,a.width+=c+e);c=a.height;b+d<=-c?(a.y+=c/2,a.height=0):(a.y-=b,a.height+=b+d);return a}t.hy=function(a){return Yb(this,a.x,a.y,a.width,a.height)}; -t.zv=function(a,b,c,d){return Yb(this,a,b,c,d)};function Yb(a,b,c,d,e){var f=Math.max(a.x,b),g=Math.max(a.y,c);b=Math.min(a.x+a.width,b+d);c=Math.min(a.y+a.height,c+e);a.x=f;a.y=g;a.width=Math.max(0,b-f);a.height=Math.max(0,c-g);return a}t.Ic=function(a){return this.Av(a.x,a.y,a.width,a.height)}; -t.Av=function(a,b,c,d){var e=this.width,f=this.x;if(Infinity!==e&&Infinity!==c&&(e+=f,c+=a,isNaN(c)||isNaN(e)||f>c||a>e))return!1;a=this.height;c=this.y;return Infinity!==a&&Infinity!==d&&(a+=c,d+=b,isNaN(d)||isNaN(a)||c>d||b>a)?!1:!0};function Zb(a,b){var c=a.width,d=a.x,e=b.x-10;if(d>b.width+10+10+e||e>c+d)return!1;c=a.height;a=a.y;d=b.y-10;return a>b.height+10+10+d||d>c+a?!1:!0}t.Le=function(a){return $b(this,a.x,a.y,0,0)};t.Nc=function(a){return $b(this,a.x,a.y,a.width,a.height)}; +t.offset=function(a,b){this.x+=a;this.y+=b;return this};t.Hc=function(a,b){return Xb(this,b,a,b,a)};t.Xp=function(a){return Xb(this,a.top,a.right,a.bottom,a.left)};t.cw=function(a){return Xb(this,-a.top,-a.right,-a.bottom,-a.left)};t.lA=function(a,b,c,d){return Xb(this,a,b,c,d)};function Xb(a,b,c,d,e){var f=a.width;c+e<=-f?(a.x+=f/2,a.width=0):(a.x-=e,a.width+=c+e);c=a.height;b+d<=-c?(a.y+=c/2,a.height=0):(a.y-=b,a.height+=b+d);return a}t.hy=function(a){return Yb(this,a.x,a.y,a.width,a.height)}; +t.zv=function(a,b,c,d){return Yb(this,a,b,c,d)};function Yb(a,b,c,d,e){var f=Math.max(a.x,b),g=Math.max(a.y,c);b=Math.min(a.x+a.width,b+d);c=Math.min(a.y+a.height,c+e);a.x=f;a.y=g;a.width=Math.max(0,b-f);a.height=Math.max(0,c-g);return a}t.Jc=function(a){return this.Av(a.x,a.y,a.width,a.height)}; +t.Av=function(a,b,c,d){var e=this.width,f=this.x;if(Infinity!==e&&Infinity!==c&&(e+=f,c+=a,isNaN(c)||isNaN(e)||f>c||a>e))return!1;a=this.height;c=this.y;return Infinity!==a&&Infinity!==d&&(a+=c,d+=b,isNaN(d)||isNaN(a)||c>d||b>a)?!1:!0};function Zb(a,b){var c=a.width,d=a.x,e=b.x-10;if(d>b.width+10+10+e||e>c+d)return!1;c=a.height;a=a.y;d=b.y-10;return a>b.height+10+10+d||d>c+a?!1:!0}t.Le=function(a){return $b(this,a.x,a.y,0,0)};t.Oc=function(a){return $b(this,a.x,a.y,a.width,a.height)}; t.gw=function(a,b,c,d){void 0===c&&(c=0);void 0===d&&(d=0);return $b(this,a,b,c,d)};function $b(a,b,c,d,e){var f=Math.min(a.x,b),g=Math.min(a.y,c);b=Math.max(a.x+a.width,b+d);c=Math.max(a.y+a.height,c+e);a.x=f;a.y=g;a.width=b-f;a.height=c-g;return a}t.Vi=function(a,b,c){this.x=a-c.offsetX-c.x*this.width;this.y=b-c.offsetY-c.y*this.height;return this};function ac(a,b,c,d,e,f,g,h){void 0===g&&(g=0);void 0===h&&(h=0);return a<=e&&e+g<=a+c&&b<=f&&f+h<=b+d} function bc(a,b,c,d,e,f,g,h){return a>g+e||e>c+a?!1:b>h+f||f>d+b?!1:!0}t.u=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)};t.rA=function(){return 0===this.width&&0===this.height};N.alloc=function(){var a=cc.pop();return void 0===a?new N:a};N.allocAt=function(a,b,c,d){var e=cc.pop();return void 0===e?new N(a,b,c,d):e.h(a,b,c,d)};N.free=function(a){cc.push(a)}; na.Object.defineProperties(N.prototype,{left:{get:function(){return this.x},set:function(a){this.x=a}},top:{get:function(){return this.y},set:function(a){this.y=a}},right:{get:function(){return this.x+this.width},set:function(a){this.x+=a-(this.x+this.width)}},bottom:{get:function(){return this.y+this.height},set:function(a){this.y+=a-(this.y+this.height)}},position:{ get:function(){return new J(this.x,this.y)},set:function(a){this.x=a.x;this.y=a.y}},size:{get:function(){return new M(this.width,this.height)},set:function(a){this.width=a.width;this.height=a.height}},center:{get:function(){return new J(this.x+this.width/2,this.y+this.height/2)},set:function(a){this.x=a.x-this.width/2;this.y=a.y-this.height/2}},centerX:{get:function(){return this.x+this.width/2}, -set:function(a){this.x=a-this.width/2}},centerY:{get:function(){return this.y+this.height/2},set:function(a){this.y=a-this.height/2}}});N.prototype.isEmpty=N.prototype.rA;N.prototype.isReal=N.prototype.u;N.intersectsLineSegment=function(a,b,c,d,e,f,g,h){return L.iy(a,b,c,d,e,f,g,h)};N.prototype.setSpot=N.prototype.Vi;N.prototype.union=N.prototype.gw;N.prototype.unionRect=N.prototype.Nc;N.prototype.unionPoint=N.prototype.Le;N.prototype.intersects=N.prototype.Av; -N.prototype.intersectsRect=N.prototype.Ic;N.prototype.intersect=N.prototype.zv;N.prototype.intersectRect=N.prototype.hy;N.prototype.grow=N.prototype.lA;N.prototype.subtractMargin=N.prototype.cw;N.prototype.addMargin=N.prototype.Xp;N.prototype.inflate=N.prototype.Gc;N.prototype.offset=N.prototype.offset;N.prototype.contains=N.prototype.contains;N.prototype.containsRect=N.prototype.De;N.prototype.containsPoint=N.prototype.$;N.prototype.equalsApprox=N.prototype.Ta;N.prototype.equalTo=N.prototype.Gi; -N.prototype.equals=N.prototype.A;N.prototype.setSize=N.prototype.WA;N.prototype.setPoint=N.prototype.Mc;N.prototype.set=N.prototype.set;N.prototype.setTo=N.prototype.ng;var gc=null,hc=null,cc=[];N.className="Rect";N.parse=Ub;N.stringify=Vb;N.contains=ac;N.intersects=bc;N.ZeroRect=gc=(new N(0,0,0,0)).ca();N.NoRect=hc=(new N(NaN,NaN,NaN,NaN)).ca();N.parse=Ub;N.stringify=Vb;N.contains=ac;N.intersects=bc; +set:function(a){this.x=a-this.width/2}},centerY:{get:function(){return this.y+this.height/2},set:function(a){this.y=a-this.height/2}}});N.prototype.isEmpty=N.prototype.rA;N.prototype.isReal=N.prototype.u;N.intersectsLineSegment=function(a,b,c,d,e,f,g,h){return L.iy(a,b,c,d,e,f,g,h)};N.prototype.setSpot=N.prototype.Vi;N.prototype.union=N.prototype.gw;N.prototype.unionRect=N.prototype.Oc;N.prototype.unionPoint=N.prototype.Le;N.prototype.intersects=N.prototype.Av; +N.prototype.intersectsRect=N.prototype.Jc;N.prototype.intersect=N.prototype.zv;N.prototype.intersectRect=N.prototype.hy;N.prototype.grow=N.prototype.lA;N.prototype.subtractMargin=N.prototype.cw;N.prototype.addMargin=N.prototype.Xp;N.prototype.inflate=N.prototype.Hc;N.prototype.offset=N.prototype.offset;N.prototype.contains=N.prototype.contains;N.prototype.containsRect=N.prototype.De;N.prototype.containsPoint=N.prototype.$;N.prototype.equalsApprox=N.prototype.Ta;N.prototype.equalTo=N.prototype.Gi; +N.prototype.equals=N.prototype.A;N.prototype.setSize=N.prototype.WA;N.prototype.setPoint=N.prototype.Nc;N.prototype.set=N.prototype.set;N.prototype.setTo=N.prototype.ng;var gc=null,hc=null,cc=[];N.className="Rect";N.parse=Ub;N.stringify=Vb;N.contains=ac;N.intersects=bc;N.ZeroRect=gc=(new N(0,0,0,0)).ca();N.NoRect=hc=(new N(NaN,NaN,NaN,NaN)).ca();N.parse=Ub;N.stringify=Vb;N.contains=ac;N.intersects=bc; function ic(a,b,c,d){void 0===a?this.left=this.bottom=this.right=this.top=0:void 0===b?this.left=this.bottom=this.right=this.top=a:void 0===c?(this.top=a,this.right=b,this.bottom=a,this.left=b):void 0!==d?(this.top=a,this.right=b,this.bottom=c,this.left=d):C("Invalid arguments to Margin constructor: "+a+", "+b+", "+c+", "+d);this.v=!1}ic.prototype.assign=function(a){this.top=a.top;this.right=a.right;this.bottom=a.bottom;this.left=a.left;return this}; ic.prototype.ng=function(a,b,c,d){this.top=a;this.right=b;this.bottom=c;this.left=d;return this};ic.prototype.set=function(a){this.top=a.top;this.right=a.right;this.bottom=a.bottom;this.left=a.left;return this};ic.prototype.copy=function(){var a=new ic;a.top=this.top;a.right=this.right;a.bottom=this.bottom;a.left=this.left;return a};t=ic.prototype;t.ca=function(){this.v=!0;Object.freeze(this);return this};t.I=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()}; t.freeze=function(){this.v=!0;return this};t.ea=function(){Object.isFrozen(this)&&C("cannot thaw constant: "+this);this.v=!1;return this}; @@ -130,8 +130,8 @@ a)return Fc;if("RightSide"===a)return Gc;if("BottomSide"===a)return Hc;if("TopBo var d=a[b++];void 0!==d&&0c,f=0>d;if(al;++l){b=.5*(h+k);if(b===h||b===k)break;var m=a/(b+e),n=g/(b+f);m=m*m+n*n-1;if(0m)k=b;else break}c=e*c/(b+e)-c;d=f*d/(b+f)-d;c=Math.sqrt(c*c+d*d)}else c=Math.abs(d-b);else d=a*a-b*b,f=a*c,fg&&(g+=360),q.startAngle+=g);0>a&&(q.startAngle=180-q.startAngle,q.sweepAngle=-q.sweepAngle); 0>d&&(q.startAngle=-q.startAngle,q.sweepAngle=-q.sweepAngle);q.radiusX*=Math.sqrt(a*a+c*c);void 0!==q.radiusY&&(q.radiusY*=Math.sqrt(b*b+d*d));break;case Pd:g=q.endX;h=q.endY;q.endX=g*a+h*c+e;q.endY=g*b+h*d+f;if(0===q.radiusX||0===q.radiusY)break;0!==b&&(g=180*Math.atan2(b,a)/Math.PI,0>g&&(g+=360),q.xAxisRotation+=g);0>a&&(q.xAxisRotation=180-q.xAxisRotation,q.isClockwiseArc=!q.isClockwiseArc);0>d&&(q.xAxisRotation=-q.xAxisRotation,q.isClockwiseArc=!q.isClockwiseArc);q.radiusX*=Math.sqrt(a*a+c*c); q.radiusY*=Math.sqrt(b*b+d*d);break;default:C("Unknown Segment type: "+q.type)}}}}this.qa=!0;return this}; -t.$=function(a,b){void 0===b&&(b=0);var c=this.Zc,d=this.$c,e=this.fc,f=this.oc;switch(this.type){case Q.j:return L.Mb(c,d,e,f,b,a.x,a.y);case Q.C:var g=N.allocAt(Math.min(c,e)-b,Math.min(d,f)-b,Math.abs(e-c)+2*b,Math.abs(f-d)+2*b);a=g.$(a);N.free(g);return a;case Q.M:g=Math.min(c,e)-b;var h=Math.min(d,f)-b;c=(Math.abs(e-c)+2*b)/2;b=(Math.abs(f-d)+2*b)/2;if(0>=c||0>=b)return!1;g=a.x-(g+c);h=a.y-(h+b);return 1>=g*g/(c*c)+h*h/(b*b);case Q.o:return Sd(this,a,b,!0,!1);default:return!1}}; +t.$=function(a,b){void 0===b&&(b=0);var c=this.$c,d=this.ad,e=this.fc,f=this.oc;switch(this.type){case Q.j:return L.Mb(c,d,e,f,b,a.x,a.y);case Q.C:var g=N.allocAt(Math.min(c,e)-b,Math.min(d,f)-b,Math.abs(e-c)+2*b,Math.abs(f-d)+2*b);a=g.$(a);N.free(g);return a;case Q.M:g=Math.min(c,e)-b;var h=Math.min(d,f)-b;c=(Math.abs(e-c)+2*b)/2;b=(Math.abs(f-d)+2*b)/2;if(0>=c||0>=b)return!1;g=a.x-(g+c);h=a.y-(h+b);return 1>=g*g/(c*c)+h*h/(b*b);case Q.o:return Sd(this,a,b,!0,!1);default:return!1}}; function Sd(a,b,c,d,e){var f=b.x;b=b.y;for(var g=a.bounds.x-20,h=0,k,l,m,n,p=a.figures.m,r=p.length,q=0;qa?"M"+this.startX.toString()+" "+this.startY.toString():"M"+this.startX.toFixed(a)+" "+this.startY.toFixed(a);for(var c=this.segments.m,d=c.length,e=0;ea&&(a+=360),this.Ae=a,this.pi=0,this.ri=Math.max(d,0),this.ah=Math.max(e,0),this.rl="boolean"===typeof g?g:"number"===typeof g?!!g:!1,this.Nk=!!h):(this.Ae=d,this.pi=e,a===Od&&(f=Math.max(f,0)),this.ri=f,"number"===typeof g?(a===Od&&(g=Math.max(g,0)),this.ah=g):this.ah=0, this.Nk=this.rl=!1);this.yj=!1;this.qa=!0;this.Od=null}Xd.prototype.copy=function(){var a=new Xd;a.ia=this.ia;a.fc=this.fc;a.oc=this.oc;a.Ae=this.Ae;a.pi=this.pi;a.ri=this.ri;a.ah=this.ah;a.rl=this.rl;a.Nk=this.Nk;a.yj=this.yj;a.qa=this.qa;return a};t=Xd.prototype; t.Ta=function(a){if(!(a instanceof Xd)||this.type!==a.type||this.isClosed!==a.isClosed)return!1;switch(this.type){case Fd:case ud:return L.w(this.endX,a.endX)&&L.w(this.endY,a.endY);case Md:return L.w(this.endX,a.endX)&&L.w(this.endY,a.endY)&&L.w(this.point1X,a.point1X)&&L.w(this.point1Y,a.point1Y)&&L.w(this.point2X,a.point2X)&&L.w(this.point2Y,a.point2Y);case Nd:return L.w(this.endX,a.endX)&&L.w(this.endY,a.endY)&&L.w(this.point1X,a.point1X)&&L.w(this.point1Y,a.point1Y);case Od:return L.w(this.startAngle, @@ -234,15 +234,15 @@ wa(this,a);this.oc=a;this.qa=!0}},point1X:{get:function(){return this.Ae},set:fu wa(this,a);this.ah=a;this.qa=!0}},centerX:{get:function(){return this.Ae},set:function(a){this.v&&wa(this,a);this.Ae=a;this.qa=!0}},centerY:{get:function(){return this.pi},set:function(a){this.v&&wa(this,a);this.pi=a;this.qa=!0}},radiusX:{get:function(){return this.ri},set:function(a){0>a&&xa(a,">= zero",Xd,"radiusX");this.v&&wa(this,a);this.ri=a;this.qa=!0}},radiusY:{get:function(){return this.ah}, set:function(a){0>a&&xa(a,">= zero",Xd,"radiusY");this.v&&wa(this,a);this.ah=a;this.qa=!0}},startAngle:{get:function(){return this.fc},set:function(a){this.fc!==a&&(this.v&&wa(this,a),a%=360,0>a&&(a+=360),this.fc=a,this.qa=!0)}},sweepAngle:{get:function(){return this.oc},set:function(a){this.v&&wa(this,a);360a&&(a=-360);this.oc=a;this.qa=!0}},isClockwiseArc:{get:function(){return this.Nk},set:function(a){this.v&& wa(this,a);this.Nk=a;this.qa=!0}},isLargeArc:{get:function(){return this.rl},set:function(a){this.v&&wa(this,a);this.rl=a;this.qa=!0}},xAxisRotation:{get:function(){return this.Ae},set:function(a){a%=360;0>a&&(a+=360);this.v&&wa(this,a);this.Ae=a;this.qa=!0}}});Xd.prototype.equalsApprox=Xd.prototype.Ta; -var Fd=new D(Xd,"Move",0),ud=new D(Xd,"Line",1),Md=new D(Xd,"Bezier",2),Nd=new D(Xd,"QuadraticBezier",3),Od=new D(Xd,"Arc",4),Pd=new D(Xd,"SvgArc",4);Xd.className="PathSegment";Xd.Move=Fd;Xd.Line=ud;Xd.Bezier=Md;Xd.QuadraticBezier=Nd;Xd.Arc=Od;Xd.SvgArc=Pd;function Zd(){this.F=null;this.Wu=(new J(0,0)).freeze();this.Ht=(new J(0,0)).freeze();this.Sq=this.Lr=0;this.Tq=1;this.ci="";this.rs=this.hr=!1;this.fr=this.Vq=0;this.sg=this.ur=this.Ar=!1;this.lr=null;this.ps=0;this.md=this.os=null} -Zd.prototype.copy=function(){var a=new Zd;return this.clone(a)};Zd.prototype.clone=function(a){a.F=this.F;a.Wu.assign(this.viewPoint);a.Ht.assign(this.documentPoint);a.Lr=this.Lr;a.Sq=this.Sq;a.Tq=this.Tq;a.ci=this.ci;a.hr=this.hr;a.rs=this.rs;a.Vq=this.Vq;a.fr=this.fr;a.Ar=this.Ar;a.ur=this.ur;a.sg=this.sg;a.lr=this.lr;a.ps=this.ps;a.os=this.os;a.md=this.md;return a}; +var Fd=new D(Xd,"Move",0),ud=new D(Xd,"Line",1),Md=new D(Xd,"Bezier",2),Nd=new D(Xd,"QuadraticBezier",3),Od=new D(Xd,"Arc",4),Pd=new D(Xd,"SvgArc",4);Xd.className="PathSegment";Xd.Move=Fd;Xd.Line=ud;Xd.Bezier=Md;Xd.QuadraticBezier=Nd;Xd.Arc=Od;Xd.SvgArc=Pd;function Zd(){this.F=null;this.Wu=(new J(0,0)).freeze();this.Ht=(new J(0,0)).freeze();this.Sq=this.Lr=0;this.Tq=1;this.ci="";this.rs=this.hr=!1;this.fr=this.Vq=0;this.sg=this.ur=this.Ar=!1;this.lr=null;this.ps=0;this.nd=this.os=null} +Zd.prototype.copy=function(){var a=new Zd;return this.clone(a)};Zd.prototype.clone=function(a){a.F=this.F;a.Wu.assign(this.viewPoint);a.Ht.assign(this.documentPoint);a.Lr=this.Lr;a.Sq=this.Sq;a.Tq=this.Tq;a.ci=this.ci;a.hr=this.hr;a.rs=this.rs;a.Vq=this.Vq;a.fr=this.fr;a.Ar=this.Ar;a.ur=this.ur;a.sg=this.sg;a.lr=this.lr;a.ps=this.ps;a.os=this.os;a.nd=this.nd;return a}; Zd.prototype.toString=function(){var a="^";0!==this.modifiers&&(a+="M:"+this.modifiers);0!==this.button&&(a+="B:"+this.button);""!==this.key&&(a+="K:"+this.key);0!==this.clickCount&&(a+="C:"+this.clickCount);0!==this.delta&&(a+="D:"+this.delta);this.handled&&(a+="h");this.bubbles&&(a+="b");null!==this.documentPoint&&(a+="@"+this.documentPoint.toString());return a};Zd.prototype.mq=function(a,b){var c=this.diagram;if(null===c)return b;$d(c,this.event,a,b);return b}; Zd.prototype.fA=function(a,b){var c=this.diagram;if(null===c)return b;$d(c,this.event,a,b);b.assign(c.kt(b));return b}; na.Object.defineProperties(Zd.prototype,{diagram:{get:function(){return this.F},set:function(a){this.F=a}},viewPoint:{get:function(){return this.Wu},set:function(a){this.Wu.assign(a)}},documentPoint:{get:function(){return this.Ht},set:function(a){this.Ht.assign(a)}},modifiers:{get:function(){return this.Lr},set:function(a){this.Lr=a}},button:{get:function(){return this.Sq}, set:function(a){this.Sq=a;if(null===this.event)switch(a){case 0:this.buttons=1;break;case 1:this.buttons=4;break;case 2:this.buttons=2}}},buttons:{get:function(){return this.Tq},set:function(a){this.Tq=a}},key:{get:function(){return this.ci},set:function(a){this.ci=a}},down:{get:function(){return this.hr},set:function(a){this.hr=a}},up:{get:function(){return this.rs},set:function(a){this.rs= a}},clickCount:{get:function(){return this.Vq},set:function(a){this.Vq=a}},delta:{get:function(){return this.fr},set:function(a){this.fr=a}},isMultiTouch:{get:function(){return this.Ar},set:function(a){this.Ar=a}},handled:{get:function(){return this.ur},set:function(a){this.ur=a}},bubbles:{get:function(){return this.sg},set:function(a){this.sg=a}},event:{ get:function(){return this.lr},set:function(a){this.lr=a}},isTouchEvent:{get:function(){var a=x.TouchEvent,b=this.event;return a&&b instanceof a?!0:(a=x.PointerEvent)&&b instanceof a&&("touch"===b.pointerType||"pen"===b.pointerType)}},timestamp:{get:function(){return this.ps},set:function(a){this.ps=a}},targetDiagram:{get:function(){return this.os},set:function(a){this.os=a}},targetObject:{ -get:function(){return this.md},set:function(a){this.md=a}},control:{get:function(){return 0!==(this.modifiers&1)},set:function(a){this.modifiers=a?this.modifiers|1:this.modifiers&-2}},shift:{get:function(){return 0!==(this.modifiers&4)},set:function(a){this.modifiers=a?this.modifiers|4:this.modifiers&-5}},alt:{get:function(){return 0!==(this.modifiers&2)},set:function(a){this.modifiers=a?this.modifiers| +get:function(){return this.nd},set:function(a){this.nd=a}},control:{get:function(){return 0!==(this.modifiers&1)},set:function(a){this.modifiers=a?this.modifiers|1:this.modifiers&-2}},shift:{get:function(){return 0!==(this.modifiers&4)},set:function(a){this.modifiers=a?this.modifiers|4:this.modifiers&-5}},alt:{get:function(){return 0!==(this.modifiers&2)},set:function(a){this.modifiers=a?this.modifiers| 2:this.modifiers&-3}},meta:{get:function(){return 0!==(this.modifiers&8)},set:function(a){this.modifiers=a?this.modifiers|8:this.modifiers&-9}},left:{get:function(){var a=this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons&1):0===this.button},set:function(a){this.buttons=a?this.buttons|1:this.buttons&-2}},right:{get:function(){var a= this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons&2):2===this.button},set:function(a){this.buttons=a?this.buttons|2:this.buttons&-3}},middle:{get:function(){var a=this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons&4):1===this.button},set:function(a){this.buttons=a?this.buttons|4:this.buttons&-5}}}); Zd.prototype.getMultiTouchDocumentPoint=Zd.prototype.fA;Zd.prototype.getMultiTouchViewPoint=Zd.prototype.mq;Zd.className="InputEvent";function ae(){this.F=null;this.na="";this.Tr=this.ks=null}ae.prototype.copy=function(){var a=new ae;a.F=this.F;a.na=this.na;a.ks=this.ks;a.Tr=this.Tr;return a};ae.prototype.toString=function(){var a="*"+this.name;null!==this.subject&&(a+=":"+this.subject.toString());null!==this.parameter&&(a+="("+this.parameter.toString()+")");return a}; @@ -258,9 +258,9 @@ newValue:{get:function(){return this.No},set:function(a){this.No=a}},newParam:{g var de=new D(be,"Transaction",-1),ce=new D(be,"Property",0),ee=new D(be,"Insert",1),fe=new D(be,"Remove",2);be.className="ChangedEvent";be.Transaction=de;be.Property=ce;be.Insert=ee;be.Remove=fe;function oe(){this.o=(new E).freeze();this.na="";this.j=!1}oe.prototype.toString=function(a){var b="Transaction: "+this.name+" "+this.changes.count.toString()+(this.isComplete?"":", incomplete");if(void 0!==a&&0b&&a.Lc(b,d),b++);for(;a.length>b;)a.pop();a.freeze()}}; +oe.prototype.Zs=function(){if(this.isComplete){var a=this.changes;a.ea();for(var b=new I,c=0;cb&&a.Mc(b,d),b++);for(;a.length>b;)a.pop();a.freeze()}}; na.Object.defineProperties(oe.prototype,{changes:{get:function(){return this.o}},name:{get:function(){return this.na},set:function(a){this.na=a}},isComplete:{get:function(){return this.j},set:function(a){this.j=a}}});oe.prototype.optimize=oe.prototype.Zs;oe.prototype.redo=oe.prototype.redo;oe.prototype.canRedo=oe.prototype.canRedo;oe.prototype.undo=oe.prototype.undo;oe.prototype.canUndo=oe.prototype.canUndo; -oe.prototype.clear=oe.prototype.clear;oe.className="Transaction";function pe(){this.nu=new G;this.td=!1;this.C=(new E).freeze();this.pe=-1;this.o=999;this.re=!1;this.cr=null;this.yi=0;this.j=!1;this.we=(new E).freeze();this.Al=new E;this.Pt=!0;this.Zt=this.yr=this.bu=this.au=!1} +oe.prototype.clear=oe.prototype.clear;oe.className="Transaction";function pe(){this.nu=new G;this.ud=!1;this.C=(new E).freeze();this.pe=-1;this.o=999;this.re=!1;this.cr=null;this.yi=0;this.j=!1;this.we=(new E).freeze();this.Al=new E;this.Pt=!0;this.Zt=this.yr=this.bu=this.au=!1} pe.prototype.toString=function(a){var b="UndoManager "+this.historyIndex+"<"+this.history.count+"<="+this.maxHistoryLength;b+="[";for(var c=this.nestedTransactionNames.count,d=0;d=this.transactionLevel&&!this.Pt&&(a=a.diagram,null!==a&&!1===a.Pi||ya("Change not within a transaction: "+c.toString()))}}; pe.prototype.skipsEvent=function(a){if(null===a||0>a.change.value)return!0;a=a.object;if(null===a)return!1;if(void 0!==a.layer){if(a=a.layer,null!==a&&a.isTemporary)return!0}else if(a.isTemporary)return!0;return!1}; -na.Object.defineProperties(pe.prototype,{models:{get:function(){return this.nu.iterator}},isEnabled:{get:function(){return this.td},set:function(a){this.td=a}},transactionToUndo:{get:function(){return 0<=this.historyIndex&&this.historyIndex<=this.history.count-1?this.history.J(this.historyIndex):null}},transactionToRedo:{get:function(){return this.historyIndexe&&(e=-3),0g&&(g=-3);if(void 0===h||void 0===e||void 0===g||0===e&&0===g||b.shift)!b.shift&&a.allowVerticalScroll?(f=3*f*a.scrollVerticalLineChange,0e||Math.abs(b.y-a.y)>d}; -na.Object.defineProperties(re.prototype,{diagram:{get:function(){return this.F},set:function(a){a instanceof T&&(this.F=a)}},name:{get:function(){return this.na},set:function(a){this.na=a}},isEnabled:{get:function(){return this.td},set:function(a){this.td=a}},isActive:{get:function(){return this.Oc},set:function(a){this.Oc=a}},transactionResult:{get:function(){return this.tw}, -set:function(a){this.tw=a}}});re.prototype.startTransaction=re.prototype.wa;re.className="Tool";function Oa(){re.call(this);this.name="ToolManager";this.yc=new E;this.Pc=new E;this.Kd=new E;this.M=this.Ga=850;this.o=(new M(2,2)).ca();this.Wa=5E3;this.Ha=ve;this.C=xe;this.br=this.j=null;this.Vj=-1}ma(Oa,re);Oa.prototype.initializeStandardTools=function(){}; +na.Object.defineProperties(re.prototype,{diagram:{get:function(){return this.F},set:function(a){a instanceof T&&(this.F=a)}},name:{get:function(){return this.na},set:function(a){this.na=a}},isEnabled:{get:function(){return this.ud},set:function(a){this.ud=a}},isActive:{get:function(){return this.Pc},set:function(a){this.Pc=a}},transactionResult:{get:function(){return this.tw}, +set:function(a){this.tw=a}}});re.prototype.startTransaction=re.prototype.wa;re.className="Tool";function Oa(){re.call(this);this.name="ToolManager";this.yc=new E;this.Qc=new E;this.Kd=new E;this.M=this.Ga=850;this.o=(new M(2,2)).ca();this.Wa=5E3;this.Ha=ve;this.C=xe;this.br=this.j=null;this.Vj=-1}ma(Oa,re);Oa.prototype.initializeStandardTools=function(){}; Oa.prototype.updateAdornments=function(a){var b=this.currentToolTip;if(b instanceof we&&this.br===a){var c=b.adornedObject;(null!==a?c.part===a:null===c)?this.showToolTip(b,c):this.hideToolTip()}}; Oa.prototype.doMouseDown=function(){var a=this.diagram,b=a.lastInput;b.isTouchEvent&&this.gestureBehavior===ye&&(b.bubbles=!1);if(b.isMultiTouch){this.cancelWaitAfter();if(this.gestureBehavior===ze){b.bubbles=!0;return}if(this.gestureBehavior===ye)return;if(a.currentTool.canStartMultiTouch()){a.currentTool.standardPinchZoomStart();return}}for(var c=this.mouseDownTools.length,d=0;dg&&(g=l),m>h&&(h=m))}}Infinity===d?f.h(0,0,0,0):f.h(d,e,g-d,h-e);d=f.x+f.width/2;e=f.y+f.height/2;N.free(f); -f=a.hs;g=new I;h=J.alloc();for(k=b.iterator;k.next();)l=k.value,l instanceof U&&l.canCopy()&&(m=c.H(l),null!==m&&(m.points=l.points,cf(m,f.x-d,f.y-e),m.suspendsRouting=!0,g.add(m,a.yd())));for(b=b.iterator;b.next();)l=b.value,l.Jc()&&l.canCopy()&&(k=c.H(l),null!==k&&(l=l.location,h.h(f.x-(d-l.x),f.y-(e-l.y)),k.location=h,k.Sa(),g.add(k,a.yd(h))));J.free(h);a.copiedParts=g;Je(a,g.Ef());null!==a.draggedLink&&(c=a.draggedLink,b=c.routeBounds,cf(c,a.startPoint.x-(b.x+b.width/2),a.startPoint.y-(b.y+b.height/ +f=a.hs;g=new I;h=J.alloc();for(k=b.iterator;k.next();)l=k.value,l instanceof U&&l.canCopy()&&(m=c.H(l),null!==m&&(m.points=l.points,cf(m,f.x-d,f.y-e),m.suspendsRouting=!0,g.add(m,a.zd())));for(b=b.iterator;b.next();)l=b.value,l.Kc()&&l.canCopy()&&(k=c.H(l),null!==k&&(l=l.location,h.h(f.x-(d-l.x),f.y-(e-l.y)),k.location=h,k.Sa(),g.add(k,a.zd(h))));J.free(h);a.copiedParts=g;Je(a,g.Ef());null!==a.draggedLink&&(c=a.draggedLink,b=c.routeBounds,cf(c,a.startPoint.x-(b.x+b.width/2),a.startPoint.y-(b.y+b.height/ 2)));a.doUpdateCursor(null,!0)}}}De.prototype.doSimulatedDragOut=function(){var a=this.diagram;a.ht=!1;this.mayCopy()||this.mayMove()?a.currentCursor="":a.currentCursor=this.nodropCursor;this.qo=null};De.prototype.computeMove=function(a,b,c,d){c=this.diagram;return null!==c?c.computeMove(a,b,this.dragOptions,d):new J}; -na.Object.defineProperties(De.prototype,{isCopyEnabled:{get:function(){return this.Pc},set:function(a){this.Pc=a}},copiesEffectiveCollection:{get:function(){return this.C},set:function(a){this.C=a}},dragOptions:{get:function(){return this.Ha},set:function(a){this.Ha=a}},isGridSnapEnabled:{get:function(){return this.dragOptions.isGridSnapEnabled},set:function(a){this.dragOptions.isGridSnapEnabled= +na.Object.defineProperties(De.prototype,{isCopyEnabled:{get:function(){return this.Qc},set:function(a){this.Qc=a}},copiesEffectiveCollection:{get:function(){return this.C},set:function(a){this.C=a}},dragOptions:{get:function(){return this.Ha},set:function(a){this.Ha=a}},isGridSnapEnabled:{get:function(){return this.dragOptions.isGridSnapEnabled},set:function(a){this.dragOptions.isGridSnapEnabled= a}},isComplexRoutingRealtime:{get:function(){return this.yc},set:function(a){this.yc=a}},isGridSnapRealtime:{get:function(){return this.dragOptions.isGridSnapRealtime},set:function(a){this.dragOptions.isGridSnapRealtime=a}},gridSnapCellSize:{get:function(){return this.dragOptions.gridSnapCellSize},set:function(a){this.dragOptions.gridSnapCellSize.A(a)||(a=a.I(),this.dragOptions.gridSnapCellSize=a)}},gridSnapCellSpot:{ get:function(){return this.dragOptions.gridSnapCellSpot},set:function(a){this.dragOptions.gridSnapCellSpot.A(a)||(a=a.I(),this.dragOptions.gridSnapCellSpot=a)}},gridSnapOrigin:{get:function(){return this.dragOptions.gridSnapOrigin},set:function(a){this.dragOptions.gridSnapOrigin.A(a)||(a=a.I(),this.dragOptions.gridSnapOrigin=a)}},dragsLink:{get:function(){return this.dragOptions.dragsLink},set:function(a){this.dragOptions.dragsLink= a}},dragsTree:{get:function(){return this.dragOptions.dragsTree},set:function(a){this.dragOptions.dragsTree=a}},copyCursor:{get:function(){return this.M},set:function(a){this.M=a}},moveCursor:{get:function(){return this.Ih},set:function(a){this.Ih=a}},nodropCursor:{get:function(){return this.Jh},set:function(a){this.Jh=a}},currentPart:{get:function(){return this.Ga}, @@ -361,7 +361,7 @@ set:function(a){this.Ga=a}},copiedParts:{get:function(){return this.o},set:funct a}},isDragOutStarted:{get:function(){return this.Kd},set:function(a){this.Kd=a}},startPoint:{get:function(){return this.hs},set:function(a){this.hs.A(a)||this.hs.assign(a)}},delay:{get:function(){return this.Zk},set:function(a){this.Zk=a}}});De.prototype.getDraggingSource=De.prototype.eA;var Ie=null,Me=null;De.className="DraggingTool";He=new E; Ma("draggingTool",function(){return this.findTool("Dragging")},function(a){this.Za("Dragging",a,this.mouseMoveTools)});Oa.prototype.doCancel=function(){null!==Ie&&Ie.doCancel();re.prototype.doCancel.call(this)}; function tf(){re.call(this);this.Jh=100;this.Ha=!1;this.Sh="pointer";var a=new U,b=new uf;b.isPanelMain=!0;b.stroke="blue";a.add(b);b=new uf;b.toArrow="Standard";b.fill="blue";b.stroke="blue";a.add(b);a.layerName="Tool";this.rw=a;a=new W;b=new uf;b.portId="";b.figure="Rectangle";b.fill=null;b.stroke="magenta";b.strokeWidth=2;b.desiredSize=Jb;a.add(b);a.selectable=!1;a.layerName="Tool";this.Tm=a;this.j=b;a=new W;b=new uf;b.portId="";b.figure="Rectangle";b.fill=null;b.stroke="magenta";b.strokeWidth= -2;b.desiredSize=Jb;a.add(b);a.selectable=!1;a.layerName="Tool";this.sw=a;this.o=b;this.Ih=this.Kd=this.yc=this.Wa=this.Pc=null;this.Ga=!0;this.My=new I;this.Zi=this.ii=this.Sm=null}ma(tf,re);tf.prototype.doStop=function(){this.diagram.og();this.originalToPort=this.originalToNode=this.originalFromPort=this.originalFromNode=this.originalLink=null;this.validPortsCache.clear();this.targetPort=null}; +2;b.desiredSize=Jb;a.add(b);a.selectable=!1;a.layerName="Tool";this.sw=a;this.o=b;this.Ih=this.Kd=this.yc=this.Wa=this.Qc=null;this.Ga=!0;this.My=new I;this.Zi=this.ii=this.Sm=null}ma(tf,re);tf.prototype.doStop=function(){this.diagram.og();this.originalToPort=this.originalToNode=this.originalFromPort=this.originalFromNode=this.originalLink=null;this.validPortsCache.clear();this.targetPort=null}; tf.prototype.copyPortProperties=function(a,b,c,d,e){if(null!==a&&null!==b&&null!==c&&null!==d){var f=b.wf(),g=M.alloc();g.width=b.naturalBounds.width*f;g.height=b.naturalBounds.height*f;d.desiredSize=g;M.free(g);e?(d.toSpot=b.toSpot,d.toEndSegmentLength=b.toEndSegmentLength):(d.fromSpot=b.fromSpot,d.fromEndSegmentLength=b.fromEndSegmentLength);c.locationSpot=yc;f=J.alloc();c.location=b.da(yc,f);J.free(f);d.angle=b.Li();null!==this.portTargeted&&this.portTargeted(a,b,c,d,e)}}; tf.prototype.setNoTargetPortProperties=function(a,b,c){null!==b&&(b.desiredSize=Jb,b.fromSpot=rc,b.toSpot=rc);null!==a&&(a.location=this.diagram.lastInput.documentPoint);null!==this.portTargeted&&this.portTargeted(null,null,a,b,c)};tf.prototype.doMouseDown=function(){this.isActive&&this.doMouseMove()}; tf.prototype.doMouseMove=function(){if(this.isActive){var a=this.diagram;this.targetPort=this.findTargetPort(this.isForwards);if(null!==this.targetPort&&this.targetPort.part instanceof W){var b=this.targetPort.part;this.isForwards?this.copyPortProperties(b,this.targetPort,this.temporaryToNode,this.temporaryToPort,!0):this.copyPortProperties(b,this.targetPort,this.temporaryFromNode,this.temporaryFromPort,!1)}else this.isForwards?this.setNoTargetPortProperties(this.temporaryToNode,this.temporaryToPort, @@ -379,7 +379,7 @@ a)return!1;return!If(this,a,b,c,!0)}if(d===Kf)return a===b?a=!0:(d=new G,d.add(b function Lf(a,b,c,d,e){if(c===d)return!0;if(null===c||null===d||b.contains(c))return!1;b.add(c);for(var f=c.linksConnected;f.next();){var g=f.value;if(g!==e&&g.toNode===c&&(g=g.fromNode,g!==c&&Lf(a,b,g,d,e)))return!0}return!1}function Of(a,b,c,d,e){if(c===d)return!0;if(null===c||null===d||b.contains(c))return!1;b.add(c);for(var f=c.linksConnected;f.next();){var g=f.value;if(g!==e){var h=g.fromNode;g=g.toNode;h=h===c?g:h;if(h!==c&&Of(a,b,h,d,e))return!0}}return!1} na.Object.defineProperties(tf.prototype,{portGravity:{get:function(){return this.Jh},set:function(a){0<=a&&(this.Jh=a)}},isUnconnectedLinkValid:{get:function(){return this.Ha},set:function(a){this.Ha=a}},linkingCursor:{get:function(){return this.Sh},set:function(a){this.Sh=a}},temporaryLink:{get:function(){return this.rw},set:function(a){this.rw=a}},temporaryFromNode:{ get:function(){return this.Tm},set:function(a){if(this.Tm=a)this.j=a.port}},temporaryFromPort:{get:function(){return this.j},set:function(a){if(null!==this.j){var b=this.j.panel;if(null!==b){var c=b.T.indexOf(this.j);b.eb(c);b.ub(c,a)}}this.j=a}},temporaryToNode:{get:function(){return this.sw},set:function(a){if(this.sw=a)this.o=a.port}},temporaryToPort:{get:function(){return this.o},set:function(a){if(null!== -this.o){var b=this.o.panel;if(null!==b){var c=b.T.indexOf(this.o);b.eb(c);b.ub(c,a)}}this.o=a}},originalLink:{get:function(){return this.Pc},set:function(a){this.Pc=a}},originalFromNode:{get:function(){return this.Wa},set:function(a){this.Wa=a}},originalFromPort:{get:function(){return this.yc},set:function(a){this.yc=a}},originalToNode:{get:function(){return this.Kd},set:function(a){this.Kd= +this.o){var b=this.o.panel;if(null!==b){var c=b.T.indexOf(this.o);b.eb(c);b.ub(c,a)}}this.o=a}},originalLink:{get:function(){return this.Qc},set:function(a){this.Qc=a}},originalFromNode:{get:function(){return this.Wa},set:function(a){this.Wa=a}},originalFromPort:{get:function(){return this.yc},set:function(a){this.yc=a}},originalToNode:{get:function(){return this.Kd},set:function(a){this.Kd= a}},originalToPort:{get:function(){return this.Ih},set:function(a){this.Ih=a}},isForwards:{get:function(){return this.Ga},set:function(a){this.Ga=a}},validPortsCache:{get:function(){return this.My}},targetPort:{get:function(){return this.Sm},set:function(a){this.Sm=a}},linkValidation:{get:function(){return this.ii},set:function(a){this.ii=a}},portTargeted:{ get:function(){return this.Zi},set:function(a){this.Zi=a}}});tf.className="LinkingBaseTool";function Pf(){tf.call(this);this.name="Linking";this.M={};this.C=null;this.K=Qf;this.Kh=null}ma(Pf,tf);Pf.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;return a.isReadOnly||a.isModelReadOnly||!a.allowLink||!a.model.Ps()||!a.lastInput.left||a.currentTool!==this&&!this.isBeyondDragSize()?!1:null!==this.findLinkablePort()}; Pf.prototype.findLinkablePort=function(){var a=this.diagram,b=this.startObject;null===b&&(b=a.Wb(a.firstInput.documentPoint,null,null));if(null===b)return null;a=b.part;if(!(a instanceof W))return null;var c=this.direction;if(c===Qf||c===Rf){var d=this.findValidLinkablePort(b,!1);if(null!==d||this.startObject===a&&(d=a.port,this.findValidLinkablePort(d,!1)))return this.isForwards=!0,d}if(c===Qf||c===Sf)if(b=this.findValidLinkablePort(b,!0),null!==b||this.startObject===a&&(b=a.port,this.findValidLinkablePort(b, @@ -419,8 +419,8 @@ Wf.prototype.doActivate=function(){var a=this.diagram;null===this.handle&&(this. this.handle=this.findToolHandleAt(a.firstInput.documentPoint,this.name);if(null===this.handle){this.doDeactivate();return}}this.ix=b.i(this.handle.segmentIndex);this.Sr=b.points.copy();this.isActive=!0}}};Wf.prototype.doDeactivate=function(){this.stopTransaction();this.ot=this.handle=null;this.isActive=this.diagram.isMouseCaptured=!1};Wf.prototype.doCancel=function(){var a=this.adornedLink;null!==a&&(a.points=this.Sr);this.stopTool()};Wf.prototype.getResegmentingPoint=function(){return this.handle.da(yc)}; Wf.prototype.doMouseMove=function(){var a=this.diagram;this.isActive&&(a=this.computeReshape(a.lastInput.documentPoint),this.reshape(a))}; Wf.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){var b=this.computeReshape(a.lastInput.documentPoint);this.reshape(b);b=this.adornedLink;if(null!==b&&b.resegmentable){var c=this.handle.segmentIndex,d=b.i(c-1),e=b.i(c),f=b.i(c+1);if(b.isOrthogonal){if(c>b.firstPickIndex+1&&c=n&&(n=1);0>=p&&(p=1);n=p/n}p=J.alloc();L.jq(a.x,a.y,h,k,e.width,e.height,p);a=g.copy();0>=b.x?0>=b.y?(a.x=Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=Math.max(l-a.x,c.width),a.y=Math.max(p.y,m-d.height),a.y=Math.min(a.y,m-c.height),a.height=Math.max(m-a.y,c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n* a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width),a.x=l-a.width,a.y=m-a.height)):1<=b.y?(a.x=Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=Math.max(l-a.x,c.width),a.height=Math.max(Math.min(p.y-k,d.height),c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width),a.x=l-a.width)):(a.x= Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=l-a.x,f||(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n,a.y=k+.5*(m-k-a.height))):1<=b.x?0>=b.y?(a.width=Math.max(Math.min(p.x-h,d.width),c.width),a.y=Math.max(p.y,m-d.height),a.y=Math.min(a.y,m-c.height),a.height=Math.max(m-a.y,c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width), @@ -458,9 +458,9 @@ rg.prototype.doActivate=function(){var a=this.diagram;if(null===this.adornedObje rg.prototype.computeRotationPoint=function(a){var b=a.part,c=b.locationObject;return b.rotationSpot.hb()?a.da(b.rotationSpot):a===b||a===c?c.da(b.locationSpot):a.da(yc)}; rg.prototype.computeAdornmentLocation=function(a){var b=this.rotationPoint;b.u()||(b=this.computeRotationPoint(a));b=a.Hs(b);var c=this.handleAngle;0>c?c+=360:360<=c&&(c-=360);c=Math.round(45*Math.round(c/45));var d=this.handleDistance;0===c?b.x=a.naturalBounds.width+d:45===c?(b.x=a.naturalBounds.width+d,b.y=a.naturalBounds.height+d):90===c?b.y=a.naturalBounds.height+d:135===c?(b.x=-d,b.y=a.naturalBounds.height+d):180===c?b.x=-d:225===c?(b.x=-d,b.y=-d):270===c?b.y=-d:315===c&&(b.x=a.naturalBounds.width+ d,b.y=-d);return a.da(b)};rg.prototype.doDeactivate=function(){var a=this.diagram;this.stopTransaction();this.ie=this.handle=null;this.Xr=new J(NaN,NaN);this.isActive=a.isMouseCaptured=!1};rg.prototype.doCancel=function(){this.diagram.delaysLayout=!1;this.rotate(this.originalAngle);this.stopTool()};rg.prototype.doMouseMove=function(){var a=this.diagram;this.isActive&&(a=this.computeRotate(a.lastInput.documentPoint),this.rotate(a))}; -rg.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){a.delaysLayout=!1;var b=this.computeRotate(a.lastInput.documentPoint);this.rotate(b);a.Pa();this.transactionResult=this.name;a.S("PartRotated",this.adornedObject,this.originalAngle)}this.stopTool()}; -rg.prototype.rotate=function(a){var b=this.adornedObject;if(null!==b){b.angle=a;b=b.part;b.Sa();var c=b.locationObject,d=b.rotateObject;if(c===d||c.mg(d))c=this.Uo.copy(),b.location=c.ge(this.rotationPoint).rotate(a-this.originalAngle).add(this.rotationPoint);this.diagram.ed()}}; -rg.prototype.computeRotate=function(a){a=this.rotationPoint.Oa(a)-this.handleAngle;var b=this.adornedObject.panel;null!==b&&(a-=b.Li());360<=a?a-=360:0>a&&(a+=360);b=Math.min(Math.abs(this.snapAngleMultiple),180);var c=Math.min(Math.abs(this.snapAngleEpsilon),b/2);!this.diagram.lastInput.shift&&0b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a}; +rg.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){a.delaysLayout=!1;var b=this.computeRotate(a.lastInput.documentPoint);this.rotate(b);a.Oa();this.transactionResult=this.name;a.S("PartRotated",this.adornedObject,this.originalAngle)}this.stopTool()}; +rg.prototype.rotate=function(a){var b=this.adornedObject;if(null!==b){b.angle=a;b=b.part;b.Sa();var c=b.locationObject,d=b.rotateObject;if(c===d||c.mg(d))c=this.Uo.copy(),b.location=c.ge(this.rotationPoint).rotate(a-this.originalAngle).add(this.rotationPoint);this.diagram.fd()}}; +rg.prototype.computeRotate=function(a){a=this.rotationPoint.Ra(a)-this.handleAngle;var b=this.adornedObject.panel;null!==b&&(a-=b.Li());360<=a?a-=360:0>a&&(a+=360);b=Math.min(Math.abs(this.snapAngleMultiple),180);var c=Math.min(Math.abs(this.snapAngleEpsilon),b/2);!this.diagram.lastInput.shift&&0b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a}; na.Object.defineProperties(rg.prototype,{handleArchetype:{get:function(){return this.o},set:function(a){this.o=a}},handle:{get:function(){return this.j},set:function(a){if(null!==a&&!(a.part instanceof we))throw Error("new handle is not in an Adornment: "+a);this.j=a}},adornedObject:{get:function(){return this.ie},set:function(a){if(null!==a&&a.part instanceof we)throw Error("new handle must not be in an Adornment: "+ a);this.ie=a}},snapAngleMultiple:{get:function(){return this.Ha},set:function(a){this.Ha=a}},snapAngleEpsilon:{get:function(){return this.Ga},set:function(a){this.Ga=a}},originalAngle:{get:function(){return this.ex}},rotationPoint:{get:function(){return this.Xr},set:function(a){this.Xr=a.copy()}},handleAngle:{get:function(){return this.C},set:function(a){this.C= a}},handleDistance:{get:function(){return this.M},set:function(a){this.M=a}}});rg.className="RotatingTool";Ma("rotatingTool",function(){return this.findTool("Rotating")},function(a){this.Za("Rotating",a,this.mouseDownTools)});function sg(){re.call(this);this.name="ClickSelecting"}ma(sg,re);sg.prototype.canStart=function(){return!this.isEnabled||this.isBeyondDragSize()?!1:!0}; @@ -470,7 +470,7 @@ tg.prototype.doMouseMove=function(){if(this.isActive){var a=this.diagram.lastInp tg.prototype.doCancel=function(){var a=this.diagram.lastInput,b=this.Dk;null!==b&&(a.targetObject=b,null!==b.actionCancel&&b.actionCancel(a,b),this.stopTool())};tg.prototype.doStop=function(){this.Dk=null};tg.className="ActionTool";function ug(){re.call(this);this.name="ClickCreating";this.mj=null;this.o=!0;this.j=!1;this.Nw=new J(0,0)}ma(ug,re); ug.prototype.canStart=function(){if(!this.isEnabled||null===this.archetypeNodeData)return!1;var a=this.diagram;if(a.isReadOnly||a.isModelReadOnly||!a.allowInsert||!a.lastInput.left||this.isBeyondDragSize())return!1;if(this.isDoubleClick){if(1===a.lastInput.clickCount&&(this.Nw=a.lastInput.viewPoint.copy()),2!==a.lastInput.clickCount||this.isBeyondDragSize(this.Nw))return!1}else if(1!==a.lastInput.clickCount)return!1;return a.currentTool!==this&&null!==a.im(a.lastInput.documentPoint,!0)?!1:!0}; ug.prototype.doMouseUp=function(){var a=this.diagram;this.isActive&&this.insertPart(a.lastInput.documentPoint);this.stopTool()}; -ug.prototype.insertPart=function(a){var b=this.diagram,c=this.archetypeNodeData;if(null===c)return null;var d=null;try{b.S("ChangingSelection",b.selection);this.wa(this.name);if(c instanceof V)c.Jc()&&(ng(c),d=c.copy(),null!==d&&b.add(d));else if(null!==c){var e=b.model.copyNodeData(c);za(e)&&(b.model.nf(e),d=b.vc(e))}if(null!==d){var f=J.allocAt(a.x,a.y);this.isGridSnapEnabled&&vg(this.diagram,d,a,f);d.location=f;b.allowSelect&&(b.clearSelection(!0),d.isSelected=!0);J.free(f)}b.Pa();this.transactionResult= +ug.prototype.insertPart=function(a){var b=this.diagram,c=this.archetypeNodeData;if(null===c)return null;var d=null;try{b.S("ChangingSelection",b.selection);this.wa(this.name);if(c instanceof V)c.Kc()&&(ng(c),d=c.copy(),null!==d&&b.add(d));else if(null!==c){var e=b.model.copyNodeData(c);za(e)&&(b.model.nf(e),d=b.vc(e))}if(null!==d){var f=J.allocAt(a.x,a.y);this.isGridSnapEnabled&&vg(this.diagram,d,a,f);d.location=f;b.allowSelect&&(b.clearSelection(!0),d.isSelected=!0);J.free(f)}b.Oa();this.transactionResult= this.name;b.S("PartCreated",d)}finally{this.stopTransaction(),b.S("ChangedSelection",b.selection)}return d};na.Object.defineProperties(ug.prototype,{archetypeNodeData:{get:function(){return this.mj},set:function(a){this.mj=a}},isDoubleClick:{get:function(){return this.o},set:function(a){this.o=a}},isGridSnapEnabled:{get:function(){return this.j},set:function(a){this.j=a}}});ug.className="ClickCreatingTool"; function wg(){re.call(this);this.name="DragSelecting";this.Zk=175;this.o=!1;var a=new V;a.layerName="Tool";a.selectable=!1;var b=new uf;b.name="SHAPE";b.figure="Rectangle";b.fill=null;b.stroke="magenta";a.add(b);this.j=a}ma(wg,re); wg.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;if(!a.allowSelect)return!1;var b=a.lastInput;return!b.left||a.currentTool!==this&&(!this.isBeyondDragSize()||b.timestamp-a.firstInput.timestampa&&xa(a,">= 1",bh,"duration");this.Fg=a}},isAnimating:{get:function(){return this.hc}}, +na.Object.defineProperties(bh.prototype,{animationReasons:{get:function(){return this.Md}},isEnabled:{get:function(){return this.ud},set:function(a){(this.ud=a)&&this.$i.each(function(a){a.isAnimating||Infinity!==a.runCount||a.start()})}},duration:{get:function(){return this.Fg},set:function(a){1>a&&xa(a,">= 1",bh,"duration");this.Fg=a}},isAnimating:{get:function(){return this.hc}}, isTicking:{get:function(){return this.Dr}},isInitial:{get:function(){return this.Zh},set:function(a){this.Zh=a}},defaultAnimation:{get:function(){return this.Pd}},activeAnimations:{get:function(){return this.$i}},initialAnimationStyle:{get:function(){return this.hl},set:function(a){this.hl=a}}});bh.prototype.stopAnimation=bh.prototype.nc; var Kh=null,ch=!1,eh=new D(bh,"Default",1),kh=new D(bh,"AnimateLocations",2),jh=new D(bh,"None",3);bh.className="AnimationManager";bh.defineAnimationEffect=function(a,b){ch||(dh(),ch=!0);Kh.add(a,b)};bh.Default=eh;bh.AnimateLocations=kh;bh.None=jh; -function fh(a){this.Uu=this.qx=this.Ld=this.F=null;this.ol=this.hc=this.j=!1;this.In=this.zd=0;this.ar=this.Kt=Lh;this.nl=this.jp=!1;this.Bu=1;this.zu=0;this.sd=this.Fg=NaN;this.Hw=0;this.Jn=null;this.o=pb;this.jc=new I;this.ru=new I;this.Zl=new G;this.su=new G;this.Ew=Mh;a&&Object.assign(this,a)}fh.prototype.suspend=function(){this.ol=!0};fh.prototype.advanceTo=function(a,b){b&&(this.ol=!1);this.jp&&a>=this.sd&&(this.nl=!0,a-=this.sd);this.Hw=a;Eh(this,!0);oh(this.Ld);rf(this.F);Ah(this.Ld);this.F.redraw()}; -function lh(a,b){a.ru.clear();a.nl=!1;a.zu=0;a.sd=NaN;0=this.td&&(this.nl=!0,a-=this.td);this.Hw=a;Eh(this,!0);oh(this.Ld);rf(this.F);Ah(this.Ld);this.F.redraw()}; +function lh(a,b){a.ru.clear();a.nl=!1;a.zu=0;a.td=NaN;0a.In?a.sd:d-a.zd;b&&(e=a.Hw,ea.In&&(a.jp&&!a.nl?(a.zd=+new Date,a.In=a.zd+a.sd,a.nl=!0):a.gm(!1))}}} -function zh(a,b){for(var c=a.sd,d=a.jc.iterator,e=a.nl;d.next();){var f=d.key;if(!(f instanceof Y&&null===f.diagram)){var g=d.value,h=e?g.end:g.start;g=e?g.start:g.end;var k=Kh,l;for(l in g)"position"===l&&(g["position:placeholder"]||g["position:nodeCollapse"])||null===k.get(l)||k.get(l)(f,h[l],g[l],a.ar,b,c,a)}}}t.stop=function(){if(!this.hc)return this;this.gm(!0);return this}; +function Eh(a,b){if(!a.ol||b){var c=a.Ld;if(!1!==a.hc){var d=+new Date,e=d>a.In?a.td:d-a.Ad;b&&(e=a.Hw,ea.In&&(a.jp&&!a.nl?(a.Ad=+new Date,a.In=a.Ad+a.td,a.nl=!0):a.gm(!1))}}} +function zh(a,b){for(var c=a.td,d=a.jc.iterator,e=a.nl;d.next();){var f=d.key;if(!(f instanceof Y&&null===f.diagram)){var g=d.value,h=e?g.end:g.start;g=e?g.start:g.end;var k=Kh,l;for(l in g)"position"===l&&(g["position:placeholder"]||g["position:nodeCollapse"])||null===k.get(l)||k.get(l)(f,h[l],g[l],a.ar,b,c,a)}}}t.stop=function(){if(!this.hc)return this;this.gm(!0);return this}; t.gm=function(a){null!==this.Uu&&this.Uu.qp.remove(this.qx);if(this.hc){var b=this.F,c=this.Ld;this.ol=this.hc=c.gl=!1;oh(c);for(var d=this.jc,e=this.Zl.iterator;e.next();)b.remove(e.value);for(e=this.su.iterator;e.next();)e.value.s();e=this.jp;d=d.iterator;for(var f=Kh;d.next();){var g=d.key,h=d.value,k=e?h.end:h.start,l=e?h.start:h.end,m=h.nv,n;for(n in l)if(null!==f.get(n)){var p=n;!h.hv||"position:nodeCollapse"!==p&&"position:placeholder"!==p||(p="position");f.get(p)(g,k[n],void 0!==m[n]?m[n]: -h.hv?k[n]:l[n],this.ar,this.sd,this.sd,this)}h.hv&&void 0!==m.location&&g instanceof V&&(g.location=m.location);h.Pv&&g instanceof V&&g.Nb(!1)}b.Ts.clear();Te(b,!1);b.Pa();b.N();rf(b,!0);if(c.defaultAnimation===this){for(n=c.Il.iterator;n.next();)e=n.value,null!==e.cf&&(e.points=e.cf,e.cf=null);c.Il.clear()}this.isViewportUnconstrained&&(b.scrollMode=this.Ew);Ah(c);this.zu++;!a&&this.Bu>this.zu?(this.nl=!1,this.start()):(this.Jn&&this.Jn(this),lh(this,null),c.gm(this),b.Fb())}}; +h.hv?k[n]:l[n],this.ar,this.td,this.td,this)}h.hv&&void 0!==m.location&&g instanceof V&&(g.location=m.location);h.Pv&&g instanceof V&&g.Nb(!1)}b.Ts.clear();Te(b,!1);b.Oa();b.N();rf(b,!0);if(c.defaultAnimation===this){for(n=c.Il.iterator;n.next();)e=n.value,null!==e.cf&&(e.points=e.cf,e.cf=null);c.Il.clear()}this.isViewportUnconstrained&&(b.scrollMode=this.Ew);Ah(c);this.zu++;!a&&this.Bu>this.zu?(this.nl=!1,this.start()):(this.Jn&&this.Jn(this),lh(this,null),c.gm(this),b.Fb())}}; t.Yj=function(a,b){var c=b.actualBounds,d=null;b instanceof hf&&(d=b.placeholder);null!==d?(c=d.da(sc),d=d.padding,c.x+=d.left,c.y+=d.top,this.add(a,"position",c,a.position,!1)):this.add(a,"position",new J(c.x+c.width/2,c.y+c.height/2),a.position,!1);this.add(a,"scale",.01,a.scale,!1);if(a instanceof hf)for(a=a.memberParts;a.next();)d=a.value,d instanceof W&&this.Yj(d,b)}; t.Wj=function(a,b){if(a.isVisible()){var c=null;b instanceof hf&&(c=b.placeholder);null!==c?this.add(a,"position:placeholder",a.position,c,!0):this.add(a,"position:nodeCollapse",a.position,b,!0);this.add(a,"scale",a.scale,.01,!0);c=this.jc;c.contains(a)&&(c.H(a).Pv=!0);if(a instanceof hf)for(a=a.memberParts;a.next();)c=a.value,c instanceof W&&this.Wj(c,b)}};t.iA=function(a){var b=this.ru.get(a);null===b&&(b={},this.ru.add(a,b));return b}; na.Object.defineProperties(fh.prototype,{duration:{get:function(){return this.Fg},set:function(a){1>a&&xa(a,">= 1",fh,"duration");this.Fg=a}},reversible:{get:function(){return this.jp},set:function(a){this.jp=a}},runCount:{get:function(){return this.Bu},set:function(a){0a?c/2*a*a+b:-c/2*(--a*(a-2)-1)+b}function Nh(a,b,c,d){return a===d?b+c:c*(-Math.pow(2,-10*a/d)+1)+b}fh.className="Animation";fh.EaseLinear=function(a,b,c,d){return c*a/d+b};fh.EaseInOutQuad=Lh;fh.EaseInQuad=function(a,b,c,d){return c*(a/=d)*a+b};fh.EaseOutQuad=function(a,b,c,d){return-c*(a/=d)*(a-2)+b};fh.EaseInExpo=function(a,b,c,d){return 0===a?b:c*Math.pow(2,10*(a/d-1))+b};fh.EaseOutExpo=Nh; -function Th(a,b,c){this.start=a;this.end=b;this.nv={};this.hv=c;this.Pv=!1}Th.className="AnimationState";function Uh(a,b,c){this.md=null;this.bf=a;this.Hp=c||Vh;this.Ik=null;void 0!==b&&(this.Ik=b,void 0===c&&(this.Hp=Wh))}Uh.prototype.copy=function(){var a=new Uh(this.bf);a.Hp=this.Hp;var b=this.Ik;if(null!==b){var c={};void 0!==b.duration&&(c.duration=b.duration);void 0!==b.finished&&(c.finished=b.finished);void 0!==b.easing&&(c.easing=b.easing);a.Ik=c}return a}; +function Th(a,b,c){this.start=a;this.end=b;this.nv={};this.hv=c;this.Pv=!1}Th.className="AnimationState";function Uh(a,b,c){this.nd=null;this.bf=a;this.Hp=c||Vh;this.Ik=null;void 0!==b&&(this.Ik=b,void 0===c&&(this.Hp=Wh))}Uh.prototype.copy=function(){var a=new Uh(this.bf);a.Hp=this.Hp;var b=this.Ik;if(null!==b){var c={};void 0!==b.duration&&(c.duration=b.duration);void 0!==b.finished&&(c.finished=b.finished);void 0!==b.easing&&(c.easing=b.easing);a.Ik=c}return a}; function Xh(a,b){a=a.Ik;null!==a&&(a.duration&&(b.duration=a.duration),a.finished&&(b.finished=a.finished),a.easing&&(b.easing=a.easing))}na.Object.defineProperties(Uh.prototype,{propertyName:{get:function(){return this.bf},set:function(a){this.bf=a}},animationSettings:{get:function(){return this.Ik},set:function(a){this.Ik=a}},startCondition:{get:function(){return this.Hp},set:function(a){this.Hp=a}}}); var Vh=new D(Uh,"Default",1),Wh=new D(Uh,"Immediate",2),Yh=new D(Uh,"Bundled",3);Uh.className="AnimationTrigger";Uh.Default=Vh;Uh.Immediate=Wh;Uh.Bundled=Yh;function Zh(a){Ta(this);this.F=null;this.Fa=new E;this.na="";this.lb=1;this.o=!1;this.j=this.oi=this.C=this.jj=this.ij=this.hj=this.gj=this.ej=this.fj=this.dj=this.lj=this.cj=this.kj=this.bj=this.aj=!0;this.Vo=[];a&&Object.assign(this,a)}t=Zh.prototype;t.clear=function(){this.Fa.clear();this.Vo.length=0};t.Ke=function(a){this.F=a}; t.toString=function(a){void 0===a&&(a=0);var b='Layer "'+this.name+'"';if(0>=a)return b;for(var c=0,d=0,e=0,f=0,g=0,h=this.Fa.iterator;h.next();){var k=h.value;k instanceof hf?e++:k instanceof W?d++:k instanceof U?f++:k instanceof we?g++:c++}h="";0c.Jr||h.height*e>c.Jr?b.lc(a,c):(e=b.actualBounds,f=b.naturalBounds,0===e.width||0===e.height||isNaN(e.x)|| +t.Ei=function(a,b,c,d,e,f,g){if(!g||lg(b)){if(null!==d&&b instanceof U&&(b.isOrthogonal&&d.push(b),!1===b.sd))return;g=!1;for(d=b.containingGroup;null!==d;)g?null!==d.$a&&f.hy(d.$a):null!==d.$a&&(g=!0,f.assign(d.$a)),d=d.containingGroup;var h=b.actualBounds;d=!1;if(g&&b.isVisible()){if(!f.Jc(h))return;d=!f.De(h)}d&&(a.save(),a.beginPath(),a.rect(f.x,f.y,f.width,f.height),a.clip());h.width*e>c.Jr||h.height*e>c.Jr?b.lc(a,c):(e=b.actualBounds,f=b.naturalBounds,0===e.width||0===e.height||isNaN(e.x)|| isNaN(e.y)||!b.isVisible()||(c=b.transform,null!==b.areaBackground&&(bi(b,a,b.areaBackground,!0,!0,f,e),a.fillRect(e.x,e.y,e.width,e.height)),null===b.areaBackground&&null===b.background&&(bi(b,a,"rgba(0,0,0,0.3)",!0,!1,f,e),a.fillRect(e.x,e.y,e.width,e.height)),null!==b.background&&(a.transform(c.m11,c.m12,c.m21,c.m22,c.dx,c.dy),bi(b,a,b.background,!0,!1,f,e),a.fillRect(0,0,f.width/2,f.height/2),c.Os()||(b=1/(c.m11*c.m22-c.m12*c.m21),a.transform(c.m22*b,-c.m12*b,-c.m21*b,c.m11*b,b*(c.m21*c.dy-c.m22* c.dx),b*(c.m12*c.dx-c.m11*c.dy))))));d&&(a.restore(),a.Ec(!0))}};t.g=function(a,b,c,d,e){var f=this.diagram;null!==f&&f.Va(ce,a,this,b,c,d,e)};t.Oi=function(a,b,c){var d=this.Fa;b.ei=this;if(a>=d.count)a=d.count;else if(d.J(a)===b)return-1;d.ub(a,b);b.pq(c);d=this.diagram;null!==d&&(c?d.N():d.Oi(b));ci(this,a,b);return a}; t.bc=function(a,b,c){if(!c&&b.layer!==this&&null!==b.layer)return b.layer.bc(a,b,c);var d=this.Fa;if(0>a||a>=d.length){if(a=d.indexOf(b),0>a)return-1}else if(d.J(a)!==b&&(a=d.indexOf(b),0>a))return-1;b.qq(c);d.eb(a);d=this.diagram;null!==d&&(c?d.N():d.bc(b));b.ei=null;return a}; @@ -573,19 +573,19 @@ e&&(k=a.J(h).zOrder,isNaN(k)););}return b} na.Object.defineProperties(Zh.prototype,{parts:{get:function(){return this.Fa.iterator}},partsBackwards:{get:function(){return this.Fa.iteratorBackwards}},diagram:{get:function(){return this.F}},name:{get:function(){return this.na},set:function(a){var b=this.na;if(b!==a){var c=this.diagram;if(null!==c)for(""===b&&C("Cannot rename default Layer to: "+a),c=c.layers;c.next();)c.value.name=== a&&C("Layer.name is already present in this diagram: "+a);this.na=a;this.g("name",b,a);for(a=this.Fa.iterator;a.next();)a.value.layerName=this.na}}},opacity:{get:function(){return this.lb},set:function(a){var b=this.lb;b!==a&&((0>a||1q&&(this.position=v.h(-(b.scrollWidth-this.ua)+w-this.ua/e+m,this.position.y))),a.$y&&this.allowVerticalScroll&&(hu&&(this.position= v.h(this.position.x,-(b.scrollHeight-this.ta)+a.scrollTop-this.ta/e+f))),J.free(v),Qi(this),this.wj=this.$r=!1,d=this.documentBounds,e=this.viewportBounds,m=d.right,q=e.right,f=d.bottom,u=e.bottom,g=d.x,n=e.x,h=d.y,d=e.y,p>=k&&g>=n&&m<=q&&(c.style.width="1px"),r>=l&&h>=d&&f<=u&&(c.style.height="1px"))}};T.prototype.computeBounds=function(a){void 0===a&&(a=new N);hh(this);return Ri(this,a)}; -function Ri(a,b){if(a.fixedBounds.u())return b.assign(a.fixedBounds),b.Xp(a.mb),b;for(var c=!0,d=a.Na.m,e=d.length,f=0;fc&&(b=c),ba.maxScale&&(b=a.maxScale),b):b===Yi?(b=k>h?(g-a.sb)/d:(f-a.sb)/e,b>c&&(b=c),ba.maxScale&&(b=a.maxScale),b):a.scale} @@ -630,61 +630,61 @@ T.prototype.vA=function(a){var b=this.F;if(!b.isEnabled)return!1;var c=bj(b,a,!1 T.prototype.Gz=function(a){var b=this.F;if(!b.isEnabled)return!1;var c=bj(b,a,!0);null!==b.mouseEnter&&b.mouseEnter(c);return fj(c,a)};T.prototype.Hz=function(a){var b=this.F;if(!b.isEnabled)return!1;var c=bj(b,a,!0);null!==b.mouseLeave&&b.mouseLeave(c);return fj(c,a)}; T.prototype.getMouse=function(a){var b=this.Aa;if(null===b)return new J(0,0);var c=b.getBoundingClientRect();b=a.clientX-this.ua/c.width*c.left;a=a.clientY-this.ta/c.height*c.top;return null!==this.tb?Ab(new J(b,a),this.tb):new J(b,a)}; function cj(a,b,c){var d=a.Aa,e=a.ua,f=a.ta,g=0,h=0;null!==d&&(d=d.getBoundingClientRect(),g=b.clientX-e/d.width*d.left,h=b.clientY-f/d.height*d.top);c.viewPoint.h(g,h);null!==a.tb?(b=J.allocAt(g,h),a.tb.Ed(b),c.documentPoint.assign(b),J.free(b)):c.documentPoint.h(g,h)} -function $d(a,b,c,d){if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;b=b.targetTouches[c]}else if(null!==a.El[0])b=a.El[c];else return;c=a.Aa;null!==c&&(c=c.getBoundingClientRect(),d.h(b.clientX-a.ua/c.width*c.left,b.clientY-a.ta/c.height*c.top))}T.prototype.Pa=function(){this.vj||(this.vj=!0,this.Fb(!0))};function gj(a){a.Vc||hh(a);a.Sa()}T.prototype.redraw=function(){this.ob||this.Vc||(this.N(),Vi(this),this.ed())};t=T.prototype;t.tA=function(){return this.eg}; -t.Bz=function(a){void 0===a&&(a=null);var b=this.animationManager,c=b.isEnabled;b.nc();b.isEnabled=!1;rf(this);this.Qf=!1;this.Cu=new J(NaN,NaN);b.isEnabled=c;this.Vc=!0;var d=this;null!==a&&ua(function(){d.Vc=!1;gh(b,"Model");a(d)},1)};t.Fb=function(a){void 0===a&&(a=!1);if(!0!==this.eg&&!(this.ob||!1===a&&this.Vc)){this.eg=!0;var b=this;x.requestAnimationFrame(function(){b.eg&&b.ed()})}};t.ed=function(){if(!this.Ln||this.eg)this.Ln&&(this.Ln=!1),rf(this)}; +function $d(a,b,c,d){if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;b=b.targetTouches[c]}else if(null!==a.El[0])b=a.El[c];else return;c=a.Aa;null!==c&&(c=c.getBoundingClientRect(),d.h(b.clientX-a.ua/c.width*c.left,b.clientY-a.ta/c.height*c.top))}T.prototype.Oa=function(){this.vj||(this.vj=!0,this.Fb(!0))};function gj(a){a.Wc||hh(a);a.Sa()}T.prototype.redraw=function(){this.ob||this.Wc||(this.N(),Vi(this),this.fd())};t=T.prototype;t.tA=function(){return this.eg}; +t.Bz=function(a){void 0===a&&(a=null);var b=this.animationManager,c=b.isEnabled;b.nc();b.isEnabled=!1;rf(this);this.Qf=!1;this.Cu=new J(NaN,NaN);b.isEnabled=c;this.Wc=!0;var d=this;null!==a&&ua(function(){d.Wc=!1;gh(b,"Model");a(d)},1)};t.Fb=function(a){void 0===a&&(a=!1);if(!0!==this.eg&&!(this.ob||!1===a&&this.Wc)){this.eg=!0;var b=this;x.requestAnimationFrame(function(){b.eg&&b.fd()})}};t.fd=function(){if(!this.Ln||this.eg)this.Ln&&(this.Ln=!1),rf(this)}; function Wi(a,b,c){a.animationManager.defaultAnimation.isAnimating||a.ob||!a.wj||Oi(a)||(b&&hh(a),c&&Si(a,!1))} -function rf(a,b){if(!a.Vc&&(a.eg=!1,null!==a.Ea||a.Rp.u())){a.Vc=!0;var c=a.animationManager,d=a.$o;if(!c.isAnimating&&0!==d.length){for(var e=d.m,f=e.length,g=0;gb;b++){var c=a.qe.iterator;if(null===c||0===a.qe.count)break;a.qe=new G;a.kw(c,a.qe)}a.nodes.each(function(a){a instanceof hf&&0!==(a.R&65536)!==!1&&(a.R=a.R^65536)})}} -t.kw=function(a,b){for(a.reset();a.next();){var c=a.value;!c.Jc()||c instanceof hf||(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}for(a.reset();a.next();)c=a.value,c instanceof hf&&c.isVisible()&&lj(this,c);for(a.reset();a.next();)c=a.value,c instanceof U&&c.isVisible()&&(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c));for(a.reset();a.next();)c=a.value,c instanceof we&&c.isVisible()&&(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}; +b||a.lc(a.Sb);e&&(a.skipsUndoManager=d);a.Wc=!1}}function kj(a){var b=a.sa;if(a.Lg!==mh)a.scale=Ti(a,a.Lg);else if(a.Oh!==mh)a.scale=Ti(a,a.Oh);else{var c=a.initialScale;isFinite(c)&&0b;b++){var c=a.qe.iterator;if(null===c||0===a.qe.count)break;a.qe=new G;a.kw(c,a.qe)}a.nodes.each(function(a){a instanceof hf&&0!==(a.R&65536)!==!1&&(a.R=a.R^65536)})}} +t.kw=function(a,b){for(a.reset();a.next();){var c=a.value;!c.Kc()||c instanceof hf||(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}for(a.reset();a.next();)c=a.value,c instanceof hf&&c.isVisible()&&lj(this,c);for(a.reset();a.next();)c=a.value,c instanceof U&&c.isVisible()&&(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c));for(a.reset();a.next();)c=a.value,c instanceof we&&c.isVisible()&&(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}; function lj(a,b){for(var c=Fa(),d=Fa(),e=b.memberParts;e.next();){var f=e.value;f.isVisible()&&(f instanceof hf?(mj(f)||nj(f)||oj(f))&&lj(a,f):f instanceof U?f.fromNode===b||f.toNode===b?d.push(f):c.push(f):(f.measure(Infinity,Infinity),f.arrange()))}a=c.length;for(e=0;en&&(z=K.left,y= K.right),w.height>F&&(A=K.top,B=K.bottom)):(z=K.left,y=K.right,A=K.top,B=K.bottom);K=w.width+z+y;var S=w.height+A+B;z=w.x-z;var R=e.x;y=w.right+y;var O=e.right+r;A=w.y-A;var H=e.y;w=w.bottom+B;B=e.bottom+q;var da="1px",ba="1px";e=a.scale;u=K>u/e;v=S>v/e;a.scrollMode===Mh&&(u||v)&&(u&&a.hasHorizontalScrollbar&&a.allowHorizontalScroll&&(u=1,z+1O+1&&(u=Math.max((y-O)*e+a.ua,u)),n+r+1B+1&&(u=Math.max((w-B)*e+a.ta,u)),F+q+1O+1&&(r=Math.max((y-O)*e+a.ua,r)),n+1B+1&&(q=Math.max((w-B)*e+r,q)),F+1B+1&&(q=Math.max((w-B)*e+r,q)),F+1O+1&&(b=a.position.x*e));if(a.io)switch(a.Au){case "negative":b=-(l.scrollWidth-b-l.clientWidth);break;case "reverse":b=l.scrollWidth-b-l.clientWidth}l.scrollLeft=b;a.hasVerticalScrollbar&&a.allowVerticalScroll&&(F+1B+1&&(l.scrollTop=a.position.y*e));u=a.ua;v=a.ta;l.style.width=u+(a.Of?a.sb:0)+"px";l.style.height=v+(a.Ue?a.sb:0)+"px";return c!==u||d!==v||a.animationManager.rb?(c=N.allocAt(f,g,h,k),a.onViewportBoundsChanged(c,a.viewportBounds,e,p),N.free(c),!1):!0}t=T.prototype; -t.add=function(a){var b=a.diagram;if(b!==this&&(null!==b&&C("Cannot add part "+a.toString()+" to "+this.toString()+". It is already a part of "+b.toString()),b=this.ik(a.layerName),null===b&&(b=this.ik("")),null===b&&C('Cannot add a Part when unable find a Layer named "'+a.layerName+'" and there is no default Layer'),a.layer!==b)){var c=b.Oi(99999999,a,a.diagram===this);0<=c&&this.Va(ee,"parts",b,null,a,null,c);b.isTemporary||this.Pa();a.B(1);c=a.layerChanged;null!==c&&c(a,null,b)}}; -t.Oi=function(a){this.partManager.Oi(a);var b=this;zj(a,function(a){Aj(b,a)});(a instanceof we||a instanceof hf&&null!==a.placeholder)&&a.s();null!==a.data&&zj(a,function(a){Bj(b.partManager,a)});!0!==nj(a)&&!0!==oj(a)||this.qe.add(a);Cj(a,!0,this);Dj(a)?(a.actualBounds.u()&&this.N(xj(a,a.actualBounds)),this.Pa()):a.isVisible()&&a.actualBounds.u()&&this.N(xj(a,a.actualBounds));this.Fb()}; -t.bc=function(a){a.$j();this.partManager.bc(a);var b=this;null!==a.data&&zj(a,function(a){Ej(b.partManager,a,b)});this.qe.remove(a);Dj(a)?(a.actualBounds.u()&&this.N(xj(a,a.actualBounds)),this.Pa()):a.isVisible()&&a.actualBounds.u()&&this.N(xj(a,a.actualBounds));this.Fb()};t.remove=function(a){Fj(this,a,!0)}; +t.add=function(a){var b=a.diagram;if(b!==this&&(null!==b&&C("Cannot add part "+a.toString()+" to "+this.toString()+". It is already a part of "+b.toString()),b=this.ik(a.layerName),null===b&&(b=this.ik("")),null===b&&C('Cannot add a Part when unable find a Layer named "'+a.layerName+'" and there is no default Layer'),a.layer!==b)){var c=b.Oi(99999999,a,a.diagram===this);0<=c&&this.Va(ee,"parts",b,null,a,null,c);b.isTemporary||this.Oa();a.B(1);c=a.layerChanged;null!==c&&c(a,null,b)}}; +t.Oi=function(a){this.partManager.Oi(a);var b=this;zj(a,function(a){Aj(b,a)});(a instanceof we||a instanceof hf&&null!==a.placeholder)&&a.s();null!==a.data&&zj(a,function(a){Bj(b.partManager,a)});!0!==nj(a)&&!0!==oj(a)||this.qe.add(a);Cj(a,!0,this);Dj(a)?(a.actualBounds.u()&&this.N(xj(a,a.actualBounds)),this.Oa()):a.isVisible()&&a.actualBounds.u()&&this.N(xj(a,a.actualBounds));this.Fb()}; +t.bc=function(a){a.$j();this.partManager.bc(a);var b=this;null!==a.data&&zj(a,function(a){Ej(b.partManager,a,b)});this.qe.remove(a);Dj(a)?(a.actualBounds.u()&&this.N(xj(a,a.actualBounds)),this.Oa()):a.isVisible()&&a.actualBounds.u()&&this.N(xj(a,a.actualBounds));this.Fb()};t.remove=function(a){Fj(this,a,!0)}; function Fj(a,b,c){var d=b.layer;null!==d&&d.diagram===a&&(b.isSelected=!1,b.isHighlighted=!1,b.B(2),c&&b.fk(),c=d.bc(-1,b,!1),0<=c&&a.Va(fe,"parts",d,b,null,c,null),a=b.layerChanged,null!==a&&a(b,d,null))}t.bt=function(a,b){void 0===b&&(b=!1);if(Aa(a))for(var c=a.length,d=0;dd&&this.Pa();return this}; -t.fz=function(a,b){Lj(this,a,b);a.Ke(this);var c=this.Na,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Tb&&this.Va(fe,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Pa();return this}; -t.NA=function(a){a.diagram!==this&&C("Cannot remove a Layer from another Diagram: "+a+" of "+a.diagram);if(""!==a.name){var b=this.Na,c=b.indexOf(a);if(b.remove(a)){for(b=a.Fa.copy().iterator;b.next();){var d=b.value,e=d.layerName;e!==a.name?d.layerName=e:d.layerName=""}null!==this.Tb&&this.Va(fe,"layers",this,a,null,c,null);this.N();this.Pa()}}};t.ik=function(a){for(var b=this.layers;b.next();){var c=b.value;if(c.name===a)return c}return null}; +t.bm=function(a){Lj(this,a,null);a.Ke(this);var b=this.Na,c=b.count-1;if(!a.isTemporary)for(;0<=c&&b.J(c).isTemporary;)c--;b.ub(c+1,a);null!==this.Tb&&this.Va(ee,"layers",this,null,a,null,c+1);this.N();this.Oa();return this}; +t.zx=function(a,b){Lj(this,a,b);a.Ke(this);var c=this.Na,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Tb&&this.Va(fe,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Oa();return this}; +t.fz=function(a,b){Lj(this,a,b);a.Ke(this);var c=this.Na,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Tb&&this.Va(fe,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Oa();return this}; +t.NA=function(a){a.diagram!==this&&C("Cannot remove a Layer from another Diagram: "+a+" of "+a.diagram);if(""!==a.name){var b=this.Na,c=b.indexOf(a);if(b.remove(a)){for(b=a.Fa.copy().iterator;b.next();){var d=b.value,e=d.layerName;e!==a.name?d.layerName=e:d.layerName=""}null!==this.Tb&&this.Va(fe,"layers",this,a,null,c,null);this.N();this.Oa()}}};t.ik=function(a){for(var b=this.layers;b.next();){var c=b.value;if(c.name===a)return c}return null}; t.Bx=function(a){null===this.$e&&(this.$e=new E);this.$e.add(a);this.model.uh(a);return this};t.PA=function(a){null!==this.$e&&(this.$e.remove(a),0===this.$e.count&&(this.$e=null));this.model.Bk(a)};t.uh=function(a){null===this.ug&&(this.ug=new E);this.ug.add(a);return this};t.Bk=function(a){null!==this.ug&&(this.ug.remove(a),0===this.ug.count&&(this.ug=null))}; t.ws=function(a){this.skipsUndoManager||this.model.skipsUndoManager||this.model.undoManager.yv(a);a.change!==de&&(this.isModified=!0);if(null!==this.ug)for(var b=this.ug,c=b.length,d=0;dn.Fa.indexOf(r)&&n.Oi(p,r,q):(r.isSelected=!1,r.isHighlighted=!1,r.Kb(),n.bc(q?p:-1,r,q)))}else n instanceof T?"number"===typeof p&&r instanceof Zh&&(b?(r.Ke(this),this.Na.ub(p,r)):this.Na.eb(p)):C("unknown ChangedEvent.Remove object: "+a.toString());this.isModified=!0}else d!==de&&C("unknown ChangedEvent: "+a.toString())}finally{this.skipsModelSourceBindings= c}}};T.prototype.wa=function(a){return this.undoManager.wa(a)};T.prototype.Xa=function(a){return this.undoManager.Xa(a)};T.prototype.Df=function(){return this.undoManager.Df()};T.prototype.commit=function(a,b){void 0===b&&(b="");var c=this.skipsUndoManager;null===b&&(this.skipsUndoManager=!0,b="");this.undoManager.wa(b);var d=!1;try{a(this),d=!0}finally{d?this.undoManager.Xa(b):this.undoManager.Df(),this.skipsUndoManager=c}};T.prototype.updateAllTargetBindings=function(a){this.partManager.updateAllTargetBindings(a)}; T.prototype.Lq=function(){this.partManager.Lq()}; -function Qj(a,b,c){var d=a.animationManager;if(a.ob||a.Vc)a.sa=c,Ji(a),d.rb&&(Bh(d)||d.Pd.add(d.F,"scale",b,a.sa));else if(null===a.Aa)a.sa=c,Ji(a);else{a.ob=!0;var e=a.viewportBounds.copy(),f=a.ua,g=a.ta;e.width=a.ua/b;e.height=a.ta/b;var h=a.zoomPoint.x,k=a.zoomPoint.y,l=a.contentAlignment;isNaN(h)&&(l.Kc()?l.zf(Fc)?h=0:l.zf(Gc)&&(h=f-1):h=l.hb()?l.x*(f-1):f/2);isNaN(k)&&(l.Kc()?l.zf(Dc)?k=0:l.zf(Hc)&&(k=g-1):k=l.hb()?l.y*(g-1):g/2);null===a.scaleComputation||a.animationManager.defaultAnimation.isAnimating|| +function Qj(a,b,c){var d=a.animationManager;if(a.ob||a.Wc)a.sa=c,Ji(a),d.rb&&(Bh(d)||d.Pd.add(d.F,"scale",b,a.sa));else if(null===a.Aa)a.sa=c,Ji(a);else{a.ob=!0;var e=a.viewportBounds.copy(),f=a.ua,g=a.ta;e.width=a.ua/b;e.height=a.ta/b;var h=a.zoomPoint.x,k=a.zoomPoint.y,l=a.contentAlignment;isNaN(h)&&(l.Lc()?l.zf(Fc)?h=0:l.zf(Gc)&&(h=f-1):h=l.hb()?l.x*(f-1):f/2);isNaN(k)&&(l.Lc()?l.zf(Dc)?k=0:l.zf(Hc)&&(k=g-1):k=l.hb()?l.y*(g-1):g/2);null===a.scaleComputation||a.animationManager.defaultAnimation.isAnimating|| (c=a.scaleComputation(a,c));ca.maxScale&&(c=a.maxScale);f=J.allocAt(a.ka.x+h/b-h/c,a.ka.y+k/b-k/c);a.position=f;J.free(f);a.sa=c;Ji(a);a.onViewportBoundsChanged(e,a.viewportBounds,b,!1);a.ob=!1;Si(a,!1);d.rb&&(Bh(d)||d.Pd.add(d.F,"scale",b,a.sa));a.N();Vi(a)}} -T.prototype.onViewportBoundsChanged=function(a,b,c,d){if(!a.A(b)){void 0===d&&(d=!1);d||Vi(this);Qi(this);var e=this.layout;null===e||!e.isViewportSized||this.autoScale!==mh||d||a.width===b.width&&a.height===b.height||e.B();e=this.currentTool;!0===this.ml&&e instanceof Oa&&(this.lastInput.documentPoint=this.kt(this.lastInput.viewPoint),Ae(e,this));this.ob||this.invalidateViewport(a,b);ij(this);this.bd.scale=c;this.bd.position.x=a.x;this.bd.position.y=a.y;this.bd.bounds.assign(a);this.bd.Gx.width= -Math.round(a.width*c);this.bd.Gx.height=Math.round(a.height*c);this.bd.qy.width=this.ua;this.bd.qy.height=this.ta;this.bd.ky=d;this.S("ViewportBoundsChanged",this.bd,a);this.isVirtualized&&this.links.each(function(a){a.isAvoiding&&a.actualBounds.Ic(b)&&a.Ua()})}}; +T.prototype.onViewportBoundsChanged=function(a,b,c,d){if(!a.A(b)){void 0===d&&(d=!1);d||Vi(this);Qi(this);var e=this.layout;null===e||!e.isViewportSized||this.autoScale!==mh||d||a.width===b.width&&a.height===b.height||e.B();e=this.currentTool;!0===this.ml&&e instanceof Oa&&(this.lastInput.documentPoint=this.kt(this.lastInput.viewPoint),Ae(e,this));this.ob||this.invalidateViewport(a,b);ij(this);this.cd.scale=c;this.cd.position.x=a.x;this.cd.position.y=a.y;this.cd.bounds.assign(a);this.cd.Gx.width= +Math.round(a.width*c);this.cd.Gx.height=Math.round(a.height*c);this.cd.qy.width=this.ua;this.cd.qy.height=this.ta;this.cd.ky=d;this.S("ViewportBoundsChanged",this.cd,a);this.isVirtualized&&this.links.each(function(a){a.isAvoiding&&a.actualBounds.Jc(b)&&a.Ua()})}}; function ij(a,b){var c=a.Vd;if(null!==c&&c.visible){for(var d=M.alloc(),e=1,f=1,g=c.T.m,h=g.length,k=0;km||(Rj(l.figure)?f=f*m/L.Wx(f,m):e=e*m/L.Wx(e,m))}g=c.gridCellSize;d.h(f*g.width,e*g.height);if(void 0!==b)e=b.width,f=b.height,a=b.x,g=b.y;else{b=N.alloc();a=a.viewportBounds;b.h(a.x,a.y,a.width,a.height);if(!b.u()){N.free(b);return}e=b.width;f=b.height;a=b.x;g=b.y;N.free(b)}c.width=e+2*d.width;c.height=f+2*d.height;b=J.alloc();L.jq(a,g,0,0,d.width,d.height, b);b.offset(-d.width,-d.height);M.free(d);c.part.location=b;J.free(b)}}T.prototype.clearSelection=function(a){void 0===a&&(a=!1);var b=this.selection;if(0!==b.count){a||this.S("ChangingSelection",b);for(var c=b.xa(),d=c.length,e=0;e=d&&!f.defaultAnimation.isAnimating&&!f.rb&&(b||gh(f,"Layout"));a.Nh=!1;for(var g=a.xi.iterator;g.next();)ak(a,g.value,b,d);e.isValidLayout||(!b||e.isRealtime||null===e.isRealtime||0===d?(e.doLayout(a),hh(a),e.isValidLayout=!0):a.Nh=!0)}finally{b=a.undoManager.isInternalTransaction,0===d&&(a.Xa("Layout"),a.undoManager.isInternalTransaction= !1),!b||0!==d&&1!==d||ih(f),a.Z=c}}}function ak(a,b,c,d){if(null!==b){for(var e=b.zl.iterator;e.next();)ak(a,e.value,c,d);e=b.layout;null===e||e.isValidLayout||(!c||e.isRealtime||0===d?(b.Fh=!b.location.u(),e.doLayout(b),b.B(32),lj(a,b),e.isValidLayout=!0):a.Nh=!0)}}t.cA=function(){for(var a=new E,b=this.nodes;b.next();){var c=b.value;c.isTopLevel&&null===c.Ji()&&a.add(c)}return a.iterator}; @@ -723,11 +723,11 @@ b("LostFocus");b("Modified");b("ObjectSingleClicked");b("ObjectDoubleClicked");b function uj(a,b){var c=a.Iw.H(b);return null!==c?c:a.Iw.H(b.toLowerCase())}function jk(a,b){var c=a.Jw.H(b);if(null!==c)return c;c=a.Jw.H(b.toLowerCase());if(null!==c)return c;C("Unknown DiagramEvent name: "+b)}t.Xj=function(a,b){a=jk(this,a);null!==a&&a.add(b);return this};t.um=function(a,b){a=jk(this,a);null!==a&&a.remove(b)}; t.S=function(a,b,c){var d=jk(this,a),e=new ae;e.diagram=this;a=uj(this,a);null!==a&&(e.name=a);void 0!==b&&(e.subject=b);void 0!==c&&(e.parameter=c);b=d.length;if(1===b)d.J(0)(e);else if(0!==b)for(d=d.xa(),c=0;c=c.top&&0>=c.left&&0>=c.right&&0>=c.bottom)return b;var d=this.viewportBounds,e=this.scale;d=N.allocAt(0,0,d.width*e,d.height*e);var f=J.allocAt(0,0);if(a.x>=d.x&&a.xd.x+d.width-c.right&&this.allowHorizontalScroll&&(g=Math.max(this.scrollHorizontalLineChange, 1),g|=0,f.x+=g,a.x>d.x+d.width-c.right/2&&(f.x+=g),a.x>d.x+d.width-c.right/4&&(f.x+=4*g));a.y>=d.y&&a.yd.y+d.height-c.bottom&&this.allowVerticalScroll&&(g=Math.max(this.scrollVerticalLineChange,1),g|=0,f.y+=g,a.y>d.y+d.height-c.bottom/2&&(f.y+=g),a.y>d.y+d.height-c.bottom/4&&(f.y+=4*g));f.Ta(pb)||(b=new J(b.x+f.x/e,b.y+f.y/e)); N.free(d);J.free(f);return b};t=T.prototype;t.Vs=function(){return null};t.Gv=function(){return null};t.jz=function(a,b){this.Xy.add(a,b)};t.ev=function(a){(this.tx=a)||this.nodes.each(function(a){a instanceof hf&&(a.mr=null)})}; @@ -735,10 +735,10 @@ function xk(a,b,c){function d(){var a=+new Date;f=!0;for(g.reset();g.next();)if( t.ny=function(a){void 0===a&&(a={});return xk(this,this.AA,a)}; t.AA=function(a,b,c){var d=yk(c,a,"canvas",null);if(null===d)return null;c=d.Y.canvas;var e=null;if(null!==c)switch(e=a.returnType,void 0===e?e="string":e=e.toLowerCase(),e){case zk+"data":e=d.getImageData(0,0,c.width,c.height);break;case zk:d=(a.document||document).createElement("img");d.src=c.toDataURL(a.type,a.details);e=d;break;case "blob":"function"!==typeof b&&C('Error: Diagram.makeImageData called with "returnType: toBlob", but no required "callback" function property defined.');if("function"=== typeof c.toBlob)return c.toBlob(b,a.type,a.details),"toBlob";if("function"===typeof c.msToBlob)return b(c.msToBlob()),"msToBlob";b(null);return null;default:e=c.toDataURL(a.type,a.details)}return"function"===typeof b?(b(e),null):e}; -function yk(a,b,c,d){a.animationManager.nc();a.ed();if(null===a.Aa)return null;"object"!==typeof b&&C("properties argument must be an Object.");var e=b.size||null,f=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(f="NaN");var g=b.maxSize;void 0===b.maxSize&&(g="SVG"===c?new M(Infinity,Infinity):new M(2E3,2E3));var h=b.position||null,k=b.parts||null,l=void 0===b.padding?1:b.padding,m=b.background||null,n=b.omitTemporary;void 0===n&&(n=!0);var p=b.document||document,r=b.elementFinished||null,q=b.showTemporary; +function yk(a,b,c,d){a.animationManager.nc();a.fd();if(null===a.Aa)return null;"object"!==typeof b&&C("properties argument must be an Object.");var e=b.size||null,f=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(f="NaN");var g=b.maxSize;void 0===b.maxSize&&(g="SVG"===c?new M(Infinity,Infinity):new M(2E3,2E3));var h=b.position||null,k=b.parts||null,l=void 0===b.padding?1:b.padding,m=b.background||null,n=b.omitTemporary;void 0===n&&(n=!0);var p=b.document||document,r=b.elementFinished||null,q=b.showTemporary; void 0===q&&(q=!n);b=b.showGrid;void 0===b&&(b=q);null!==e&&isNaN(e.width)&&isNaN(e.height)&&(e=null);"number"===typeof l?l=new ic(l):l instanceof ic||C("MakeImage padding must be a Margin or a number.");l.left=Math.max(l.left,0);l.right=Math.max(l.right,0);l.top=Math.max(l.top,0);l.bottom=Math.max(l.bottom,0);a.Sb.Ec(!0);n=new Ak(null,p);var u=n.context;if(!(e||f||k||h)){n.width=a.ua+Math.ceil(l.left+l.right);n.height=a.ta+Math.ceil(l.top+l.bottom);if("SVG"===c){if(null===d)return null;d.resize(n.width, -n.height,n.width,n.height);d.ownerDocument=p;d.gq=r;sj(a,d.context,l,new M(n.width,n.height),a.sa,a.ka,k,m,q,b);return d.context}a.Bn=!1;sj(a,u,l,new M(n.width,n.height),a.sa,a.ka,k,m,q,b);a.Bn=!0;return n.context}var v=a.er,w=a.documentBounds.copy();w.cw(a.mb);if(q)for(var z=a.Na.m,y=z.length,A=0;Av?(f=v,e=w.width,w=w.height):(e=g.width,w=g.height)):(e=w.width*f,w=w.height*f):(f=v,e=w.width,w=w.height);null!==l?(e+=h,w+=y):l=new ic(0);null!==g&&(v=g.width,g=g.height,isNaN(v)&&(v=2E3),isNaN(g)&&(g=2E3),isFinite(v)&&(e=Math.min(e, v)),isFinite(g)&&(w=Math.min(w,g)));n.width=Math.ceil(e);n.height=Math.ceil(w);if("SVG"===c){if(null===d)return null;d.resize(n.width,n.height,n.width,n.height);d.ownerDocument=p;d.gq=r;sj(a,d.context,l,new M(Math.ceil(e),Math.ceil(w)),f,z,k,m,q,b);return d.context}a.Bn=!1;sj(a,u,l,new M(Math.ceil(e),Math.ceil(w)),f,z,k,m,q,b);a.Bn=!0;return n.context} na.Object.defineProperties(T.prototype,{div:{get:function(){return this.Ea},set:function(a){if(this.Ea!==a){var b=this.Ea;null!==b?(b.F=void 0,b.goDiagram=void 0,b.go=void 0,b.innerHTML="",null!==this.Aa&&(b=this.Aa.La,this.removeEventListener(b,"pointermove",this.xk,!1),this.removeEventListener(b,"pointerdown",this.wk,!1),this.removeEventListener(b,"pointerup",this.zk,!1),this.removeEventListener(b,"pointerout",this.yk,!1),this.Aa.Ox()),this.Hl&&(this.Hl.disconnect(), @@ -746,7 +746,7 @@ this.Hl=null),b=this.toolManager,null!==b&&(b.mouseDownTools.each(function(a){a. get:function(){return this.Mr}},Pi:{get:function(){return this.Qf}},draggedLink:{get:function(){return this.It},set:function(a){this.It!==a&&(this.It=a,null!==a&&(this.tu=a.fromPort,this.uu=a.toPort))}},sy:{get:function(){return this.tu},set:function(a){this.tu=a}},ty:{get:function(){return this.uu},set:function(a){this.uu=a}},animationManager:{get:function(){return this.Ld}}, undoManager:{get:function(){return this.Tb.undoManager}},skipsUndoManager:{get:function(){return this.gh},set:function(a){this.gh=a;this.Tb.skipsUndoManager=a}},delaysLayout:{get:function(){return this.Gt},set:function(a){this.Gt=a}},opacity:{get:function(){return this.lb},set:function(a){var b=this.lb;b!==a&&((0>a||1= 0",T,"maxSelectionCount")}},nodeSelectionAdornmentTemplate:{get:function(){return this.qu},set:function(a){var b=this.qu;b!==a&&(this.qu=a,this.g("nodeSelectionAdornmentTemplate",b,a))}},groupSelectionAdornmentTemplate:{get:function(){return this.St},set:function(a){var b=this.St;b!==a&&(this.St=a,this.g("groupSelectionAdornmentTemplate",b,a))}},linkSelectionAdornmentTemplate:{get:function(){return this.gu}, set:function(a){var b=this.gu;b!==a&&(this.gu=a,this.g("linkSelectionAdornmentTemplate",b,a))}},highlighteds:{get:function(){return this.Pw}},isModified:{get:function(){var a=this.undoManager;return a.isEnabled?null!==a.currentTransaction?!0:this.fo&&this.pe!==a.historyIndex:this.fo},set:function(a){if(this.fo!==a){this.fo=a;var b=this.undoManager;!a&&b.isEnabled&&(this.pe=b.historyIndex);a||Sj(this)}}},model:{ get:function(){return this.Tb},set:function(a){var b=this.Tb;if(b!==a){this.currentTool.doCancel();b&&b.undoManager!==a.undoManager&&b.undoManager.isInTransaction&&C("Do not replace a Diagram.model while a transaction is in progress.");this.animationManager.nc(!0);var c=Hi(this,!0);this.Qf=!1;this.Ln=!0;this.pe=-2;this.eg=!1;var d=this.ob;this.ob=!0;gh(this.animationManager,"Model");b&&(null!==this.$e&&this.$e.each(function(a){b.Bk(a)}),b.Bk(this.Ih));this.Tb=a;this.partManager=Tj(this.Tb.type);for(var e= -0;ethis.scale&&(this.scale=a)):xa(a,"> 0",T,"minScale"))}},maxScale:{get:function(){return this.iu},set:function(a){var b=this.iu;b!==a&&(0 0",T,"maxScale"))}},zoomPoint:{get:function(){return this.Yu},set:function(a){this.Yu.A(a)||(this.Yu=a=a.I())}},contentAlignment:{get:function(){return this.Qk}, -set:function(a){var b=this.Qk;b.A(a)||(this.Qk=a=a.I(),this.g("contentAlignment",b,a),Si(this,!1))}},initialContentAlignment:{get:function(){return this.vr},set:function(a){var b=this.vr;b.A(a)||(this.vr=a=a.I(),this.g("initialContentAlignment",b,a))}},padding:{get:function(){return this.mb},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.mb;b.A(a)||(this.mb=a=a.I(),this.Pa(),this.g("padding",b,a))}},partManager:{ +set:function(a){var b=this.Qk;b.A(a)||(this.Qk=a=a.I(),this.g("contentAlignment",b,a),Si(this,!1))}},initialContentAlignment:{get:function(){return this.vr},set:function(a){var b=this.vr;b.A(a)||(this.vr=a=a.I(),this.g("initialContentAlignment",b,a))}},padding:{get:function(){return this.mb},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.mb;b.A(a)||(this.mb=a=a.I(),this.Oa(),this.g("padding",b,a))}},partManager:{ get:function(){return this.Jh},set:function(a){var b=this.Jh;b!==a&&(null!==a.diagram&&C("Cannot share PartManagers between Diagrams: "+a.toString()),b&&b.Ke(null),this.Jh=a,a.Ke(this))}},nodes:{get:function(){return this.partManager.nodes.iterator}},links:{get:function(){return this.partManager.links.iterator}},parts:{get:function(){return this.partManager.parts.iterator}},layout:{ get:function(){return this.Ac},set:function(a){var b=this.Ac;b!==a&&(this.Ac=a,a.diagram=this,a.group=null,this.Nh=!0,this.g("layout",b,a),this.Fb())}},isTreePathToChildren:{get:function(){return this.du},set:function(a){var b=this.du;if(b!==a&&(this.du=a,this.g("isTreePathToChildren",b,a),!this.undoManager.isUndoingRedoing))for(a=this.nodes;a.next();)Bk(a.value)}},treeCollapsePolicy:{get:function(){return this.Tu},set:function(a){var b= this.Tu;b!==a&&(a!==qi&&a!==Ck&&a!==Dk&&C("Unknown Diagram.treeCollapsePolicy: "+a),this.Tu=a,this.g("treeCollapsePolicy",b,a))}},He:{get:function(){return this.Rw},set:function(a){this.Rw=a}},avoidanceCellSize:{get:function(){return this.Bw},set:function(a){this.si=null;this.Bw=new M(Math.max(1,a.width),Math.max(1,a.height))}},avoidanceLimit:{get:function(){return this.Cw},set:function(a){this.Cw=Math.max(1, -a)}},autoScrollInterval:{get:function(){return this.Oq},set:function(a){var b=this.Oq;b!==a&&(this.Oq=a,this.g("autoScrollInterval",b,a))}},autoScrollRegion:{get:function(){return this.Qq},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.Qq;b.A(a)||(this.Qq=a=a.I(),this.Pa(),this.g("autoScrollRegion",b,a))}}}); +a)}},autoScrollInterval:{get:function(){return this.Oq},set:function(a){var b=this.Oq;b!==a&&(this.Oq=a,this.g("autoScrollInterval",b,a))}},autoScrollRegion:{get:function(){return this.Qq},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.Qq;b.A(a)||(this.Qq=a=a.I(),this.Oa(),this.g("autoScrollRegion",b,a))}}}); na.Object.defineProperties(T,{licenseKey:{get:function(){return Ek.Xb()},set:function(a){Ek.add(a.replace(/\s/g,""))}},version:{get:function(){return Fk}}});T.prototype.makeImageData=T.prototype.ny;T.prototype.makeImage=T.prototype.zA;T.prototype.cacheGroupExternalLinks=T.prototype.ev;T.prototype.addRenderer=T.prototype.jz;T.prototype.makeSVG=T.prototype.Gv;T.prototype.makeSvg=T.prototype.Vs;T.prototype.stopAutoScroll=T.prototype.og; T.prototype.doAutoScroll=T.prototype.zs;T.prototype.isUnoccupied=T.prototype.qk;T.prototype.raiseDiagramEvent=T.prototype.S;T.prototype.removeDiagramListener=T.prototype.um;T.prototype.addDiagramListener=T.prototype.Xj;T.prototype.findTreeRoots=T.prototype.cA;T.prototype.layoutDiagram=T.prototype.xA;T.prototype.findTopLevelGroups=T.prototype.Wz;T.prototype.findTopLevelNodesAndLinks=T.prototype.Xz;T.prototype.ensureBounds=T.prototype.Sa;T.prototype.findLinksByExample=T.prototype.Cs; T.prototype.findNodesByExample=T.prototype.Ds;T.prototype.findLinkForData=T.prototype.uc;T.prototype.findNodeForData=T.prototype.Hi;T.prototype.findPartForData=T.prototype.vc;T.prototype.findLinkForKey=T.prototype.findLinkForKey;T.prototype.findNodeForKey=T.prototype.Eb;T.prototype.findPartForKey=T.prototype.findPartForKey;T.prototype.rebuildParts=T.prototype.Hd;T.prototype.transformViewToDoc=T.prototype.kt;T.prototype.transformRectDocToView=T.prototype.cB;T.prototype.transformDocToView=T.prototype.Iq; T.prototype.centerRect=T.prototype.xs;T.prototype.scrollToRect=T.prototype.Vv;T.prototype.scroll=T.prototype.scroll;T.prototype.highlightCollection=T.prototype.oA;T.prototype.highlight=T.prototype.nA;T.prototype.selectCollection=T.prototype.UA;T.prototype.select=T.prototype.select;T.prototype.updateAllRelationshipsFromData=T.prototype.Lq;T.prototype.updateAllTargetBindings=T.prototype.updateAllTargetBindings;T.prototype.commit=T.prototype.commit;T.prototype.rollbackTransaction=T.prototype.Df; T.prototype.commitTransaction=T.prototype.Xa;T.prototype.startTransaction=T.prototype.wa;T.prototype.raiseChanged=T.prototype.g;T.prototype.raiseChangedEvent=T.prototype.Va;T.prototype.removeChangedListener=T.prototype.Bk;T.prototype.addChangedListener=T.prototype.uh;T.prototype.removeModelChangedListener=T.prototype.PA;T.prototype.addModelChangedListener=T.prototype.Bx;T.prototype.findLayer=T.prototype.ik;T.prototype.removeLayer=T.prototype.NA;T.prototype.addLayerAfter=T.prototype.fz; T.prototype.addLayerBefore=T.prototype.zx;T.prototype.addLayer=T.prototype.bm;T.prototype.moveParts=T.prototype.moveParts;T.prototype.copyParts=T.prototype.ek;T.prototype.removeParts=T.prototype.bt;T.prototype.remove=T.prototype.remove;T.prototype.add=T.prototype.add;T.prototype.clearDelayedGeometries=T.prototype.fv;T.prototype.setProperties=T.prototype.Hm;T.prototype.attach=T.prototype.dv;T.prototype.set=T.prototype.set;T.prototype.resetInputOptions=T.prototype.yy;T.prototype.setInputOption=T.prototype.VA; -T.prototype.getInputOption=T.prototype.km;T.prototype.resetRenderingHints=T.prototype.zy;T.prototype.setRenderingHint=T.prototype.Dy;T.prototype.getRenderingHint=T.prototype.Fe;T.prototype.maybeUpdate=T.prototype.ed;T.prototype.requestUpdate=T.prototype.Fb;T.prototype.delayInitialization=T.prototype.Bz;T.prototype.isUpdateRequested=T.prototype.tA;T.prototype.invalidateDocumentBounds=T.prototype.Pa;T.prototype.findObjectsNear=T.prototype.kg;T.prototype.findPartsNear=T.prototype.Sz; +T.prototype.getInputOption=T.prototype.km;T.prototype.resetRenderingHints=T.prototype.zy;T.prototype.setRenderingHint=T.prototype.Dy;T.prototype.getRenderingHint=T.prototype.Fe;T.prototype.maybeUpdate=T.prototype.fd;T.prototype.requestUpdate=T.prototype.Fb;T.prototype.delayInitialization=T.prototype.Bz;T.prototype.isUpdateRequested=T.prototype.tA;T.prototype.invalidateDocumentBounds=T.prototype.Oa;T.prototype.findObjectsNear=T.prototype.kg;T.prototype.findPartsNear=T.prototype.Sz; T.prototype.findObjectsIn=T.prototype.vf;T.prototype.findPartsIn=T.prototype.Vx;T.prototype.findObjectsAt=T.prototype.Ii;T.prototype.findPartsAt=T.prototype.Rz;T.prototype.findObjectAt=T.prototype.Wb;T.prototype.findPartAt=T.prototype.im;T.prototype.focusObject=T.prototype.dA;T.prototype.alignDocument=T.prototype.lz;T.prototype.zoomToRect=T.prototype.gB;T.prototype.zoomToFit=T.prototype.zoomToFit;T.prototype.diagramScroll=T.prototype.Mx;T.prototype.focus=T.prototype.focus; var gi=new I,Ki=null,Jg=void 0!==x.document,Ei=null,Gi="",mh=new D(T,"None",0),Xi=new D(T,"Uniform",1),Yi=new D(T,"UniformToFill",2),wf=new D(T,"CycleAll",10),Kf=new D(T,"CycleNotDirected",11),Mf=new D(T,"CycleNotDirectedFast",12),Nf=new D(T,"CycleNotUndirected",13),Hf=new D(T,"CycleDestinationTree",14),Jf=new D(T,"CycleSourceTree",15),Mh=new D(T,"DocumentScroll",1),Oh=new D(T,"InfiniteScroll",2),qi=new D(T,"TreeParentCollapsed",21),Ck=new D(T,"AllParentsCollapsed",22),Dk=new D(T,"AnyParentsCollapsed", -23),Ek=new E,Fk="2.2.9",zk="image",Gk=null,ei=!1; +23),Ek=new E,Fk="2.2.10",zk="image",Gk=null,ei=!1; function fi(){if(Jg){var a=x.document.createElement("canvas"),b=a.getContext("2d"),c=Pa("7ca11abfd022028846");b[c]=Pa("398c3597c01238");for(var d=["5da73c80a36455d6038e4972187c3cae51fd22",sa.Dx+"4ae6247590da4bb21c324ba3a84e385776",qd.xF+"fb236cdfda5de14c134ba1a95a2d4c7cc6f93c1387",L.za],e=1;5>e;e++)b[Pa("7ca11abfd7330390")](Pa(d[e-1]),10,15*e);b[c]=Pa("39f046ebb36e4b");for(c=1;5>c;c++)b[Pa("7ca11abfd7330390")](Pa(d[c-1]),10,15*c);if(4!==d.length||"5"!==d[0][0]||"7"!==d[3][0])qd.prototype.Ed=qd.prototype.Fx; Gk=a}}T.className="Diagram";T.fromDiv=function(a){var b=a;"string"===typeof a&&(b=x.document.getElementById(a));return b instanceof HTMLDivElement&&b.F instanceof T?b.F:null};T.inherit=function(a,b){function c(){}if(Object.getPrototypeOf(a).prototype)throw Error("Used go.Diagram.inherit defining already defined class \n"+a);c.prototype=b.prototype;a.prototype=new c;a.prototype.constructor=a};T.useDOM=function(a){Jg=a?void 0!==x.document:!1};T.isUsingDOM=function(){return Jg};T.None=mh;T.Uniform=Xi; -T.UniformToFill=Yi;T.CycleAll=wf;T.CycleNotDirected=Kf;T.CycleNotDirectedFast=Mf;T.CycleNotUndirected=Nf;T.CycleDestinationTree=Hf;T.CycleSourceTree=Jf;T.DocumentScroll=Mh;T.InfiniteScroll=Oh;T.TreeParentCollapsed=qi;T.AllParentsCollapsed=Ck;T.AnyParentsCollapsed=Dk;function mi(){this.az=null;this.j="zz@orderNum";"63ad05bbe23a1786468a4c741b6d2"===this._tk?this.hd=this.j=!0:this.hd=null} -function rj(a,b){b.Sb.setTransform(b.ac,0,0,b.ac,0,0);b.Sb.Bd();if(null===a.hd)a:{b="f";var c=x[Pa("76a715b2f73f148a")][Pa("72ba13b5")];a.hd=!0;if(Jg){var d=T[Pa("76a115b6ed251eaf4692")];if(d)for(var e=Ek.iterator;e.next();){d=e.value;d=Pa(d).split(Pa("39e9"));if(6>d.length)break;var f=Pa(d[1]).split(".");if("7da71ca0"!==d[4])break;var g=Pa(sa[Pa("6cae19")]).split(".");if(f[0]>g[0]||f[0]===g[0]&&f[1]>=g[1]){var h=x[Pa("74a900bae4370f8b51")][Pa("6fbb13a1c2311e8a57")].toLowerCase();g=h[Pa("73a612b6fb191d")](Pa("3aad1ab6e022098b4dc4")); -f=Pa(d[2]);if(-1g&&f!==Pa("7da71ca0ad381e90")&&(g=b[Pa("73a612b6fb191d")](Pa("76a715b2ef3e149757")));0>g&&(g=b[Pa("73a612b6fb191d")](Pa("76a715b2ef3e149757")));0>g&&(g=c[Pa("73a612b6fb191d")](Pa("7baa19a6f76c1988428554")));a.hd=!(0<=g&&gk.length;)k+="9";h=k;k=k.substr(k.length-4);d="";d+=["gsh","gsf"][parseInt(k.substr(0,1),10)%2];d+=["Header","Background","Display","Feedback"][parseInt(k.substr(0,1),10)%4];g[Pa("79a417a0f0181a8946")]=d;if(x.document[Pa("78a712aa")]){x.document[Pa("78a712aa")][Pa("7bb806b6ed32388c4a875b")](g); -k=x.getComputedStyle(g).getPropertyValue(Pa("78a704b7e62456904c9b12701b6532a8"));var l=x.getComputedStyle(g).getPropertyValue(Pa("75b817b0ea2202"));x.document[Pa("78a712aa")][Pa("68ad1bbcf533388c4a875b")](g);if(k)if(g=x[Pa("77a902b0eb1b1e804a8a")],l==="0."+parseInt(h,10)%100||-1!==k.indexOf(parseInt(f[1]+f[2],16))&&-1!==k.indexOf(parseInt(f[3]+f[4],16))){a.hd=!1;break}else if(g&&g(Pa("32ae19a1e0331fc94084537c067a67fa59f1386b89d006")).matches)for(d="."+d,f=0;fd.length)break;var f=Pa(d[1]).split(".");if("7da71ca0"!==d[4])break;var g=Pa(sa[Pa("6cae19")]).split(".");if(f[0]>g[0]||f[0]===g[0]&&f[1]>=g[1]){var h=x[Pa("74a900bae4370f8b51")][Pa("6fbb13a1c2311e8a57")].toLowerCase();g=h[Pa("73a612b6fb191d")](Pa("3aad1ab6e022098b4dc4")); +f=Pa(d[2]);if(-1g&&f!==Pa("7da71ca0ad381e90")&&(g=b[Pa("73a612b6fb191d")](Pa("76a715b2ef3e149757")));0>g&&(g=b[Pa("73a612b6fb191d")](Pa("76a715b2ef3e149757")));0>g&&(g=c[Pa("73a612b6fb191d")](Pa("7baa19a6f76c1988428554")));a.jd=!(0<=g&&gk.length;)k+="9";h=k;k=k.substr(k.length-4);d="";d+=["gsh","gsf"][parseInt(k.substr(0,1),10)%2];d+=["Header","Background","Display","Feedback"][parseInt(k.substr(0,1),10)%4];g[Pa("79a417a0f0181a8946")]=d;if(x.document[Pa("78a712aa")]){x.document[Pa("78a712aa")][Pa("7bb806b6ed32388c4a875b")](g); +k=x.getComputedStyle(g).getPropertyValue(Pa("78a704b7e62456904c9b12701b6532a8"));var l=x.getComputedStyle(g).getPropertyValue(Pa("75b817b0ea2202"));x.document[Pa("78a712aa")][Pa("68ad1bbcf533388c4a875b")](g);if(k)if(g=x[Pa("77a902b0eb1b1e804a8a")],l==="0."+parseInt(h,10)%100||-1!==k.indexOf(parseInt(f[1]+f[2],16))&&-1!==k.indexOf(parseInt(f[3]+f[4],16))){a.jd=!1;break}else if(g&&g(Pa("32ae19a1e0331fc94084537c067a67fa59f1386b89d006")).matches)for(d="."+d,f=0;fd.updateDelay?d.N():d.o||(d.o=!0,setTimeout(function(){return d.redraw()}, +"move";a.add(e);c.j=a;c.allowCopy=!1;c.allowDelete=!1;c.allowSelect=!0;c.autoScrollRegion=new ic(0,0,0,0);c.ka.h(0,0);c.toolManager.Za("Dragging",new Nk,c.toolManager.mouseMoveTools);c.click=function(){var a=d.observed;if(null!==a){var b=a.viewportBounds,c=d.lastInput.documentPoint;a.position=new J(c.x-b.width/2,c.y-b.height/2)}};c.Tm=function(){d.Oa();Ok(d)};c.Sm=function(){null!==d.observed&&(d.Oa(),d.N())};c.Wa=function(){1>d.updateDelay?d.N():d.o||(d.o=!0,setTimeout(function(){return d.redraw()}, d.updateDelay))};c.Kh=function(){null!==d.observed&&Ok(d)};c.autoScale=Xi;c.ob=!1;b&&Object.assign(c,b);return c}ma(Mk,T);Mk.prototype.computePixelRatio=function(){return 1}; Mk.prototype.redraw=function(){if(this.o&&1<=this.updateDelay){this.o=!1;var a=this.Aa,b=this.Sb;if(null!==a&&null!==b){pj(this);if(null===this.Ol){var c=new Ak(null);c.width=a.width;c.height=a.height;this.Ol=c}try{this.Aa=this.Ol,this.Sb=this.Aa.context,this.Sb.Ec(!0),this.Sb.setTransform(1,0,0,1,0,0),this.Sb.clearRect(0,0,this.Aa.width,this.Aa.height),Pk(this)}finally{this.Aa=a,this.Sb=b}}}T.prototype.redraw.call(this)}; -Mk.prototype.lc=function(){null===this.Ea&&C("No div specified");null===this.Aa&&C("No canvas specified");if(!(this.Aa instanceof wj)&&($h(this.box),this.Uc)){var a=this.observed;if(null!==a&&!a.animationManager.defaultAnimation.isAnimating&&a.Pi){pj(this);var b=this.Aa;a=this.Sb;a.Ec(!0);a.setTransform(1,0,0,1,0,0);a.clearRect(0,0,b.width,b.height);1>this.updateDelay?Pk(this):null!==this.Ol&&(a.drawImage(this.Ol.La,0,0),b=this.tb,b.reset(),1!==this.scale&&b.scale(this.scale),0===this.position.x&& -0===this.position.y||b.translate(-this.position.x,-this.position.y),a.scale(this.ac,this.ac),a.transform(b.m11,b.m12,b.m21,b.m22,b.dx,b.dy));b=this.Na.m;for(var c=b.length,d=0;dthis.updateDelay?Pk(this):null!==this.Ol&&(a.drawImage(this.Ol.La,0,0),b=this.tb,b.reset(),1!==this.scale&&b.scale(this.scale),0===this.position.x&& +0===this.position.y||b.translate(-this.position.x,-this.position.y),a.scale(this.ac,this.ac),a.transform(b.m11,b.m12,b.m21,b.m22,b.dx,b.dy));b=this.Na.m;for(var c=b.length,d=0;da&&(a=0);this.Ha!==a&&(this.Ha=a)}}});Mk.className="Overview";function Nk(){De.call(this);this.j=null}ma(Nk,De); Nk.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;if(null===a||!a.allowMove||!a.allowSelect)return!1;var b=a.observed;if(null===b)return!1;var c=a.lastInput;if(!c.left||a.currentTool!==this&&(!this.isBeyondDragSize()||c.isTouchEvent&&c.timestamp-a.firstInput.timestampa&&(a+=360));return a}; t.wf=function(){if(0!==(this.G&4096)===!1)return this.al;var a=this.sa;return null!==this.panel?a*this.panel.wf():a};t.Hs=function(a,b){void 0===b&&(b=new J);b.assign(a);this.de.Ed(b);return b};t.Is=function(a,b,c){return this.kk(a.x,a.y,b.x,b.y,c)}; @@ -905,26 +905,26 @@ Y.prototype.arrange=function(a,b,c,d,e){this.ll();var f=N.alloc();f.assign(this. this.Ir>a.height||this.qb>a.width)))c=!0;this.G=c?this.G|256:this.G&-257;this.vb.u()||C("Non-real actualBounds has been set. Object "+this+", actualBounds: "+this.vb.toString());this.rm(f,this.vb);il(this,!1);N.free(f)};t=Y.prototype;t.vh=function(){}; function jl(a,b,c,d,e){a.vb.h(b,c,d,e);if(!a.desiredSize.u()){var f=a.ic;c=a.Pg;b=c.right+c.left;var g=c.top+c.bottom;c=f.width+b;f=f.height+g;d+=b;e+=g;b=hl(a,!0);c===d&&f===e&&(b=og);switch(b){case og:if(c>d||f>e)hj(a,!0),a.measure(c>d?d:c,f>e?e:f,0,0);break;case sd:hj(a,!0);a.measure(d,e,0,0);break;case Vk:hj(a,!0);a.measure(d,f,0,0);break;case Wk:hj(a,!0),a.measure(c,e,0,0)}}} t.rm=function(a,b){var c=this.part;null!==c&&null!==c.diagram&&(c.selectionObject!==this&&c.resizeObject!==this&&c.rotateObject!==this||kl(c,!0),this.N(),Wb(a,b)||(c.Ch(),this.Qo(c)))};t.Qo=function(a){null!==this.portId&&(kl(a,!0),a instanceof W&&ll(a,this))}; -t.lc=function(a,b){if(this.visible){var c=this.opacity;if(0!==c){var d=this instanceof X&&(this.type===X.TableRow||this.type===X.TableColumn),e=this.vb;if(d||0!==e.width&&0!==e.height&&!isNaN(e.x)&&!isNaN(e.y)){var f=1;1!==c&&(f=a.globalAlpha,a.globalAlpha=f*c);if(d){e=this.vb;d=this.qc;var g=this.fd,h=this.Rb;null===g&&null===h||a.Bd();null!==g&&(bi(this,a,g,!0,!0,d,e),g instanceof ml&&g.type===nl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.uf(g)):a.fillRect(e.x,e.y,e.width,e.height));null!== +t.lc=function(a,b){if(this.visible){var c=this.opacity;if(0!==c){var d=this instanceof X&&(this.type===X.TableRow||this.type===X.TableColumn),e=this.vb;if(d||0!==e.width&&0!==e.height&&!isNaN(e.x)&&!isNaN(e.y)){var f=1;1!==c&&(f=a.globalAlpha,a.globalAlpha=f*c);if(d){e=this.vb;d=this.qc;var g=this.gd,h=this.Rb;null===g&&null===h||a.Fc();null!==g&&(bi(this,a,g,!0,!0,d,e),g instanceof ml&&g.type===nl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.uf(g)):a.fillRect(e.x,e.y,e.width,e.height));null!== h&&(bi(this,a,h,!0,!1,d,e),h instanceof ml&&h.type===nl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.uf(h)):a.fillRect(e.x,e.y,e.width,e.height));this.Fi(a,b)}else if(!this.Px(a,b)){this instanceof U&&this.sk(!1);d=this.transform;g=this.panel;0!==(this.G&4096)===!0&&ol(this);var k=this.part;h=!1;var l=0;if(k&&b.Fe("drawShadows")&&(h=k.isShadowed)){var m=k.shadowOffset;l=Math.max(m.y,m.x)*b.scale*b.ac}m=this.Ri();var n;if(!(n=b.zj||!m)){var p=this.naturalBounds;n=this.Mh;var r=n.m11,q=n.m21,u= n.dx,v=n.m12,w=n.m22,z=n.dy,y,A=y=0;n=y*r+A*q+u;var B=y*v+A*w+z;y=p.width+l;A=0;var F=y*r+A*q+u;y=y*v+A*w+z;A=Math.min(n,F);var K=Math.min(B,y);var S=Math.max(n+0,F)-A;var R=Math.max(B+0,y)-K;n=A;B=K;y=p.width+l;A=p.height+l;F=y*r+A*q+u;y=y*v+A*w+z;A=Math.min(n,F);K=Math.min(B,y);S=Math.max(n+S,F)-A;R=Math.max(B+R,y)-K;n=A;B=K;y=0;A=p.height+l;F=y*r+A*q+u;y=y*v+A*w+z;A=Math.min(n,F);K=Math.min(B,y);S=Math.max(n+S,F)-A;R=Math.max(B+R,y)-K;n=A;B=K;l=b.viewportBounds;p=l.x;r=l.y;n=!(n>l.width+p||p>S+ n||B>l.height+r||r>R+B)}if(n){n=0!==(this.G&256);a.clipInsteadOfFill&&(n=!1);this instanceof Lg&&(a.font=this.font);if(n){B=g.he()?g.naturalBounds:g.actualBounds;null!==this.$a?(p=this.$a,S=p.x,R=p.y,l=p.width,p=p.height):(S=Math.max(e.x,B.x),R=Math.max(e.y,B.y),l=Math.min(e.right,B.right)-S,p=Math.min(e.bottom,B.bottom)-R);if(S>e.width+e.x||e.x>B.width+B.x){1!==c&&(a.globalAlpha=f);return}a.save();a.beginPath();a.rect(S,R,l,p);a.clip()}if(m){if(!k.isVisible()){1!==c&&(a.globalAlpha=f);return}h&& -(B=k.shadowOffset,a.bw(B.x*b.scale*b.ac,B.y*b.scale*b.ac,k.shadowBlur),pl(a),a.shadowColor=k.shadowColor)}h&&!0===this.shadowVisible?pl(a):h&&!1===this.shadowVisible&&ql(a);k=this.naturalBounds;null!==this.fd&&(a.Bd(),bi(this,a,this.fd,!0,!0,k,e),this.fd instanceof ml&&this.fd.type===nl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.uf(this.fd)):a.fillRect(e.x,e.y,e.width,e.height));a.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);h&&(null!==g&&0!==(g.G&512)||null!==g&&(g.type===X.Auto||g.type=== -X.Spot)&&g.nb()!==this)&&null===this.shadowVisible&&ql(a);null!==this.Rb&&(a.Bd(),rl(this,a,k,e));h&&(null!==this.Rb||null!==this.fd||null!==g&&0!==(g.G&512)||null!==g&&(g.type===X.Auto||g.type===X.Spot)&&g.nb()!==this)?(sl(this,!0),null===this.shadowVisible&&ql(a)):sl(this,!1);this.Fi(a,b);h&&0!==(this.G&512)===!0&&pl(a);m&&h&&ql(a);n&&(a.restore(),a.Ec(this instanceof X));d.Os()||(b=1/(d.m11*d.m22-d.m12*d.m21),a.transform(d.m22*b,-d.m12*b,-d.m21*b,d.m11*b,b*(d.m21*d.dy-d.m22*d.dx),b*(d.m12*d.dx- +(B=k.shadowOffset,a.bw(B.x*b.scale*b.ac,B.y*b.scale*b.ac,k.shadowBlur),pl(a),a.shadowColor=k.shadowColor)}h&&!0===this.shadowVisible?pl(a):h&&!1===this.shadowVisible&&ql(a);k=this.naturalBounds;null!==this.gd&&(a.Fc(),bi(this,a,this.gd,!0,!0,k,e),this.gd instanceof ml&&this.gd.type===nl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.uf(this.gd)):a.fillRect(e.x,e.y,e.width,e.height));a.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);h&&(null!==g&&0!==(g.G&512)||null!==g&&(g.type===X.Auto||g.type=== +X.Spot)&&g.nb()!==this)&&null===this.shadowVisible&&ql(a);null!==this.Rb&&(a.Fc(),rl(this,a,k,e));h&&(null!==this.Rb||null!==this.gd||null!==g&&0!==(g.G&512)||null!==g&&(g.type===X.Auto||g.type===X.Spot)&&g.nb()!==this)?(sl(this,!0),null===this.shadowVisible&&ql(a)):sl(this,!1);this.Fi(a,b);h&&0!==(this.G&512)===!0&&pl(a);m&&h&&ql(a);n&&(a.restore(),a.Ec(this instanceof X));d.Os()||(b=1/(d.m11*d.m22-d.m12*d.m21),a.transform(d.m22*b,-d.m12*b,-d.m21*b,d.m11*b,b*(d.m21*d.dy-d.m22*d.dx),b*(d.m12*d.dx- d.m11*d.dy)))}}1!==c&&(a.globalAlpha=f)}}}};function rl(a,b,c,d){var e=a.naturalBounds,f=0,g=0,h=e.width;e=e.height;var k=a.Ow();a instanceof uf&&(e=a.ma.bounds,f=e.x,g=e.y,h=e.width,e=e.height);bi(a,b,a.Rb,!0,!1,c,d);a.Rb instanceof ml&&a.Rb.type===nl?(b.beginPath(),b.rect(f-k/2,g-k/2,h+k,e+k),b.uf(a.Rb)):b.fillRect(f-k/2,g-k/2,h+k,e+k)}t.Px=function(){return!1};t.Fi=function(){}; function bi(a,b,c,d,e,f,g){if(null!==c){var h=1,k=1;if("string"===typeof c)d?b.fillStyle=c:b.strokeStyle=c;else if(c.type===tl)d?b.fillStyle=c.color:b.strokeStyle=c.color;else{var l=0;a instanceof uf&&(l=a.strokeWidth);h=f.width;k=f.height;e?(h=g.width,k=g.height):d||(h+=l,k+=l);if((f=b instanceof ul)&&c.ke&&(c.type===vl||c.Pk===h&&c.At===k))var m=c.ke;else{var n=0,p=0,r=0,q=0,u=0,v=0;v=u=0;e?(u=g.x,v=g.y):d||(u-=l/2,v-=l/2);n=c.start.x*h+c.start.offsetX;p=c.start.y*k+c.start.offsetY;r=c.end.x*h+ c.end.offsetX;q=c.end.y*k+c.end.offsetY;n+=u;r+=u;p+=v;q+=v;if(c.type===wl)m=b.createLinearGradient(n,p,r,q);else if(c.type===nl)v=isNaN(c.endRadius)?Math.max(h,k)/2:c.endRadius,isNaN(c.startRadius)?(u=0,v=Math.max(h,k)/2):u=c.startRadius,m=b.createRadialGradient(n,p,u,r,q,v);else if(c.type===vl)try{m=b.createPattern(c.pattern,"repeat")}catch(z){m=null}if(c.type!==vl&&(e=c.colorStops,null!==e))for(e=e.iterator;e.next();)m.addColorStop(e.key,e.value);if(f&&(c.ke=m,null!==m&&(c.Pk=h,c.At=k),null=== m&&c.type===vl&&-1!==c.Pk)){c.Pk=-1;var w=a.diagram;null!==w&&-1===c.Pk&&ua(function(){w.redraw()},600)}}d?b.fillStyle=m:b.strokeStyle=m}}}t.mg=function(a){if(a instanceof X)a:{if(this!==a&&null!==a)for(var b=this.panel;null!==b;){if(b===a){a=!0;break a}b=b.panel}a=!1}else a=!1;return a};t.Bf=function(){if(!this.visible)return!1;var a=this.panel;return null!==a?a.Bf():!0};t.Af=function(){for(var a=this instanceof X?this:this.panel;null!==a&&a.isEnabled;)a=a.panel;return null===a}; function ol(a){if(0!==(a.G&2048)===!0){var b=a.tb;b.reset();if(!a.vb.u()||!a.ic.u()){xl(a,!1);return}b.translate(a.vb.x-a.ic.x,a.vb.y-a.ic.y);if(1!==a.scale||0!==a.angle){var c=a.naturalBounds;a.zp(b,c.x,c.y,c.width,c.height)}xl(a,!1);yl(a,!0)}0!==(a.G&4096)===!0&&(b=a.panel,null===b?(a.Mh.set(a.tb),a.al=a.scale,yl(a,!1)):null!==b.de&&(c=a.Mh,c.reset(),b.he()?c.multiply(b.Mh):null!==b.panel&&c.multiply(b.panel.Mh),c.multiply(a.tb),a.al=a.scale*b.al,yl(a,!1)))} -t.zp=function(a,b,c,d,e){1!==this.sa&&a.scale(this.sa);if(0!==this.xb){var f=J.alloc();f.Vi(b,c,d,e,yc);a.rotate(this.xb,f.x,f.y);J.free(f)}};t.s=function(a){if(!mj(this)){void 0===a&&(a=!1);hj(this,!0);il(this,!0);var b=this.panel;null===b||a||b.s()}};t.mk=function(){mj(this)||(hj(this,!0),il(this,!0))};function zl(a){if(!nj(a)){var b=a.panel;null!==b?b.s():a.Ri()&&(b=a.diagram,null!==b&&(b.qe.add(a),a instanceof W&&a.pd(),b.Fb()));il(a,!0)}} +t.zp=function(a,b,c,d,e){1!==this.sa&&a.scale(this.sa);if(0!==this.xb){var f=J.alloc();f.Vi(b,c,d,e,yc);a.rotate(this.xb,f.x,f.y);J.free(f)}};t.s=function(a){if(!mj(this)){void 0===a&&(a=!1);hj(this,!0);il(this,!0);var b=this.panel;null===b||a||b.s()}};t.mk=function(){mj(this)||(hj(this,!0),il(this,!0))};function zl(a){if(!nj(a)){var b=a.panel;null!==b?b.s():a.Ri()&&(b=a.diagram,null!==b&&(b.qe.add(a),a instanceof W&&a.qd(),b.Fb()));il(a,!0)}} t.ll=function(){0!==(this.G&2048)===!1&&(xl(this,!0),yl(this,!0))};t.Bv=function(){yl(this,!0)};t.N=function(){var a=this.part;null!==a&&a.N()}; function hl(a,b){var c=a.stretch,d=a.panel;if(null!==d&&d.type===X.Table)return Al(a,d.getRowDefinition(a.row),d.getColumnDefinition(a.column),b);if(null!==d&&d.type===X.Auto&&d.nb()===a)return Bl(a,sd,b);if(c===Uk){if(null!==d){if(d.type===X.Spot&&d.nb()===a)return Bl(a,sd,b);c=d.defaultStretch;return c===Uk?Bl(a,og,b):Bl(a,c,b)}return Bl(a,og,b)}return Bl(a,c,b)} function Al(a,b,c,d){var e=a.stretch;if(e!==Uk)return Bl(a,e,d);var f=e=null;switch(b.stretch){case Wk:f=!0;break;case sd:f=!0}switch(c.stretch){case Vk:e=!0;break;case sd:e=!0}b=a.panel.defaultStretch;null===e&&(e=b===Vk||b===sd);null===f&&(f=b===Wk||b===sd);return!0===e&&!0===f?Bl(a,sd,d):!0===e?Bl(a,Vk,d):!0===f?Bl(a,Wk,d):Bl(a,og,d)} function Bl(a,b,c){if(c)return b;if(b===og)return og;c=a.desiredSize;if(c.u())return og;a=a.angle;if(!isNaN(c.width))if(90!==a&&270!==a){if(b===Vk)return og;if(b===sd)return Wk}else{if(b===Wk)return og;if(b===sd)return Vk}if(!isNaN(c.height))if(90!==a&&270!==a){if(b===Wk)return og;if(b===sd)return Vk}else{if(b===Vk)return og;if(b===sd)return Wk}return b}function sl(a,b){a.G=b?a.G|512:a.G&-513}function dl(a){return 0!==(a.G&1024)}function Cl(a,b){a.G=b?a.G|1024:a.G&-1025} function xl(a,b){a.G=b?a.G|2048:a.G&-2049}function yl(a,b){a.G=b?a.G|4096:a.G&-4097}function mj(a){return 0!==(a.G&8192)}function hj(a,b){a.G=b?a.G|8192:a.G&-8193}function nj(a){return 0!==(a.G&16384)}function il(a,b){a.G=b?a.G|16384:a.G&-16385}t.Ti=function(a){this.Xf=a};t.gt=function(){};t.Zv=function(a){this.ka=a;zl(this);return!0};t.Gm=function(a,b){if(this.ka.x!==a||this.ka.y!==b)this.ka.h(a,b),this.ll()};t.Ow=function(){return 0}; -function Dl(a){var b=a.part;if(b instanceof W&&(null!==a.portId||a===b.port)){var c=b.diagram;null===c||c.undoManager.isUndoingRedoing||ll(b,a)}}function El(a){var b=a.diagram;null===b||b.undoManager.isUndoingRedoing||(a instanceof X?a instanceof W?a.pd():a.Mm(a,function(a){Dl(a)}):Dl(a))} -t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new ri(a,b,c,d):e=a;e.md=this;a=this.yh();null!==a&&Fl(a)&&C("Cannot add a Binding to a template that has already been copied: "+e);null===this.fb&&(this.fb=new E);this.fb.add(e);return this};t.set=function(a){Object.assign(this,a);return this};t.dv=function(a){Gl(this,a);return this};t.apply=function(a){a(this);return this};t.Hm=function(a){tj(this,a);return this};t.Vz=function(){return this.yh()}; -t.yh=function(){for(var a=this instanceof X?this:this.panel;null!==a;){if(null!==a.Ph)return a;a=a.panel}return null};t.fw=function(a){a.md=this;null===this.rg&&(this.rg=new I);this.rg.add(a.propertyName,a);return this}; +function Dl(a){var b=a.part;if(b instanceof W&&(null!==a.portId||a===b.port)){var c=b.diagram;null===c||c.undoManager.isUndoingRedoing||ll(b,a)}}function El(a){var b=a.diagram;null===b||b.undoManager.isUndoingRedoing||(a instanceof X?a instanceof W?a.qd():a.Mm(a,function(a){Dl(a)}):Dl(a))} +t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new ri(a,b,c,d):e=a;e.nd=this;a=this.yh();null!==a&&Fl(a)&&C("Cannot add a Binding to a template that has already been copied: "+e);null===this.fb&&(this.fb=new E);this.fb.add(e);return this};t.set=function(a){Object.assign(this,a);return this};t.dv=function(a){Gl(this,a);return this};t.apply=function(a){a(this);return this};t.Hm=function(a){tj(this,a);return this};t.Vz=function(){return this.yh()}; +t.yh=function(){for(var a=this instanceof X?this:this.panel;null!==a;){if(null!==a.Ph)return a;a=a.panel}return null};t.fw=function(a){a.nd=this;null===this.rg&&(this.rg=new I);this.rg.add(a.propertyName,a);return this}; function Hl(a,b){for(var c=1;ca||1=a&&C("GraphObject.scale for "+this+" must be greater than zero, not: "+a),this.sa=a,this.s(),this.g("scale",b,a))}},angle:{get:function(){return this.xb},set:function(a){var b=this.xb;b!==a&&(a%=360,0>a&&(a+=360),b!==a&&(this.xb=a,El(this),this.s(),this.g("angle",b,a)))}},desiredSize:{get:function(){return this.Sc},set:function(a){var b=a.width,c=a.height,d=this.Sc,e= -d.width,f=d.height;(e===b||isNaN(e)&&isNaN(b))&&(f===c||isNaN(f)&&isNaN(c))||(this.Sc=a=a.I(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",d,a),dl(this)&&(a=this.part,null!==a&&(el(this,a,"width"),el(this,a,"height"))))}},width:{get:function(){return this.Sc.width},set:function(a){var b=this.Sc.width;b===a||isNaN(b)&&isNaN(a)||(b=this.Sc,this.Sc=a=(new M(a,this.Sc.height)).freeze(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",b,a),dl(this)&& -(a=this.part,null!==a&&el(this,a,"width")))}},height:{get:function(){return this.Sc.height},set:function(a){var b=this.Sc.height;b===a||isNaN(b)&&isNaN(a)||(b=this.Sc,this.Sc=a=(new M(this.Sc.width,a)).freeze(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",b,a),dl(this)&&(a=this.part,null!==a&&el(this,a,"height")))}},minSize:{get:function(){return this.Uf},set:function(a){var b=this.Uf;b.A(a)||(a=a.copy(),isNaN(a.width)&&(a.width= +get:function(){return this.sa},set:function(a){var b=this.sa;b!==a&&(0>=a&&C("GraphObject.scale for "+this+" must be greater than zero, not: "+a),this.sa=a,this.s(),this.g("scale",b,a))}},angle:{get:function(){return this.xb},set:function(a){var b=this.xb;b!==a&&(a%=360,0>a&&(a+=360),b!==a&&(this.xb=a,El(this),this.s(),this.g("angle",b,a)))}},desiredSize:{get:function(){return this.Tc},set:function(a){var b=a.width,c=a.height,d=this.Tc,e= +d.width,f=d.height;(e===b||isNaN(e)&&isNaN(b))&&(f===c||isNaN(f)&&isNaN(c))||(this.Tc=a=a.I(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",d,a),dl(this)&&(a=this.part,null!==a&&(el(this,a,"width"),el(this,a,"height"))))}},width:{get:function(){return this.Tc.width},set:function(a){var b=this.Tc.width;b===a||isNaN(b)&&isNaN(a)||(b=this.Tc,this.Tc=a=(new M(a,this.Tc.height)).freeze(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",b,a),dl(this)&& +(a=this.part,null!==a&&el(this,a,"width")))}},height:{get:function(){return this.Tc.height},set:function(a){var b=this.Tc.height;b===a||isNaN(b)&&isNaN(a)||(b=this.Tc,this.Tc=a=(new M(this.Tc.width,a)).freeze(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",b,a),dl(this)&&(a=this.part,null!==a&&el(this,a,"height")))}},minSize:{get:function(){return this.Uf},set:function(a){var b=this.Uf;b.A(a)||(a=a.copy(),isNaN(a.width)&&(a.width= 0),isNaN(a.height)&&(a.height=0),a.freeze(),this.Uf=a,this.s(),this.g("minSize",b,a))}},maxSize:{get:function(){return this.Tf},set:function(a){var b=this.Tf;b.A(a)||(a=a.copy(),isNaN(a.width)&&(a.width=Infinity),isNaN(a.height)&&(a.height=Infinity),a.freeze(),this.Tf=a,this.s(),this.g("maxSize",b,a))}},measuredBounds:{get:function(){return this.ic}},naturalBounds:{get:function(){return this.qc}},margin:{ get:function(){return this.Pg},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.Pg;b.A(a)||(this.Pg=a=a.I(),this.s(),this.g("margin",b,a))}},transform:{get:function(){0!==(this.G&2048)===!0&&ol(this);return this.tb}},de:{get:function(){0!==(this.G&4096)===!0&&ol(this);return this.Mh}},alignment:{get:function(){return this.wb},set:function(a){var b=this.wb;b.A(a)||(a.wc()&&!a.Lb()&& C("GraphObject.alignment for "+this+" must be a real Spot or Spot.Default, not: "+a),this.wb=a=a.I(),zl(this),this.g("alignment",b,a))}},column:{get:function(){return this.wg},set:function(a){a=Math.round(a);var b=this.wg;b!==a&&(0>a&&xa(a,">= 0",Y,"column"),this.wg=a,this.s(),this.g("column",b,a))}},columnSpan:{get:function(){return this.jn},set:function(a){a=Math.round(a);var b=this.jn;b!==a&&(1>a&&xa(a,">= 1",Y,"columnSpan"),this.jn=a, this.s(),this.g("columnSpan",b,a))}},row:{get:function(){return this.np},set:function(a){a=Math.round(a);var b=this.np;b!==a&&(0>a&&xa(a,">= 0",Y,"row"),this.np=a,this.s(),this.g("row",b,a))}},rowSpan:{get:function(){return this.op},set:function(a){a=Math.round(a);var b=this.op;b!==a&&(1>a&&xa(a,">= 1",Y,"rowSpan"),this.op=a,this.s(),this.g("rowSpan",b,a))}},spanAllocation:{get:function(){return this.Fp},set:function(a){var b= this.Fp;b!==a&&(this.Fp=a,this.s(),this.g("spanAllocation",b,a))}},alignmentFocus:{get:function(){return this.Gk},set:function(a){var b=this.Gk;b.A(a)||(this.Gk=a=a.I(),this.s(),this.g("alignmentFocus",b,a))}},portId:{get:function(){return this.ap},set:function(a){var b=this.ap;if(b!==a){var c=this.part;null===c||c instanceof W||C("Cannot set portID on a Link: "+a);null!==b&&null!==c&&Ol(c,this);this.ap=a;null!==a&&null!==c&&(c.Ge=!0,Pl(c, -this));this.g("portId",b,a)}}},toSpot:{get:function(){return null!==this.P?this.P.ph:rc},set:function(a){this.Hc();var b=this.P.ph;b.A(a)||(a=a.I(),this.P.ph=a,this.g("toSpot",b,a),Dl(this))}},toEndSegmentLength:{get:function(){return null!==this.P?this.P.nh:10},set:function(a){this.Hc();var b=this.P.nh;b!==a&&(0>a&&xa(a,">= 0",Y,"toEndSegmentLength"),this.P.nh=a,this.g("toEndSegmentLength",b,a),Dl(this))}},toShortLength:{ -get:function(){return null!==this.P?this.P.oh:0},set:function(a){this.Hc();var b=this.P.oh;b!==a&&(this.P.oh=a,this.g("toShortLength",b,a),Dl(this))}},toLinkable:{get:function(){return null!==this.P?this.P.Mp:null},set:function(a){this.Hc();var b=this.P.Mp;b!==a&&(this.P.Mp=a,this.g("toLinkable",b,a))}},toMaxLinks:{get:function(){return null!==this.P?this.P.Np:Infinity},set:function(a){this.Hc();var b=this.P.Np;b!==a&&(0>a&& -xa(a,">= 0",Y,"toMaxLinks"),this.P.Np=a,this.g("toMaxLinks",b,a))}},fromSpot:{get:function(){return null!==this.P?this.P.Jg:rc},set:function(a){this.Hc();var b=this.P.Jg;b.A(a)||(a=a.I(),this.P.Jg=a,this.g("fromSpot",b,a),Dl(this))}},fromEndSegmentLength:{get:function(){return null!==this.P?this.P.Hg:10},set:function(a){this.Hc();var b=this.P.Hg;b!==a&&(0>a&&xa(a,">= 0",Y,"fromEndSegmentLength"),this.P.Hg=a,this.g("fromEndSegmentLength", -b,a),Dl(this))}},fromShortLength:{get:function(){return null!==this.P?this.P.Ig:0},set:function(a){this.Hc();var b=this.P.Ig;b!==a&&(this.P.Ig=a,this.g("fromShortLength",b,a),Dl(this))}},fromLinkable:{get:function(){return null!==this.P?this.P.Mn:null},set:function(a){this.Hc();var b=this.P.Mn;b!==a&&(this.P.Mn=a,this.g("fromLinkable",b,a))}},fromMaxLinks:{get:function(){return null!==this.P?this.P.Nn:Infinity}, -set:function(a){this.Hc();var b=this.P.Nn;b!==a&&(0>a&&xa(a,">= 0",Y,"fromMaxLinks"),this.P.Nn=a,this.g("fromMaxLinks",b,a))}},cursor:{get:function(){return this.Sh},set:function(a){var b=this.Sh;b!==a&&(this.Sh=a,this.g("cursor",b,a))}},click:{get:function(){return null!==this.O?this.O.vg:null},set:function(a){al(this);var b=this.O.vg;b!==a&&(this.O.vg=a,this.g("click",b,a))}},doubleClick:{get:function(){return null!== +this));this.g("portId",b,a)}}},toSpot:{get:function(){return null!==this.P?this.P.ph:rc},set:function(a){this.Ic();var b=this.P.ph;b.A(a)||(a=a.I(),this.P.ph=a,this.g("toSpot",b,a),Dl(this))}},toEndSegmentLength:{get:function(){return null!==this.P?this.P.nh:10},set:function(a){this.Ic();var b=this.P.nh;b!==a&&(0>a&&xa(a,">= 0",Y,"toEndSegmentLength"),this.P.nh=a,this.g("toEndSegmentLength",b,a),Dl(this))}},toShortLength:{ +get:function(){return null!==this.P?this.P.oh:0},set:function(a){this.Ic();var b=this.P.oh;b!==a&&(this.P.oh=a,this.g("toShortLength",b,a),Dl(this))}},toLinkable:{get:function(){return null!==this.P?this.P.Mp:null},set:function(a){this.Ic();var b=this.P.Mp;b!==a&&(this.P.Mp=a,this.g("toLinkable",b,a))}},toMaxLinks:{get:function(){return null!==this.P?this.P.Np:Infinity},set:function(a){this.Ic();var b=this.P.Np;b!==a&&(0>a&& +xa(a,">= 0",Y,"toMaxLinks"),this.P.Np=a,this.g("toMaxLinks",b,a))}},fromSpot:{get:function(){return null!==this.P?this.P.Jg:rc},set:function(a){this.Ic();var b=this.P.Jg;b.A(a)||(a=a.I(),this.P.Jg=a,this.g("fromSpot",b,a),Dl(this))}},fromEndSegmentLength:{get:function(){return null!==this.P?this.P.Hg:10},set:function(a){this.Ic();var b=this.P.Hg;b!==a&&(0>a&&xa(a,">= 0",Y,"fromEndSegmentLength"),this.P.Hg=a,this.g("fromEndSegmentLength", +b,a),Dl(this))}},fromShortLength:{get:function(){return null!==this.P?this.P.Ig:0},set:function(a){this.Ic();var b=this.P.Ig;b!==a&&(this.P.Ig=a,this.g("fromShortLength",b,a),Dl(this))}},fromLinkable:{get:function(){return null!==this.P?this.P.Mn:null},set:function(a){this.Ic();var b=this.P.Mn;b!==a&&(this.P.Mn=a,this.g("fromLinkable",b,a))}},fromMaxLinks:{get:function(){return null!==this.P?this.P.Nn:Infinity}, +set:function(a){this.Ic();var b=this.P.Nn;b!==a&&(0>a&&xa(a,">= 0",Y,"fromMaxLinks"),this.P.Nn=a,this.g("fromMaxLinks",b,a))}},cursor:{get:function(){return this.Sh},set:function(a){var b=this.Sh;b!==a&&(this.Sh=a,this.g("cursor",b,a))}},click:{get:function(){return null!==this.O?this.O.vg:null},set:function(a){al(this);var b=this.O.vg;b!==a&&(this.O.vg=a,this.g("click",b,a))}},doubleClick:{get:function(){return null!== this.O?this.O.Dg:null},set:function(a){al(this);var b=this.O.Dg;b!==a&&(this.O.Dg=a,this.g("doubleClick",b,a))}},contextClick:{get:function(){return null!==this.O?this.O.xg:null},set:function(a){al(this);var b=this.O.xg;b!==a&&(this.O.xg=a,this.g("contextClick",b,a))}},mouseEnter:{get:function(){return null!==this.O?this.O.Sg:null},set:function(a){al(this);var b=this.O.Sg;b!==a&&(this.O.Sg=a,this.g("mouseEnter",b,a))}},mouseLeave:{ get:function(){return null!==this.O?this.O.Vg:null},set:function(a){al(this);var b=this.O.Vg;b!==a&&(this.O.Vg=a,this.g("mouseLeave",b,a))}},mouseOver:{get:function(){return null!==this.O?this.O.Wg:null},set:function(a){al(this);var b=this.O.Wg;b!==a&&(this.O.Wg=a,this.g("mouseOver",b,a))}},mouseHover:{get:function(){return null!==this.O?this.O.Ug:null},set:function(a){al(this);var b=this.O.Ug;b!==a&&(this.O.Ug=a,this.g("mouseHover", b,a))}},mouseHold:{get:function(){return null!==this.O?this.O.Tg:null},set:function(a){al(this);var b=this.O.Tg;b!==a&&(this.O.Tg=a,this.g("mouseHold",b,a))}},mouseDragEnter:{get:function(){return null!==this.O?this.O.Ho:null},set:function(a){al(this);var b=this.O.Ho;b!==a&&(this.O.Ho=a,this.g("mouseDragEnter",b,a))}},mouseDragLeave:{get:function(){return null!==this.O?this.O.Io:null},set:function(a){al(this); @@ -962,7 +962,7 @@ var b=this.O.Io;b!==a&&(this.O.Io=a,this.g("mouseDragLeave",b,a))}},mouseDrop:{g this.O?this.O.Wm:null},set:function(a){al(this);var b=this.O.Wm;b!==a&&(this.O.Wm=a,this.g("actionMove",b,a))}},actionUp:{get:function(){return null!==this.O?this.O.Xm:null},set:function(a){al(this);var b=this.O.Xm;b!==a&&(this.O.Xm=a,this.g("actionUp",b,a))}},actionCancel:{get:function(){return null!==this.O?this.O.Um:null},set:function(a){al(this);var b=this.O.Um;b!==a&&(this.O.Um=a,this.g("actionCancel",b,a))}},toolTip:{ get:function(){return null!==this.O?this.O.qh:null},set:function(a){al(this);var b=this.O.qh;b!==a&&(this.O.qh=a,this.g("toolTip",b,a))}},contextMenu:{get:function(){return null!==this.O?this.O.yg:null},set:function(a){al(this);var b=this.O.yg;b!==a&&(this.O.yg=a,this.g("contextMenu",b,a))}}});Y.prototype.trigger=Y.prototype.fw;Y.prototype.findBindingPanel=Y.prototype.yh;Y.prototype.findTemplateBinder=Y.prototype.Vz;Y.prototype.setProperties=Y.prototype.Hm; Y.prototype.apply=Y.prototype.apply;Y.prototype.attach=Y.prototype.dv;Y.prototype.set=Y.prototype.set;Y.prototype.isEnabledObject=Y.prototype.Af;Y.prototype.isVisibleObject=Y.prototype.Bf;Y.prototype.isContainedBy=Y.prototype.mg;Y.prototype.getNearestIntersectionPoint=Y.prototype.Is;Y.prototype.getLocalPoint=Y.prototype.Hs;Y.prototype.getDocumentScale=Y.prototype.wf;Y.prototype.getDocumentAngle=Y.prototype.Li;Y.prototype.getDocumentBounds=Y.prototype.Mi;Y.prototype.getDocumentPoint=Y.prototype.da; -Y.prototype.intersectsRect=Y.prototype.Ic;Y.prototype.containedInRect=Y.prototype.wh;Y.prototype.containsRect=Y.prototype.De;Y.prototype.containsPoint=Y.prototype.$;Y.prototype.raiseChanged=Y.prototype.g;Y.prototype.raiseChangedEvent=Y.prototype.Va;Y.prototype.addCopyProperty=Y.prototype.yx;var Il=null;Y.className="GraphObject";Il=new I; +Y.prototype.intersectsRect=Y.prototype.Jc;Y.prototype.containedInRect=Y.prototype.wh;Y.prototype.containsRect=Y.prototype.De;Y.prototype.containsPoint=Y.prototype.$;Y.prototype.raiseChanged=Y.prototype.g;Y.prototype.raiseChangedEvent=Y.prototype.Va;Y.prototype.addCopyProperty=Y.prototype.yx;var Il=null;Y.className="GraphObject";Il=new I; Ll("Button",function(){function a(a,b){return null!==a.diagram.Wb(a.documentPoint,function(a){for(;null!==a.panel&&!a.isActionable;)a=a.panel;return a},function(a){return a===b})}var b=Hl(X,X.Auto,{isActionable:!0,enabledChanged:function(a,b){if(a instanceof X){var c=a.Ya("ButtonBorder");null!==c&&(c.fill=b?a._buttonFillNormal:a._buttonFillDisabled)}},cursor:"pointer",_buttonFillNormal:"#F5F5F5",_buttonStrokeNormal:"#BDBDBD",_buttonFillOver:"#E0E0E0",_buttonStrokeOver:"#9E9E9E",_buttonFillPressed:"#BDBDBD", _buttonStrokePressed:"#9E9E9E",_buttonFillDisabled:"#E5E5E5"},Hl(uf,{name:"ButtonBorder",figure:"RoundedRectangle",spot1:new P(0,0,2.76142374915397,2.761423749153969),spot2:new P(1,1,-2.76142374915397,-2.761423749153969),parameter1:2,parameter2:2,fill:"#F5F5F5",stroke:"#BDBDBD"}));b.mouseEnter=function(a,b){if(b.Af()&&b instanceof X&&(a=b.Ya("ButtonBorder"),a instanceof uf)){var c=b._buttonFillOver;b._buttonFillNormal=a.fill;a.fill=c;c=b._buttonStrokeOver;b._buttonStrokeNormal=a.stroke;a.stroke=c}}; b.mouseLeave=function(a,b){b.Af()&&b instanceof X&&(a=b.Ya("ButtonBorder"),a instanceof uf&&(a.fill=b._buttonFillNormal,a.stroke=b._buttonStrokeNormal))};b.actionDown=function(a,b){if(b.Af()&&b instanceof X&&null!==b._buttonFillPressed&&0===a.button){var c=b.Ya("ButtonBorder");if(c instanceof uf){a=a.diagram;var d=a.skipsUndoManager;a.skipsUndoManager=!0;var g=b._buttonFillPressed;b._buttonFillOver=c.fill;c.fill=g;g=b._buttonStrokePressed;b._buttonStrokeOver=c.stroke;c.stroke=g;a.skipsUndoManager= @@ -989,8 +989,8 @@ function wj(a,b){this.ownerDocument=a=void 0===b?x.document:b;this.FA="http://ww wj.prototype.resize=function(a,b,c,d){return this.width!==a||this.height!==b?(this.style.width=c+"px",this.style.height=d+"px",this.La.setAttributeNS(null,"width",c+"px"),this.La.setAttributeNS(null,"height",d+"px"),this.La.setAttributeNS(null,"viewBox","0 0 "+c+" "+d),this.context.Yw.firstElementChild.setAttributeNS(null,"width",c+"px"),this.context.Yw.firstElementChild.setAttributeNS(null,"height",d+"px"),!0):!1}; wj.prototype.Ob=function(a,b,c){a=this.ownerDocument.createElementNS(this.FA,a);if(za(b))for(var d in b)a.setAttributeNS("href"===d?"http://www.w3.org/1999/xlink":"",d,b[d]);void 0!==c&&(a.textContent=c);return a};wj.prototype.getBoundingClientRect=function(){return this.La.getBoundingClientRect()};wj.prototype.focus=function(){this.La.focus()};wj.prototype.Ox=function(){this.ownerDocument=null}; na.Object.defineProperties(wj.prototype,{width:{get:function(){return this.La.width.baseVal.value},set:function(a){this.La.width=a}},height:{get:function(){return this.La.height.baseVal.value},set:function(a){this.La.height=a}},style:{get:function(){return this.La.style}}});wj.className="SVGSurface"; -function Sl(a){this.jt=a;this.svg=a.La;this.stack=[];this.dd=[];this.fillStyle="#000000";this.font="10px sans-serif";this.globalAlpha=1;this.lineCap="butt";this.lineDashOffset=0;this.lineJoin="miter";this.lineWidth=1;this.miterLimit=10;this.shadowBlur=0;this.shadowColor="rgba(0, 0, 0, 0)";this.shadowOffsetY=this.shadowOffsetX=0;this.strokeStyle="#000000";this.textAlign="start";this.clipInsteadOfFill=!1;this.bg=this.fs=this.es=0;this.Rs=null;this.path=[];this.Yt=!1;this.ih=null;this.jh=0;this.Ee=new Ql; -Tl(this,1,0,0,1,0,0);var b=kb++,c=this.Ob("clipPath",{id:"mainClip"+b});c.appendChild(this.Ob("rect",{x:0,y:0,width:a.width,height:a.height}));this.Yw=c;this.jt.La.appendChild(c);this.dd[0].setAttributeNS(null,"clip-path","url(#mainClip"+b+")");this.HA={}}t=Sl.prototype; +function Sl(a){this.jt=a;this.svg=a.La;this.stack=[];this.ed=[];this.fillStyle="#000000";this.font="10px sans-serif";this.globalAlpha=1;this.lineCap="butt";this.lineDashOffset=0;this.lineJoin="miter";this.lineWidth=1;this.miterLimit=10;this.shadowBlur=0;this.shadowColor="rgba(0, 0, 0, 0)";this.shadowOffsetY=this.shadowOffsetX=0;this.strokeStyle="#000000";this.textAlign="start";this.clipInsteadOfFill=!1;this.bg=this.fs=this.es=0;this.Rs=null;this.path=[];this.Yt=!1;this.ih=null;this.jh=0;this.Ee=new Ql; +Tl(this,1,0,0,1,0,0);var b=kb++,c=this.Ob("clipPath",{id:"mainClip"+b});c.appendChild(this.Ob("rect",{x:0,y:0,width:a.width,height:a.height}));this.Yw=c;this.jt.La.appendChild(c);this.ed[0].setAttributeNS(null,"clip-path","url(#mainClip"+b+")");this.HA={}}t=Sl.prototype; t.arc=function(a,b,c,d,e,f,g,h){var k=2*Math.PI,l=k-1E-6,m=c*Math.cos(d),n=c*Math.sin(d),p=a+m,r=b+n,q=f?0:1;d=f?d-e:e-d;(1E-6d&&(d=d%k+k);d>l?(this.path.push(["A",c,c,0,1,q,a-m,b-n]),this.path.push(["A",c,c,0,1,q,p,r])):1E-6=Math.PI),q,a+c*Math.cos(e),b+c*Math.sin(e)])};t.beginPath=function(){this.path=[]};t.bezierCurveTo=function(a,b,c,d,e,f){this.path.push(["C",a,b,c,d,e,f])};t.clearRect=function(){}; t.clip=function(){this.addPath("clipPath",this.path,this.Ee)};t.closePath=function(){this.path.push(["z"])};t.createLinearGradient=function(a,b,c,d){var e=new Rl("linear");e.x1=a;e.y1=b;e.x2=c;e.y2=d;return e}; t.createPattern=function(a){var b="";a instanceof HTMLCanvasElement&&(b=a.toDataURL());a instanceof HTMLImageElement&&(b=a.getAttribute("src"));var c=this.HA;if(c[b])return"url(#"+c[b]+")";var d="PATTERN"+kb++,e={x:0,y:0,width:a.width,height:a.height,href:b};a=this.Ob("pattern",{width:a.width,height:a.height,id:d,patternUnits:"userSpaceOnUse"});a.appendChild(this.Ob(zk,e));this.svg.appendChild(a);c[b]=d;return"url(#"+d+")"}; @@ -1001,38 +1001,38 @@ t.uf=function(){this.clipInsteadOfFill?this.clip():this.fill()};t.fillRect=funct t.moveTo=function(a,b){this.path.push(["M",a,b])};t.quadraticCurveTo=function(a,b,c,d){this.path.push(["Q",a,b,c,d])};t.rect=function(a,b,c,d){this.path.push(["M",a,b],["L",a+c,b],["L",a+c,b+d],["L",a,b+d],["z"])}; t.restore=function(){this.Ee=this.stack.pop();this.path=this.stack.pop();var a=this.stack.pop();this.fillStyle=a.fillStyle;this.font=a.font;this.globalAlpha=a.globalAlpha;this.lineCap=a.lineCap;this.lineDashOffset=a.lineDashOffset;this.lineJoin=a.lineJoin;this.lineWidth=a.lineWidth;this.miterLimit=a.miterLimit;this.shadowBlur=a.shadowBlur;this.shadowColor=a.shadowColor;this.shadowOffsetX=a.shadowOffsetX;this.shadowOffsetY=a.shadowOffsetY;this.strokeStyle=a.strokeStyle;this.textAlign=a.textAlign}; t.save=function(){this.stack.push({fillStyle:this.fillStyle,font:this.font,globalAlpha:this.globalAlpha,lineCap:this.lineCap,lineDashOffset:this.lineDashOffset,lineJoin:this.lineJoin,lineWidth:this.lineWidth,miterLimit:this.miterLimit,shadowBlur:this.shadowBlur,shadowColor:this.shadowColor,shadowOffsetX:this.shadowOffsetX,shadowOffsetY:this.shadowOffsetY,strokeStyle:this.strokeStyle,textAlign:this.textAlign});for(var a=[],b=0;bb.offset?1:-1});for(e=0;eg.width+g.x||g.x> k.width+k.x||n>g.height+g.y||g.y>k.height+k.y)return!0;k=!0;Tl(a,1,0,0,1,0,0);a.save();a.beginPath();a.rect(m,n,p,l);a.clip()}if(this.Ri()&&!this.isVisible())return!0;a.Ee.Ma=[1,0,0,1,0,0];(this instanceof Lg&&1b?(this.scale(b/a,1),this.translate((a-b)/2,0)):b>a&&(this.scale(1,a/b),this.translate(0,(b-a)/2));this.hn?this.clip():this.fill();a>b?(this.translate(-(a-b)/2,0),this.scale(1/(b/a),1)):b>a&&(this.translate(0,-(b-a)/2),this.scale(1,1/(a/b)))}else this.hn?this.clip():this.fill()};t.Xi=function(){this.hn||this.stroke()};t.bw=function(a,b,c){this.es=a;this.fs=b;this.bg=c}; t.As=function(a,b){var c=this.Y;void 0!==c.setLineDash&&(c.setLineDash(a),c.lineDashOffset=b)};t.ys=function(){var a=this.Y;void 0!==a.setLineDash&&(a.setLineDash(Wl),a.lineDashOffset=0)};t.Ec=function(a){a&&(this.yt="");this.xt=this.zt=""}; na.Object.defineProperties(ul.prototype,{fillStyle:{get:function(){return this.Y.fillStyle},set:function(a){this.xt!==a&&(this.xt=this.Y.fillStyle=a)}},font:{get:function(){return this.Y.font},set:function(a){this.yt!==a&&(this.yt=this.Y.font=a)}},globalAlpha:{get:function(){return this.Y.globalAlpha},set:function(a){this.Y.globalAlpha=a}},lineCap:{get:function(){return this.Y.lineCap}, set:function(a){this.Y.lineCap=a}},lineDashOffset:{get:function(){return this.Y.lineDashOffset},set:function(a){this.Y.lineDashOffset=a}},lineJoin:{get:function(){return this.Y.lineJoin},set:function(a){this.Y.lineJoin=a}},lineWidth:{get:function(){return this.Y.lineWidth},set:function(a){this.Y.lineWidth=a}},miterLimit:{get:function(){return this.Y.miterLimit},set:function(a){this.Y.miterLimit= a}},shadowBlur:{get:function(){return this.Y.shadowBlur},set:function(a){this.Y.shadowBlur=a}},shadowColor:{get:function(){return this.Y.shadowColor},set:function(a){this.Y.shadowColor=a}},shadowOffsetX:{get:function(){return this.Y.shadowOffsetX},set:function(a){this.Y.shadowOffsetX=a}},shadowOffsetY:{get:function(){return this.Y.shadowOffsetY},set:function(a){this.Y.shadowOffsetY= a}},strokeStyle:{get:function(){return this.Y.strokeStyle},set:function(a){this.zt!==a&&(this.zt=this.Y.strokeStyle=a)}},textAlign:{get:function(){return this.Y.textAlign},set:function(a){this.Y.textAlign=a}},imageSmoothingEnabled:{get:function(){return this.Y.imageSmoothingEnabled},set:function(a){this.Y.imageSmoothingEnabled=a}},clipInsteadOfFill:{get:function(){return this.hn}, -set:function(a){this.hn=a}}});var Wl=Object.freeze([]);ul.className="CanvasSurfaceContext";function Xl(){this.M=this.o=this.C=this.j=0}Xl.className="ColorNumbers";function ml(a,b){Yl||(Zl(),Yl=!0);Ta(this);this.v=!1;void 0===a?(this.ia=tl,this.Ok="black"):"string"===typeof a?(this.ia=tl,this.Ok=a):(this.ia=a,this.Ok="black");a=this.ia;a===wl?(this.zd=vc,this.bl=Bc):this.bl=a===nl?this.zd=yc:this.zd=rc;this.js=0;this.jr=NaN;this.ke=this.Ur=this.je=null;this.At=this.Pk=0;b&&Object.assign(this,b)} -ml.prototype.copy=function(){var a=new ml;a.ia=this.ia;a.Ok=this.Ok;a.zd=this.zd.I();a.bl=this.bl.I();a.js=this.js;a.jr=this.jr;null!==this.je&&(a.je=this.je.copy());a.Ur=this.Ur;return a};t=ml.prototype;t.freeze=function(){this.v=!0;null!==this.je&&this.je.freeze();return this};t.ea=function(){Object.isFrozen(this)&&C("cannot thaw constant: "+this);this.v=!1;null!==this.je&&this.je.ea();return this};t.gb=function(a){a.classType===ml&&(this.type=a)}; +set:function(a){this.hn=a}}});var Wl=Object.freeze([]);ul.className="CanvasSurfaceContext";function Xl(){this.M=this.o=this.C=this.j=0}Xl.className="ColorNumbers";function ml(a,b){Yl||(Zl(),Yl=!0);Ta(this);this.v=!1;void 0===a?(this.ia=tl,this.Ok="black"):"string"===typeof a?(this.ia=tl,this.Ok=a):(this.ia=a,this.Ok="black");a=this.ia;a===wl?(this.Ad=vc,this.bl=Bc):this.bl=a===nl?this.Ad=yc:this.Ad=rc;this.js=0;this.jr=NaN;this.ke=this.Ur=this.je=null;this.At=this.Pk=0;b&&Object.assign(this,b)} +ml.prototype.copy=function(){var a=new ml;a.ia=this.ia;a.Ok=this.Ok;a.Ad=this.Ad.I();a.bl=this.bl.I();a.js=this.js;a.jr=this.jr;null!==this.je&&(a.je=this.je.copy());a.Ur=this.Ur;return a};t=ml.prototype;t.freeze=function(){this.v=!0;null!==this.je&&this.je.freeze();return this};t.ea=function(){Object.isFrozen(this)&&C("cannot thaw constant: "+this);this.v=!1;null!==this.je&&this.je.ea();return this};t.gb=function(a){a.classType===ml&&(this.type=a)}; t.toString=function(){var a="Brush(";if(this.type===tl)a+=this.color;else if(a=this.type===wl?a+"Linear ":this.type===nl?a+"Radial ":this.type===vl?a+"Pattern ":a+"(unknown) ",a+=this.start+" "+this.end,null!==this.colorStops)for(var b=this.colorStops.iterator;b.next();)a+=" "+b.key+":"+b.value;return a+")"}; t.addColorStop=function(a,b){this.v&&wa(this);("number"!==typeof a||!isFinite(a)||1a)&&xa(a,"0 <= loc <= 1",ml,"addColorStop:loc");null===this.je&&(this.je=new I);this.je.add(a,b);this.ia===tl&&(this.type=wl);this.ke=null;return this}; t.yA=function(a,b){this.v&&wa(this);a=void 0===a||"number"!==typeof a?.2:a;b=void 0===b?$l:b;if(this.type===tl)Ph(this.color),this.color=am(a,b);else if((this.type===wl||this.type===nl)&&null!==this.colorStops)for(var c=this.colorStops.iterator;c.next();)Ph(c.value),this.addColorStop(c.key,am(a,b));return this};function bm(a,b,c){b=void 0===b||"number"!==typeof b?.2:b;c=void 0===c?$l:c;Ph(a);return am(b,c)} @@ -1045,8 +1045,8 @@ hm.C+.041556*hm.o;b=.0556434*hm.j+-.2040259*hm.C+1.0572252*hm.o;em.j=255*om((3.2 Rh.M+")";default:C("Unknown color space: "+b)}}function Ph(a){Yl||(Zl(),Yl=!0);var b=qm;if(null!==b){b.clearRect(0,0,1,1);b.fillStyle="#000000";var c=b.fillStyle;b.fillStyle=a;b.fillStyle!==c?(b.fillRect(0,0,1,1),a=b.getImageData(0,0,1,1).data,em.j=a[0],em.C=a[1],em.o=a[2],em.M=a[3]/255):(b.fillStyle="#FFFFFF",b.fillStyle=a,em.j=0,em.C=0,em.o=0,em.M=1)}} function Qh(){var a=em.j/255,b=em.C/255,c=em.o/255,d=Math.max(a,b,c),e=Math.min(a,b,c),f=d-e;e=(d+e)/2;if(0===f)var g=a=0;else{switch(d){case a:g=(b-c)/f%6;break;case b:g=(c-a)/f+2;break;case c:g=(a-b)/f+4}g*=60;0>g&&(g+=360);a=f/(1-Math.abs(2*e-1))}Rh.j=Math.round(g);Rh.C=Math.round(100*a);Rh.o=Math.round(100*e);Rh.M=em.M}function gm(a){a/=255;return.04045>=a?a/12.92:Math.pow((a+.055)/1.055,2.4)}function om(a){return.0031308>=a?12.92*a:1.055*Math.pow(a,1/2.4)-.055} function im(a){return a>nm?Math.pow(a,1/3):(mm*a+16)/116}function lm(a){var b=a*a*a;return b>nm?b:(116*a-16)/mm}function Nl(a,b){"string"!==typeof a&&(a instanceof ml||C("Value for "+b+" must be a color string or a Brush, not "+a))}function Zl(){qm=Jg?(new Ak(null)).context:null} -na.Object.defineProperties(ml.prototype,{type:{get:function(){return this.ia},set:function(a){this.v&&wa(this,a);this.ia=a;this.start.wc()&&(a===wl?this.start=vc:a===nl&&(this.start=yc));this.end.wc()&&(a===wl?this.end=Bc:a===nl&&(this.end=yc));this.ke=null}},color:{get:function(){return this.Ok},set:function(a){this.v&&wa(this,a);this.Ok=a;this.ke=null}},start:{get:function(){return this.zd},set:function(a){this.v&& -wa(this,a);this.zd=a.I();this.ke=null}},end:{get:function(){return this.bl},set:function(a){this.v&&wa(this,a);this.bl=a.I();this.ke=null}},startRadius:{get:function(){return this.js},set:function(a){this.v&&wa(this,a);0>a&&xa(a,">= zero",ml,"startRadius");this.js=a;this.ke=null}},endRadius:{get:function(){return this.jr},set:function(a){this.v&&wa(this,a);0>a&&xa(a,">= zero",ml,"endRadius");this.jr=a;this.ke= +na.Object.defineProperties(ml.prototype,{type:{get:function(){return this.ia},set:function(a){this.v&&wa(this,a);this.ia=a;this.start.wc()&&(a===wl?this.start=vc:a===nl&&(this.start=yc));this.end.wc()&&(a===wl?this.end=Bc:a===nl&&(this.end=yc));this.ke=null}},color:{get:function(){return this.Ok},set:function(a){this.v&&wa(this,a);this.Ok=a;this.ke=null}},start:{get:function(){return this.Ad},set:function(a){this.v&& +wa(this,a);this.Ad=a.I();this.ke=null}},end:{get:function(){return this.bl},set:function(a){this.v&&wa(this,a);this.bl=a.I();this.ke=null}},startRadius:{get:function(){return this.js},set:function(a){this.v&&wa(this,a);0>a&&xa(a,">= zero",ml,"startRadius");this.js=a;this.ke=null}},endRadius:{get:function(){return this.jr},set:function(a){this.v&&wa(this,a);0>a&&xa(a,">= zero",ml,"endRadius");this.jr=a;this.ke= null}},colorStops:{get:function(){return this.je},set:function(a){this.v&&wa(this,a);this.je=a;this.ke=null}},pattern:{get:function(){return this.Ur},set:function(a){this.v&&wa(this,a);this.Ur=a;this.ke=null}}});ml.prototype.isDark=ml.prototype.jy;ml.prototype.darkenBy=ml.prototype.Az;ml.prototype.lightenBy=ml.prototype.yA;ml.prototype.addColorStop=ml.prototype.addColorStop; var nm=216/24389,mm=24389/27,jm=[95.047,100,108.883],qm=null,em=new Xl,Rh=new Xl,hm=new Xl,km=new Xl,Yl=!1;ml.className="Brush";var tl;ml.Solid=tl=new D(ml,"Solid",0);var wl;ml.Linear=wl=new D(ml,"Linear",1);var nl;ml.Radial=nl=new D(ml,"Radial",2);var vl;ml.Pattern=vl=new D(ml,"Pattern",4);var $l;ml.Lab=$l=new D(ml,"Lab",5);var pm;ml.HSL=pm=new D(ml,"HSL",6); ml.randomColor=function(a,b){void 0===a&&(a=128);void 0===b&&(b=Math.max(a,255));var c=Math.abs(b-a);b=Math.floor(a+Math.random()*c).toString(16);var d=Math.floor(a+Math.random()*c).toString(16);a=Math.floor(a+Math.random()*c).toString(16);2>b.length&&(b="0"+b);2>d.length&&(d="0"+d);2>a.length&&(a="0"+a);return"#"+b+d+a}; @@ -1077,29 +1077,29 @@ Math.abs(y.offsetY)+q;u=k.stretch;u===Uk&&(u=hl(k,!1));switch(u){case og:g=f=0;b xm.prototype.arrange=function(a,b){var c=b.length,d=a.nb(),e=d.measuredBounds,f=N.alloc();f.h(0,0,1,1);var g=d.margin,h=g.left;g=g.top;var k=a.padding,l=k.left;k=k.top;d.arrange(l+h,k+g,e.width,e.height);var m=ym(d),n=zm(d),p=m.y*e.height+m.offsetY,r=n.x*e.width+n.offsetX;n=n.y*e.height+n.offsetY;f.x=m.x*e.width+m.offsetX;f.y=p;$b(f,r,n,0,0);f.x+=h+l;f.y+=g+k;for(e=0;eS&&(Ha=Math.max(S-tc,0));var fg=0===H.ga;H.$b=H.$b+Ha;H.actual=H.ga+Ha;S=Math.max(S-(Ha+(fg?tc:0)),0)}if(1===sb.columnSpan&&(eb===og|| -eb===Wk)){H=a.getColumnDefinition(Rb);var rh=H.Fc();Ha=Math.max(kc-H.actual,0);Ha+rh>K&&(Ha=Math.max(K-rh,0));var wn=0===H.ga;H.$b=H.$b+Ha;H.actual=H.ga+Ha;K=Math.max(K-(Ha+(wn?rh:0)),0)}he&&sb.mk()}}}}}Ia(z);var Gd=0,ie=0;f=a.columnCount;for(var gg=0;ggS&&(Ha=Math.max(S-tc,0));var fg=0===H.ga;H.$b=H.$b+Ha;H.actual=H.ga+Ha;S=Math.max(S-(Ha+(fg?tc:0)),0)}if(1===sb.columnSpan&&(bb===og|| +bb===Wk)){H=a.getColumnDefinition(Rb);var rh=H.Gc();Ha=Math.max(kc-H.actual,0);Ha+rh>K&&(Ha=Math.max(K-rh,0));var wn=0===H.ga;H.$b=H.$b+Ha;H.actual=H.ga+Ha;K=Math.max(K-(Ha+(wn?rh:0)),0)}he&&sb.mk()}}}}}Ia(z);var Gd=0,ie=0;f=a.columnCount;for(var gg=0;gg=a.rowCount);Cf++)H=a.getRowDefinition(Na.row+Cf),Ha=0,Ha=eb===sd||eb===Wk?Math.max(H.minimum,0===ke[Na.row+Cf]?H.maximum:Math.min(ke[Na.row+Cf],H.maximum)):Math.max(H.minimum,isNaN(H.rc)?H.maximum:Math.min(H.rc,H.maximum)),Qc.height+=Ha,Ld+=H.minimum;for(var nd=1;nd=a.columnCount);nd++)H=a.getColumnDefinition(Na.column+ -nd),Ha=0,Ha=eb===sd||eb===Vk?Math.max(H.minimum,0===md[Na.column+nd]?H.maximum:Math.min(md[Na.column+nd],H.maximum)):Math.max(H.minimum,isNaN(H.rc)?H.maximum:Math.min(H.rc,H.maximum)),Qc.width+=Ha,vh+=H.minimum;bb.width+=Qc.width;bb.height+=Qc.height;var Df=Na.margin,zi=Df.right+Df.left,me=Df.top+Df.bottom;Na.measure(bb.width,bb.height,vh,Ld);for(var ig=Na.measuredBounds,Ef=Math.max(ig.width+zi,0),Ai=Math.max(ig.height+me,0),Ze=0,Zc=0;Zc=a.rowCount);Zc++)H=a.getRowDefinition(Na.row+ +0;Bf=a.rowCount);Cf++)H=a.getRowDefinition(Na.row+Cf),Ha=0,Ha=bb===sd||bb===Wk?Math.max(H.minimum,0===ke[Na.row+Cf]?H.maximum:Math.min(ke[Na.row+Cf],H.maximum)):Math.max(H.minimum,isNaN(H.rc)?H.maximum:Math.min(H.rc,H.maximum)),Qc.height+=Ha,Ld+=H.minimum;for(var nd=1;nd=a.columnCount);nd++)H=a.getColumnDefinition(Na.column+ +nd),Ha=0,Ha=bb===sd||bb===Vk?Math.max(H.minimum,0===md[Na.column+nd]?H.maximum:Math.min(md[Na.column+nd],H.maximum)):Math.max(H.minimum,isNaN(H.rc)?H.maximum:Math.min(H.rc,H.maximum)),Qc.width+=Ha,vh+=H.minimum;cb.width+=Qc.width;cb.height+=Qc.height;var Df=Na.margin,zi=Df.right+Df.left,me=Df.top+Df.bottom;Na.measure(cb.width,cb.height,vh,Ld);for(var ig=Na.measuredBounds,Ef=Math.max(ig.width+zi,0),Ai=Math.max(ig.height+me,0),Ze=0,Zc=0;Zc=a.rowCount);Zc++)H=a.getRowDefinition(Na.row+ Zc),Ze+=H.total||0;if(Ze=od)&&!(Na.row+ne>=a.rowCount);ne++){H=a.getRowDefinition(Na.row+ne);var zd=H.ga||0,fk=Gf(Na,H,Ff);H.actual=Math.min(H.maximum,zd+fk);H.ga!==zd&&(od-=H.ga-zd)}for(;0Ge&&(H.actual=Math.min(H.maximum,Ge+od),H.ga!==Ge&&(od-=H.ga-Ge));if(0===H.index)break;H=a.getRowDefinition(H.index-1)}}for(var wh=0,xh=0;xh=a.columnCount);xh++)H=a.getColumnDefinition(Na.column+xh),wh+=H.total||0;if(wh=$c)&&!(Na.column+yh>=a.columnCount);yh++){H=a.getColumnDefinition(Na.column+yh);var yn=H.ga||0,Wt=xn(Na,H,Bi);H.actual=Math.min(H.maximum,yn+Wt);H.ga!==yn&&($c-=H.ga-yn)}for(;0<$c;){var gk=H.ga||0;isNaN(H.width)&&H.maximum>gk&&(H.actual=Math.min(H.maximum,gk+$c),H.ga!==gk&&($c-=H.ga-gk));if(0=== -H.index)break;H=a.getColumnDefinition(H.index-1)}}}}Ia(y);M.free(Qc);M.free(bb);void 0!==ke&&Ia(ke);void 0!==md&&Ia(md);var jg=0,kg=0,hk=a.desiredSize,fr=a.maxSize;eb=hl(a,!0);var Ci=ie=Gd=0,Di=0;f=a.columnCount;for(var ik=0;ik=a.rowCount);R++){var O=a.getRowDefinition(v+ -R);0!==O.ga&&(u.height+=O.total)}for(R=1;R=a.columnCount);R++)O=a.getColumnDefinition(z+R),0!==O.ga&&(u.width+=O.total);var H=y.ga+u.width,da=w.ga+u.height;R=h;O=k;var ba=H,ra=da,Ca=h,cb=k,db=H,Ha=da;h+H>c.width&&(db=Math.max(c.width-h,0));k+da>c.height&&(Ha=Math.max(c.height-k,0));var zb=K.alignment;if(zb.Lb()){zb=a.defaultAlignment;zb.hb()||(zb=yc);var Db=zb.x;var Yc=zb.y;var Rb=zb.offsetX;zb=zb.offsetY;var jc=y.alignment,Ec=w.alignment;jc.hb()&&(Db=jc.x,Rb=jc.offsetX);Ec.hb()&& +R);0!==O.ga&&(u.height+=O.total)}for(R=1;R=a.columnCount);R++)O=a.getColumnDefinition(z+R),0!==O.ga&&(u.width+=O.total);var H=y.ga+u.width,da=w.ga+u.height;R=h;O=k;var ba=H,ra=da,Ca=h,db=k,eb=H,Ha=da;h+H>c.width&&(eb=Math.max(c.width-h,0));k+da>c.height&&(Ha=Math.max(c.height-k,0));var zb=K.alignment;if(zb.Lb()){zb=a.defaultAlignment;zb.hb()||(zb=yc);var Db=zb.x;var Yc=zb.y;var Rb=zb.offsetX;zb=zb.offsetY;var jc=y.alignment,Ec=w.alignment;jc.hb()&&(Db=jc.x,Rb=jc.offsetX);Ec.hb()&& (Yc=Ec.y,zb=Ec.offsetY)}else Db=zb.x,Yc=zb.y,Rb=zb.offsetX,zb=zb.offsetY;if(isNaN(Db)||isNaN(Yc))Yc=Db=.5,zb=Rb=0;jc=S.width;Ec=S.height;var ge=K.margin,xf=ge.left+ge.right,sb=ge.top+ge.bottom,he=Al(K,w,y,!1);!isNaN(K.desiredSize.width)||he!==sd&&he!==Vk||(jc=Math.max(H-xf,0));!isNaN(K.desiredSize.height)||he!==sd&&he!==Wk||(Ec=Math.max(da-sb,0));H=K.maxSize;da=K.minSize;jc=Math.min(H.width,jc);Ec=Math.min(H.height,Ec);jc=Math.max(da.width,jc);Ec=Math.max(da.height,Ec);H=Ec+sb;R+=ba*Db-(jc+xf)*Db+ -Rb+ge.left;O+=ra*Yc-H*Yc+zb+ge.top;K.visible&&(ac(Ca,cb,db,Ha,R,O,S.width,S.height)?K.arrange(R,O,jc,Ec):K.arrange(R,O,jc,Ec,new N(Ca,cb,db,Ha)))}}M.free(u);for(a=0;ab)return a%b===c;if(a%b!==c)return!1;b=d.length;for(var e=0;en)z.measure(Infinity,Infinity,0,0),y=z.measuredBounds,b.Nc(y),q.push(y);else{var A=z.segmentIndex,B=z.segmentFraction,F=z.alignmentFocus;F.wc()&&(F=yc);var K=z.segmentOrientation,S=z.segmentOffset;if(isNaN(A)){var R=h.ma;y=Fa();R.vv(B,y);var O=J.allocAt(y[0],y[1]);O.add(h.i(0)); +k&&(Jm(a,p,r,k),g=k.measuredBounds,b.Oc(g),q.push(g));g=qd.alloc();for(var u=J.alloc(),v=J.alloc(),w=0;wn)z.measure(Infinity,Infinity,0,0),y=z.measuredBounds,b.Oc(y),q.push(y);else{var A=z.segmentIndex,B=z.segmentFraction,F=z.alignmentFocus;F.wc()&&(F=yc);var K=z.segmentOrientation,S=z.segmentOffset;if(isNaN(A)){var R=h.ma;y=Fa();R.vv(B,y);var O=J.allocAt(y[0],y[1]);O.add(h.i(0)); R.type===Q.j?O.offset(-R.startX,-R.startY):(R=R.figures.first(),null!==R&&O.offset(-R.startX,-R.startY));R=y[2];if(K!==Vf){var H=h.computeAngle(z,K,R);z.xb=H}H=O.x-l.x;var da=O.y-l.y;J.free(O);Ia(y)}else if(A<-n||A>=n)y=J.alloc(),h.pg(),h.computeMidPoint(y),R=h.midAngle,K!==Vf&&(H=h.computeAngle(z,K,R),z.xb=H),H=y.x-l.x,da=y.y-l.y,J.free(y);else{H=0;0<=A?(da=m.J(A),y=Aba+10?0<=A?R.Oa(da):da.Oa(R):ba>O+10?0<=A?y.Oa(H):H.Oa(y):0<=A?R.Oa(H):H.Oa(R)}else R=0<=A?da.Oa(y):y.Oa(da);K!==Vf&&(H=h.computeAngle(z,K,R),z.xb=H);H=da.x+(y.x-da.x)*B-l.x;da=da.y+(y.y-da.y)*B-l.y}z.measure(Infinity,Infinity,0,0);y=z.measuredBounds;O=z.naturalBounds;var ra=0;z instanceof uf&&(ra=z.strokeWidth);ba=O.width+ra;var Ca=O.height+ra;g.reset();g.translate(-y.x,-y.y);g.scale(z.scale,z.scale);g.rotate(K===Vf?z.angle:R,ba/2,Ca/2);K!==Km&&K!== -Lm||g.rotate(90,ba/2,Ca/2);K!==Mm&&K!==Nm||g.rotate(-90,ba/2,Ca/2);K===Om&&(45R||225R)&&g.rotate(-R,ba/2,Ca/2);O=new N(0,0,ba,Ca);u.Ui(O,F);g.ya(u);F=-u.x+ra/2*z.scale;z=-u.y+ra/2*z.scale;v.assign(S);ra=isNaN(S.x);var cb=isNaN(S.y);if(ra||cb){ba=ba/2+3;Ca=Ca/2+3;var db=45<=R&&135>=R,Ha=225<=R&&315>=R;K===Vf&&(db||Ha)?(v.x=cb?ba:S.y,v.y=ra?Ca:S.x,db?0<=A||isNaN(A)&&.5>B||!ra||(v.y=-Ca):Ha&&((0<=A||isNaN(A)&&.5>B)&&ra&&(v.y=-Ca),cb&&(v.x=-ba))):(ra&&(v.x=0<=A||isNaN(A)&&.5>B?ba:-ba), -cb&&(v.y=-Ca),v.rotate(R))}else v.rotate(R);H+=v.x;da+=v.y;O.set(y);O.h(H+F,da+z,y.width,y.height);q.push(O);b.Nc(O)}}if(null!==f)for(d=f.labelNodes;d.next();)d.value.measure(Infinity,Infinity);a.dg=b;a=a.location;a.h(a.x+b.x,a.y+b.y);Tb(e,b.width||0,b.height||0);qd.free(g);J.free(u);J.free(v)}}}}; +H=1ba+10?0<=A?R.Ra(da):da.Ra(R):ba>O+10?0<=A?y.Ra(H):H.Ra(y):0<=A?R.Ra(H):H.Ra(R)}else R=0<=A?da.Ra(y):y.Ra(da);K!==Vf&&(H=h.computeAngle(z,K,R),z.xb=H);H=da.x+(y.x-da.x)*B-l.x;da=da.y+(y.y-da.y)*B-l.y}z.measure(Infinity,Infinity,0,0);y=z.measuredBounds;O=z.naturalBounds;var ra=0;z instanceof uf&&(ra=z.strokeWidth);ba=O.width+ra;var Ca=O.height+ra;g.reset();g.translate(-y.x,-y.y);g.scale(z.scale,z.scale);g.rotate(K===Vf?z.angle:R,ba/2,Ca/2);K!==Km&&K!== +Lm||g.rotate(90,ba/2,Ca/2);K!==Mm&&K!==Nm||g.rotate(-90,ba/2,Ca/2);K===Om&&(45R||225R)&&g.rotate(-R,ba/2,Ca/2);O=new N(0,0,ba,Ca);u.Ui(O,F);g.ya(u);F=-u.x+ra/2*z.scale;z=-u.y+ra/2*z.scale;v.assign(S);ra=isNaN(S.x);var db=isNaN(S.y);if(ra||db){ba=ba/2+3;Ca=Ca/2+3;var eb=45<=R&&135>=R,Ha=225<=R&&315>=R;K===Vf&&(eb||Ha)?(v.x=db?ba:S.y,v.y=ra?Ca:S.x,eb?0<=A||isNaN(A)&&.5>B||!ra||(v.y=-Ca):Ha&&((0<=A||isNaN(A)&&.5>B)&&ra&&(v.y=-Ca),db&&(v.x=-ba))):(ra&&(v.x=0<=A||isNaN(A)&&.5>B?ba:-ba), +db&&(v.y=-Ca),v.rotate(R))}else v.rotate(R);H+=v.x;da+=v.y;O.set(y);O.h(H+F,da+z,y.width,y.height);q.push(O);b.Oc(O)}}if(null!==f)for(d=f.labelNodes;d.next();)d.value.measure(Infinity,Infinity);a.dg=b;a=a.location;a.h(a.x+b.x,a.y+b.y);Tb(e,b.width||0,b.height||0);qd.free(g);J.free(u);J.free(v)}}}}; Im.prototype.arrange=function(a,b){var c=b.length;if(a instanceof we||a instanceof U){var d=a,e=null;a instanceof we&&(e=a,d=e.adornedPart);var f=a instanceof we?null:d.path,g=a.j;if(0!==g.length){var h=0;if(null!==f&&h=c)q=J.alloc(),r=n,v=q,r.pg(),r.computeMidPoint(v),r=n.midAngle,l!==Vf&&(n=n.computeAngle(g,l,r),g.angle=n),n=q.x,v=q.y, -J.free(q);else{u=0;0<=h?(q=b.m[h],v=hz+10?0<=h?r.Oa(q):q.Oa(r):z>w+10?0<=h?v.Oa(u):u.Oa(v):0<=h?r.Oa(u):u.Oa(r)}else r=0<=h?q.Oa(v):v.Oa(q);l!==Vf&&(n=n.computeAngle(g,l,r),g.angle=n);n=q.x+(v.x-q.x)*k;v=q.y+(v.y-q.y)*k}if(p.Qs())g.location=new J(n,v);else{p.wc()&&(p=yc);q=qd.alloc();q.reset();q.scale(g.scale,g.scale);q.rotate(g.angle, +J.free(q);else{u=0;0<=h?(q=b.m[h],v=hz+10?0<=h?r.Ra(q):q.Ra(r):z>w+10?0<=h?v.Ra(u):u.Ra(v):0<=h?r.Ra(u):u.Ra(r)}else r=0<=h?q.Ra(v):v.Ra(q);l!==Vf&&(n=n.computeAngle(g,l,r),g.angle=n);n=q.x+(v.x-q.x)*k;v=q.y+(v.y-q.y)*k}if(p.Qs())g.location=new J(n,v);else{p.wc()&&(p=yc);q=qd.alloc();q.reset();q.scale(g.scale,g.scale);q.rotate(g.angle, 0,0);var y=g.naturalBounds;u=N.allocAt(0,0,y.width,y.height);w=J.alloc();w.Ui(u,p);q.ya(w);p=-w.x;z=-w.y;var A=y.width,B=y.height;y=J.alloc();y.assign(m);var F=isNaN(m.x),K=isNaN(m.y);if(F||K){A=A/2+3;B=B/2+3;var S=45<=r&&135>=r,R=225<=r&&315>=r;l===Vf&&(S||R)?(y.x=K?A:m.y,y.y=F?B:m.x,S?0<=h||isNaN(h)&&.5>k||!F||(y.y=-B):R&&((0<=h||isNaN(h)&&.5>k)&&F&&(y.y=-B),K&&(y.x=-A))):(F&&(y.x=0<=h||isNaN(h)&&.5>k?A:-A),K&&(y.y=-B),y.rotate(r))}else y.rotate(r);n+=y.x;v+=y.y;q.Jq(u);p+=u.x;z+=u.y;h=J.allocAt(n+ p,v+z);g.move(h);J.free(h);J.free(y);J.free(w);N.free(u);qd.free(q)}}null!==e?e.sk(!1):d.sk(!1)}}; function Jm(a,b,c,d){if(!1!==mj(d)){var e=d.strokeWidth;0===e&&a instanceof we&&a.type===X.Link&&a.adornedObject instanceof uf&&(e=a.adornedObject.strokeWidth);e*=d.sa;a instanceof U&&null!==a.ma?(a=a.ma.bounds,d.ue(a.x-e/2,a.y-e/2,a.width+e,a.height+e)):a instanceof we&&null!==a.adornedPart.ma?(a=a.adornedPart.ma.bounds,d.ue(a.x-e/2,a.y-e/2,a.width+e,a.height+e)):d.ue(-(e/2),-(e/2),b+e,c+e);hj(d,!1)}}function Pm(){this.na="Base"}ma(Pm,Kl); Pm.prototype.measure=function(a,b,c,d,e,f,g){var h=a.nb();a.Kg=[];var k=h.margin,l=k.right+k.left,m=k.top+k.bottom;h.measure(b,c,f,g);var n=h.measuredBounds,p=new N(-k.left,-k.top,Math.max(n.width+l,0),Math.max(n.height+m,0));a.Kg.push(p);e.assign(p);for(var r=h.geometry,q=h.strokeWidth,u=r.flattenedSegments,v=r.flattenedLengths,w=r.flattenedTotalLength,z=u.length,y=0,A=0,B=Fa(),F=0;Fba&&(ba+=360);S.push(ba)}y=H;A=da}B.push(S)}if(null===a.Nf){for(var ra=[],Ca=a.T.m,cb=Ca.length,db=0;dbDb))for(var Yc=0;YcDb&&zb.push(jc)}}}}a.Nf=ra}var Ec=a.Nf;var ge=a.T.m,xf=ge.length,sb=0,he=0,dg=w;a.tj=[];for(var ph,qh=0;qhbk*ti*w/a.graduatedRange)){var eg=v[0][0],ld=0,kc=0;he=w*eb.graduatedStart-1E-4;dg=w*eb.graduatedEnd+1E-4;var yf=bk*ti,tc=a.graduatedTickBase;if(tca.graduatedMin+yf&&(tc-=Math.floor((tc-a.graduatedMin)/yf)*yf);for(var rh=Ec[qh],wn=tc,Gd=1;tcw&&(sb=w),he<=sb&&sb<=dg)){for(var Hd=B[ld][kc],yd=v[ld][kc];ldeg&&kcec&&.4995ec?0ec||.9995vi){var ck=1-Math.abs(.5-ec);Hd=(je*ck+Pc*(1-ck))%360;break a}}}Hd=je}if(eb instanceof Lg){var Id="";null!== -eb.graduatedFunction?(Id=eb.graduatedFunction(tc),Id=null!==Id&&void 0!==Id?Id.toString():""):Id=(+tc.toFixed(2)).toString();""!==Id&&ph.push({tm:ui,angle:Hd,text:Id})}else ph.push({tm:ui,angle:Hd})}tc=wn+Gd*yf}}}a.tj.push(ph)}Ia(B);var uh=a.tj;if(null!==uh)for(var zf=d.length,bb=0;bbBf;Bf++){switch(Bf){case 0:fc.h(Xe,Ye);break;case 1:fc.h(Xe+wi,Ye);break;case 2:fc.h(Xe,Ye+xi);break;case 3:fc.h(Xe+wi,Ye+xi)}fc.rotate(ek+Eb.angle);fc.offset(dk,Af);0===md&&0===Bf?Qc.h(fc.x,fc.y,0,0):Qc.Le(fc);fc.offset(-dk,-Af);fc.rotate(-ek-Eb.angle)}J.free(fc);null!==lc.Kg&& -lc.Kg.push(Qc);$b(uc,Qc.x,Qc.y,Qc.width,Qc.height)}else if(Eb instanceof Lg){var Na=a,Kd=e;null===Na.mh&&(Na.mh=new Lg);var qb=Na.mh;Qm(qb,Eb);var vh=Eb.alignmentFocus;vh.wc()&&(vh=vc);for(var Ld=Eb.segmentOrientation,Cf=Eb.segmentOffset,nd=new N,Df=0,zi=0,me=0,ig=0,Ef=0,Ai=Fb.length,Ze=0;Zeme||225me)&&zd.rotate(-me,Gf/2,ne/2);var fk=N.allocAt(0,0,Gf,ne),Ge=J.alloc();Ge.Ui(fk,vh);zd.ya(Ge);var wh=-Ge.x,xh=-Ge.y,$c=J.alloc();$c.assign(Cf);isNaN($c.x)&&($c.x=Gf/2+3);isNaN($c.y)&&($c.y=-(ne/2+3));$c.rotate(me); -Df+=$c.x+wh;zi+=$c.y+xh;var Bi=new N(Df,zi,od.width,od.height),xn=new N(od.x,od.y,od.width,od.height),yh=new N(Ff.x,Ff.y,Ff.width,Ff.height);Zc.wA=ig;Zc.lineCount=qb.lineCount;Zc.lines=[qb.qb,qb.di,qb.oe,qb.ze,qb.zc,qb.Pb,qb.me];Zc.actualBounds=Bi;Zc.measuredBounds=xn;Zc.naturalBounds=yh;0===Ze?nd.assign(Bi):nd.Nc(Bi);J.free($c);J.free(Ge);N.free(fk);qd.free(zd)}null!==Na.Kg&&Na.Kg.push(nd);$b(Kd,nd.x,nd.y,nd.width,nd.height)}hj(Eb,!1)}}}; +A,H-y)/Math.PI;0>ba&&(ba+=360);S.push(ba)}y=H;A=da}B.push(S)}if(null===a.Nf){for(var ra=[],Ca=a.T.m,db=Ca.length,eb=0;ebDb))for(var Yc=0;YcDb&&zb.push(jc)}}}}a.Nf=ra}var Ec=a.Nf;var ge=a.T.m,xf=ge.length,sb=0,he=0,dg=w;a.tj=[];for(var ph,qh=0;qhbk*ti*w/a.graduatedRange&&null===bb.graduatedSkip)){var eg=v[0][0],ld=0,kc=0;he=w*bb.graduatedStart-1E-4;dg=w*bb.graduatedEnd+1E-4;var yf=bk*ti,tc=a.graduatedTickBase;if(tca.graduatedMin+yf&&(tc-=Math.floor((tc-a.graduatedMin)/yf)*yf);for(var rh=Ec[qh],wn=tc,Gd=1;tcw&&(sb=w),he<=sb&&sb<=dg)){for(var Hd=B[ld][kc],yd=v[ld][kc];ldeg&&kcec&&.4995ec?0ec||.9995vi){var ck=1-Math.abs(.5-ec);Hd=(je*ck+Pc*(1-ck))%360;break a}}}Hd=je}if(bb instanceof Lg){var Id= +"";null!==bb.graduatedFunction?(Id=bb.graduatedFunction(tc),Id=null!==Id&&void 0!==Id?Id.toString():""):Id=(+tc.toFixed(2)).toString();""!==Id&&ph.push({tm:ui,angle:Hd,text:Id})}else ph.push({tm:ui,angle:Hd})}tc=wn+Gd*yf}}}a.tj.push(ph)}Ia(B);var uh=a.tj;if(null!==uh)for(var zf=d.length,cb=0;cbBf;Bf++){switch(Bf){case 0:fc.h(Xe,Ye);break;case 1:fc.h(Xe+wi,Ye);break;case 2:fc.h(Xe,Ye+xi);break;case 3:fc.h(Xe+wi,Ye+xi)}fc.rotate(ek+Eb.angle);fc.offset(dk,Af);0===md&&0===Bf?Qc.h(fc.x,fc.y,0,0):Qc.Le(fc);fc.offset(-dk,-Af);fc.rotate(-ek-Eb.angle)}J.free(fc); +null!==lc.Kg&&lc.Kg.push(Qc);$b(uc,Qc.x,Qc.y,Qc.width,Qc.height)}else if(Eb instanceof Lg){var Na=a,Kd=e;null===Na.mh&&(Na.mh=new Lg);var qb=Na.mh;Qm(qb,Eb);var vh=Eb.alignmentFocus;vh.wc()&&(vh=vc);for(var Ld=Eb.segmentOrientation,Cf=Eb.segmentOffset,nd=new N,Df=0,zi=0,me=0,ig=0,Ef=0,Ai=Fb.length,Ze=0;Zeme||225me)&&zd.rotate(-me,Gf/2,ne/2);var fk=N.allocAt(0,0,Gf,ne),Ge=J.alloc();Ge.Ui(fk,vh);zd.ya(Ge);var wh=-Ge.x,xh=-Ge.y,$c=J.alloc();$c.assign(Cf);isNaN($c.x)&&($c.x=Gf/2+3);isNaN($c.y)&&($c.y=-(ne/2+3));$c.rotate(me); +Df+=$c.x+wh;zi+=$c.y+xh;var Bi=new N(Df,zi,od.width,od.height),xn=new N(od.x,od.y,od.width,od.height),yh=new N(Ff.x,Ff.y,Ff.width,Ff.height);Zc.wA=ig;Zc.lineCount=qb.lineCount;Zc.lines=[qb.qb,qb.di,qb.oe,qb.ze,qb.zc,qb.Pb,qb.me];Zc.actualBounds=Bi;Zc.measuredBounds=xn;Zc.naturalBounds=yh;0===Ze?nd.assign(Bi):nd.Oc(Bi);J.free($c);J.free(Ge);N.free(fk);qd.free(zd)}null!==Na.Kg&&Na.Kg.push(nd);$b(Kd,nd.x,nd.y,nd.width,nd.height)}hj(Eb,!1)}}}; Pm.prototype.arrange=function(a,b,c){if(null!==a.Kg){var d=a.nb(),e=a.tj;if(null!==e){var f=a.Kg,g=0,h=f[g];g++;null!==d&&d.arrange(h.x-c.x,h.y-c.y,h.width,h.height);for(var k=b.length,l=0;l=e&&(e=1);for(var g=f.actualBounds,h=a.T.m,k=a.tj,l=h.length,m=0;ma.graduatedTickUnit*n.interval*f.geometry.flattenedTotalLength/a.graduatedRange*e)){var q=n.measuredBounds,u=n.strokeWidth*n.scale,v=n.alignmentFocus;v.wc()&& -(v=vc);for(var w=0;w=e&&(e=1);for(var g=f.actualBounds,h=a.T.m,k=a.tj,l=h.length,m=0;ma.graduatedTickUnit*n.interval*f.geometry.flattenedTotalLength/a.graduatedRange*e&&null===n.graduatedSkip)){var q=n.measuredBounds,u=n.strokeWidth*n.scale, +v=n.alignmentFocus;v.wc()&&(v=vc);for(var w=0;wf.height)continue}else if(l.position>f.width)continue;var m=l.separatorStrokeWidth;isNaN(m)&&(m=c?a.Bg:a.Ag);var n=l.separatorStroke;null===n&&(n=c?a.Vh:a.zg);if(0!==m&&null!==n){bi(a,b,n,!1,!1,g,f);n=!1;var p=l.separatorDashArray;null===p&&(p=c?a.Uh:a.Th);null!==p&&(n=!0,b.As(p,0));b.beginPath();p=l.position+m;c?p>f.height&&(m-= p-f.height):p>f.width&&(m-=p-f.width);l=l.position+m/2;b.lineWidth=m;m=a.mb;c?(l+=m.top,p=f.width-m.right,b.moveTo(m.left,l),b.lineTo(p,l)):(l+=m.left,p=f.height-m.bottom,b.moveTo(l,m.top),b.lineTo(l,p));b.stroke();n&&b.ys()}}}} -function Vm(a,b,c,d,e){for(var f=d.length,g=a.actualBounds,h=a.naturalBounds,k=Xm(a,!0),l=Xm(a,!1),m=0;mp)){var r=n.Fc(),q=n.separatorStrokeWidth;isNaN(q)&&(q=c?a.Bg:a.Ag);var u=n.separatorStroke;null===u&&(u=c?a.Vh:a.zg);if(null===u||n.index===(c?k:l))q=0;r-=q;q=n.position+q;r+=n.actual;q+r>p&&(r=p-q);0>=r||(p=a.mb,bi(a,b,n.background,!0,!1,h,g),c?b.fillRect(p.left, +function Vm(a,b,c,d,e){for(var f=d.length,g=a.actualBounds,h=a.naturalBounds,k=Xm(a,!0),l=Xm(a,!1),m=0;mp)){var r=n.Gc(),q=n.separatorStrokeWidth;isNaN(q)&&(q=c?a.Bg:a.Ag);var u=n.separatorStroke;null===u&&(u=c?a.Vh:a.zg);if(null===u||n.index===(c?k:l))q=0;r-=q;q=n.position+q;r+=n.actual;q+r>p&&(r=p-q);0>=r||(p=a.mb,bi(a,b,n.background,!0,!1,h,g),c?b.fillRect(p.left, q+p.top,g.width-(p.left+p.right),r):b.fillRect(q+p.left,p.top,r,g.height-(p.top+p.bottom)))}}}}function Xm(a,b){for(var c=b?a.Db.length:a.yb.length,d=0;dd&&e.set(q),J.free(q));J.free(m);f&&e.transform(g);return l}; @@ -1153,7 +1153,7 @@ t.ll=function(){if(0!==(this.G&2048)===!1){xl(this,!0);yl(this,!0);for(var a=thi t.qm=function(a,b,c,d){var e=this.dg;e.h(0,0,0,0);var f=this.desiredSize,g=this.minSize;void 0===c&&(c=g.width,d=g.height);c=Math.max(c,g.width);d=Math.max(d,g.height);var h=this.maxSize;isNaN(f.width)||(a=Math.min(f.width,h.width));isNaN(f.height)||(b=Math.min(f.height,h.height));a=Math.max(c,a);b=Math.max(d,b);var k=this.mb;a=Math.max(a-k.left-k.right,0);b=Math.max(b-k.top-k.bottom,0);var l=this.T.m;0!==l.length&&this.ia.measure(this,a,b,l,e,c,d);a=e.width+k.left+k.right;k=e.height+k.top+k.bottom; isFinite(f.width)&&(a=f.width);isFinite(f.height)&&(k=f.height);a=Math.min(h.width,a);k=Math.min(h.height,k);a=Math.max(g.width,a);k=Math.max(g.height,k);a=Math.max(c,a);k=Math.max(d,k);Tb(e,a,k);Tb(this.naturalBounds,a,k);this.ue(0,0,a,k)};t.nb=function(){if(null===this.lh){var a=this.T.m,b=a.length;if(0===b)return null;for(var c=0;cc||f>d)this.s(),this.measure(b>c?c:b,f>d?d:f,0,0);break;case sd:this.s(!0);this.measure(c+h,d+g,0,0);break;case Vk:this.s(!0);this.measure(c+h,f+g,0,0);break;case Wk:this.s(!0),this.measure(b+h,d+g,0,0)}}this.ia.arrange(this,e,this.dg)}}; -t.xh=function(a){var b=this.naturalBounds,c=sm(this);if(ac(0,0,b.width,b.height,a.x,a.y)){b=this.T.m;for(var d=b.length,e=J.allocAt(0,0);d--;){var f=b[d];if(f.visible||f===c)if(Ab(e.set(a),f.transform),f.$(e))return J.free(e),!0}J.free(e);return null===this.Rb&&null===this.fd?!1:!0}return!1};t.Bs=function(a){if(this.Mk===a)return this;for(var b=this.T.m,c=b.length,d=0;dp.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof X?m:null;p=qd.alloc();p.set(g); +t.vf=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var g=f;void 0===f&&(g=qd.alloc(),g.reset());g.multiply(this.transform);if(this.wh(a,g))return dn(this,b,c,e),void 0===f&&qd.free(g),!0;if(this.Jc(a,g)){if(!this.isAtomic)for(var h=sm(this),k=this.T.m,l=k.length;l--;){var m=k[l];if(m.visible||m===h){var n=m.actualBounds,p=this.naturalBounds;if(!(n.x>p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof X?m:null;p=qd.alloc();p.set(g); if(null!==m?m.vf(a,b,c,d,e,p):gl(n,a,d,p))null!==b&&(n=b(n)),null===n||null!==c&&!c(n)||e.add(n);qd.free(p)}}}void 0===f&&qd.free(g);return d}void 0===f&&qd.free(g);return!1};function dn(a,b,c,d){for(var e=a.T.m,f=e.length;f--;){var g=e[f];if(g.visible){var h=g.actualBounds,k=a.naturalBounds;h.x>k.width||h.y>k.height||0>h.x+h.width||0>h.y+h.height||(g instanceof X&&dn(g,b,c,d),null!==b&&(g=b(g)),null===g||null!==c&&!c(g)||d.add(g))}}} -t.kg=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===c&&(c=null);void 0===d&&(d=null);var g=this.naturalBounds,h=this.he(),k=h?a:Ab(J.allocAt(a.x,a.y),this.transform),l=h?b:Ab(J.allocAt(b.x,b.y),this.transform),m=k.tf(l),n=0v.width||u.y>v.height||0>u.x+u.width||0>u.y+u.height))if(q.he()?(u=q.transform,Ab(k.set(a),u),Ab(l.set(b),u)):(k.set(a),l.set(b)),u=q,q=q instanceof X?q:null,null!==q?q.kg(k,l,c,d,e,f):u.Ux(k,l,e))null!==c&&(u=c(u)),null===u||null!==d&&!d(u)||f.add(u)}}J.free(k);J.free(l)}return e?n:g}return!1}; function ym(a){var b=null;a instanceof uf&&(b=a.spot1,b===Vc&&(b=null),a=a.geometry,null!==a&&null===b&&(b=a.spot1));null===b&&(b=sc);return b}function zm(a){var b=null;a instanceof uf&&(b=a.spot2,b===Vc&&(b=null),a=a.geometry,null!==a&&null===b&&(b=a.spot2));null===b&&(b=Cc);return b}t.add=function(a){for(var b=[],c=0;ca&&xa(a,">= 0",X,"removeColumnDefinition:idx");a=Math.round(a t.Tz=function(a){if(0>a||this.type!==X.Table)return-1;for(var b=0,c=this.Db,d=c.length,e=this.wi;ea||this.type!==X.Table)return-1;for(var b=0,c=this.yb,d=c.length,e=this.fi;ea;)this.bc(this.T.length-1,!1);jn(this,this.itemArray)}; function jn(a,b){var c=bn(a);if(null===b||0===b.length)for(;a.T.length>c;)a.bc(a.T.length-1,!1);else if(a.T.length<=c){c=b.length;for(var d=0;da&&xa(a,">= 0",Nj,"height"),this.rc=a,this.actual=this.ga,null!==this.panel&&this.panel.s(), +t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new ri(a,b,c,d):e=a;e.nd=this;a=this.panel;null!==a&&(b=a.yh(),null!==b&&Fl(b)&&C("Cannot add a Binding to a RowColumnDefinition that is already frozen: "+e+" on "+a));null===this.fb&&(this.fb=new E);this.fb.add(e);return this}; +na.Object.defineProperties(Nj.prototype,{panel:{get:function(){return this.Xf}},isRow:{get:function(){return this.Br},set:function(a){this.Br=a}},index:{get:function(){return this.Pa},set:function(a){this.Pa=a}},height:{get:function(){return this.rc},set:function(a){var b=this.rc;b!==a&&(0>a&&xa(a,">= 0",Nj,"height"),this.rc=a,this.actual=this.ga,null!==this.panel&&this.panel.s(), this.Cb("height",b,a))}},width:{get:function(){return this.rc},set:function(a){var b=this.rc;b!==a&&(0>a&&xa(a,">= 0",Nj,"width"),this.rc=a,this.actual=this.ga,null!==this.panel&&this.panel.s(),this.Cb("width",b,a))}},minimum:{get:function(){return this.Ij},set:function(a){var b=this.Ij;b!==a&&((0>a||!isFinite(a))&&xa(a,">= 0",Nj,"minimum"),this.Ij=a,this.actual=this.ga,null!==this.panel&&this.panel.s(),this.Cb("minimum",b,a))}},maximum:{ get:function(){return this.Hj},set:function(a){var b=this.Hj;b!==a&&(0>a&&xa(a,">= 0",Nj,"maximum"),this.Hj=a,this.actual=this.ga,null!==this.panel&&this.panel.s(),this.Cb("maximum",b,a))}},alignment:{get:function(){return this.wb},set:function(a){var b=this.wb;b.A(a)||(this.wb=a.I(),null!==this.panel&&this.panel.s(),this.Cb("alignment",b,a))}},stretch:{get:function(){return this.Be},set:function(a){var b=this.Be;b!==a&&(this.Be= a,null!==this.panel&&this.panel.s(),this.Cb("stretch",b,a))}},separatorPadding:{get:function(){return this.$f},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.$f;null!==a&&null!==b&&b.A(a)||(null!==a&&(a=a.I()),this.$f=a,null!==this.panel&&this.panel.s(),this.Cb("separatorPadding",b,a))}},separatorStroke:{get:function(){return this.xp},set:function(a){var b=this.xp;b!==a&&(null!==a&&Nl(a,"RowColumnDefinition.separatorStroke"), a instanceof ml&&a.freeze(),this.xp=a,null!==this.panel&&this.panel.s(),this.Cb("separatorStroke",b,a))}},separatorStrokeWidth:{get:function(){return this.yp},set:function(a){var b=this.yp;b!==a&&(this.yp=a,null!==this.panel&&this.panel.s(),this.Cb("separatorStrokeWidth",b,a))}},separatorDashArray:{get:function(){return this.Tj},set:function(a){var b=this.Tj;if(b!==a){if(null!==a){for(var c=a.length,d=0,e=0;ee)){var f=d.measuredBounds,g=Math.max(1,f.width);f=f.height;for(var h=c[0],k=c[1],l,m,n,p,r,q,u=0,v=Fa(),w=2;wn&&(n=1);e=c=n;l=g/2;m=0===l?!1:!0;w=0;q=v[w];n=q[0];r=q[1];p=q[2];q=q[3];for(var z=0;.1<=u;){0===z&&(m?(e=c,e-=l,u-=l,m=!1):e=c,0===e&&(e=1)); if(e>u){Ia(v);return}e>q?(z=e-q,e=q):z=0;var y=Math.sqrt(e*e/(1+p*p));0>n&&(y=-y);h+=y;k+=p*y;a.translate(h,k);a.rotate(r);a.translate(-(g/2),-(f/2));0===z&&d.Fi(a,b);a.translate(g/2,f/2);a.rotate(-r);a.translate(-h,-k);u-=e;q-=e;if(0!==z){w++;if(w===v.length){Ia(v);return}q=v[w];n=q[0];r=q[1];p=q[2];q=q[3];e=z}}Ia(v)}} -t.Fi=function(a,b){var c=this.Dc,d=this.cl;if(null!==c||null!==d){var e=this.ma;if(null!==e){a.Bd();var f=this.actualBounds,g=this.naturalBounds;null!==d&&bi(this,a,d,!0,!1,g,f);var h=this.part,k=this.cg;null===c||0!==k||null===h||!this.isPanelMain&&h.nb()!==this||(k=h.type===X.Link&&h instanceof we&&"Selection"===h.category&&h.adornedObject instanceof uf&&h.adornedPart.nb()===h.adornedObject?h.adornedObject.strokeWidth:0);0===k&&(c=null);null!==c&&0!==k&&(bi(this,a,c,!1,!1,g,f),a.lineWidth=k,a.lineJoin= +t.Fi=function(a,b){var c=this.Dc,d=this.cl;if(null!==c||null!==d){var e=this.ma;if(null!==e){a.Fc();var f=this.actualBounds,g=this.naturalBounds;null!==d&&bi(this,a,d,!0,!1,g,f);var h=this.part,k=this.cg;null===c||0!==k||null===h||!this.isPanelMain&&h.nb()!==this||(k=h.type===X.Link&&h instanceof we&&"Selection"===h.category&&h.adornedObject instanceof uf&&h.adornedPart.nb()===h.adornedObject?h.adornedObject.strokeWidth:0);0===k&&(c=null);null!==c&&0!==k&&(bi(this,a,c,!1,!1,g,f),a.lineWidth=k,a.lineJoin= this.Ul,a.lineCap=this.Tl,a.miterLimit=this.Uj);f=!1;h&&b.Fe("drawShadows")&&(f=h.isShadowed);h=!0;null===c||null!==d&&"transparent"!==d||(h=!1);g=!1;k=this.strokeDashArray;null!==k&&(g=!0,a.As(k,this.jh));if(e.type===Q.j)a.beginPath(),a.moveTo(e.startX,e.startY),a.lineTo(e.endX,e.endY),null!==c&&a.Xi();else if(e.type===Q.C){var l=e.startX;k=e.startY;var m=e.endX,n=e.endY;e=Math.min(l,m);var p=Math.min(k,n);l=Math.abs(m-l);k=Math.abs(n-k);a.beginPath();a.rect(e,p,l,k);null!==d&&a.uf(d);if(null!== c){h&&f&&ql(a);if(0===l||0===k)a.beginPath(),a.rect(e,p,Math.max(l,.1),Math.max(k,.1));a.Xi();h&&f&&pl(a)}}else if(e.type===Q.M)l=e.startX,k=e.startY,m=e.endX,n=e.endY,e=Math.abs(m-l)/2,p=Math.abs(n-k)/2,l=Math.min(l,m)+e,k=Math.min(k,n)+p,a.beginPath(),a.moveTo(l,k-p),a.bezierCurveTo(l+L.qg*e,k-p,l+e,k-L.qg*p,l+e,k),a.bezierCurveTo(l+e,k+L.qg*p,l+L.qg*e,k+p,l,k+p),a.bezierCurveTo(l-L.qg*e,k+p,l-e,k+L.qg*p,l-e,k),a.bezierCurveTo(l-e,k-L.qg*p,l-L.qg*e,k-p,l,k-p),a.closePath(),null!==d&&a.uf(d),null!== c&&(h&&f?(ql(a),a.Xi(),pl(a)):a.Xi());else if(e.type===Q.o)for(e=e.figures,k=e.length,p=0;p(c.startX-c.endX)*(a.x-c.endX)+(c.startY-c.endY)*(a.y-c.endY)||0>d)return!1;N.free(f);return L.Mb(c.startX,c.startY,c.endX,c.endY,e,a.x,a.y)}if(c.type=== -Q.C){b=c.startX;var g=c.startY,h=c.endX;c=c.endY;f.x=Math.min(b,h);f.y=Math.min(g,c);f.width=Math.abs(h-b);f.height=Math.abs(c-g);if(null===this.fill){f.Gc(-d,-d);if(f.$(a))return N.free(f),!1;f.Gc(d,d)}null!==this.stroke&&f.Gc(e,e);a=f.$(a);N.free(f);return a}if(c.type===Q.M){g=c.startX;e=c.startY;h=c.endX;var k=c.endY;c=Math.min(g,h);b=Math.min(e,k);g=Math.abs(h-g)/2;e=Math.abs(k-e)/2;c=a.x-(c+g);b=a.y-(b+e);if(null===this.fill){g-=d;e-=d;if(0>=g||0>=e||1>=c*c/(g*g)+b*b/(e*e))return N.free(f),!1; +t.Mi=function(a){void 0===a&&(a=new N);var b=this.naturalBounds,c=this.de;b=N.allocAt(b.x,b.y,b.width,b.height);var d=this.strokeWidth;b.Hc(d/2,d/2);d=J.allocAt(b.x,b.y).transform(c);a.h(d.x,d.y,0,0);d.h(b.right,b.y).transform(c);$b(a,d.x,d.y,0,0);d.h(b.right,b.bottom).transform(c);$b(a,d.x,d.y,0,0);d.h(b.x,b.bottom).transform(c);$b(a,d.x,d.y,0,0);N.free(b);J.free(d);return a}; +t.xh=function(a,b){var c=this.geometry;if(null===c||null===this.fill&&null===this.stroke)return!1;var d=c.bounds,e=this.strokeWidth/2;c.type!==Q.j||b||(e+=2);var f=N.alloc();f.assign(d);f.Hc(e+2,e+2);if(!f.$(a))return N.free(f),!1;d=e+1E-4;if(c.type===Q.j){if(null===this.stroke)return!1;d=(c.endX-c.startX)*(a.x-c.startX)+(c.endY-c.startY)*(a.y-c.startY);if(0>(c.startX-c.endX)*(a.x-c.endX)+(c.startY-c.endY)*(a.y-c.endY)||0>d)return!1;N.free(f);return L.Mb(c.startX,c.startY,c.endX,c.endY,e,a.x,a.y)}if(c.type=== +Q.C){b=c.startX;var g=c.startY,h=c.endX;c=c.endY;f.x=Math.min(b,h);f.y=Math.min(g,c);f.width=Math.abs(h-b);f.height=Math.abs(c-g);if(null===this.fill){f.Hc(-d,-d);if(f.$(a))return N.free(f),!1;f.Hc(d,d)}null!==this.stroke&&f.Hc(e,e);a=f.$(a);N.free(f);return a}if(c.type===Q.M){g=c.startX;e=c.startY;h=c.endX;var k=c.endY;c=Math.min(g,h);b=Math.min(e,k);g=Math.abs(h-g)/2;e=Math.abs(k-e)/2;c=a.x-(c+g);b=a.y-(b+e);if(null===this.fill){g-=d;e-=d;if(0>=g||0>=e||1>=c*c/(g*g)+b*b/(e*e))return N.free(f),!1; g+=d;e+=d}null!==this.stroke&&(g+=d,e+=d);N.free(f);return 0>=g||0>=e?!1:1>=c*c/(g*g)+b*b/(e*e)}if(c.type===Q.o)return N.free(f),null===this.fill?Ud(c,a.x,a.y,e):Sd(c,a,e,1=this.strokeWidth)m=L.Ie(l.startX,l.startY,l.endX,l.endY,f,g,h,k,e);else{l.startX===l.endX?(d=n,m=0):(b=(l.endY-l.startY)/(l.endX-l.startX),m=n/Math.sqrt(1+b*b), d=m*b);b=Fa();a=new J;L.Ie(l.startX+d,l.startY+m,l.endX+d,l.endY+m,f,g,h,k,a)&&b.push(a);a=new J;L.Ie(l.startX-d,l.startY-m,l.endX-d,l.endY-m,f,g,h,k,a)&&b.push(a);a=new J;L.Ie(l.startX+d,l.startY+m,l.startX-d,l.startY-m,f,g,h,k,a)&&b.push(a);a=new J;L.Ie(l.endX+d,l.endY+m,l.endX-d,l.endY-m,f,g,h,k,a)&&b.push(a);h=b.length;if(0===h)return Ia(b),!1;m=!0;k=Infinity;for(d=0;dMath.abs(c)){k=g-m-c*(f-d);if(0>a*a*c*c+l*l-k*k){e.x=NaN;e.y=NaN;m=!1;break a}n=Math.sqrt(a*a*c*c+l*l-k*k);h=(-(a*a*c*k)+a*l*n)/(l*l+a*a*c*c)+d;a=(-(a*a*c*k)-a*l*n)/(l*l+a*a*c*c)+d;l=c*(h-d)+k+m;k=c* +n,r.y+r.height+n,f,g,h,k,e);else if(l.type===Q.M){b=N.allocAt(r.x,r.y,r.width,r.height).Hc(n,n);a:if(0===b.width)m=L.Ie(b.x,b.y,b.x,b.y+b.height,f,g,h,k,e);else if(0===b.height)m=L.Ie(b.x,b.y,b.x+b.width,b.y,f,g,h,k,e);else{a=b.width/2;l=b.height/2;d=b.x+a;m=b.y+l;c=9999;f!==h&&(c=(g-k)/(f-h));if(9999>Math.abs(c)){k=g-m-c*(f-d);if(0>a*a*c*c+l*l-k*k){e.x=NaN;e.y=NaN;m=!1;break a}n=Math.sqrt(a*a*c*c+l*l-k*k);h=(-(a*a*c*k)+a*l*n)/(l*l+a*a*c*c)+d;a=(-(a*a*c*k)-a*l*n)/(l*l+a*a*c*c)+d;l=c*(h-d)+k+m;k=c* (a-d)+k+m;Math.abs((f-h)*(f-h))+Math.abs((g-l)*(g-l))h){e.x=NaN;e.y=NaN;m=!1;break a}k=Math.sqrt(h);h=m+k;k=m-k;Math.abs(h-g)Math.abs(q)?(u*=.5/q,q=.5):0!==u&&.5>Math.abs(u)&&(q*=.5/u,u=.5),w-=q,z-= u;r.contains(w,z);)w-=q,z-=u;e.x=h;e.y=k;for(u=0;uc?a-c:c-a)<(b>d?b-d:d-b)?(a=ba||L.aa(k.y,a))&&(k.yb||L.aa(k.x,b))&&(k.x=a&&d<=b;a=d&&c<=a} -t.Ux=function(a,b,c){function d(a,b){for(var c=a.length,d=0;de)return!0;return!1}if(c&&null!==this.fill&&this.xh(a,!0))return!0;var e=a.tf(b),f=e;1.5e)return!0;return!1}if(c&&null!==this.fill&&this.xh(a,!0))return!0;var e=a.tf(b),f=e;1.5=e||Cb(b,f,0,-n)>=e||Cb(b, -f,0,n)>=e||Cb(b,f,m,0)>=e?!1:!0}else if(b.type===Q.o){l=b.bounds;f=l.x;h=l.y;k=l.x+l.width;l=l.y+l.height;if(a.x>k&&a.xl&&a.ye&&Bb(a.x,a.y,f,h,k,h)>e&&Bb(a.x,a.y,k,l,f,l)>e&&Bb(a.x,a.y,k,l,k,h)>e)return!1;f=Math.sqrt(e);if(c){if(null===this.fill?Ud(b,a.x,a.y,f):Sd(b,a,f,!0,!1))return!0}else{c=b.figures;for(b=0;be)return!1;h=f.segments.m;k=h.length;for(l=0;le)return!1;break;case Md:var p=Fa();L.Ce(g,m,n.point1X,n.point1Y,n.point2X,n.point2Y,n.endX,n.endY,.8,p);g=d(p,a);Ia(p);if(g)return!1;g=n.endX;m=n.endY;if(a.nd(g,m)>e)return!1;break;case Nd:p=Fa();L.xq(g,m,n.point1X,n.point1Y,n.endX,n.endY,.8,p);g=d(p,a);Ia(p);if(g)return!1;g=n.endX;m=n.endY;if(a.nd(g,m)>e)return!1;break;case Od:case Pd:p=n.type===Od?Qd(n,f):Rd(n,f,g,m);var r=p.length;if(0===r){g=n.type===Od?n.centerX:n.endX;m=n.type===Od?n.centerY:n.endY;if(a.nd(g,m)>e)return!1; +f,0,n)>=e||Cb(b,f,m,0)>=e?!1:!0}else if(b.type===Q.o){l=b.bounds;f=l.x;h=l.y;k=l.x+l.width;l=l.y+l.height;if(a.x>k&&a.xl&&a.ye&&Bb(a.x,a.y,f,h,k,h)>e&&Bb(a.x,a.y,k,l,f,l)>e&&Bb(a.x,a.y,k,l,k,h)>e)return!1;f=Math.sqrt(e);if(c){if(null===this.fill?Ud(b,a.x,a.y,f):Sd(b,a,f,!0,!1))return!0}else{c=b.figures;for(b=0;be)return!1;h=f.segments.m;k=h.length;for(l=0;le)return!1;break;case Md:var p=Fa();L.Ce(g,m,n.point1X,n.point1Y,n.point2X,n.point2Y,n.endX,n.endY,.8,p);g=d(p,a);Ia(p);if(g)return!1;g=n.endX;m=n.endY;if(a.od(g,m)>e)return!1;break;case Nd:p=Fa();L.xq(g,m,n.point1X,n.point1Y,n.endX,n.endY,.8,p);g=d(p,a);Ia(p);if(g)return!1;g=n.endX;m=n.endY;if(a.od(g,m)>e)return!1;break;case Od:case Pd:p=n.type===Od?Qd(n,f):Rd(n,f,g,m);var r=p.length;if(0===r){g=n.type===Od?n.centerX:n.endX;m=n.type===Od?n.centerY:n.endY;if(a.od(g,m)>e)return!1; break}n=null;for(var q=Fa(),u=0;u= 0",uf,"strokeWidth:value")}},strokeCap:{get:function(){return this.Tl}, set:function(a){var b=this.Tl;b!==a&&("string"!==typeof a||"butt"!==a&&"round"!==a&&"square"!==a?xa(a,'"butt", "round", or "square"',uf,"strokeCap"):(this.Tl=a,this.N(),this.g("strokeCap",b,a)))}},strokeJoin:{get:function(){return this.Ul},set:function(a){var b=this.Ul;b!==a&&("string"!==typeof a||"miter"!==a&&"bevel"!==a&&"round"!==a?xa(a,'"miter", "bevel", or "round"',uf,"strokeJoin"):(this.Ul=a,this.N(),this.g("strokeJoin",b,a)))}},strokeMiterLimit:{ get:function(){return this.Uj},set:function(a){var b=this.Uj;if(b!==a&&1<=a){this.Uj=a;this.N();var c=this.part;null!==c&&(c.Sf=NaN);this.g("strokeMiterLimit",b,a)}}},strokeDashArray:{get:function(){return this.ih},set:function(a){var b=this.ih;if(b!==a){if(null!==a){for(var c=a.length,d=0,e=0;ea?a=0:1a?a=0:1(n*n+m*m)*p*p&&(c=!0);b.Sb!==a&&(c=!1);!1===b.Fe("textGreeking")&&(c=!1);b=this.ff;n= -this.gf;switch(this.flip){case Zk:a.translate(e,0);a.scale(-1,1);break;case Yk:a.translate(0,f);a.scale(1,-1);break;case $k:a.translate(e,f),a.scale(-1,-1)}a.Bd();m=this.Wc;p=(b+g+n)*m;f>p&&(d=this.Bi,d=d.y*f-d.y*p+d.offsetY);if(1===m&&null!==this.me)n=this.qb,n>e&&(n=e),this.Ei(this.me,a,0,d+b,e,g,n,c,h,k,l);else if(null!==this.zc&&null!==this.Pb)for(p=0;pe&&(r=e);d+=b;this.Ei(this.Pb[p],a,0,d,e,g,r,c,h,k,l);d+=g+n}switch(this.flip){case Zk:a.scale(-1,1);a.translate(-e, +this.gf;switch(this.flip){case Zk:a.translate(e,0);a.scale(-1,1);break;case Yk:a.translate(0,f);a.scale(1,-1);break;case $k:a.translate(e,f),a.scale(-1,-1)}a.Fc();m=this.Xc;p=(b+g+n)*m;f>p&&(d=this.Bi,d=d.y*f-d.y*p+d.offsetY);if(1===m&&null!==this.me)n=this.qb,n>e&&(n=e),this.Ei(this.me,a,0,d+b,e,g,n,c,h,k,l);else if(null!==this.zc&&null!==this.Pb)for(p=0;pe&&(r=e);d+=b;this.Ei(this.Pb[p],a,0,d,e,g,r,c,h,k,l);d+=g+n}switch(this.flip){case Zk:a.scale(-1,1);a.translate(-e, 0);break;case Yk:a.scale(1,-1);a.translate(0,-f);break;case $k:a.scale(-1,-1),a.translate(-e,-f)}}}; t.Ei=function(a,b,c,d,e,f,g,h,k,l,m){var n=0;h?("left"===k?n=0:"right"===k?n=e-g:"center"===k&&(n=(e-g)/2),b.fillRect(c+n,d+.25*f,g,1)):("left"===k?n=0:"right"===k?n=e:"center"===k&&(n=e/2),e=null!==Nn?Nn(this,f):.75*f,b.fillText(a,c+n,d+e),a=f/20|0,0===a&&(a=1),"right"===k?n-=g:"center"===k&&(n-=g/2),l&&(k=null!==On?On(this,f):.8*f,b.beginPath(),b.lineWidth=a,b.moveTo(c+n,d+k),b.lineTo(c+n+g,d+k),b.stroke()),m&&(b.beginPath(),b.lineWidth=a,d=d+f-f/2.2|0,0!==a%2&&(d+=.5),b.moveTo(c+n,d),b.lineTo(c+ n+g,d),b.stroke()))}; t.qm=function(a,b,c,d){this.di=a;var e=this.ne;null!==In&&Pn!==e&&(Pn=In.font=e);this.qb=this.ze=0;this.me=this.Pb=this.zc=this.oe=null;var f;if(isNaN(this.desiredSize.width)){e=this.Ub.replace(/\r\n/g,"\n").replace(/\r/g,"\n");if(0===e.length)e=0;else if(this.isMultiline){for(var g=f=0,h=!1;!h;){var k=e.indexOf("\n",g);-1===k&&(k=e.length,h=!0);g=e.substr(g,k-g);this.Xh===Ln&&(g=g.trim());f=Math.max(f,Qn(g));g=k+1}e=f}else f=e.indexOf("\n",0),0<=f&&(e=e.substr(0,f)),e=Qn(e);e=Math.min(e,a/this.scale); e=Math.max(8,e)}else e=this.desiredSize.width;null!==this.panel&&(e=Math.min(e,this.panel.maxSize.width));f=Rn(this,e);isNaN(this.desiredSize.height)?f=Math.min(f,b/this.scale):f=this.desiredSize.height;h=f;if(0!==this.qb&&null!==this.zc&&null!==this.Pb&&this.Vf===Sn&&(b=this.ne,b=this.Vf===Sn?Tn(b):0,k=this.ff+this.gf,k=Math.max(0,Mn(this)+k),h=Math.min(this.maxLines-1,Math.max(Math.floor(h/k+.01)-1,0)),!(h+1>=this.Pb.length))){k=this.Pb[h];for(b=Math.max(1,a-b);Qn(k)>b&&1=a.te)null!==d&&d.h(0,h);else if(g=b,a.gg===Yn){a.ze=1;var l=Qn(b);if(0===k||l<=c)a.qb=Math.max(a.qb,l),Wn(a,b,a.qb),null!==d&&d.h(l,h);else{f=Zn(a,g);g=g.substr(f.length);b=Zn(a,g);for(l=Qn(f+b);0c&&1c;){var n=1;l=Qn(b.substr(0,n));for(m=0;l<=c;)n++,m=l,l=Qn(b.substr(0,n));if(1===n){var p=l;f=Math.max(f,l)}else p=m,f=Math.max(f,m);n--;1>n&&(n=1);Wn(a,b.substr(0,n),p);k++;b=b.substr(n);if(a.Wc+k>a.te)break}m=Zn(a,g);for(l=Qn(b+m);0a.te))break}a.ze=Math.min(a.te,k);a.qb=Math.max(a.qb,f);null!==d&&d.h(a.qb,h*a.ze)}}function Zn(a,b){if(a.gg===$n)return b.substr(0,1);for(var c=b.length,d=0,e=ao;d=b.length?b:b.substr(0,d)}function Qn(a){return null===In?8*a.length:In.measureText(a).width} +function Xn(a,b,c,d){var e=a.Xh===Ln;e&&(b=b.trim());var f=0,g=a.ne,h=a.ff+a.gf;h=Math.max(0,Mn(a)+h);var k=a.Vf===Sn?Tn(g):0;if(a.Xc>=a.te)null!==d&&d.h(0,h);else if(g=b,a.gg===Yn){a.ze=1;var l=Qn(b);if(0===k||l<=c)a.qb=Math.max(a.qb,l),Wn(a,b,a.qb),null!==d&&d.h(l,h);else{f=Zn(a,g);g=g.substr(f.length);b=Zn(a,g);for(l=Qn(f+b);0c&&1c;){var n=1;l=Qn(b.substr(0,n));for(m=0;l<=c;)n++,m=l,l=Qn(b.substr(0,n));if(1===n){var p=l;f=Math.max(f,l)}else p=m,f=Math.max(f,m);n--;1>n&&(n=1);Wn(a,b.substr(0,n),p);k++;b=b.substr(n);if(a.Xc+k>a.te)break}m=Zn(a,g);for(l=Qn(b+m);0a.te))break}a.ze=Math.min(a.te,k);a.qb=Math.max(a.qb,f);null!==d&&d.h(a.qb,h*a.ze)}}function Zn(a,b){if(a.gg===$n)return b.substr(0,1);for(var c=b.length,d=0,e=ao;d=b.length?b:b.substr(0,d)}function Qn(a){return null===In?8*a.length:In.measureText(a).width} function Mn(a){if(null!==a.oe)return a.oe;var b=a.ne;if(null===In){var c=16;return a.oe=c}void 0!==co[b]&&5E3>eo?c=co[b]:(c=1.3*In.measureText("M").width,co[b]=c,eo++);return a.oe=c}function Tn(a){if(null===In)return 6;if(void 0!==fo[a]&&5E3>go)var b=fo[a];else b=In.measureText(Un).width,fo[a]=b,go++;return b} -function Rn(a,b){var c=a.Ub.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),d=a.ff+a.gf;d=Math.max(0,Mn(a)+d);if(0===c.length)return a.qb=0,a.Wc=1,d;if(!a.isMultiline){var e=c.indexOf("\n",0);0<=e&&(c=c.substr(0,e))}e=0;for(var f=a.Wc=0,g,h=!1;!h;){g=c.indexOf("\n",f);-1===g&&(g=c.length,h=!0);if(f<=g){f=c.substr(f,g-f);if(a.gg!==Yn){a.ze=0;var k=M.alloc();Xn(a,f,b,k);e+=k.height;M.free(k);a.Wc+=a.ze}else Xn(a,f,b,null),e+=d,a.Wc++;a.Wc===a.te&&(h=!0)}f=g+1}return a.Ir=e} +function Rn(a,b){var c=a.Ub.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),d=a.ff+a.gf;d=Math.max(0,Mn(a)+d);if(0===c.length)return a.qb=0,a.Xc=1,d;if(!a.isMultiline){var e=c.indexOf("\n",0);0<=e&&(c=c.substr(0,e))}e=0;for(var f=a.Xc=0,g,h=!1;!h;){g=c.indexOf("\n",f);-1===g&&(g=c.length,h=!0);if(f<=g){f=c.substr(f,g-f);if(a.gg!==Yn){a.ze=0;var k=M.alloc();Xn(a,f,b,k);e+=k.height;M.free(k);a.Xc+=a.ze}else Xn(a,f,b,null),e+=d,a.Xc++;a.Xc===a.te&&(h=!0)}f=g+1}return a.Ir=e} na.Object.defineProperties(Lg.prototype,{font:{get:function(){return this.ne},set:function(a){var b=this.ne;b!==a&&(this.ne=a,this.oe=null,this.s(),this.g("font",b,a))}},text:{get:function(){return this.Ub},set:function(a){var b=this.Ub;null!==a&&void 0!==a?a=a.toString():a="";b!==a&&(this.Ub=a,this.s(),this.g("text",b,a))}},textAlign:{get:function(){return this.ui},set:function(a){var b=this.ui;b===a||"start"!== a&&"end"!==a&&"left"!==a&&"right"!==a&&"center"!==a||(this.ui=a,this.N(),this.g("textAlign",b,a))}},flip:{get:function(){return this.Rd},set:function(a){var b=this.Rd;b!==a&&(this.Rd=a,this.N(),this.g("flip",b,a))}},verticalAlignment:{get:function(){return this.Bi},set:function(a){var b=this.Bi;b.A(a)||(this.Bi=a=a.I(),zl(this),this.g("verticalAlignment",b,a))}},naturalBounds:{get:function(){if(!this.qc.u()){var a= M.alloc();Xn(this,this.Ub,999999,a);var b=a.width;M.free(a);a=Rn(this,b);var c=this.desiredSize;isNaN(c.width)||(b=c.width);isNaN(c.height)||(a=c.height);Tb(this.qc,b,a)}return this.qc}},isMultiline:{get:function(){return this.Aj},set:function(a){var b=this.Aj;b!==a&&(this.Aj=a,this.s(),this.g("isMultiline",b,a))}},isUnderline:{get:function(){return this.ai},set:function(a){var b=this.ai;b!==a&&(this.ai=a,this.N(),this.g("isUnderline",b, a))}},isStrikethrough:{get:function(){return this.$h},set:function(a){var b=this.$h;b!==a&&(this.$h=a,this.N(),this.g("isStrikethrough",b,a))}},wrap:{get:function(){return this.gg},set:function(a){var b=this.gg;b!==a&&(this.gg=a,this.s(),this.g("wrap",b,a))}},overflow:{get:function(){return this.Vf},set:function(a){var b=this.Vf;b!==a&&(this.Vf=a,this.s(),this.g("overflow",b,a))}},stroke:{ -get:function(){return this.Dc},set:function(a){var b=this.Dc;b!==a&&(null!==a&&Nl(a,"TextBlock.stroke"),a instanceof ml&&a.freeze(),this.Dc=a,this.N(),this.g("stroke",b,a))}},lineCount:{get:function(){return this.Wc}},lineHeight:{get:function(){return Mn(this)}},editable:{get:function(){return this.En},set:function(a){var b=this.En;b!==a&&(this.En=a,this.g("editable",b,a))}},textEditor:{ -get:function(){return this.Lp},set:function(a){var b=this.Lp;b!==a&&(this.Lp=a,this.g("textEditor",b,a))}},errorFunction:{get:function(){return this.kd},set:function(a){var b=this.kd;b!==a&&(this.kd=a,this.g("errorFunction",b,a))}},interval:{get:function(){return this.Wd},set:function(a){var b=this.Wd;a=Math.round(a);if(b!==a&&0!==a&&isFinite(a)){this.Wd=a;this.s();var c=this.panel;null!==c&&(c.Nf=null);this.g("interval",b,a)}}},graduatedStart:{ +get:function(){return this.Dc},set:function(a){var b=this.Dc;b!==a&&(null!==a&&Nl(a,"TextBlock.stroke"),a instanceof ml&&a.freeze(),this.Dc=a,this.N(),this.g("stroke",b,a))}},lineCount:{get:function(){return this.Xc}},lineHeight:{get:function(){return Mn(this)}},editable:{get:function(){return this.En},set:function(a){var b=this.En;b!==a&&(this.En=a,this.g("editable",b,a))}},textEditor:{ +get:function(){return this.Lp},set:function(a){var b=this.Lp;b!==a&&(this.Lp=a,this.g("textEditor",b,a))}},errorFunction:{get:function(){return this.ld},set:function(a){var b=this.ld;b!==a&&(this.ld=a,this.g("errorFunction",b,a))}},interval:{get:function(){return this.Wd},set:function(a){var b=this.Wd;a=Math.round(a);if(b!==a&&0!==a&&isFinite(a)){this.Wd=a;this.s();var c=this.panel;null!==c&&(c.Nf=null);this.g("interval",b,a)}}},graduatedStart:{ get:function(){return this.Ud},set:function(a){var b=this.Ud;b!==a&&(0>a?a=0:1a?a=0:1=a&&xa(a,"> 0",Lg,"maxLines"),this.te=a,this.s(),this.g("maxLines",b,a))}},metrics:{get:function(){return{arrSize:null!==this.zc?this.zc:[this.qb],arrText:null!==this.Pb?this.Pb:[this.me],maxLineWidth:this.qb,fontHeight:this.oe}}},choices:{get:function(){return this.gn},set:function(a){var b=this.gn;b!==a&&(this.gn=a,this.g("choices",b,a))}}}); var Nn=null,On=null,Yn=new D(Lg,"None",0),Vn=new D(Lg,"WrapFit",1),Kn=new D(Lg,"WrapDesiredSize",2),$n=new D(Lg,"WrapBreakAll",3),Jn=new D(Lg,"OverflowClip",0),Sn=new D(Lg,"OverflowEllipsis",1),Ln=new D(Lg,"FormatTrim",0),bo=new D(Lg,"FormatNone",0),ao=/[ \u200b\u00ad]/,co=new Wa,eo=0,fo=new Wa,go=0,Un="...",Pn="",In=null,Hn=!1;Lg.className="TextBlock";Lg.getEllipsis=function(){return Un};Lg.setEllipsis=function(a){Un=a;fo=new Wa;go=0};Lg.getBaseline=function(){return Nn}; Lg.setBaseline=function(a){Nn=a};Lg.getUnderline=function(){return On};Lg.setUnderline=function(a){On=a};Lg.isValidFont=function(a){Hn||(In=Jg?(new Ak(null)).context:null,Hn=!0);if(null===In)return!0;var b=In.font;if(a===b||"10px sans-serif"===a)return!0;In.font="10px sans-serif";In.font=a;var c=In.font;if("10px sans-serif"!==c)return In.font=b,!0;In.font="19px serif";var d=In.font;In.font=a;c=In.font;In.font=b;return c!==d};Lg.FormatNone=bo;Lg.FormatTrim=Ln;Lg.None=Yn;Lg.OverflowClip=Jn; -Lg.OverflowEllipsis=Sn;Lg.WrapBreakAll=$n;Lg.WrapDesiredSize=Kn;Lg.WrapFit=Vn;function Vj(a,b){Y.call(this);this.Gg=null;this.Ep="";this.hh=hc;this.fl=sd;this.kh=this.kd=null;this.el=yc;this.Rd=og;this.Wl=null;this.co=!1;this.Kn=!0;this.ul=!1;this.Pl=null;"string"===typeof a?this.source=a:a&&Object.assign(this,a);b&&Object.assign(this,b)}var ho;ma(Vj,Y); -Vj.prototype.cloneProtected=function(a){Y.prototype.cloneProtected.call(this,a);a.element=this.Gg;a.Ep=this.Ep;a.hh=this.hh.I();a.fl=this.fl;a.Rd=this.Rd;a.kd=this.kd;a.kh=this.kh;a.el=this.el.I();a.Kn=this.Kn;a.Pl=this.Pl};Vj.prototype.gb=function(a){a===og||a===qg||a===Xk?this.imageStretch=a:Y.prototype.gb.call(this,a)};Vj.prototype.toString=function(){return"Picture("+this.source+")#"+gb(this)};function Ii(a){void 0===a&&(a="");""!==a?ho[a]&&(delete ho[a],io--):(ho=new Wa,io=0)} +Lg.OverflowEllipsis=Sn;Lg.WrapBreakAll=$n;Lg.WrapDesiredSize=Kn;Lg.WrapFit=Vn;function Vj(a,b){Y.call(this);this.Gg=null;this.Ep="";this.hh=hc;this.fl=sd;this.kh=this.ld=null;this.el=yc;this.Rd=og;this.Wl=null;this.co=!1;this.Kn=!0;this.ul=!1;this.Pl=null;"string"===typeof a?this.source=a:a&&Object.assign(this,a);b&&Object.assign(this,b)}var ho;ma(Vj,Y); +Vj.prototype.cloneProtected=function(a){Y.prototype.cloneProtected.call(this,a);a.element=this.Gg;a.Ep=this.Ep;a.hh=this.hh.I();a.fl=this.fl;a.Rd=this.Rd;a.ld=this.ld;a.kh=this.kh;a.el=this.el.I();a.Kn=this.Kn;a.Pl=this.Pl};Vj.prototype.gb=function(a){a===og||a===qg||a===Xk?this.imageStretch=a:Y.prototype.gb.call(this,a)};Vj.prototype.toString=function(){return"Picture("+this.source+")#"+gb(this)};function Ii(a){void 0===a&&(a="");""!==a?ho[a]&&(delete ho[a],io--):(ho=new Wa,io=0)} function jo(a,b){b.Vy||(b.Hr=function(c){b.zr=!0;b.Xn=!1;var d=b.Cg.copy();if(null!==d&&void 0!==d){for(d=d.iterator;d.next();){var e=d.value;var f=b.getAttribute("src")||"";var g=e.$g.H(f);if(null!==g)for(var h=g.length,k=0;k=d.width&&(e=e+r.offsetX+(m*r.x-d.width*r.x));n>=d.height&&(f=f+r.offsetY+(n*r.y-d.height*r.y));h=Math.min(d.width,m);g=Math.min(d.height,n);break;case sd:m=d.width;n=d.height;break;case qg:case Xk:p===qg?(p=Math.min(d.height/n,d.width/m),m*=p,n*=p):p===Xk&&(p=Math.max(d.height/n,d.width/m),m*=p,n*=p,m>=d.width&&(e=(e+r.offsetX+(m*r.x-d.width*r.x)/m)*h),n>=d.height&&(f=(f+r.offsetY+(n*r.y-d.height*r.y)/n)*g),h*=1/(m/ d.width),g*=1/(n/d.height),m=d.width,n=d.height)}p=this.wf()*b.scale;var q=m*p*n*p,u=h*g/q,v=c.__goCache;p=null;var w=ko;if(c.zr&&void 0!==v&&4w*w)for(null===v.Di&&(lo(v,4,k,l,c),lo(v,16,k,l,c)),k=v.Di,l=k.length,q=0;qe.x&&a.y>e.y&&a.righte.x&&b.y>e.y&&b.righte.x&&a.y>e.y&&a.righte.x&&b.y>e.y&&b.right=c.maxSelectionCount)){this.D^=4096;var d=!1;if(null!==c){d=c.skipsUndoManager;c.skipsUndoManager=!0;var e=c.selection;e.ea();a?e.add(this):e.remove(this);e.freeze()}this.g("isSelected",b,a);this.Kb();a=this.selectionChanged;null!==a&&a(this);null!==c&&(c.Fb(),c.skipsUndoManager=d)}}}},isHighlighted:{get:function(){return 0!== (this.D&524288)},set:function(a){var b=0!==(this.D&524288);if(b!==a){this.D^=524288;var c=this.diagram;null!==c&&(c=c.highlighteds,c.ea(),a?c.add(this):c.remove(this),c.freeze());this.g("isHighlighted",b,a);this.N();a=this.highlightedChanged;null!==a&&a(this)}}},isShadowed:{get:function(){return 0!==(this.D&8192)},set:function(a){var b=0!==(this.D&8192);b!==a&&(this.D^=8192,this.g("isShadowed",b,a),this.N())}},isAnimated:{get:function(){return 0!== @@ -1410,19 +1410,19 @@ get:function(){return this.tp},set:function(a){var b=this.tp;b!==a&&(this.tp=a,t b!==a&&(this.vp=a,this.g("selectionChanged",b,a))}},resizeAdornmentTemplate:{get:function(){return this.gp},set:function(a){var b=this.gp;b!==a&&(this.gp=a,this.g("resizeAdornmentTemplate",b,a))}},resizeObjectName:{get:function(){return this.ip},set:function(a){var b=this.ip;b!==a&&(this.ip=a,this.g("resizeObjectName",b,a))}},resizeObject:{get:function(){var a=this.resizeObjectName;return""!==a&&(a=this.Ya(a), null!==a)?a:this}},resizeCellSize:{get:function(){return this.hp},set:function(a){var b=this.hp;b.A(a)||(this.hp=a=a.I(),this.g("resizeCellSize",b,a))}},rotateAdornmentTemplate:{get:function(){return this.kp},set:function(a){var b=this.kp;b!==a&&(this.kp=a,this.g("rotateAdornmentTemplate",b,a))}},rotateObjectName:{get:function(){return this.lp},set:function(a){var b=this.lp;b!==a&&(this.lp=a,this.g("rotateObjectName", b,a))}},rotateObject:{get:function(){var a=this.rotateObjectName;return""!==a&&(a=this.Ya(a),null!==a)?a:this}},rotationSpot:{get:function(){return this.mp},set:function(a){var b=this.mp;b.A(a)||(this.mp=a=a.I(),this.g("rotationSpot",b,a))}},text:{get:function(){return this.Ub},set:function(a){var b=this.Ub;b!==a&&(this.Ub=a,this.g("text",b,a))}},containingGroup:{get:function(){return this.Qh}, -set:function(a){if(this.Jc()){var b=this.Qh;if(b!==a){null===a||this!==a&&!a.Fd(this)||(this===a&&C("Cannot make a Group a member of itself: "+this.toString()),C("Cannot make a Group indirectly contain itself: "+this.toString()+" already contains "+a.toString()));this.B(2);var c=this.diagram;null!==b?Do(b,this):this instanceof hf&&null!==c&&c.xi.remove(this);this.Qh=a;null!==a?Co(a,this):this instanceof hf&&null!==c&&c.xi.add(this);this.B(1);if(null!==c&&c.Z){var d=this.data,e=c.model;if(null!==d&& +set:function(a){if(this.Kc()){var b=this.Qh;if(b!==a){null===a||this!==a&&!a.Fd(this)||(this===a&&C("Cannot make a Group a member of itself: "+this.toString()),C("Cannot make a Group indirectly contain itself: "+this.toString()+" already contains "+a.toString()));this.B(2);var c=this.diagram;null!==b?Do(b,this):this instanceof hf&&null!==c&&c.xi.remove(this);this.Qh=a;null!==a?Co(a,this):this instanceof hf&&null!==c&&c.xi.add(this);this.B(1);if(null!==c&&c.Z){var d=this.data,e=c.model;if(null!==d&& e.pk()){var f=e.pa(null!==a?a.data:null);e.Gq(d,f)}}d=this.containingGroupChanged;null!==d&&(e=!0,null!==c&&(e=c.Z,c.Z=!0),d(this,b,a),null!==c&&(c.Z=e));if(this instanceof hf)for(c=new G,Rk(c,this,!0,0,!0),c=c.iterator;c.next();)if(d=c.value,d instanceof W)for(d=d.linksConnected;d.next();)Io(d.value);if(this instanceof W){for(c=this.linksConnected;c.next();)Io(c.value);c=this.labeledLink;null!==c&&Io(c)}this.g("containingGroup",b,a);null!==a&&(b=a.layer,null!==b&&ci(b,-1,a))}}else C("cannot set the Part.containingGroup of a Link or Adornment")}}, containingGroupChanged:{get:function(){return this.kn},set:function(a){var b=this.kn;b!==a&&(this.kn=a,this.g("containingGroupChanged",b,a))}},isTopLevel:{get:function(){return null!==this.containingGroup||this instanceof W&&null!==this.labeledLink?!1:!0}},layoutConditions:{get:function(){return this.so},set:function(a){var b=this.so;b!==a&&(this.so=a,this.g("layoutConditions",b,a))}},dragComputation:{ get:function(){return this.An},set:function(a){var b=this.An;b!==a&&(this.An=a,this.g("dragComputation",b,a))}},shadowOffset:{get:function(){return this.Bp},set:function(a){var b=this.Bp;b.A(a)||(this.Bp=a=a.I(),this.N(),this.g("shadowOffset",b,a))}},shadowColor:{get:function(){return this.Ap},set:function(a){var b=this.Ap;b!==a&&(this.Ap=a,this.N(),this.g("shadowColor",b,a))}},shadowBlur:{get:function(){return this.bg}, set:function(a){var b=this.bg;b!==a&&(this.bg=a,this.N(),this.g("shadowBlur",b,a))}}});V.prototype.invalidateLayout=V.prototype.B;V.prototype.findCommonContainingGroup=V.prototype.Rx;V.prototype.isMemberOf=V.prototype.Fd;V.prototype.findTopLevelPart=V.prototype.Yz;V.prototype.findSubGraphLevel=V.prototype.Uz;V.prototype.ensureBounds=V.prototype.Sa;V.prototype.getDocumentBounds=V.prototype.Mi;V.prototype.findObject=V.prototype.Ya;V.prototype.moveTo=V.prototype.moveTo; V.prototype.invalidateAdornments=V.prototype.Kb;V.prototype.clearAdornments=V.prototype.$j;V.prototype.removeAdornment=V.prototype.Cf;V.prototype.addAdornment=V.prototype.th;V.prototype.findAdornment=V.prototype.hk;V.prototype.updateTargetBindings=V.prototype.Da;var Ao=!1;V.className="Part";V.LayoutNone=0;V.LayoutAdded=1;V.LayoutRemoved=2;V.LayoutShown=4;V.LayoutHidden=8;V.LayoutNodeSized=16;V.LayoutGroupLayout=32;V.LayoutNodeReplaced=64;V.LayoutStandard=127;V.LayoutAll=16777215; -function we(a,b){void 0===a||a instanceof Kl||"string"===typeof a?V.call(this,a):(V.call(this),a&&(b=a));this.D&=-257;this.Og="Adornment";this.ie=null;this.ax=0;this.xx=!1;this.j=this.Ra=null;b&&Object.assign(this,b)}ma(we,V);we.prototype.toString=function(){var a=this.adornedPart;return"Adornment("+this.category+")"+(null!==a?a.toString():"")};we.prototype.updateRelationshipsFromData=function(){}; -we.prototype.sk=function(a){var b=this.adornedObject,c=null===b||void 0===b?void 0:b.part;if(c instanceof U&&b instanceof uf){b=c.path;c.sk(a);a=b.geometry;c=this.T.m;b=c.length;for(var d=0;da&&(a=1);var b=this.diagram;if(null!==b&&!b.He){b.He=!0;var c=new G;c.add(this);To(this,c,b.isTreePathToChildren,a,b,this,b.treeCollapsePolicy===qi);b.He=!1}};function To(a,b,c,d,e,f,g){if(1a&&(a=2);var b=this.diagram;if(null!==b&&!b.He){b.He=!0;var c=new G;c.add(this);Vo(this,c,b.isTreePathToChildren,a,b,this,b.treeCollapsePolicy===qi);b.He=!1}}; -function Vo(a,b,c,d,e,f,g){for(var h=f===a?!1:a.isTreeExpanded,k=c?a.iq():a.Dd();k.next();){var l=k.value;l.isTreeLink&&(h||l.rd||l.Ua(),l=l.nq(a),null!==l&&l!==a&&!b.contains(l)&&(b.add(l),h||(l.Nb(!0),l.Ch(),g&&e.Yj(l,f)),2e&&(e=h.right);h.bottom>f&&(f=h.bottom)}}isFinite(c)&&isFinite(d)?a.h(c,d,e-c,f-d):(b=b.location, a.h(b.x,b.y,0,0));return a};na.Object.defineProperties(mg.prototype,{padding:{get:function(){return this.mb},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.mb;b.A(a)||(this.mb=a=a.I(),this.g("padding",b,a),this.s())}}});mg.className="Placeholder"; -function U(a){V.call(this,X.Link);this.Ia=8;this.Se=null;this.Te="";this.kf=this.On=null;this.lf="";this.Op=null;this.Ek=Vf;this.rn=0;this.tn=Vf;this.un=NaN;this.Oj=$o;this.Dp=.5;this.ld=null;this.Bb=(new E).freeze();this.cf=this.Zg=null;this.Gl=new N;this.ma=new Q;this.C=this.o=this.If=this.Mf=null;this.Ru=new J;this.qr=this.px=this.ox=null;this.Rt=NaN;this.P=null;this.j=[];a&&Object.assign(this,a)}ma(U,V); +function U(a){V.call(this,X.Link);this.Ia=8;this.Se=null;this.Te="";this.kf=this.On=null;this.lf="";this.Op=null;this.Ek=Vf;this.rn=0;this.tn=Vf;this.un=NaN;this.Oj=$o;this.Dp=.5;this.md=null;this.Bb=(new E).freeze();this.cf=this.Zg=null;this.Gl=new N;this.ma=new Q;this.C=this.o=this.If=this.Mf=null;this.Ru=new J;this.qr=this.px=this.ox=null;this.Rt=NaN;this.P=null;this.j=[];a&&Object.assign(this,a)}ma(U,V); U.prototype.cloneProtected=function(a){V.prototype.cloneProtected.call(this,a);a.Ia=this.Ia&-113;a.Te=this.Te;a.On=this.On;a.lf=this.lf;a.Op=this.Op;a.Ek=this.Ek;a.rn=this.rn;a.tn=this.tn;a.un=this.un;a.Oj=this.Oj;a.Dp=this.Dp;null!==this.P&&(a.P=this.P.copy())};t=U.prototype;t.sf=function(a){V.prototype.sf.call(this,a);this.Te=a.Te;this.lf=a.lf;a.Zg=null;a.Ua();a.If=this.If;var b=a.fromPort;null!==b&&Mo(b);a=a.toPort;null!==a&&Mo(a)}; -t.gb=function(a){a.classType===U?2===(a.value&2)?this.routing=a:a===Yf||a===Uf||a===Tf?this.curve=a:a===ap||a===bp||a===cp?this.adjusting=a:a!==$o&&a!==Vf&&C("Unknown Link enum value for a Link property: "+a):V.prototype.gb.call(this,a)};t.Hc=function(){null===this.P&&(this.P=new cl)};t.Si=function(){var a=this.fromNode;if(null!==a){var b=a.findVisibleNode();null!==b&&(a=b);if(nj(a)||oj(a))return!1}a=this.toNode;return null!==a&&(b=a.findVisibleNode(),null!==b&&(a=b),nj(a)||oj(a))?!1:!0};t.Zv=function(){return!1}; -t.gt=function(){};t.Jc=function(){return!1};U.prototype.computeAngle=function(a,b,c){return U.computeAngle(b,c)};U.computeAngle=function(a,b){switch(a){default:case Vf:a=0;break;case Rm:a=b;break;case Km:a=b+90;break;case Mm:a=b-90;break;case dp:a=b+180;break;case Sm:a=L.vq(b);90a&&(a-=180);break;case Lm:a=L.vq(b+90);90a&&(a-=180);break;case Nm:a=L.vq(b-90);90a&&(a-=180);break;case Om:a=L.vq(b);if(45a||225a)return 0;90a&&(a-=180)}return L.vq(a)}; -function Io(a){var b=a.fromNode,c=a.toNode,d=null;null!==b?d=null!==c?b.Rx(c):b.containingGroup:null!==c?d=c.containingGroup:d=null;b=d;c=a.Qh;if(c!==b){null!==c&&Do(c,a);a.Qh=b;null!==b&&Co(b,a);var e=a.containingGroupChanged;if(null!==e){var f=!0,g=a.diagram;null!==g&&(f=g.Z,g.Z=!0);e(a,c,b);null!==g&&(g.Z=f)}!a.rd||a.ox!==c&&a.px!==c||a.Ua()}if(a.isLabeledLink)for(a=a.labelNodes;a.next();)a.value.containingGroup=d}t=U.prototype; -t.Ch=function(){var a=this.containingGroup;null!==a&&this.fromNode!==a&&this.toNode!==a&&a.computesBoundsIncludingLinks&&V.prototype.Ch.call(this)};t.nq=function(a){var b=this.fromNode;return a===b?this.toNode:b};t.gA=function(a){var b=this.fromPort;return a===b?this.toPort:b};function Qo(a,b){null===a.ld&&(a.ld=new G);a.ld.add(b);a.s()} +t.gb=function(a){a.classType===U?2===(a.value&2)?this.routing=a:a===Yf||a===Uf||a===Tf?this.curve=a:a===ap||a===bp||a===cp?this.adjusting=a:a!==$o&&a!==Vf&&C("Unknown Link enum value for a Link property: "+a):V.prototype.gb.call(this,a)};t.Ic=function(){null===this.P&&(this.P=new cl)};t.Si=function(){var a=this.fromNode;if(null!==a){var b=a.findVisibleNode();null!==b&&(a=b);if(nj(a)||oj(a))return!1}a=this.toNode;return null!==a&&(b=a.findVisibleNode(),null!==b&&(a=b),nj(a)||oj(a))?!1:!0};t.Zv=function(){return!1}; +t.gt=function(){};t.Kc=function(){return!1};U.prototype.computeAngle=function(a,b,c){return U.computeAngle(b,c)};U.computeAngle=function(a,b){switch(a){default:case Vf:a=0;break;case Rm:a=b;break;case Km:a=b+90;break;case Mm:a=b-90;break;case dp:a=b+180;break;case Sm:a=L.vq(b);90a&&(a-=180);break;case Lm:a=L.vq(b+90);90a&&(a-=180);break;case Nm:a=L.vq(b-90);90a&&(a-=180);break;case Om:a=L.vq(b);if(45a||225a)return 0;90a&&(a-=180)}return L.vq(a)}; +function Io(a){var b=a.fromNode,c=a.toNode,d=null;null!==b?d=null!==c?b.Rx(c):b.containingGroup:null!==c?d=c.containingGroup:d=null;b=d;c=a.Qh;if(c!==b){null!==c&&Do(c,a);a.Qh=b;null!==b&&Co(b,a);var e=a.containingGroupChanged;if(null!==e){var f=!0,g=a.diagram;null!==g&&(f=g.Z,g.Z=!0);e(a,c,b);null!==g&&(g.Z=f)}!a.sd||a.ox!==c&&a.px!==c||a.Ua()}if(a.isLabeledLink)for(a=a.labelNodes;a.next();)a.value.containingGroup=d}t=U.prototype; +t.Ch=function(){var a=this.containingGroup;null!==a&&this.fromNode!==a&&this.toNode!==a&&a.computesBoundsIncludingLinks&&V.prototype.Ch.call(this)};t.nq=function(a){var b=this.fromNode;return a===b?this.toNode:b};t.gA=function(a){var b=this.fromPort;return a===b?this.toPort:b};function Qo(a,b){null===a.md&&(a.md=new G);a.md.add(b);a.s()} t.pq=function(a){V.prototype.pq.call(this,a);ep(this)&&this.rq(this.actualBounds);if(!a){a=this.Se;var b=null;null!==a&&(b=this.fromPort,Oo(a,this,b));var c=this.kf;if(null!==c){var d=this.toPort;c===a&&d===b||Oo(c,this,d)}fp(this)}};t.qq=function(a){V.prototype.qq.call(this,a);ep(this)&&this.rq(this.actualBounds);if(!a){a=this.Se;var b=null;null!==a&&(b=this.fromPort,Po(a,this,b));var c=this.kf;if(null!==c){var d=this.toPort;c===a&&d===b||Po(c,this,d)}gp(this)}}; -t.fk=function(){this.rd=!0;if(null!==this.ld){var a=this.diagram;if(null!==a)for(var b=this.ld.copy().iterator;b.next();)a.remove(b.value)}null!==this.data&&(a=this.diagram,null!==a&&a.partManager.removeDataForLink(this))};U.prototype.updateRelationshipsFromData=function(){if(null!==this.data){var a=this.diagram;null!==a&&a.partManager.updateRelationshipsFromData(this)}}; +t.fk=function(){this.sd=!0;if(null!==this.md){var a=this.diagram;if(null!==a)for(var b=this.md.copy().iterator;b.next();)a.remove(b.value)}null!==this.data&&(a=this.diagram,null!==a&&a.partManager.removeDataForLink(this))};U.prototype.updateRelationshipsFromData=function(){if(null!==this.data){var a=this.diagram;null!==a&&a.partManager.updateRelationshipsFromData(this)}}; U.prototype.move=function(a,b){var c=b?this.location:this.position,d=c.x;isNaN(d)&&(d=0);var e=c.y;isNaN(e)&&(e=0);d=a.x-d;e=a.y-e;!0===b?V.prototype.move.call(this,a,!1):(a=J.allocAt(c.x+d,c.y+e),V.prototype.move.call(this,a,!1),J.free(a));cf(this,d,e);for(a=this.labelNodes;a.next();)b=a.value,c=b.position,b.moveTo(c.x+d,c.y+e)}; U.prototype.canRelinkFrom=function(){if(!this.relinkableFrom)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowRelink)return!1;a=a.diagram;return null===a||a.allowRelink?!0:!1};U.prototype.canRelinkTo=function(){if(!this.relinkableTo)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowRelink)return!1;a=a.diagram;return null===a||a.allowRelink?!0:!1}; U.prototype.computeMidPoint=function(a){var b=this.pointsCount;if(0===b)return a.assign(vb),a;if(1===b)return a.assign(this.i(0)),a;if(2===b){var c=this.i(0),d=this.i(1);a.h((c.x+d.x)/2,(c.y+d.y)/2);return a}if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===Yf))return this.ma.uv(.5,a),a.add(this.i(0)),c=this.ma.figures.first(),a.offset(-c.startX,-c.startY),a;if(this.computeCurve()===Yf){if(3===b)return this.i(1);d=(b-1)/3|0;c=3*(d/2|0);if(1===d%2){d=this.i(c);var e=this.i(c+1), f=this.i(c+2);c=this.i(c+3);L.pz(d.x,d.y,e.x,e.y,f.x,f.y,c.x,c.y,a)}else a.assign(this.i(c));return a}var g=this.flattenedLengths;c=this.flattenedTotalLength;for(e=f=d=0;dc/2)break;d+=e;f++}b=this.i(f);f=this.i(f+1);1>Math.abs(b.x-f.x)?b.y>f.y?a.h(b.x,b.y-(c/2-d)):a.h(b.x,b.y+(c/2-d)):1>Math.abs(b.y-f.y)?b.x>f.x?a.h(b.x-(c/2-d),b.y):a.h(b.x+(c/2-d),b.y):(c=(c/2-d)/e,a.h(b.x+c*(f.x-b.x),b.y+c*(f.y-b.y)));return a}; -U.prototype.computeMidAngle=function(){var a=this.pointsCount;if(2>a)return NaN;if(2===a)return this.i(0).Oa(this.i(1));if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===Yf))return this.ma.Xx(.5);if(this.computeCurve()===Yf&&4<=a){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){c=Math.floor(c);a=this.i(c);b=this.i(c+1);var d=this.i(c+2);c=this.i(c+3);return L.oz(a.x,a.y,b.x,b.y,d.x,d.y,c.x,c.y)}if(0d/2)break;e+=f;c++}b=this.i(c);d=this.i(c+1);if(1>Math.abs(b.x-d.x)&&1>Math.abs(b.y-d.y)){if(0Math.abs(b.x-d.x))return b.y>d.y?270:90;if(1>Math.abs(b.y-d.y))return b.x>d.x?180:0}return b.Oa(d)};t=U.prototype;t.i=function(a){return this.Bb.m[a]};t.Mc=function(a,b){this.Bb.Lc(a,b)};t.L=function(a,b,c){this.Bb.Lc(a,new J(b,c))};t.pA=function(a,b){this.Bb.ub(a,b)}; +U.prototype.computeMidAngle=function(){var a=this.pointsCount;if(2>a)return NaN;if(2===a)return this.i(0).Ra(this.i(1));if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===Yf))return this.ma.Xx(.5);if(this.computeCurve()===Yf&&4<=a){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){c=Math.floor(c);a=this.i(c);b=this.i(c+1);var d=this.i(c+2);c=this.i(c+3);return L.oz(a.x,a.y,b.x,b.y,d.x,d.y,c.x,c.y)}if(0d/2)break;e+=f;c++}b=this.i(c);d=this.i(c+1);if(1>Math.abs(b.x-d.x)&&1>Math.abs(b.y-d.y)){if(0Math.abs(b.x-d.x))return b.y>d.y?270:90;if(1>Math.abs(b.y-d.y))return b.x>d.x?180:0}return b.Ra(d)};t=U.prototype;t.i=function(a){return this.Bb.m[a]};t.Nc=function(a,b){this.Bb.Mc(a,b)};t.L=function(a,b,c){this.Bb.Mc(a,new J(b,c))};t.pA=function(a,b){this.Bb.ub(a,b)}; t.l=function(a,b,c){this.Bb.ub(a,new J(b,c))};t.ce=function(a){this.Bb.add(a)};t.pf=function(a,b){this.Bb.add(new J(a,b))};t.Rv=function(a){this.Bb.eb(a)};t.ak=function(){this.Bb.clear()}; -function cf(a,b,c){if(0!==b||0!==c)if(0===a.pointsCount)a.defaultFromPoint&&a.defaultFromPoint.offset(b,c),a.defaultToPoint&&a.defaultToPoint.offset(b,c);else{for(var d=a.rd,e=new E,f=a.Bb.iterator;f.next();){var g=f.value;e.add((new J(g.x+b,g.y+c)).freeze())}e.freeze();f=a.Bb;a.Bb=e;g=a.diagram;isNaN(b)||isNaN(c)||null!==g&&g.animationManager.rb?a.s():(a.ae.h(a.ae.x+b,a.ae.y+c),a.ka.h(a.ka.x+b,a.ka.y+c),zl(a));d?hp(a):(a.defaultFromPoint&&(a.defaultFromPoint=a.i(0)),a.defaultToPoint&&(a.defaultToPoint= +function cf(a,b,c){if(0!==b||0!==c)if(0===a.pointsCount)a.defaultFromPoint&&a.defaultFromPoint.offset(b,c),a.defaultToPoint&&a.defaultToPoint.offset(b,c);else{for(var d=a.sd,e=new E,f=a.Bb.iterator;f.next();){var g=f.value;e.add((new J(g.x+b,g.y+c)).freeze())}e.freeze();f=a.Bb;a.Bb=e;g=a.diagram;isNaN(b)||isNaN(c)||null!==g&&g.animationManager.rb?a.s():(a.ae.h(a.ae.x+b,a.ae.y+c),a.ka.h(a.ka.x+b,a.ka.y+c),zl(a));d?hp(a):(a.defaultFromPoint&&(a.defaultFromPoint=a.i(0)),a.defaultToPoint&&(a.defaultToPoint= a.i(a.pointsCount-1)));null!==g&&g.animationManager.rb&&(b=g.animationManager,a.cf=e,b.Il.add(a));a.g("points",f,e)}}t.Hh=function(){null===this.Zg&&(this.Zg=this.Bb,this.Bb=this.Bb.copy())}; t.rf=function(){if(null!==this.Zg){for(var a=this.Zg,b=this.Bb,c=Infinity,d=Infinity,e=a.m,f=e.length,g=0;gl&&(n=-n),u= -(0>k?-1:1)*n+r,v=m*(u-r)+q);r=f.x+2*h/3;q=f.y+2*k/3;var w=r,z=q;L.w(k,0)?z=0k?-1:1)*n+r,z=m*(w-r)+q);this.ak();this.ce(f);this.pf(u,v);this.pf(w,z);this.ce(p);this.Mc(0,this.getLinkPoint(a,b,g,!0,!1,d,e));this.Mc(3,this.getLinkPoint(d,e,c,!1,!1,a,b))}else if(f=d,p=e,d=this.getLinkPoint(a,b,g,!0,!1,f,p),e=this.getLinkPoint(f,p,c,!1,!1,a,b),this.hasCurviness())p=e.x-d.x,c=e.y-d.y,g=this.computeCurviness(),a=d.x+p/2,b=d.y+c/2,f=a,h=b,L.w(c,0)?h=0g&&(f=-f),f=(0>c?-1:1)*f+a,h=p*(f-a)+b),this.ce(d),this.pf(f,h),this.ce(e);else{this.ce(d);this.ce(e);h=N.alloc();b.Mi(h);k=h.$(e);p.Mi(h);l=h.$(d);if(k||l)g=b.da(mp(g),new J),this.Mc(0,this.getLinkPointFromPoint(a,b,g,e,!0,g)),c=p.da(mp(c),new J),this.Mc(1,this.getLinkPointFromPoint(f,p,c,d,!1,c));N.free(h)}}else{n=this.isAvoiding;p&&(m&&n||l)&&this.ak();var y=l?this.computeCurviness():0;n=this.getLinkPoint(a,b,g,!0,m,d,e);r=u=q=0;if(m||!h||l)v=this.computeEndSegmentLength(a,b,g,!0),r=this.getLinkDirection(a, +(0>k?-1:1)*n+r,v=m*(u-r)+q);r=f.x+2*h/3;q=f.y+2*k/3;var w=r,z=q;L.w(k,0)?z=0k?-1:1)*n+r,z=m*(w-r)+q);this.ak();this.ce(f);this.pf(u,v);this.pf(w,z);this.ce(p);this.Nc(0,this.getLinkPoint(a,b,g,!0,!1,d,e));this.Nc(3,this.getLinkPoint(d,e,c,!1,!1,a,b))}else if(f=d,p=e,d=this.getLinkPoint(a,b,g,!0,!1,f,p),e=this.getLinkPoint(f,p,c,!1,!1,a,b),this.hasCurviness())p=e.x-d.x,c=e.y-d.y,g=this.computeCurviness(),a=d.x+p/2,b=d.y+c/2,f=a,h=b,L.w(c,0)?h=0g&&(f=-f),f=(0>c?-1:1)*f+a,h=p*(f-a)+b),this.ce(d),this.pf(f,h),this.ce(e);else{this.ce(d);this.ce(e);h=N.alloc();b.Mi(h);k=h.$(e);p.Mi(h);l=h.$(d);if(k||l)g=b.da(mp(g),new J),this.Nc(0,this.getLinkPointFromPoint(a,b,g,e,!0,g)),c=p.da(mp(c),new J),this.Nc(1,this.getLinkPointFromPoint(f,p,c,d,!1,c));N.free(h)}}else{n=this.isAvoiding;p&&(m&&n||l)&&this.ak();var y=l?this.computeCurviness():0;n=this.getLinkPoint(a,b,g,!0,m,d,e);r=u=q=0;if(m||!h||l)v=this.computeEndSegmentLength(a,b,g,!0),r=this.getLinkDirection(a, b,n,g,!0,m,d,e),l&&(h||g.A(c)||!m&&1===g.x+c.x&&1===g.y+c.y)&&(r-=m?90:30,0>y&&(r-=180)),0>r?r+=360:360<=r&&(r-=360),l&&(v+=Math.abs(y)*(m?1:2)),0===r?q=v:90===r?u=v:180===r?q=-v:270===r?u=-v:(q=v*Math.cos(r*Math.PI/180),u=v*Math.sin(r*Math.PI/180)),g.wc()&&l&&(v=b.da(yc,J.alloc()),w=J.allocAt(v.x+1E3*q,v.y+1E3*u),this.getLinkPointFromPoint(a,b,v,w,!0,n),J.free(v),J.free(w));v=this.getLinkPoint(d,e,c,!1,m,a,b);var A=z=w=0;if(m||!k||l){var B=this.computeEndSegmentLength(d,e,c,!1);A=this.getLinkDirection(d, -e,v,c,!1,m,a,b);l&&(k||g.A(c)||!m&&1===g.x+c.x&&1===g.y+c.y)&&(A+=m?0:30,0>y&&(A+=180));0>A?A+=360:360<=A&&(A-=360);l&&(B+=Math.abs(y)*(m?1:2));0===A?w=B:90===A?z=B:180===A?w=-B:270===A?z=-B:(w=B*Math.cos(A*Math.PI/180),z=B*Math.sin(A*Math.PI/180));c.wc()&&l&&(c=e.da(yc,J.alloc()),g=J.allocAt(c.x+1E3*w,c.y+1E3*z),this.getLinkPointFromPoint(d,e,c,g,!1,v),J.free(c),J.free(g))}c=n;if(m||!h||l)c=new J(n.x+q,n.y+u);g=v;if(m||!k||l)g=new J(v.x+w,v.y+z);!p&&!m&&h&&3Math.abs(b.y-a.y)?(b.x>=a.x?b.x=a.x+9E9:b.x=a.x-9E9,b.y=a.y):(b.y>=a.y?b.y=a.y+9E9:b.y=a.y-9E9,b.x=a.x);return b} +e,v,c,!1,m,a,b);l&&(k||g.A(c)||!m&&1===g.x+c.x&&1===g.y+c.y)&&(A+=m?0:30,0>y&&(A+=180));0>A?A+=360:360<=A&&(A-=360);l&&(B+=Math.abs(y)*(m?1:2));0===A?w=B:90===A?z=B:180===A?w=-B:270===A?z=-B:(w=B*Math.cos(A*Math.PI/180),z=B*Math.sin(A*Math.PI/180));c.wc()&&l&&(c=e.da(yc,J.alloc()),g=J.allocAt(c.x+1E3*w,c.y+1E3*z),this.getLinkPointFromPoint(d,e,c,g,!1,v),J.free(c),J.free(g))}c=n;if(m||!h||l)c=new J(n.x+q,n.y+u);g=v;if(m||!k||l)g=new J(v.x+w,v.y+z);!p&&!m&&h&&3Math.abs(b.y-a.y)?(b.x>=a.x?b.x=a.x+9E9:b.x=a.x-9E9,b.y=a.y):(b.y>=a.y?b.y=a.y+9E9:b.y=a.y-9E9,b.x=a.x);return b} U.prototype.getLinkPointFromPoint=function(a,b,c,d,e,f){void 0===f&&(f=new J);if(null===a||null===b)return f.assign(c),f;a.isVisible()||(e=a.findVisibleNode(),null!==e&&e!==a&&(b=e.port));a=null;e=b.panel;null===e||e.he()||(e=e.panel);if(null===e){e=d.x;d=d.y;var g=c.x;c=c.y}else{a=e.de;e=1/(a.m11*a.m22-a.m12*a.m21);g=a.m22*e;var h=-a.m12*e,k=-a.m21*e,l=a.m11*e,m=e*(a.m21*a.dy-a.m22*a.dx),n=e*(a.m12*a.dx-a.m11*a.dy);e=d.x*g+d.y*k+m;d=d.x*h+d.y*l+n;g=c.x*g+c.y*k+m;c=c.x*h+c.y*l+n}b.kk(e,d,g,c,f);null!== a&&f.transform(a);return f};function op(a,b){var c=b.bp;null===c&&(c=new pp,c.port=b,c.node=b.part,b.bp=c);return qp(c,a)} -U.prototype.getLinkPoint=function(a,b,c,d,e,f,g,h){void 0===h&&(h=new J);if(c.hb()&&!lp(c))return b.da(c,h),h;if(c.Kc()){var k=op(this,b);if(null!==k){h.assign(k.tq);if(e&&this.routing===rp){var l=op(this,g);if(null!==l&&k.fm=m.y&&a.y<=m.y+m.height?h.y=a.y:(c.zf(Dc)||c.zf(Hc))&&a.x>=m.x&&a.x<=m.x+m.width&&(h.x=a.x);J.free(k);J.free(l)}}return h}}c= +U.prototype.getLinkPoint=function(a,b,c,d,e,f,g,h){void 0===h&&(h=new J);if(c.hb()&&!lp(c))return b.da(c,h),h;if(c.Lc()){var k=op(this,b);if(null!==k){h.assign(k.tq);if(e&&this.routing===rp){var l=op(this,g);if(null!==l&&k.fm=m.y&&a.y<=m.y+m.height?h.y=a.y:(c.zf(Dc)||c.zf(Hc))&&a.x>=m.x&&a.x<=m.x+m.width&&(h.x=a.x);J.free(k);J.free(l)}}return h}}c= b.da(mp(c),J.alloc());this.pointsCount>(e?6:2)?(g=d?this.i(1):this.i(this.pointsCount-2),e&&(g=np(c,g.copy()))):(k=this.computeSpot(!d,g),f=J.alloc(),g=g.da(mp(k),f),e&&(g=np(c,g)),J.free(f));this.getLinkPointFromPoint(a,b,c,g,d,h);J.free(c);return h}; -U.prototype.getLinkDirection=function(a,b,c,d,e,f,g,h){a:if(d.hb())var k=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x1-d.y?90:d.x<1-d.y?180:135:.5>d.x?225:.5(f?6:2)?(h=e?this.i(1):this.i(this.pointsCount-2),h=f?np(k,h.copy()):c):(c=J.alloc(),h=h.da(yc,c),J.free(c));c=Math.abs(h.x-k.x)>Math.abs(h.y-k.y)?h.x>= -k.x?0:180:h.y>=k.y?90:270;J.free(k);k=c}d.wc()&&g.Fd(a)&&(k+=180,360<=k&&(k-=360));if(lp(d))return k;a=b.Li();if(0===a)return k;45<=a&&135>a?k+=90:135<=a&&225>a?k+=180:225<=a&&315>a&&(k+=270);360<=k&&(k-=360);return k};U.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.Kc()&&(a=op(this,b),null!==a))return a.mv;a=d?this.fromEndSegmentLength:this.toEndSegmentLength;null!==b&&isNaN(a)&&(a=d?b.fromEndSegmentLength:b.toEndSegmentLength);isNaN(a)&&(a=10);return a}; +U.prototype.getLinkDirection=function(a,b,c,d,e,f,g,h){a:if(d.hb())var k=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x1-d.y?90:d.x<1-d.y?180:135:.5>d.x?225:.5(f?6:2)?(h=e?this.i(1):this.i(this.pointsCount-2),h=f?np(k,h.copy()):c):(c=J.alloc(),h=h.da(yc,c),J.free(c));c=Math.abs(h.x-k.x)>Math.abs(h.y-k.y)?h.x>= +k.x?0:180:h.y>=k.y?90:270;J.free(k);k=c}d.wc()&&g.Fd(a)&&(k+=180,360<=k&&(k-=360));if(lp(d))return k;a=b.Li();if(0===a)return k;45<=a&&135>a?k+=90:135<=a&&225>a?k+=180:225<=a&&315>a&&(k+=270);360<=k&&(k-=360);return k};U.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.Lc()&&(a=op(this,b),null!==a))return a.mv;a=d?this.fromEndSegmentLength:this.toEndSegmentLength;null!==b&&isNaN(a)&&(a=d?b.fromEndSegmentLength:b.toEndSegmentLength);isNaN(a)&&(a=10);return a}; U.prototype.computeSpot=function(a,b){void 0===b&&(b=null);a?(a=b?b:this.fromPort,null===a?a=yc:(b=this.fromSpot,b.Lb()&&(b=a.fromSpot),a=b===Vc?rc:b)):(a=b?b:this.toPort,null===a?a=yc:(b=this.toSpot,b.Lb()&&(b=a.toSpot),a=b===Vc?rc:b));return a};function lp(a){return a===rc||.5===a.x&&.5===a.y}function mp(a){return.5===a.x&&.5===a.y?a:yc} U.prototype.computeOtherPoint=function(a,b){if(this.computeAdjusting()!==Vf&&4p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=qd.alloc();n.set(g); +U.prototype.vf=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var g=f;void 0===f&&(g=qd.alloc(),g.reset());g.multiply(this.transform);if(this.wh(a,g))return dn(this,b,c,e),void 0===f&&qd.free(g),!0;if(this.Jc(a,g)){var h=!1;if(!this.isAtomic)for(var k=this.T.m,l=k.length;l--;){var m=k[l];if(m.visible||m===this.locationObject){var n=m.actualBounds,p=this.naturalBounds;if(!(n.x>p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=qd.alloc();n.set(g); if(m instanceof X)h=m.vf(a,b,c,d,e,n);else if(this.path===m){if(m instanceof uf)if(h=a,p=d,!1===m.pickable)h=!1;else if(n.multiply(m.transform),p)b:{var r=h,q=n;if(m.wh(r,q))h=!0;else{if(void 0===q&&(q=m.transform,r.De(m.actualBounds))){h=!0;break b}h=r.left;p=r.right;var u=r.top;r=r.bottom;var v=J.alloc(),w=J.alloc(),z=J.alloc(),y=qd.alloc();y.set(q);y.Hv(m.transform);y.Ns();w.x=p;w.y=u;w.transform(y);v.x=h;v.y=u;v.transform(y);q=!1;Dn(m,v,w,z)?q=!0:(v.x=p,v.y=r,v.transform(y),Dn(m,v,w,z)?q=!0:(w.x= h,w.y=r,w.transform(y),Dn(m,v,w,z)?q=!0:(v.x=h,v.y=u,v.transform(y),Dn(m,v,w,z)&&(q=!0))));qd.free(y);J.free(v);J.free(w);J.free(z);h=q}}else h=m.wh(h,n)}else h=gl(m,a,d,n);h&&(p=m,null!==b&&(p=b(m)),p&&(null===c||c(p))&&e.add(p));qd.free(n)}}}void 0===f&&qd.free(g);return h||null!==this.background||null!==this.areaBackground}void 0===f&&qd.free(g);return!1}; U.prototype.computeCurve=function(){if(null===this.Mf){var a=this.fromPort,b=this.isOrthogonal;this.Mf=null!==a&&a===this.toPort&&!b}return this.Mf?Yf:this.curve};U.prototype.computeCorner=function(){if(this.curve===Yf)return 0;var a=this.corner;if(isNaN(a)||0>a)a=10;return a}; U.prototype.findMidLabel=function(){for(var a=this.path,b=this.T.m,c=b.length,d=0;dk?-Math.PI/2:Math.PI/2;else m=Math.atan(k/Math.abs(h)),0>h&&(m=Math.PI-m);g=b.x;var n=b.y;h=d.x-g;var p=d.y-n;k=Math.sqrt(h*h+p*p);L.aa(h,0)?p=0>p?-Math.PI/2:Math.PI/2:(p=Math.atan(p/Math.abs(h)),0>h&&(p=Math.PI-p)); -l=k/l;m=p-m;this.Mc(a,b);for(a+=1;ak?-Math.PI/2:Math.PI/2:(k=Math.atan(k/Math.abs(h)),0>h&&(k=Math.PI-k)),h=k+m,b*=l,this.L(a,g+b*Math.cos(h),n+b*Math.sin(h)));this.Mc(c,d)}}return!0;case cp:f=this.i(a);n=this.i(c);if(!f.Ta(b)||!n.Ta(d)){e=f.x;f=f.y;g=n.x;n=n.y;l=(g-e)*(g-e)+(n-f)*(n-f);h=b.x;m=b.y;k=d.x;p=d.y;var r=1;if(0!==k-h){var q=(p-m)/(k-h);r=Math.sqrt(1+1/(q*q))}else q=9E9;this.Mc(a,b);for(a+=1;ab?b+=360:360<=b&&(b-=360);0>d?d+=360:360<=d&&(d-=360);var g=d;b=315<=b||45>b?0:45<=b&&135>b?90:135<=b&&225>b?180:270;d=315<=d||45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.actualBounds.copy(),k=f.actualBounds.copy();if(h.u()&&k.u()){h.Gc(up,up);k.Gc(up,up);h.Le(a);k.Le(c);var l=J.alloc(),m=J.alloc();if(0===b)if(c.x>a.x||270===d&&c.ya.x||90===d&&c.y>a.y&&k.right>a.x)l.h(c.x,a.y),m.h(c.x,(a.y+c.y)/2),180===d?(l.x=this.computeMidOrthoPosition(a.x, +l=k/l;m=p-m;this.Nc(a,b);for(a+=1;ak?-Math.PI/2:Math.PI/2:(k=Math.atan(k/Math.abs(h)),0>h&&(k=Math.PI-k)),h=k+m,b*=l,this.L(a,g+b*Math.cos(h),n+b*Math.sin(h)));this.Nc(c,d)}}return!0;case cp:f=this.i(a);n=this.i(c);if(!f.Ta(b)||!n.Ta(d)){e=f.x;f=f.y;g=n.x;n=n.y;l=(g-e)*(g-e)+(n-f)*(n-f);h=b.x;m=b.y;k=d.x;p=d.y;var r=1;if(0!==k-h){var q=(p-m)/(k-h);r=Math.sqrt(1+1/(q*q))}else q=9E9;this.Nc(a,b);for(a+=1;ab?b+=360:360<=b&&(b-=360);0>d?d+=360:360<=d&&(d-=360);var g=d;b=315<=b||45>b?0:45<=b&&135>b?90:135<=b&&225>b?180:270;d=315<=d||45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.actualBounds.copy(),k=f.actualBounds.copy();if(h.u()&&k.u()){h.Hc(up,up);k.Hc(up,up);h.Le(a);k.Le(c);var l=J.alloc(),m=J.alloc();if(0===b)if(c.x>a.x||270===d&&c.ya.x||90===d&&c.y>a.y&&k.right>a.x)l.h(c.x,a.y),m.h(c.x,(a.y+c.y)/2),180===d?(l.x=this.computeMidOrthoPosition(a.x, a.y,c.x,c.y,!1),m.x=l.x,m.y=c.y):270===d&&c.ya.y?(l.x=a.xk.bottom)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):k.right,m.x=l.x,m.y=c.y):0===d&&a.xk.top&&a.yh.bottom)180===d&&(k.$(a)||h.$(c))?l.y= this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!0):c.ya.y&&(180===d||270===d)&&(l.y=this.computeMidOrthoPosition(a.x,h.bottom,c.x,Math.min(c.y,k.top),!0)),m.x=c.x,m.y=l.y;if(l.y>h.top&&l.y=h.left&&c.x<=a.x||a.x<=k.right&&a.x>=c.x){if(90===d||270===d)l.h(Math.max((a.x+c.x)/2,a.x),a.y),m.h(l.x,c.y)}else l.y=270===d||(0===d||180===d)&&c.ya.y&&k.lefta.y?(l.x=a.x>k.right?this.computeMidOrthoPosition(a.x,a.y,k.right,c.y,!1):a.x>k.left&&(270===d&&a.yk.bottom)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):k.left,m.x=l.x,m.y=c.y): @@ -1551,15 +1551,15 @@ a.y,c.x,c.y,!1):c.xa.x&&k.top=a.x?(l.y=a.y>k.bottom?this.computeMidOrthoPosition(a.x,a.y,c.x,k.bottom,!0):a.y>k.top&&(180===d&&a.xk.right)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!0):k.top,m.x=c.x,m.y=l.y):270===d&&a.y>k.bottom&&a.x>k.left&&a.xh.right)90===d&&(k.$(a)||h.$(c))?l.x=this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):c.xa.x&&(90===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right,a.y,Math.min(c.x,k.left),c.y,!1)),m.x=l.x,m.y=c.y;if(l.x>h.left&&l.x=a.y||a.y>=k.top&&a.y<=c.y){if(0===d||180===d)l.h(a.x,Math.min((a.y+c.y)/2,a.y)),m.h(c.x,l.y)}else l.x=180===d||(90===d||270===d)&&c.x=xp&&(sk(r),h.Gc(r.bq*r.ly,r.aq*r.my),vp(r,a,b,n,d,h,!1),k=wp(r, +Math.min(a.y,l.y),Math.abs(a.x-l.x),Math.abs(a.y-l.y))&&r.qk(Math.min(l.x,m.x),Math.min(l.y,m.y),Math.abs(l.x-m.x),Math.abs(l.y-m.y))&&r.qk(Math.min(m.x,n.x),Math.min(m.y,n.y),Math.abs(m.x-n.x),Math.abs(m.y-n.y)))b=!1;else{e=a;f=n;var q=c=null;if(p.isVirtualized){p=r.bounds.copy();p.Hc(-r.bq,-r.aq);var u=J.alloc();tk(r,a.x,a.y)||(L.yf(p.x,p.y,p.x+p.width,p.y+p.height,a.x,a.y,l.x,l.y,u)?(c=a=u.copy(),b=u.Ra(l)):L.yf(p.x,p.y,p.x+p.width,p.y+p.height,l.x,l.y,m.x,m.y,u)?(c=a=u.copy(),b=u.Ra(m)):L.yf(p.x, +p.y,p.x+p.width,p.y+p.height,m.x,m.y,n.x,n.y,u)&&(c=a=u.copy(),b=u.Ra(n)));tk(r,n.x,n.y)||(L.yf(p.x,p.y,p.x+p.width,p.y+p.height,n.x,n.y,m.x,m.y,u)?(q=n=u.copy(),d=m.Ra(u)):L.yf(p.x,p.y,p.x+p.width,p.y+p.height,m.x,m.y,l.x,l.y,u)?(q=n=u.copy(),d=l.Ra(u)):L.yf(p.x,p.y,p.x+p.width,p.y+p.height,l.x,l.y,a.x,a.y,u)&&(q=n=u.copy(),d=a.Ra(u)));J.free(u)}h=h.copy().Oc(k);h.Hc(r.bq*r.it,r.aq*r.it);vp(r,a,b,n,d,h,!0);k=wp(r,n.x,n.y);!r.abort&&k>=xp&&(sk(r),h.Hc(r.bq*r.ly,r.aq*r.my),vp(r,a,b,n,d,h,!1),k=wp(r, n.x,n.y));if(!r.abort&&kthis.pointsCount)0===b||180===b?(h.x=a.x,h.y=n.y):(h.x=n.x,h.y=a.y),this.L(2,h.x,h.y),this.l(3,h.x,h.y);else if(g=this.i(3),0===b||180===b)L.w(h.x,g.x)?(h=0===b?Math.max(h.x,a.x):Math.min(h.x,a.x),this.L(2,h,a.y),this.L(3,h,g.y)):L.w(h.y,g.y)?(Math.abs(a.y-h.y)<=r.aq/2&&(this.L(2,h.x,a.y),this.L(3,g.x,a.y)),this.l(2,h.x,a.y)):this.L(2,a.x,h.y);else if(90===b||270===b)L.w(h.y,g.y)?(h=90===b?Math.max(h.y,a.y): Math.min(h.y,a.y),this.L(2,a.x,h),this.L(3,g.x,h)):L.w(h.x,g.x)?(Math.abs(a.x-h.x)<=r.bq/2&&(this.L(2,a.x,h.y),this.L(3,a.x,g.y)),this.l(2,a.x,h.y)):this.L(2,h.x,a.y);null!==c&&(a=this.i(1),g=this.i(2),a.x!==g.x&&a.y!==g.y?0===b||180===b?this.l(2,a.x,g.y):this.l(2,g.x,a.y):0===b||180===b?this.l(2,e.x,c.y):this.l(2,c.x,e.y));null!==q&&(0===d||180===d?this.pf(f.x,q.y):this.pf(q.x,f.y));b=!0}else b=!1}}}else b=!1;b||(this.ce(l.copy()),this.ce(m.copy()));J.free(l);J.free(m)}}; -U.prototype.computeMidOrthoPosition=function(a,b,c,d,e){var f=0;!this.hasCurviness()||this.computeSpot(!0,this.fromPort).Kc()||this.computeSpot(!1,this.toPort).Kc()||(f=this.computeCurviness());return e?(b+d)/2+f:(a+c)/2+f}; +U.prototype.computeMidOrthoPosition=function(a,b,c,d,e){var f=0;!this.hasCurviness()||this.computeSpot(!0,this.fromPort).Lc()||this.computeSpot(!1,this.toPort).Lc()||(f=this.computeCurviness());return e?(b+d)/2+f:(a+c)/2+f}; function Kj(a){if(null===a.diagram||!a.isAvoiding||!nk(a.diagram))return!1;var b=a.points.m,c=b.length;if(4>c)return!1;a=ok(a.diagram,!0,a.containingGroup,null);for(var d=1;dzp&&wp(b,m,n)!==l-1&&(wp(b,c-h,d)===l-1?(e=180,m=c-h,n=d):wp(b,c+h,d)===l-1?(e=0,m=c+h,n=d):wp(b,c,d-k)===l-1?(e=270,m=c,n=d-k):wp(b,c,d+k)===l-1&&(e=90,m=c,n=d+k));for(;l>zp&&wp(b,m,n)===l-1;)c=m,d=n,0===e?m+=h:90===e?n+=k:180===e?m-=h:n-=k,--l;if(f){if(l>zp)if(180===e||0===e)c=Math.floor(c/h)*h+h/2;else if(90===e||270===e)d=Math.floor(d/k)*k+k/2}else c=Math.floor(c/h)*h+h/2,d=Math.floor(d/ k)*k+k/2;l>zp&&(f=e,g=c,m=d,0===e?(f=90,m+=k):90===e?(f=180,g-=h):180===e?(f=270,m-=k):270===e&&(f=0,g+=h),wp(b,g,m)===l-1?yp(a,b,g,m,f,!1,f):(g=c,m=d,0===e?(f=270,m-=k):90===e?(f=0,g+=h):180===e?(f=90,m+=k):270===e&&(f=180,g-=h),wp(b,g,m)===l-1&&yp(a,b,g,m,f,!1,f)));a.pf(c,d)}U.prototype.Kz=function(a){var b=a.x;a=a.y;for(var c=this.i(0),d=this.i(1),e=Bb(b,a,c.x,c.y,d.x,d.y),f=0,g=1;gb)return a.type=Q.j,this.Lm=!0,a;var c=!1,d=this.diagram;null!==d&&ep(this)&&d.Wh.contains(this)&&(0!==this.Gl.width||0!==this.Gl.height)&&(c=!0);var e=this.i(0).copy(),f=e.copy();d=this.Bb.m;var g=this.computeCurve();if(g===Yf&&3<=b&&!L.aa(this.smoothness,0))if(3===b){var h=this.i(1);d=Math.min(e.x,h.x);var k=Math.min(e.y,h.y);h=this.i(2);d=Math.min(d,h.x);k=Math.min(k,h.y)}else{if(this.isOrthogonal)for(k=0;k=b&&(d=b-1),k=this.i(d),f.x=Math.min(k.x,f.x),f.y=Math.min(k.y,f.y);d=f.x;k=f.y}else{for(k=0;kv?q>r?(f.x= @@ -1573,13 +1573,13 @@ function Bp(a,b,c,d){for(var e=a.pointsCount,f=b;L.aa(b.x,f.x)&&L.aa(b.y,f.y);){ function Dp(a,b,c,d,e,f,g){if(!g&&ep(a)){g=a.computeJumpLength();var h=g/2,k=[],l=0;a.isVisible()&&(l=Ep(a,e,f,k));if(0n-g)l--,n=Math.max(m-h,f.x);else break;m=f.y-g+d;n+=c;r=f.y+d;a.curve===Uf?wd(b,n,r,!1):xd(b,p,m,n,m,n,r)}else if(L.w(e.x,f.x))if(e.ym-g)l--,m=Math.max(n-h,f.y);else break;n=f.x-g+c;r=f.x+c;m+=d;a.curve===Uf?wd(b,r,m,!1):xd(b,n,p,n,m,r,m)}}b.lineTo(f.x+c,f.y+d)} -function Ep(a,b,c,d){var e=a.diagram;if(null===e||b.A(c))return 0;for(e=e.layers;e.next();){var f=e.value;if(null!==f&&f.visible){f=f.Fa.m;for(var g=f.length,h=0;hg.x&&m.x>=l.x||l.xg.y&&m.y>=l.y||l.yq&&Math.min(g,v)n&&!L.w(g,v)){h.x=q;h.y=n;m=!0;break a}}else if(!L.w(n,r)&& L.w(g,v)&&Math.min(n,r)g&&Math.min(q,u)m&&!L.w(q,u)){h.x=m;h.y=g;m=!0;break a}h.x=0;h.y=0;m=!1}m&&(e?c.push(h.x):c.push(h.y));g=l}J.free(h)}function ep(a){a=a.curve;return a===Tf||a===Uf}function ip(a,b){if(b||ep(a))b=a.diagram,null===b||b.animationManager.isTicking||b.Wh.contains(a)||0===a.Gl.width&&0===a.Gl.height||b.Wh.add(a,a.Gl.copy())} U.prototype.rq=function(a){var b=this.layer;if(null!==b&&b.visible&&!b.isTemporary){var c=b.diagram;if(null!==c&&!c.animationManager.isTicking){var d=!1;for(c=c.layers;c.next();){var e=c.value;if(e.visible)if(e===b){d=!0;var f=!1;e=e.Fa.m;for(var g=e.length,h=0;ha&&xa(a,">= 0",U,"fromEndSegmentLength"),this.P.Hg=a,this.g("fromEndSegmentLength",b,a),this.Ua())}}, -fromShortLength:{get:function(){return null!==this.P?this.P.Ig:NaN},set:function(a){this.Hc();var b=this.P.Ig;b!==a&&(this.P.Ig=a,this.cc(!0),this.g("fromShortLength",b,a))}},toSpot:{get:function(){return null!==this.P?this.P.ph:Vc},set:function(a){this.Hc();var b=this.P.ph;b.A(a)||(a=a.I(),this.P.ph=a,this.g("toSpot",b,a),(b.Kc()||a.Kc())&&null!==this.toNode&&Mo(this.toPort),this.Ua())}},toEndSegmentLength:{ -get:function(){return null!==this.P?this.P.nh:NaN},set:function(a){this.Hc();var b=this.P.nh;b!==a&&(0>a&&xa(a,">= 0",U,"toEndSegmentLength"),this.P.nh=a,this.g("toEndSegmentLength",b,a),this.Ua())}},toShortLength:{get:function(){return null!==this.P?this.P.oh:NaN},set:function(a){this.Hc();var b=this.P.oh;b!==a&&(this.P.oh=a,this.cc(!0),this.g("toShortLength",b,a))}},isLabeledLink:{get:function(){return null===this.ld?!1:0a&&xa(a,">= 0",U,"fromEndSegmentLength"),this.P.Hg=a,this.g("fromEndSegmentLength",b,a),this.Ua())}}, +fromShortLength:{get:function(){return null!==this.P?this.P.Ig:NaN},set:function(a){this.Ic();var b=this.P.Ig;b!==a&&(this.P.Ig=a,this.cc(!0),this.g("fromShortLength",b,a))}},toSpot:{get:function(){return null!==this.P?this.P.ph:Vc},set:function(a){this.Ic();var b=this.P.ph;b.A(a)||(a=a.I(),this.P.ph=a,this.g("toSpot",b,a),(b.Lc()||a.Lc())&&null!==this.toNode&&Mo(this.toPort),this.Ua())}},toEndSegmentLength:{ +get:function(){return null!==this.P?this.P.nh:NaN},set:function(a){this.Ic();var b=this.P.nh;b!==a&&(0>a&&xa(a,">= 0",U,"toEndSegmentLength"),this.P.nh=a,this.g("toEndSegmentLength",b,a),this.Ua())}},toShortLength:{get:function(){return null!==this.P?this.P.oh:NaN},set:function(a){this.Ic();var b=this.P.oh;b!==a&&(this.P.oh=a,this.cc(!0),this.g("toShortLength",b,a))}},isLabeledLink:{get:function(){return null===this.md?!1:0=d&&(f=d-1);var h=this.i(f-1),k=this.i(f);L.cm(e.x,e.y,g.x,g.y,h.x,h.y,k.x,k.y,.5,a);b=Math.min(k.x,b);c=Math.min(k.y,c);e=k}else for(e=this.i(0),f=this.i(1),b=Math.min(e.x,f.x),c=Math.min(e.y,f.y),a.h(e.x,e.y,0,0),a.Le(f),e=2;ed&&(d=-d)):L.aa(d.y,e.y)?(d=e.x-d.x,0>d&&(d=-d)):d=Math.sqrt(d.tf(e));a.push(d)}}return this.qr}},flattenedTotalLength:{get:function(){var a=this.Rt;if(isNaN(a)){for(var b= +midAngle:{get:function(){this.pg();return this.computeMidAngle()}},flattenedLengths:{get:function(){if(null===this.qr){this.sd||hp(this);for(var a=this.qr=[],b=this.pointsCount,c=0;cd&&(d=-d)):L.aa(d.y,e.y)?(d=e.x-d.x,0>d&&(d=-d)):d=Math.sqrt(d.tf(e));a.push(d)}}return this.qr}},flattenedTotalLength:{get:function(){var a=this.Rt;if(isNaN(a)){for(var b= this.flattenedLengths,c=b.length,d=a=0;d=this.pointsCount?0:this.isOrthogonal||!lp(this.computeSpot(!0))?1:0}},lastPickIndex:{get:function(){var a=this.pointsCount;return 0===a?0:2>=a?a-1:this.isOrthogonal||!lp(this.computeSpot(!1))?a-2:a-1}},adjusting:{get:function(){return this.Ek},set:function(a){var b=this.Ek;b!== a&&(this.Ek=a,this.g("adjusting",b,a))}},corner:{get:function(){return this.rn},set:function(a){var b=this.rn;b!==a&&(this.rn=a,this.cc(!0),this.g("corner",b,a))}},curve:{get:function(){return this.tn},set:function(a){var b=this.tn;b!==a&&(this.tn=a,this.Ua(),this.cc(!0),ip(this,b===Uf||b===Tf||a===Uf||a===Tf),this.g("curve",b,a))}},curviness:{get:function(){return this.un},set:function(a){var b=this.un;b!== a&&(this.un=a,this.Ua(),this.cc(!1),this.g("curviness",b,a))}},routing:{get:function(){return this.Oj},set:function(a){var b=this.Oj;b!==a&&(this.Oj=a,this.Mf=null,this.Ua(),ip(this,2===(b.value&2)||2===(a.value&2)),this.g("routing",b,a))}},smoothness:{get:function(){return this.Dp},set:function(a){var b=this.Dp;b!==a&&(this.Dp=a,this.cc(!0),this.g("smoothness",b,a))}},key:{get:function(){var a=this.diagram; if(null!==a&&a.model.Qi())return a.model.mc(this.data)}}});U.prototype.invalidateOtherJumpOvers=U.prototype.rq;U.prototype.findClosestSegment=U.prototype.Kz;U.prototype.updateRoute=U.prototype.pg;U.prototype.invalidateRoute=U.prototype.Ua;U.prototype.rollbackRoute=U.prototype.Tv;U.prototype.commitRoute=U.prototype.rf;U.prototype.startRoute=U.prototype.Hh;U.prototype.clearPoints=U.prototype.ak;U.prototype.removePoint=U.prototype.Rv;U.prototype.addPointAt=U.prototype.pf;U.prototype.addPoint=U.prototype.ce; -U.prototype.insertPointAt=U.prototype.l;U.prototype.insertPoint=U.prototype.pA;U.prototype.setPointAt=U.prototype.L;U.prototype.setPoint=U.prototype.Mc;U.prototype.getPoint=U.prototype.i;U.prototype.getOtherPort=U.prototype.gA;U.prototype.getOtherNode=U.prototype.nq; +U.prototype.insertPointAt=U.prototype.l;U.prototype.insertPoint=U.prototype.pA;U.prototype.setPointAt=U.prototype.L;U.prototype.setPoint=U.prototype.Nc;U.prototype.getPoint=U.prototype.i;U.prototype.getOtherPort=U.prototype.gA;U.prototype.getOtherNode=U.prototype.nq; var jp=null,kp=null,$o=new D(U,"Normal",1),Ip=new D(U,"Orthogonal",2),Jp=new D(U,"AvoidsNodes",6),rp=new D(U,"AvoidsNodesStraight",7),Vf=new D(U,"None",0),Yf=new D(U,"Bezier",9),Uf=new D(U,"JumpGap",10),Tf=new D(U,"JumpOver",11),ap=new D(U,"End",17),bp=new D(U,"Scale",18),cp=new D(U,"Stretch",19),Rm=new D(U,"OrientAlong",21),Km=new D(U,"OrientPlus90",22),Mm=new D(U,"OrientMinus90",23),dp=new D(U,"OrientOpposite",24),Sm=new D(U,"OrientUpright",25),Lm=new D(U,"OrientPlus90Upright",26),Nm=new D(U,"OrientMinus90Upright", 27),Om=new D(U,"OrientUpright45",28),tp=16,sp=14,up=8;U.className="Link";U.Normal=$o;U.Orthogonal=Ip;U.AvoidsNodes=Jp;U.AvoidsNodesStraight=rp;U.None=Vf;U.Bezier=Yf;U.JumpGap=Uf;U.JumpOver=Tf;U.End=ap;U.Scale=bp;U.Stretch=cp;U.OrientAlong=Rm;U.OrientPlus90=Km;U.OrientMinus90=Mm;U.OrientOpposite=dp;U.OrientUpright=Sm;U.OrientPlus90Upright=Lm;U.OrientMinus90Upright=Nm;U.OrientUpright45=Om;U.EndSegmentStep=8;U.CurvinessStart=tp;U.SpacingMin=sp;U.OrthoShortCut=up; function Hp(a,b,c,d){Ta(this);this.re=this.wr=!1;this.Ws=a;this.uy=b;this.Iv=c;this.vy=d;this.links=[]}Hp.prototype.mm=function(){if(!this.wr){var a=this.links;0=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.wd=Math.floor((a.x-this.dc)/this.dc)*this.dc;this.xd=Math.floor((b-this.ec)/this.ec)*this.ec;this.Ao=Math.ceil((c+2*this.dc)/this.dc)*this.dc;this.Bo=Math.ceil((d+2*this.ec)/this.ec)*this.ec;a=1+(Math.ceil((this.Ao-this.wd)/this.dc)|0);b=1+(Math.ceil((this.Bo-this.xd)/this.ec)|0);if(null===this.Qb||this.zi=zp&&(c[d]=Kp)} -pk.prototype.qk=function(a,b,c,d){if(a>this.Ao||a+cthis.Bo||b+da&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e)return!0;d=Math.min(a+c-1,this.zi)|0;for(c=Math.min(b+e-1,this.Ai)|0;a<=d;a++){e=this.Qb[a];for(var f=b;f<=c;f++)if(e[f]===uk)return!1}return!0}; +function pk(a){Ta(this);this.Fy=this.group=null;this.Ms=!0;this.abort=!1;this.yd=this.xd=1;this.Bo=this.Ao=-1;this.dc=a.width;this.ec=a.height;this.Qb=null;this.Ai=this.zi=0;this.it=11;this.my=this.ly=22} +pk.prototype.initialize=function(a){if(!(0>=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.xd=Math.floor((a.x-this.dc)/this.dc)*this.dc;this.yd=Math.floor((b-this.ec)/this.ec)*this.ec;this.Ao=Math.ceil((c+2*this.dc)/this.dc)*this.dc;this.Bo=Math.ceil((d+2*this.ec)/this.ec)*this.ec;a=1+(Math.ceil((this.Ao-this.xd)/this.dc)|0);b=1+(Math.ceil((this.Bo-this.yd)/this.ec)|0);if(null===this.Qb||this.zi=zp&&(c[d]=Kp)} +pk.prototype.qk=function(a,b,c,d){if(a>this.Ao||a+cthis.Bo||b+da&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e)return!0;d=Math.min(a+c-1,this.zi)|0;for(c=Math.min(b+e-1,this.Ai)|0;a<=d;a++){e=this.Qb[a];for(var f=b;f<=c;f++)if(e[f]===uk)return!1}return!0}; function Lp(a,b,c,d,e,f,g,h,k){if(!(bg||ck)){var l=b|0;var m=c|0;var n=a.Qb[l][m];if(n>=zp&&n=a.Qb[l][m]);)a.Qb[l][m]=n,n+=1,e?m+=d:l+=d;l=e?m:l;if(e)if(0l;c+=d)Lp(a,b,c,1,!e,f,g,h,k),Lp(a,b,c,-1,!e,f,g,h,k);else if(0l;b+=d)Lp(a,b,c,1,!e,f,g,h,k),Lp(a,b,c,-1,!e,f,g,h, k)}}function Mp(a,b,c,d,e,f,g,h,k){b|=0;c|=0;var l=uk,m=zp;for(a.Qb[b][c]=m;l===uk&&b>f&&bh&&cf&&bh&&c=Math.abs(h-l)&&1>=Math.abs(k-m))a.abort=!0;else{var n=f.x;d=f.y;b=f.x+f.width;var p=f.y+f.height;n-=a.wd;n/=a.dc;d-=a.xd;d/=a.ec;b-=a.wd;b/=a.dc;p-=a.xd;p/=a.ec;f=Math.max(0,Math.min(a.zi,n|0));b=Math.min(a.zi,Math.max(0,b|0));n=Math.max(0,Math.min(a.Ai,d|0));p=Math.min(a.Ai,Math.max(0,p|0));d=a.Qb;h|=0;k|=0;l|=0;m|= +function vp(a,b,c,d,e,f,g){if(null!==a.Qb){a.abort=!1;var h=b.x,k=b.y;if(tk(a,h,k)){h-=a.xd;h/=a.dc;k-=a.yd;k/=a.ec;var l=d.x,m=d.y;if(tk(a,l,m))if(l-=a.xd,l/=a.dc,m-=a.yd,m/=a.ec,1>=Math.abs(h-l)&&1>=Math.abs(k-m))a.abort=!0;else{var n=f.x;d=f.y;b=f.x+f.width;var p=f.y+f.height;n-=a.xd;n/=a.dc;d-=a.yd;d/=a.ec;b-=a.xd;b/=a.dc;p-=a.yd;p/=a.ec;f=Math.max(0,Math.min(a.zi,n|0));b=Math.min(a.zi,Math.max(0,b|0));n=Math.max(0,Math.min(a.Ai,d|0));p=Math.min(a.Ai,Math.max(0,p|0));d=a.Qb;h|=0;k|=0;l|=0;m|= 0;var r=0===c||90===c?1:-1;c=90===c||270===c;d[h][k]===uk?(Mp(a,h,k,r,c,f,b,n,p),Mp(a,h,k,1,!c,f,b,n,p),Mp(a,h,k,-1,!c,f,b,n,p)):Mp(a,h,k,r,c,h,k,h,k);d[l][m]===uk?(Np(a,l,m,0===e||90===e?1:-1,90===e||270===e,f,b,n,p),Np(a,l,m,1,!(90===e||270===e),f,b,n,p),Np(a,l,m,-1,!(90===e||270===e),f,b,n,p)):Np(a,l,m,r,c,l,m,l,m);c=Fa();if(g&&Op(a,l,m,e,h,k,c)){if(c[0]!==l||c[1]!==m)c.unshift(m),c.unshift(l);if(c[c.length-2]!==h||c[c.length-1]!==k)c.push(h),c.push(k);a=zp;e=c[c.length-2];g=c[c.length-1];d[e][g]= a++;for(f=c.length-4;0<=f;f-=2)for(e=c[f+2],g=c[f+3],b=c[f],l=c[f+1];b>e?e++:bg?g++:le)m--;else break;else if(n>f)n--;else break;var p=h[m][n];if(0===p||p===Pp)break;k=m;l=n}for(;;){m=d;n=k;p=l;0===d?pf&&(m=270,p--):90===d?ne&&(m=180,n--):180===d?pf&&(m=270,p--):ne&&(m=180,n--);n=h[n][p];if(m!==d&&0!==n&&n!==Pp){g.push(k);g.push(l);if(Op(a,k,l, m,e,f,g))return!0;g.pop();g.pop()}h[k][l]=Pp;if(0===d){if(k===b)return!1;k--}else if(90===d){if(l===c)return!1;l--}else if(180===d){if(k===b)return!1;k++}else{if(l===c)return!1;l++}}} -na.Object.defineProperties(pk.prototype,{bounds:{get:function(){return new N(this.wd,this.xd,this.Ao-this.wd,this.Bo-this.xd)}},bq:{get:function(){return this.dc},set:function(a){0=c?180:0}a=180*Math.atan2(a.height,a.width)/Math.PI;switch(b){case 3:return c>a&&c<=180+a?180:270;case 5:return c>180-a&&c<=360-a?270:0;case 12:return c>a&&c<=180+a?90:0;case 10:return c>180-a&&c<=360-a?180:90;case 7:return 90180+a&&c<=360-a?270:0;case 13:return 180a&&180>=c?90:0;case 14:return c> a&&c<=180-a?90:c>180-a&&270>=c?180:0;case 11:return c>180-a&&c<=180+a?180:c>180+a?270:90}d&&15!==b&&(c-=15,0>c&&(c+=360));return c>a&&c<180-a?90:c>=180-a&&c<=180+a?180:c>180+a&&c<360-a?270:0}pp.prototype.mm=function(){this.ee.length=0}; function qp(a,b){var c=a.ee;if(0===c.length){a:if(!a.uq){c=a.uq;a.uq=!0;var d=null,e=a.node,f=e instanceof hf?e:null;if(null===f||f.isSubGraphExpanded)var g=e.isTreeExpanded?e.findLinksConnected(a.port.portId):e.Sx();else{if(!f.actualBounds.u()){a.uq=c;break a}d=f;g=d.ov()}f=a.ee.length=0;var h=a.port.da(sc,J.alloc()),k=a.port.da(Cc,J.alloc());e=N.allocAt(h.x,h.y,0,0);e.Le(k);J.free(h);J.free(k);h=J.allocAt(e.x+e.width/2,e.y+e.height/2);k=a.port.Li();for(g=g.iterator;g.next();){var l=g.value;if(l.isVisible()&& -l.fromPort!==l.toPort){var m=l.fromPort===a.port||null!==l.fromNode&&l.fromNode.Fd(d),n=l.computeSpot(m,a.port);if(n.Kc()){var p=m?l.toPort:l.fromPort;if(null!==p&&(m=p.part,null!==m)){var r=m.findVisibleNode();null!==r&&r!==m&&(m=r,p=m.port);m=l.computeOtherPoint(m,p);p=h.Oa(p.da(yc));p+=(h.Oa(m)-p)/360;p-=k;0>p?p+=360:360<=p&&(p-=360);n=Qp(e,n,p,l.isOrthogonal);0===n?(n=4,180p&&(p+=360));r=a.ee[f];void 0===r?(r=new Rp(l,p,n),a.ee[f]= -r):(r.link=l,r.angle=p,r.xc=n);r.Kv.set(m);f++}}}}J.free(h);a.ee.sort(pp.prototype.j);k=a.ee.length;d=-1;for(f=h=0;fMath.abs(u)?(z=Math.abs(u)/p,p=Math.abs(u)):z=1;break;case 2:r>Math.abs(y)?(z=Math.abs(y)/r,r=Math.abs(y)):z=1;break;case 1:n>Math.abs(u)?(z=Math.abs(u)/n,n=Math.abs(u)):z=1;break;default:case 4:m> -Math.abs(y)?(z=Math.abs(y)/m,m=Math.abs(y)):z=1}w=0}var F=A.tq;if(d===Xo){A=A.link.computeThickness();A*=z;F.set(B);switch(q){case 8:F.x=B.x+u/2+p/2-w-A/2;break;case 2:F.y=B.y+y/2+r/2-w-A/2;break;case 1:F.x=B.x+u/2-n/2+w+A/2;break;default:case 4:F.y=B.y+y/2-m/2+w+A/2}w+=A}else{var K=.5;d===Jo&&(K=(A.oq+1)/(A.fm+1));F.x=B.x+u*K;F.y=B.y+y*K}}}J.free(h);J.free(k);J.free(g);J.free(l);B=a.ee;for(f=0;fb.xc?1:a.angleb.angle?1:0}; +l.fromPort!==l.toPort){var m=l.fromPort===a.port||null!==l.fromNode&&l.fromNode.Fd(d),n=l.computeSpot(m,a.port);if(n.Lc()&&(m=m?l.toPort:l.fromPort,null!==m)){var p=m.part;if(null!==p){var r=p.findVisibleNode();null!==r&&r!==p&&(p=r,m=p.port);m=l.computeOtherPoint(p,m);p=h.Ra(m);p-=k;0>p?p+=360:360<=p&&(p-=360);n=Qp(e,n,p,l.isOrthogonal);0===n?(n=4,180p&&(p+=360));r=a.ee[f];void 0===r?(r=new Rp(l,p,n),a.ee[f]=r):(r.link=l,r.angle=p,r.xc= +n);r.Kv.set(m);f++}}}}J.free(h);a.ee.sort(pp.prototype.j);k=a.ee.length;d=-1;for(f=h=0;fMath.abs(u)?(z=Math.abs(u)/p,p=Math.abs(u)):z=1;break;case 2:r>Math.abs(y)?(z=Math.abs(y)/r,r=Math.abs(y)):z=1;break;case 1:n>Math.abs(u)?(z=Math.abs(u)/n,n=Math.abs(u)):z=1;break;default:case 4:m>Math.abs(y)?(z=Math.abs(y)/ +m,m=Math.abs(y)):z=1}w=0}var F=A.tq;if(d===Xo){A=A.link.computeThickness();A*=z;F.set(B);switch(q){case 8:F.x=B.x+u/2+p/2-w-A/2;break;case 2:F.y=B.y+y/2+r/2-w-A/2;break;case 1:F.x=B.x+u/2-n/2+w+A/2;break;default:case 4:F.y=B.y+y/2-m/2+w+A/2}w+=A}else{var K=.5;d===Jo&&(K=(A.oq+1)/(A.fm+1));F.x=B.x+u*K;F.y=B.y+y*K}}}J.free(h);J.free(k);J.free(g);J.free(l);B=a.ee;for(f=0;fb.xc?1:a.angleb.angle?1:0}; pp.prototype.computeEndSegmentLength=function(a){var b=a.link,c=b.computeEndSegmentLength(this.node,this.port,rc,b.fromPort===this.port),d=a.oq;if(0>d)return c;var e=a.fm;if(1>=e||!b.isOrthogonal)return c;b=a.Kv;var f=a.tq;if(2===a.xc||8===a.xc)d=e-1-d;return((a=2===a.xc||4===a.xc)?b.y=b-1?(f=0,d=c,e+=g+20,g=0):f++}}; li.prototype.doMinimalNetworkLayout=function(){var a=Math.ceil(Math.sqrt(this.network.vertexes.count));this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin);for(var b=this.arrangementOrigin.x,c=b,d=this.arrangementOrigin.y,e=0,f=0,g=this.network.vertexes.iterator;g.next();){var h=g.value.node;if(!(null===h||h instanceof U)&&(Up(h),this.Fh(h))){var k=h.measuredBounds,l=k.width;k=k.height;h.moveTo(c,d);h instanceof hf&&(h.Fh=!1);c+=Math.max(l,50)+20;f=Math.max(f,Math.max(k,50));e>=a-1?(e= -0,c=b,d+=f+20,f=0):e++}}};li.prototype.Fh=function(a){return!a.location.u()||a instanceof hf&&a.Fh?!0:!1};function Tp(a,b,c,d,e,f,g,h){for(c=c.iterator;c.next();){var k=c.value;d&&!k.isTopLevel||null!==e&&!e(k)||!k.canLayout()||(f&&k instanceof W?k.isLinkLabel||(k instanceof hf?null===k.layout?Tp(a,b,k.memberParts,!1,e,f,g,h):(Up(k),b.add(k)):(Up(k),b.add(k))):g&&k instanceof U?b.add(k):!h||!k.Jc()||k instanceof W||(Up(k),b.add(k)))}} +0,c=b,d+=f+20,f=0):e++}}};li.prototype.Fh=function(a){return!a.location.u()||a instanceof hf&&a.Fh?!0:!1};function Tp(a,b,c,d,e,f,g,h){for(c=c.iterator;c.next();){var k=c.value;d&&!k.isTopLevel||null!==e&&!e(k)||!k.canLayout()||(f&&k instanceof W?k.isLinkLabel||(k instanceof hf?null===k.layout?Tp(a,b,k.memberParts,!1,e,f,g,h):(Up(k),b.add(k)):(Up(k),b.add(k))):g&&k instanceof U?b.add(k):!h||!k.Kc()||k instanceof W||(Up(k),b.add(k)))}} function Up(a){var b=a.actualBounds;(0===b.width||0===b.height||isNaN(b.width)||isNaN(b.height))&&a.Sa()}li.prototype.Ni=function(a,b){var c=this.boundsComputation;if(null!==c)return b||(b=new N),c(a,this,b);if(!b)return a.actualBounds;b.set(a.actualBounds);return b}; li.prototype.Hx=function(a){var b=new G;a instanceof T?(Tp(this,b,a.nodes,!0,null,!0,!0,!0),Tp(this,b,a.links,!0,null,!0,!0,!0),Tp(this,b,a.parts,!0,null,!0,!0,!0)):a instanceof hf?Tp(this,b,a.memberParts,!1,null,!0,!0,!0):Tp(this,b,a.iterator,!1,null,!0,!0,!0);return b}; li.prototype.initialOrigin=function(a){var b=this.group;if(null!==b){var c=b.position.copy();(isNaN(c.x)||isNaN(c.y))&&c.set(a);b=b.placeholder;null!==b&&(c=b.da(sc),(isNaN(c.x)||isNaN(c.y))&&c.set(a),a=b.padding,c.x+=a.left,c.y+=a.top);return c}return a};li.prototype.mayUseWorker=function(){return this.mayUseWorkerFunction?this.mayUseWorkerFunction(this):!1};li.prototype.workerLayout=function(){return!1}; @@ -1662,36 +1662,36 @@ Sp.prototype.clear=function(){if(this.mf)for(var a=this.mf.iterator;a.next();)a. Sp.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutNetwork"+(null!==this.layout?"("+this.layout.toString()+")":"");if(0>=a)return b;b+=" vertexes: "+this.mf.count+" edges: "+this.le.count;if(1b?1:0):1:null!==b?-1:0} -na.Object.defineProperties(fq.prototype,{sourceEdgesArrayAccess:{get:function(){return this.qd._dataArray}},destinationEdgesArrayAccess:{get:function(){return this.Cd._dataArray}},data:{get:function(){return this.ib},set:function(a){this.ib=a;if(null!==a&&a.bounds){var b=a.bounds;a=b.x;var c=b.y,d=b.width;b=b.height;this.o.h(d/2,b/2);this.j.h(a,c,d,b)}}},node:{get:function(){return this.mi}, +function fq(a){Ta(this);this.Qc=a;this.j=(new N(0,0,10,10)).freeze();this.o=(new J(5,5)).freeze();this.mi=this.ib=null;this.rd=new E;this.Cd=new E} +fq.prototype.serializeVertexProperties=function(a){a.id=gb(this);a.key=this.node?this.node.key:this.data?this.data.ci:void 0;void 0===a.key&&(a.key=null);a.x=this.bounds.x;a.y=this.bounds.y;a.eB=this.bounds.width;a.mA=this.bounds.height;a.fx=this.focus.x;a.fy=this.focus.y;var b=[];this.rd.each(function(a){b.push(gb(a))});a.Ey=b;var c=[];this.Cd.each(function(a){c.push(gb(a))});a.Nx=c}; +fq.prototype.deserializeVertexProperties=function(a,b,c){if(null!==a){this.x=a.x;this.y=a.y;this.width=a.eB;this.height=a.mA;this.focusX=a.fx;this.focusY=a.fy;var d=this;a.Ey&&a.Ey.forEach(function(a){(a=c.get(a))&&d.rd.add(a)});a.Nx&&a.Nx.forEach(function(a){(a=c.get(a))&&d.Cd.add(a)})}};fq.prototype.clear=function(){this.mi=this.ib=null;this.rd=new E;this.Cd=new E}; +fq.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutVertex#"+gb(this);if(0b?1:0):1:null!==b?-1:0} +na.Object.defineProperties(fq.prototype,{sourceEdgesArrayAccess:{get:function(){return this.rd._dataArray}},destinationEdgesArrayAccess:{get:function(){return this.Cd._dataArray}},data:{get:function(){return this.ib},set:function(a){this.ib=a;if(null!==a&&a.bounds){var b=a.bounds;a=b.x;var c=b.y,d=b.width;b=b.height;this.o.h(d/2,b/2);this.j.h(a,c,d,b)}}},node:{get:function(){return this.mi}, set:function(a){if(this.mi!==a){this.mi=a;a.Sa();var b=this.network.layout,c=N.alloc(),d=b.Ni(a,c);b=d.x;var e=d.y,f=d.width;d=d.height;isNaN(b)&&(b=0);isNaN(e)&&(e=0);this.j.h(b,e,f,d);N.free(c);if(!(a instanceof hf)&&(a=a.locationObject.da(yc),a.u())){this.o.h(a.x-b,a.y-e);return}this.o.h(f/2,d/2)}}},bounds:{get:function(){return this.j},set:function(a){this.j.A(a)||this.j.assign(a)}},focus:{get:function(){return this.o},set:function(a){this.o.A(a)|| this.o.assign(a)}},centerX:{get:function(){return this.j.x+this.o.x},set:function(a){var b=this.j;b.x+this.o.x!==a&&(b.ea(),b.x=a-this.o.x,b.freeze())}},centerY:{get:function(){return this.j.y+this.o.y},set:function(a){var b=this.j;b.y+this.o.y!==a&&(b.ea(),b.y=a-this.o.y,b.freeze())}},focusX:{get:function(){return this.o.x},set:function(a){var b=this.o;b.x!==a&&(b.ea(),b.x=a,b.freeze())}},focusY:{ get:function(){return this.o.y},set:function(a){var b=this.o;b.y!==a&&(b.ea(),b.y=a,b.freeze())}},x:{get:function(){return this.j.x},set:function(a){var b=this.j;b.x!==a&&(b.ea(),b.x=a,b.freeze())}},y:{get:function(){return this.j.y},set:function(a){var b=this.j;b.y!==a&&(b.ea(),b.y=a,b.freeze())}},width:{get:function(){return this.j.width},set:function(a){var b=this.j;b.width!==a&&(b.ea(),b.width= -a,b.freeze())}},height:{get:function(){return this.j.height},set:function(a){var b=this.j;b.height!==a&&(b.ea(),b.height=a,b.freeze())}},network:{get:function(){return this.Pc},set:function(a){this.Pc=a}},sourceVertexes:{get:function(){for(var a=new G,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);return a.iterator}},destinationVertexes:{get:function(){for(var a=new G,b= -this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},vertexes:{get:function(){for(var a=new G,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);for(b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},sourceEdges:{get:function(){return this.qd.iterator}},destinationEdges:{get:function(){return this.Cd.iterator}},edges:{get:function(){for(var a= -new E,b=this.sourceEdges;b.next();)a.add(b.value);for(b=this.destinationEdges;b.next();)a.add(b.value);return a.iterator}},edgesCount:{get:function(){return this.qd.count+this.Cd.count}}});fq.prototype.deleteDestinationEdge=fq.prototype.jv;fq.prototype.addDestinationEdge=fq.prototype.$u;fq.prototype.deleteSourceEdge=fq.prototype.kv;fq.prototype.addSourceEdge=fq.prototype.bv;fq.className="LayoutVertex";fq.standardComparer=mq; +a,b.freeze())}},height:{get:function(){return this.j.height},set:function(a){var b=this.j;b.height!==a&&(b.ea(),b.height=a,b.freeze())}},network:{get:function(){return this.Qc},set:function(a){this.Qc=a}},sourceVertexes:{get:function(){for(var a=new G,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);return a.iterator}},destinationVertexes:{get:function(){for(var a=new G,b= +this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},vertexes:{get:function(){for(var a=new G,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);for(b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},sourceEdges:{get:function(){return this.rd.iterator}},destinationEdges:{get:function(){return this.Cd.iterator}},edges:{get:function(){for(var a= +new E,b=this.sourceEdges;b.next();)a.add(b.value);for(b=this.destinationEdges;b.next();)a.add(b.value);return a.iterator}},edgesCount:{get:function(){return this.rd.count+this.Cd.count}}});fq.prototype.deleteDestinationEdge=fq.prototype.jv;fq.prototype.addDestinationEdge=fq.prototype.$u;fq.prototype.deleteSourceEdge=fq.prototype.kv;fq.prototype.addSourceEdge=fq.prototype.bv;fq.className="LayoutVertex";fq.standardComparer=mq; fq.smartComparer=function(a,b){if(null!==a){if(null!==b){a=a.mi;var c=b.mi;if(null!==a){if(null!==c){b=a.text.toLocaleLowerCase().split(/([+-]?[.]?\d+(?:\.\d*)?(?:e[+-]?\d+)?)/);a=c.text.toLocaleLowerCase().split(/([+-]?[.]?\d+(?:\.\d*)?(?:e[+-]?\d+)?)/);for(c=0;c=f&&0>=g&&(f=1);b=this.spacing.width;isFinite(b)||(b=0);c=this.spacing.height;isFinite(c)||(c=0);null!==a&&a.wa("Layout");d=[];switch(this.alignment){case vq:var h=b,k=c,l=N.alloc(),m=Math.max(this.cellSize.width,1);if(!isFinite(m))for(var n=m=0;nf-1||0g)d.push(new N(0,u,g+h,w)),v=0,q=r,u+=w,w=0;w=Math.max(w,F);switch(p){case uq:A=-A.width;break;default:A= @@ -1701,13 +1701,13 @@ m&&u>m-1||0k){d.push(new N(0,F?z-f:z,k+n,A+f+p));for(S=0;Sl&&(f.width+=f.x-l,f.x=l);N.free(g)}for(h=f=g=e=0;hb?1:0} na.Object.defineProperties(Lk.prototype,{wrappingWidth:{get:function(){return this.Vp},set:function(a){this.Vp!==a&&(0d.indexOf(a.newValue)&&d.splice(c,0,a.newValue));return}}else if(a.change===fe){c=a.oldParam;if("linkDataArray"===a.modelChange){a=a.oldValue;za(a)&&"number"===typeof c&&(d=this.mc(a),b?(this.Rf.add(a),this.Xc[c]!==a&&this.Xc.splice(c,0,a),void 0!==d&&this.jb.add(d,a)):(this.Rf.remove(a),this.Xc[c]=== -a&&this.Xc.splice(c,1),void 0!==d&&this.jb.remove(d)));return}if("linkLabelKeys"===a.modelChange){d=this.xf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue):(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)));return}}Z.prototype.changeState.call(this,a,b)}};t=nr.prototype;t.pm=function(a){if(void 0!==a){var b=this.mj;if(null!==b){var c=this.Vb(a);null===c&&(c=this.copyNodeData(b),Mj(c,this.nodeKeyProperty,a),this.nf(c))}return a}}; +nr.prototype.changeState=function(a,b){if(null!==a&&a.model===this){if(a.change===ce){var c=a.object,d=a.propertyName;if(d===this.linkKeyProperty&&this.tc(c)){var e=a.H(b);b=a.H(!b);void 0!==b&&this.jb.remove(b);void 0!==e&&this.jb.add(e,c);Mj(c,d,e);return}}else if(a.change===ee){c=a.newParam;if("linkDataArray"===a.modelChange){a=a.newValue;za(a)&&"number"===typeof c&&(d=this.mc(a),b?(this.Rf.remove(a),this.Yc[c]===a&&this.Yc.splice(c,1),void 0!==d&&this.jb.remove(d)):(this.Rf.add(a),this.Yc[c]!== +a&&this.Yc.splice(c,0,a),void 0!==d&&this.jb.add(d,a)));return}if("linkLabelKeys"===a.modelChange){d=this.xf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)):0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue));return}}else if(a.change===fe){c=a.oldParam;if("linkDataArray"===a.modelChange){a=a.oldValue;za(a)&&"number"===typeof c&&(d=this.mc(a),b?(this.Rf.add(a),this.Yc[c]!==a&&this.Yc.splice(c,0,a),void 0!==d&&this.jb.add(d,a)):(this.Rf.remove(a),this.Yc[c]=== +a&&this.Yc.splice(c,1),void 0!==d&&this.jb.remove(d)));return}if("linkLabelKeys"===a.modelChange){d=this.xf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue):(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)));return}}Z.prototype.changeState.call(this,a,b)}};t=nr.prototype;t.pm=function(a){if(void 0!==a){var b=this.mj;if(null!==b){var c=this.Vb(a);null===c&&(c=this.copyNodeData(b),Mj(c,this.nodeKeyProperty,a),this.nf(c))}return a}}; t.Zx=function(a){return Jq(this,a,!0)};t.Wv=function(a,b){Rq(this,a,b,!0)};t.by=function(a){return Jq(this,a,!1)};t.$v=function(a,b){Rq(this,a,b,!1)};function Jq(a,b,c){if(null!==b&&(a=c?a.Xe:a.Ye,""!==a&&(a=on(b,a),void 0!==a))){if(Lq(a))return a;C((c?"FromKey":"ToKey")+" value for link data "+b+" is not a number or a string: "+a)}} function Rq(a,b,c,d){null===c&&(c=void 0);if(null!==b){var e=d?a.Xe:a.Ye;if(""!==e)if(c=a.pm(c),a.tc(b)){var f=on(b,e);f!==c&&(Pq(a,f,b),Mj(b,e,c),null===a.Vb(c)&&Qq(a,c,b),ir(a,d?"linkFromKey":"linkToKey",ce,e,b,f,c),"string"===typeof e&&a.Da(b,e))}else Mj(b,e,c)}}t.$x=function(a){return Iq(this,a,!0)};t.Xv=function(a,b){Sq(this,a,b,!0)};t.ey=function(a){return Iq(this,a,!1)};t.aw=function(a,b){Sq(this,a,b,!1)}; function Iq(a,b,c){if(null===b)return"";a=c?a.Fj:a.Gj;if(""===a)return"";b=on(b,a);return void 0===b?"":b}function Sq(a,b,c,d){if(null!==b){var e=d?a.Fj:a.Gj;if(""!==e)if(a.tc(b)){var f=on(b,e);void 0===f&&(f="");f!==c&&(Mj(b,e,c),ir(a,d?"linkFromPortId":"linkToPortId",ce,e,b,f,c),"string"===typeof e&&a.Da(b,e))}else Mj(b,e,c)}}t.xf=function(a){if(null===a)return qr;var b=this.$d;if(""===b)return qr;a=on(a,b);return void 0===a?qr:a}; @@ -1863,8 +1863,8 @@ t.av=function(a,b){if(null!==b&&void 0!==b&&null!==a){var c=this.$d;if(""!==c){v t.wy=function(a,b){if(null!==b&&void 0!==b&&null!==a){var c=this.$d;if(""!==c){var d=on(a,c);if(Array.isArray(d)){var e=d.indexOf(b);0>e||(d.splice(e,1),this.tc(a)&&(Pq(this,b,a),ir(this,"linkLabelKeys",fe,c,a,b,null,e,null)))}else void 0!==d&&C(c+" property is not an Array; cannot removeLabelKeyforLinkData: "+a)}}};t.mc=function(a){if(null!==a){var b=this.gi;if(""!==b&&(b=on(a,b),void 0!==b)){if(Lq(b))return b;C("Key value for link data "+a+" is not a number or a string: "+b)}}}; t.dt=function(a,b){if(null!==a){var c=this.gi;if(""!==c)if(this.tc(a)){var d=on(a,c);d!==b&&null===this.zh(b)&&(Mj(a,c,b),void 0!==d&&this.jb.remove(d),this.jb.add(b,a),ir(this,"linkKey",ce,c,a,d,b),"string"===typeof c&&this.Da(a,c))}else Mj(a,c,b)}};t.zh=function(a){null===a&&C("GraphLinksModel.findLinkDataForKey:key must not be null");return void 0!==a&&Lq(a)?this.jb.H(a):null}; t.Us=function(a){if(null!==a){var b=this.gi;if(""!==b){var c=this.mc(a);if(void 0===c||this.jb.contains(c)){var d=this.wl;if(null!==d&&(c=d(this,a),void 0!==c&&null!==c&&!this.jb.contains(c))){Mj(a,b,c);return}if("string"===typeof c){for(d=2;this.jb.contains(c+d);)d++;Mj(a,b,c+d)}else if(void 0===c||"number"===typeof c){for(c=-this.jb.count-1;this.jb.contains(c);)c--;Mj(a,b,c)}}}}};t.tc=function(a){return null===a?!1:this.Rf.contains(a)};t.Ci=function(a){null!==a&&(ib(a),this.tc(a)||Nq(this,a,!0))}; -function Nq(a,b,c){if(""!==a.linkKeyProperty){var d=a.mc(b);if(void 0!==d&&a.jb.H(d)===b)return;a.Us(b);d=a.mc(b);void 0===d&&C("GraphLinksModel.makeLinkDataKeyUnique failed on "+b+". Data not added to model.");a.jb.add(d,b)}a.Rf.add(b);d=null;c&&(d=a.Xc.length,a.Xc.splice(d,0,b));ir(a,"linkDataArray",ee,"linkDataArray",a,null,b,null,d);rr(a,b)}t.hz=function(a){if(Array.isArray(a))for(var b=a.length,c=0;cd)return;a.Xc.splice(d,1)}ir(a,"linkDataArray",fe,"linkDataArray",a,b,null,d,null);c=Jq(a,b,!0);Pq(a,c,b);c=Jq(a,b,!1);Pq(a,c,b);d=a.xf(b);if(Array.isArray(d))for(var e=d.length,f=0;fd)return;a.Yc.splice(d,1)}ir(a,"linkDataArray",fe,"linkDataArray",a,b,null,d,null);c=Jq(a,b,!0);Pq(a,c,b);c=Jq(a,b,!1);Pq(a,c,b);d=a.xf(b);if(Array.isArray(d))for(var e=d.length,f=0;f=a.count)1===a.count&&(a=a.first(),a.centerX=0,a.centerY=0);else{var b=new E;b.addAll(a.iterator);a=new E;var c=new E;var d=this.sort(b);var e,f,g=this.$q;var h=this.arrangement;var k=this.nodeDiameterFormula;var l=this.radius;if(!isFinite(l)||0>=l)l=NaN;var m=this.aspectRatio;if(!isFinite(m)||0>=m)m=1;var n=this.startAngle; isFinite(n)||(n=0);var p=this.sweepAngle;if(!isFinite(p)||360p)p=360;b=this.spacing;isFinite(b)||(b=NaN);h===Ir&&k===Jr?h=ur:h===Ir&&k!==Jr&&(h=this.arrangement);if((this.direction===Dr||this.direction===Er)&&this.sorting!==xr){for(k=0;!(k>=d.length);k+=2){a.add(d.J(k));if(k+1>=d.length)break;c.add(d.J(k+1))}this.direction===Dr?(this.arrangement===Ir&&a.reverse(),d=new E,d.addAll(a),d.addAll(c)):(this.arrangement===Ir&&c.reverse(),d=new E,d.addAll(c),d.addAll(a))}k=d.length;for(var r=f=e=0;r< @@ -1926,8 +1926,8 @@ p=-1,r=[],q=0;qb[c[q]].indexOf(c[q===c.length-1?0:q+1])&&r.push( c.indexOf(b[l][z]),0<=B&&(B=Math.abs(u-(B>=u?B+1:B)),w+=B=u&&B++,y>=u&&y++,B>y&&(A=y,y=B,B=A),y-B<(c.length+2)/2===(Br||r===m||(q=r>m?r-m:m-r,n+=rg-q?1:-1);c.splice(0>n?m:m+1,0,k);d.splice(h,1);h--}else f=!1;if(f)break;else c.push(d[0]),d.splice(0,1)}for(b=0;b=a?this.Vl=a:this.Vl=360,this.B())}},arrangement:{get:function(){return this.Gb},set:function(a){this.Gb===a||a!==Ir&&a!==ur&&a!==Hr&&a!==Gr||(this.Gb=a,this.B())}},direction:{get:function(){return this.K},set:function(a){this.K===a||a!==wr&&a!==Fr&&a!==Dr&&a!==Er||(this.K=a,this.B())}},sorting:{get:function(){return this.Yc},set:function(a){this.Yc===a||a!==Br&&a!==Cr&& -a!==zr&&!Ar&&a!==xr||(this.Yc=a,this.B())}},comparer:{get:function(){return this.Rc},set:function(a){this.Rc!==a&&(this.Rc=a,this.B())}},spacing:{get:function(){return this.ef},set:function(a){this.ef!==a&&(this.ef=a,this.B())}},nodeDiameterFormula:{get:function(){return this.Oo},set:function(a){this.Oo===a||a!==yr&&a!==Jr||(this.Oo=a,this.B())}},actualXRadius:{get:function(){return this.Zb}}, +set:function(a){this.Vl!==a&&(0=a?this.Vl=a:this.Vl=360,this.B())}},arrangement:{get:function(){return this.Gb},set:function(a){this.Gb===a||a!==Ir&&a!==ur&&a!==Hr&&a!==Gr||(this.Gb=a,this.B())}},direction:{get:function(){return this.K},set:function(a){this.K===a||a!==wr&&a!==Fr&&a!==Dr&&a!==Er||(this.K=a,this.B())}},sorting:{get:function(){return this.Zc},set:function(a){this.Zc===a||a!==Br&&a!==Cr&& +a!==zr&&!Ar&&a!==xr||(this.Zc=a,this.B())}},comparer:{get:function(){return this.Sc},set:function(a){this.Sc!==a&&(this.Sc=a,this.B())}},spacing:{get:function(){return this.ef},set:function(a){this.ef!==a&&(this.ef=a,this.B())}},nodeDiameterFormula:{get:function(){return this.Oo},set:function(a){this.Oo===a||a!==yr&&a!==Jr||(this.Oo=a,this.B())}},actualXRadius:{get:function(){return this.Zb}}, actualYRadius:{get:function(){return this.be}},actualSpacing:{get:function(){return this.qj}},actualCenter:{get:function(){return this.zw}}}); var ur=new D(tr,"ConstantSpacing",0),Hr=new D(tr,"ConstantDistance",1),Gr=new D(tr,"ConstantAngle",2),Ir=new D(tr,"Packed",3),wr=new D(tr,"Clockwise",4),Fr=new D(tr,"Counterclockwise",5),Dr=new D(tr,"BidirectionalLeft",6),Er=new D(tr,"BidirectionalRight",7),Br=new D(tr,"Forwards",8),Cr=new D(tr,"Reverse",9),zr=new D(tr,"Ascending",10),Ar=new D(tr,"Descending",11),xr=new D(tr,"Optimized",12),yr=new D(tr,"Pythagorean",13),Jr=new D(tr,"Circular",14);tr.className="CircularLayout";tr.ConstantSpacing=ur; tr.ConstantDistance=Hr;tr.ConstantAngle=Gr;tr.Packed=Ir;tr.Clockwise=wr;tr.Counterclockwise=Fr;tr.BidirectionalLeft=Dr;tr.BidirectionalRight=Er;tr.Forwards=Br;tr.Reverse=Cr;tr.Ascending=zr;tr.Descending=Ar;tr.Optimized=xr;tr.Pythagorean=yr;tr.Circular=Jr;function vr(){this.jm=-Infinity;this.Pm=this.Ck=null} @@ -1935,8 +1935,8 @@ vr.prototype.compare=function(a,b){if(0this.jm||Math.abs(a)h?(e=p.x+p.width/2,f=p.y+p.height/2,l[0]=new J(p.x+p.width+d.width,p.y),l[1]=new J(p.x,p.y+p.height+d.height),h=2):(k=cs(l,h,e,f,p.width,p.height,d),n=l[k],r=new J(n.x+ p.width+d.width,n.y),p=new J(n.x,n.y+p.height+d.height),k+1this.network.vertexes.count)return!1;for(var a=0,b=0,c=this.network.vertexes.first().bounds,d=this.network.vertexes.iterator;d.next();){if(d.value.bounds.Ic(c)&&(a++,2this.network.vertexes.count)return!1;for(var a=0,b=0,c=this.network.vertexes.first().bounds,d=this.network.vertexes.iterator;d.next();){if(d.value.bounds.Jc(c)&&(a++,2a.network.vertexes.count)return!1;a.sh=a.network.vertexes.xa();a=a.sh;a.sort(function(a,b){return null===a||null===b||a===b?0:b.Gd-a.Gd});for(b=a.length-1;0<=b&&1>=a[b].Gd;)b--;return 1u&&0u&&0a[this.pc]&&(this.ji=a[c]-1,this.pc=c),a[c]c)for(g=a.Ca;0c)for(d.reset();d.next();)c=d.value,e[c.component]&&(c.column+=1)} os.prototype.commitLayout=function(){if(this.setsPortSpots)for(var a=vs(this,!0),b=vs(this,!1),c=this.network.edges.iterator;c.next();){var d=c.value.link;null!==d&&(d.fromSpot=a,d.toSpot=b)}this.commitNodes();this.gv();this.isRouting&&this.commitLinks()};function vs(a,b){return 270===a.K?b?cd:fd:90===a.K?b?fd:cd:180===a.K?b?dd:ed:b?ed:dd} -os.prototype.commitNodes=function(){this.Yd=[];this.vd=[];this.ud=[];this.Ka=[];for(var a=0;a<=this.ra;a++)this.Yd[a]=0,this.vd[a]=0,this.ud[a]=0,this.Ka[a]=0;for(a=this.network.vertexes.iterator;a.next();){var b=a.value,c=b.layer;this.Yd[c]=Math.max(this.Yd[c],this.nodeMinLayerSpace(b,!0));this.vd[c]=Math.max(this.vd[c],this.nodeMinLayerSpace(b,!1))}b=0;c=this.Zd;for(var d=0;d<=this.ra;d++){var e=c;0>=this.Yd[d]+this.vd[d]&&(e=0);0=this.Yd[d]+this.wd[d]&&(e=0);0=n.bounds.bottom?(n=n.bounds.y+n.bounds.height,b.l(q++,A,n+F),b.l(q++,A,n),b.l(q++,A,n-y)):(b.l(q++,A,B+F),b.l(q++,A,B),b.l(q++,A,B-y)):270===this.K?B<=n.bounds.y?(n=n.bounds.y,b.l(q++,A,n-y),b.l(q++,A,n),b.l(q++,A,n+F)):(b.l(q++,A,B-y),b.l(q++,A,B),b.l(q++,A,B+F)):0===this.K&&(A>=n.bounds.right?(n=n.bounds.x+n.bounds.width,b.l(q++,n+F,B),b.l(q++,n,B),b.l(q++,n-y,B)):(b.l(q++,A+F,B),b.l(q++,A,B),b.l(q++,A-y,B)));else{b.l(q++,w,z);var K=0;if(180===this.K||0===this.K){if(180===this.K?A>=n.bounds.right: -A<=n.bounds.x)K=(0===this.K?-y:F)/2;b.l(q++,w+K,B)}else{if(270===this.K?B>=n.bounds.bottom:B<=n.bounds.y)K=(90===this.K?-y:F)/2;b.l(q++,A,z+K)}b.l(q++,A,B)}}else y=Math.max(10,this.Yd[v.layer]),F=Math.max(10,this.vd[v.layer]),r?180===this.K?(b.l(q++,A-y-u,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A+F+u,B)):90===this.K?(b.l(q++,A,B+F+u),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B-y-u)): -270===this.K?(b.l(q++,A,B-y-u),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B+F+u)):(b.l(q++,A+F+u,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A-y-u,B)):b.l(q++,A,B)}n=v}if(null===h||l!==rc||p)if(w=b.i(q-1).x,z=b.i(q-1).y,A=b.i(q).x,B=b.i(q).y,p)u=this.vd[m.layer],180===this.K||0===this.K?(p=z,p>=m.bounds.y&&p<=m.bounds.bottom&&(180===this.K?A>=m.bounds.x:A<=m.bounds.right)&&(n=m.centerX+(180=== -this.K?-u:u),p=m.bounds.x&&p<=m.bounds.right&&(270===this.K?B>=m.bounds.y:B<=m.bounds.bottom)&&(n=m.centerY+(270===this.K?-u:u),p=m.bounds.x?(n=m.bounds.x+ -m.bounds.width,b.L(q-2,n,z),b.L(q-1,n+F,z)):90===this.K&&B<=m.bounds.bottom?(n=m.bounds.y,b.L(q-2,w,n),b.L(q-1,w,n-y)):270===this.K&&B>=m.bounds.y?(n=m.bounds.y+m.bounds.height,b.L(q-2,w,n),b.L(q-1,w,n+F)):0===this.K&&A<=m.bounds.right&&(n=m.bounds.x,b.L(q-2,n,z),b.L(q-1,n-y,z));else{y=Math.max(10,this.Yd[m.layer]);F=Math.max(10,this.vd[m.layer]);p=0;if(180===this.K||0===this.K){if(180===this.K?A<=m.bounds.x:A>=m.bounds.right)p=(0===this.K?F:-y)/2;b.l(q++,A+p,z)}else{if(270===this.K?B<=m.bounds.y: -B>=m.bounds.bottom)p=(90===this.K?F:-y)/2;b.l(q++,w,B+p)}b.l(q++,A,B)}}else{for(;null!==m&&m!==n;){y=v=null;for(m=m.destinationEdges.iterator;m.next()&&(w=m.value,w.link!==c.link||(v=w.toVertex,y=w.fromVertex,null!==y.node&&(y=null),null!==v.node)););if(null===v)break;v!==n&&(w=b.i(q-1).x,z=b.i(q-1).y,A=v.centerX,B=v.centerY,p?180===this.K||0===this.K?(null!==y?y.centerY:z)!==B&&(y=this.Ka[v.layer]+this.Qc.x,q===b.firstPickIndex+1&&(y=0===this.K?Math.max(y,w):Math.min(y,w)),b.l(q++,y,z),b.l(q++,y, -B)):(null!==y?y.centerX:w)!==A&&(y=this.Ka[v.layer]+this.Qc.y,q===b.firstPickIndex+1&&(y=90===this.K?Math.max(y,z):Math.min(y,z)),b.l(q++,w,y),b.l(q++,A,y)):(y=Math.max(10,this.Yd[v.layer]),F=Math.max(10,this.vd[v.layer]),r?180===this.K?(b.l(q++,A+F+u,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A-y-u,B)):90===this.K?(b.l(q++,A,B-y-u),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B+F+u)):270=== +A<=n.bounds.x)K=(0===this.K?-y:F)/2;b.l(q++,w+K,B)}else{if(270===this.K?B>=n.bounds.bottom:B<=n.bounds.y)K=(90===this.K?-y:F)/2;b.l(q++,A,z+K)}b.l(q++,A,B)}}else y=Math.max(10,this.Yd[v.layer]),F=Math.max(10,this.wd[v.layer]),r?180===this.K?(b.l(q++,A-y-u,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A+F+u,B)):90===this.K?(b.l(q++,A,B+F+u),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B-y-u)): +270===this.K?(b.l(q++,A,B-y-u),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B+F+u)):(b.l(q++,A+F+u,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A-y-u,B)):b.l(q++,A,B)}n=v}if(null===h||l!==rc||p)if(w=b.i(q-1).x,z=b.i(q-1).y,A=b.i(q).x,B=b.i(q).y,p)u=this.wd[m.layer],180===this.K||0===this.K?(p=z,p>=m.bounds.y&&p<=m.bounds.bottom&&(180===this.K?A>=m.bounds.x:A<=m.bounds.right)&&(n=m.centerX+(180=== +this.K?-u:u),p=m.bounds.x&&p<=m.bounds.right&&(270===this.K?B>=m.bounds.y:B<=m.bounds.bottom)&&(n=m.centerY+(270===this.K?-u:u),p=m.bounds.x?(n=m.bounds.x+ +m.bounds.width,b.L(q-2,n,z),b.L(q-1,n+F,z)):90===this.K&&B<=m.bounds.bottom?(n=m.bounds.y,b.L(q-2,w,n),b.L(q-1,w,n-y)):270===this.K&&B>=m.bounds.y?(n=m.bounds.y+m.bounds.height,b.L(q-2,w,n),b.L(q-1,w,n+F)):0===this.K&&A<=m.bounds.right&&(n=m.bounds.x,b.L(q-2,n,z),b.L(q-1,n-y,z));else{y=Math.max(10,this.Yd[m.layer]);F=Math.max(10,this.wd[m.layer]);p=0;if(180===this.K||0===this.K){if(180===this.K?A<=m.bounds.x:A>=m.bounds.right)p=(0===this.K?F:-y)/2;b.l(q++,A+p,z)}else{if(270===this.K?B<=m.bounds.y: +B>=m.bounds.bottom)p=(90===this.K?F:-y)/2;b.l(q++,w,B+p)}b.l(q++,A,B)}}else{for(;null!==m&&m!==n;){y=v=null;for(m=m.destinationEdges.iterator;m.next()&&(w=m.value,w.link!==c.link||(v=w.toVertex,y=w.fromVertex,null!==y.node&&(y=null),null!==v.node)););if(null===v)break;v!==n&&(w=b.i(q-1).x,z=b.i(q-1).y,A=v.centerX,B=v.centerY,p?180===this.K||0===this.K?(null!==y?y.centerY:z)!==B&&(y=this.Ka[v.layer]+this.Rc.x,q===b.firstPickIndex+1&&(y=0===this.K?Math.max(y,w):Math.min(y,w)),b.l(q++,y,z),b.l(q++,y, +B)):(null!==y?y.centerX:w)!==A&&(y=this.Ka[v.layer]+this.Rc.y,q===b.firstPickIndex+1&&(y=90===this.K?Math.max(y,z):Math.min(y,z)),b.l(q++,w,y),b.l(q++,A,y)):(y=Math.max(10,this.Yd[v.layer]),F=Math.max(10,this.wd[v.layer]),r?180===this.K?(b.l(q++,A+F+u,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A-y-u,B)):90===this.K?(b.l(q++,A,B-y-u),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B+F+u)):270=== this.K?(b.l(q++,A,B+F+u),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B-y-u)):(b.l(q++,A-y-u,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A+F+u,B)):180===this.K?(b.l(q++,A+F,B),b.l(q++,A-y,B)):90===this.K?(b.l(q++,A,B-y),b.l(q++,A,B+F)):270===this.K?(b.l(q++,A,B+F),b.l(q++,A,B-y)):(b.l(q++,A-y,B),b.l(q++,A+F,B))));m=v}p&&(w=b.i(q-1).x,z=b.i(q-1).y,A=b.i(q).x,B=b.i(q).y,180===this.K||0===this.K? -z!==B&&(y=0===this.K?Math.min(Math.max((A+w)/2,this.Ka[n.layer]+this.Qc.x),A):Math.max(Math.min((A+w)/2,this.Ka[n.layer]+this.Qc.x),A),b.l(q++,y,z),b.l(q++,y,B)):w!==A&&(y=90===this.K?Math.min(Math.max((B+z)/2,this.Ka[n.layer]+this.Qc.y),B):Math.max(Math.min((B+z)/2,this.Ka[n.layer]+this.Qc.y),B),b.l(q++,w,y),b.l(q++,A,y)))}null!==d&&r&&(null!==g&&(l===rc&&(l=b.i(0),d=b.i(2),l.A(d)||b.L(1,(l.x+d.x)/2,(l.y+d.y)/2)),l=b.getLinkPoint(e,g,rc,!0,!1,f,h),l.u()||l.set(e.actualBounds.center),b.L(0,l.x,l.y)), +z!==B&&(y=0===this.K?Math.min(Math.max((A+w)/2,this.Ka[n.layer]+this.Rc.x),A):Math.max(Math.min((A+w)/2,this.Ka[n.layer]+this.Rc.x),A),b.l(q++,y,z),b.l(q++,y,B)):w!==A&&(y=90===this.K?Math.min(Math.max((B+z)/2,this.Ka[n.layer]+this.Rc.y),B):Math.max(Math.min((B+z)/2,this.Ka[n.layer]+this.Rc.y),B),b.l(q++,w,y),b.l(q++,A,y)))}null!==d&&r&&(null!==g&&(l===rc&&(l=b.i(0),d=b.i(2),l.A(d)||b.L(1,(l.x+d.x)/2,(l.y+d.y)/2)),l=b.getLinkPoint(e,g,rc,!0,!1,f,h),l.u()||l.set(e.actualBounds.center),b.L(0,l.x,l.y)), null!==h&&(k===rc&&(k=b.i(b.pointsCount-1),l=b.i(b.pointsCount-3),k.A(l)||b.L(b.pointsCount-2,(k.x+l.x)/2,(k.y+l.y)/2)),e=b.getLinkPoint(f,h,rc,!1,!1,e,g),e.u()||e.set(f.actualBounds.center),b.L(b.pointsCount-1,e.x,e.y)));b.rf();c.commit()}}}this.avoidOrthogonalOverlaps()}; os.prototype.avoidOrthogonalOverlaps=function(){if(!(0>=this.linkSpacing)){for(var a=new E,b=this.network.edges.iterator;b.next();){var c=b.value.link;null!==c&&c.isOrthogonal&&!a.contains(c)&&a.add(c)}if(0f.y&&(m=l.y>f.y?0:g.xf.y&&(m=l.y>f.y?0:g.xf.x&&(m=l.x>f.x?0:g.yb.layer?1:a.cdb.cd?1:a.scb.sc?1:0:0};t.Ay=function(a,b){return a instanceof it&&b instanceof it&&a!==b?a.firstb.first||a.jb.j||a.cdb.cd?1:a.scb.sc?1:0:0}; -t.ct=function(a,b){return a instanceof it&&b instanceof it&&a!==b?a.Xbb.Xb||a.jb.j||a.cdb.cd?1:a.scb.sc?1:0:0};t.w=function(a,b){a-=b;return-1a}; +2;ef.x&&(m=l.x>f.x?0:g.yb.layer?1:a.ddb.dd?1:a.scb.sc?1:0:0};t.Ay=function(a,b){return a instanceof it&&b instanceof it&&a!==b?a.firstb.first||a.jb.j||a.ddb.dd?1:a.scb.sc?1:0:0}; +t.ct=function(a,b){return a instanceof it&&b instanceof it&&a!==b?a.Xbb.Xb||a.jb.j||a.ddb.dd?1:a.scb.sc?1:0:0};t.w=function(a,b){a-=b;return-1a}; t.Wi=function(a,b,c,d){var e=a.length,f=d-c;if(!(1>=f))if((0>c||c>=e-1)&&C("not in range 0 <= from < length: "+c),2===f)d=a[c],e=a[c+1],0=e)a.sort(b);else for(c=a.slice(0,d),c.sort(b),b=0;b=e)for(d=a.slice(c),d.sort(b),b=c;b=a.ve.length){var d=[];for(var e=0;ea&&(this.Wf=a,this.B())}},setsPortSpots:{get:function(){return this.df},set:function(a){this.df!==a&&(this.df=a,this.B())}}, linkSpacing:{get:function(){return this.vo},set:function(a){this.vo!==a&&0<=a&&(this.vo=a,this.B())}},maxLayer:{get:function(){return this.ra}},maxIndex:{get:function(){return this.ji}},maxColumn:{get:function(){return this.Ca}},minIndexLayer:{get:function(){return this.Qg}},maxIndexLayer:{get:function(){return this.pc}}}); var ps=new D(os,"CycleDepthFirst",0),Is=new D(os,"CycleGreedy",1),us=new D(os,"CycleFromLayers",2),qs=new D(os,"LayerOptimalLinkLength",0),Ns=new D(os,"LayerLongestPathSink",1),Ps=new D(os,"LayerLongestPathSource",2),rs=new D(os,"InitDepthFirstOut",0),Vs=new D(os,"InitDepthFirstIn",1),Ts=new D(os,"InitNaive",2),Zs=new D(os,"AggressiveNone",0),ss=new D(os,"AggressiveLess",1),$s=new D(os,"AggressiveMore",2),at=8;os.className="LayeredDigraphLayout";os.CycleDepthFirst=ps;os.CycleGreedy=Is; -os.CycleFromLayers=us;os.LayerOptimalLinkLength=qs;os.LayerLongestPathSink=Ns;os.LayerLongestPathSource=Ps;os.InitDepthFirstOut=rs;os.InitDepthFirstIn=Vs;os.InitNaive=Ts;os.AggressiveNone=Zs;os.AggressiveLess=ss;os.AggressiveMore=$s;os.PackNone=0;os.PackExpand=1;os.PackStraighten=2;os.PackMedian=4;os.PackAll=15;function it(){this.index=this.sc=this.cd=this.Xb=this.first=this.layer=0;this.link=null;this.j=0}it.className="SegInfo";function ts(a){Sp.call(this,a)}ma(ts,Sp);ts.prototype.createVertex=function(){return new jt(this)}; -ts.prototype.createEdge=function(){return new kt(this)};ts.className="LayeredDigraphNetwork";function jt(a){fq.call(this,a);this.Qa=this.wg=this.ei=-1;this.C=NaN;this.M=null;this.valid=!1;this.finish=this.jg=NaN;this.qf=0;this.uk=this.vk=null}ma(jt,fq); +os.CycleFromLayers=us;os.LayerOptimalLinkLength=qs;os.LayerLongestPathSink=Ns;os.LayerLongestPathSource=Ps;os.InitDepthFirstOut=rs;os.InitDepthFirstIn=Vs;os.InitNaive=Ts;os.AggressiveNone=Zs;os.AggressiveLess=ss;os.AggressiveMore=$s;os.PackNone=0;os.PackExpand=1;os.PackStraighten=2;os.PackMedian=4;os.PackAll=15;function it(){this.index=this.sc=this.dd=this.Xb=this.first=this.layer=0;this.link=null;this.j=0}it.className="SegInfo";function ts(a){Sp.call(this,a)}ma(ts,Sp);ts.prototype.createVertex=function(){return new jt(this)}; +ts.prototype.createEdge=function(){return new kt(this)};ts.className="LayeredDigraphNetwork";function jt(a){fq.call(this,a);this.Pa=this.wg=this.ei=-1;this.C=NaN;this.M=null;this.valid=!1;this.finish=this.jg=NaN;this.qf=0;this.uk=this.vk=null}ma(jt,fq); jt.prototype.serializeVertexProperties=function(a,b){fq.prototype.serializeVertexProperties.call(this,a,b);a.layer=this.layer;a.column=this.column;a.index=this.index;a.component=this.component;a.near=this.near?gb(this.near):null;a.valid=this.valid;a.jg=this.jg;a.finish=this.finish;a.qf=this.qf;a.vk=this.vk;a.uk=this.uk}; jt.prototype.deserializeVertexProperties=function(a,b,c,d){fq.prototype.deserializeVertexProperties.call(this,a,b,c,d);this.layer=a.layer;this.column=a.column;this.index=a.index;this.component=a.component;if(b=b.get(a.near))this.near=b;this.valid=a.valid;this.jg=a.jg;this.finish=a.finish;this.qf=a.qf;this.vk=a.vk;this.uk=a.uk}; -na.Object.defineProperties(jt.prototype,{layer:{get:function(){return this.ei},set:function(a){this.ei!==a&&(this.ei=a)}},column:{get:function(){return this.wg},set:function(a){this.wg!==a&&(this.wg=a)}},index:{get:function(){return this.Qa},set:function(a){this.Qa!==a&&(this.Qa=a)}},component:{get:function(){return this.C},set:function(a){this.C!==a&&(this.C=a)}},near:{ +na.Object.defineProperties(jt.prototype,{layer:{get:function(){return this.ei},set:function(a){this.ei!==a&&(this.ei=a)}},column:{get:function(){return this.wg},set:function(a){this.wg!==a&&(this.wg=a)}},index:{get:function(){return this.Pa},set:function(a){this.Pa!==a&&(this.Pa=a)}},component:{get:function(){return this.C},set:function(a){this.C!==a&&(this.C=a)}},near:{ get:function(){return this.M},set:function(a){this.M!==a&&(this.M=a)}}});jt.className="LayeredDigraphVertex";function kt(a){gq.call(this,a);this.j=this.Ha=this.Wa=!1;this.Ga=this.C=NaN;this.M=this.o=0}ma(kt,gq); kt.prototype.serializeEdgeProperties=function(a,b){gq.prototype.serializeEdgeProperties.call(this,a,b);a.valid=this.valid;a.rev=this.rev;a.forest=this.forest;a.portFromPos=this.portFromPos;a.portToPos=this.portToPos;a.portFromColOffset=this.portFromColOffset;a.portToColOffset=this.portToColOffset}; kt.prototype.deserializeEdgeProperties=function(a,b,c,d){gq.prototype.deserializeEdgeProperties.call(this,a,b,c,d);this.valid=a.valid;this.rev=a.rev;this.forest=a.forest;this.portFromPos=a.portFromPos;this.portToPos=a.portToPos;this.portFromColOffset=a.portFromColOffset;this.portToColOffset=a.portToColOffset}; -na.Object.defineProperties(kt.prototype,{fromVertex:{get:function(){return this.Tc},set:function(a){this.Tc!==a&&(this.Tc=a)}},toVertex:{get:function(){return this.ad},set:function(a){this.ad!==a&&(this.ad=a)}},valid:{get:function(){return this.Wa},set:function(a){this.Wa!==a&&(this.Wa=a)}},rev:{get:function(){return this.Ha},set:function(a){this.Ha!==a&&(this.Ha=a)}},forest:{ +na.Object.defineProperties(kt.prototype,{fromVertex:{get:function(){return this.Uc},set:function(a){this.Uc!==a&&(this.Uc=a)}},toVertex:{get:function(){return this.bd},set:function(a){this.bd!==a&&(this.bd=a)}},valid:{get:function(){return this.Wa},set:function(a){this.Wa!==a&&(this.Wa=a)}},rev:{get:function(){return this.Ha},set:function(a){this.Ha!==a&&(this.Ha=a)}},forest:{ get:function(){return this.j},set:function(a){this.j!==a&&(this.j=a)}},portFromPos:{get:function(){return this.C},set:function(a){this.C!==a&&(this.C=a)}},portToPos:{get:function(){return this.Ga},set:function(a){this.Ga!==a&&(this.Ga=a)}},portFromColOffset:{get:function(){return this.o},set:function(a){this.o!==a&&(this.o=a)}},portToColOffset:{get:function(){return this.M}, -set:function(a){this.M!==a&&(this.M=a)}}});kt.className="LayeredDigraphEdge";function lt(a){li.call(this);this.Jb=new G;this.Yo=mt;this.jd=nt;this.Qp=ot;this.Gr=pt;this.Aw=[];this.gd=!0;this.Gb=qt;this.Nd=(new M(10,10)).freeze();var b=new rt(this);this.V=new st(b);this.W=new st(b);this.Qu=[];a&&Object.assign(this,a)}ma(lt,li); -lt.prototype.cloneProtected=function(a){li.prototype.cloneProtected.call(this,a);a.Yo=this.Yo;a.Qp=this.Qp;a.Gr=this.Gr;a.gd=this.gd;a.Gb=this.Gb;a.Nd.assign(this.Nd);a.V.copyInheritedPropertiesFrom(this.V);a.W.copyInheritedPropertiesFrom(this.W)}; +set:function(a){this.M!==a&&(this.M=a)}}});kt.className="LayeredDigraphEdge";function lt(a){li.call(this);this.Jb=new G;this.Yo=mt;this.kd=nt;this.Qp=ot;this.Gr=pt;this.Aw=[];this.hd=!0;this.Gb=qt;this.Nd=(new M(10,10)).freeze();var b=new rt(this);this.V=new st(b);this.W=new st(b);this.Qu=[];a&&Object.assign(this,a)}ma(lt,li); +lt.prototype.cloneProtected=function(a){li.prototype.cloneProtected.call(this,a);a.Yo=this.Yo;a.Qp=this.Qp;a.Gr=this.Gr;a.hd=this.hd;a.Gb=this.Gb;a.Nd.assign(this.Nd);a.V.copyInheritedPropertiesFrom(this.V);a.W.copyInheritedPropertiesFrom(this.W)}; lt.prototype.gb=function(a){a.classType===lt?0===a.name.indexOf("Alignment")?this.alignment=a:0===a.name.indexOf("Arrangement")?this.arrangement=a:0===a.name.indexOf("Compaction")?this.compaction=a:0===a.name.indexOf("Path")?this.path=a:0===a.name.indexOf("Sorting")?this.sorting=a:0===a.name.indexOf("Style")?this.treeStyle=a:C("Unknown enum value: "+a):li.prototype.gb.call(this,a)};lt.prototype.createNetwork=function(){return new rt(this)}; lt.prototype.makeNetwork=function(a){function b(a){if(a instanceof W)return!a.isLinkLabel&&"Comment"!==a.category;if(a instanceof U){var b=a.fromNode;if(null===b||b.isLinkLabel||"Comment"===b.category)return!1;a=a.toNode;return null===a||a.isLinkLabel||"Comment"===a.category?!1:!0}return!1}var c=this.createNetwork();a instanceof T?(c.hg(a.nodes,!0,b),c.hg(a.links,!0,b)):a instanceof hf?c.hg(a.memberParts,!1,b):c.hg(a.iterator,!1,b);return c}; -lt.prototype.doLayout=function(a){null===this.network&&(this.network=this.makeNetwork(a));this.arrangement!==tt&&(this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin));var b=this.diagram;null===b&&a instanceof T&&(b=a);this.path===mt&&null!==b?this.jd=b.isTreePathToChildren?nt:ut:this.jd=this.path===mt?nt:this.path;if(0b.level)return!1;a.removeChild(c.parent,c)}return!0}lt.prototype.removeChild=function(a,b){if(null!==a&&null!==b){for(var c=a.children,d=0,e=0;ee?du(a,g,ba,w,z):eu(a,g,ba,w,z);ba=z.x;w=z.width;z=z.height;break;case Pt:for(A=0;An&&(Sdb&&(ju(a,-db,0,da,ra-1),ku(A,-db,0),ku(B,-db,0),db=0)}Ca.U.h(db,R);w=Math.max(w,F);z=Math.max(z,y+(0===O?0:q)+cb.height);S=F}else{0n&&(Rdb&&(ju(a,0,-db,da,ra-1),ku(A,0,-db),ku(B,0,-db),db=0);Ca.U.h(S,db);z=Math.max(z,K);w=Math.max(w,y+(0===O?0:q)+cb.width);R=K}H++}0n&&(Seb&&(ju(a,-eb,0,da,ra-1),ku(A,-eb,0),ku(B,-eb,0),eb=0)}Ca.U.h(eb,R);w=Math.max(w,F);z=Math.max(z,y+(0===O?0:q)+db.height);S=F}else{0n&&(Reb&&(ju(a,0,-eb,da,ra-1),ku(A,0,-eb),ku(B,0,-eb),eb=0);Ca.U.h(S,eb);z=Math.max(z,K);w=Math.max(w,y+(0===O?0:q)+db.width);R=K}H++}0l&&(l=0),135u&&(u=0),k===Qt&&(h+=p/2+a.focus.y),g+=d+c):b?(null===a.comments?d>w&&(w=pu(k,d-w,0),g=w.x,h=w.y,w=d,l=0):w=nu(a,w,l),0>l&&(g-=l,l=0),135z&&(z=pu(k,0,v-z),g=z.x,h=z.y,z=v,u=0):z=ou(a,z,u),0>u&&(h-=u,u=0),g+=d+c);if(0b&&(b=c+a.width),0>c&&(b-=c),b;case cu:return a.width>b?a.width:b;case $t:return 2*a.focus.x>b?a.width:b+a.width-2*a.focus.x;case Ot:case Et:return Math.max(a.width,Math.max(b,c+a.width)-Math.min(0,c));case Pt:return a.width-a.focus.x+a.nodeSpacing/2+b;case Qt:return Math.max(a.width,a.focus.x+a.nodeSpacing/2+b);default:return b}} function ou(a,b,c){switch(a.alignment){case mu:case lu:return c+a.height>b&&(b=c+a.height),0>c&&(b-=c),b;case cu:return a.height>b?a.height:b;case $t:return 2*a.focus.y>b?a.height:b+a.height-2*a.focus.y;case Ot:case Et:return Math.max(a.height,Math.max(b,c+a.height)-Math.min(0,c));case Pt:return a.height-a.focus.y+a.nodeSpacing/2+b;case Qt:return Math.max(a.height,a.focus.y+a.nodeSpacing/2+b);default:return b}} function pu(a,b,c){switch(a){case lu:b/=2;c/=2;break;case mu:b/=2;c/=2;break;case cu:c=b=0;break;case $t:break;default:C("Unhandled alignment value "+a.toString())}return new J(b,c)}function gu(a,b,c,d,e,f){b=pu(b,c,d);ju(a,b.x,b.y,e,f)}function ju(a,b,c,d,e){if(0!==b||0!==c)for(a=a.children;d<=e;d++){var f=a[d].U;f.x+=b;f.y+=c}} -function hu(a,b,c,d){var e=b.parent;switch(a.jd){case nt:for(a=b.sourceEdges;a.next();)b=a.value,b.fromVertex===e&&b.relativePoint.h(c,d);break;case ut:for(a=b.destinationEdges;a.next();)b=a.value,b.toVertex===e&&b.relativePoint.h(c,d);break;default:C("Unhandled path value "+a.jd.toString())}}function ku(a,b,c){for(var d=0;dn.length||null===r||2>r.length))for(e=c=0;cl&&f.yf.y&&lb.length||null===c||2>c.length)d=null;else{m=fu(a,b.length+c.length);for(d=f=k=0;fk;)l=c[f++],m[d++].h(l.x+e,l.y);c=fu(a,d);for(k=0;kn.length||null===f||2>f.length)e=null;else{m=fu(a,n.length+f.length);for(e=l=c=0;cf;)k=n[c++],m[e++].h(k.x,k.y);f=fu(a,e);for(c=0;c=a?0:135>=a?90:225>=a?180:315>=a?270:0}function au(a){var b=Zt(a);b=90===b||270===b;var c=a.layerSpacing;if(0=a&&(this.V.nodeIndentPastParent=a,this.B())}},nodeSpacing:{get:function(){return this.V.nodeSpacing},set:function(a){this.V.nodeSpacing!==a&&(this.V.nodeSpacing=a,this.B())}},layerSpacing:{get:function(){return this.V.layerSpacing},set:function(a){this.V.layerSpacing!== @@ -2176,17 +2176,17 @@ var mt=new D(lt,"PathDefault",-1),nt=new D(lt,"PathDestination",0),ut=new D(lt," "AlignmentBottomRightBus",27),Tt=new D(lt,"CompactionNone",30),Vt=new D(lt,"CompactionBlock",31),ot=new D(lt,"StyleLayered",40),It=new D(lt,"StyleLastParents",41),Ht=new D(lt,"StyleAlternating",42),Gt=new D(lt,"StyleRootOnly",43),qt=new D(lt,"ArrangementVertical",50),uu=new D(lt,"ArrangementHorizontal",51),tt=new D(lt,"ArrangementFixedRoots",52),pt=new D(lt,"LayerIndividual",60),Ct=new D(lt,"LayerSiblings",61),Bt=new D(lt,"LayerUniform",62);lt.className="TreeLayout";lt.PathDefault=mt; lt.PathDestination=nt;lt.PathSource=ut;lt.SortingForwards=Jt;lt.SortingReverse=Kt;lt.SortingAscending=Lt;lt.SortingDescending=Mt;lt.AlignmentCenterSubtrees=lu;lt.AlignmentCenterChildren=mu;lt.AlignmentStart=cu;lt.AlignmentEnd=$t;lt.AlignmentBus=Ot;lt.AlignmentBusBranching=Et;lt.AlignmentTopLeftBus=Pt;lt.AlignmentBottomRightBus=Qt;lt.CompactionNone=Tt;lt.CompactionBlock=Vt;lt.StyleLayered=ot;lt.StyleLastParents=It;lt.StyleAlternating=Ht;lt.StyleRootOnly=Gt;lt.ArrangementVertical=qt; lt.ArrangementHorizontal=uu;lt.ArrangementFixedRoots=tt;lt.LayerIndividual=pt;lt.LayerSiblings=Ct;lt.LayerUniform=Bt;function rt(a){Sp.call(this,a)}ma(rt,Sp);rt.prototype.createVertex=function(){return new st(this)};rt.prototype.createEdge=function(){return new wu(this)};rt.className="TreeNetwork"; -function st(a){fq.call(this,a);this.Ga=!1;this.yc=null;this.C=[];this.Oc=this.Wa=this.M=this.Ha=0;this.gd=null;this.U=new J(0,0);this.va=new M(0,0);this.fa=new J(0,0);this.Cm=this.Bm=this.TA=!1;this.Eq=this.sq=null;this.Yc=Jt;this.Rc=mq;this.xb=0;this.wb=mu;this.Pr=this.Or=0;this.Qr=20;this.Zd=50;this.Fr=0;this.Yq=Vt;this.Rq=0;this.Zr=25;this.Xq=this.Yr=10;this.Wq=20;this.ds=!0;this.Vr=Vc;this.cs=!0;this.Uq=Vc}ma(st,fq); -st.prototype.copyInheritedPropertiesFrom=function(a){null!==a&&(this.Yc=a.sorting,this.Rc=a.comparer,this.xb=a.angle,this.wb=a.alignment,this.Or=a.nodeIndent,this.Pr=a.nodeIndentPastParent,this.Qr=a.nodeSpacing,this.Zd=a.layerSpacing,this.Fr=a.layerSpacingParentOverlap,this.Yq=a.compaction,this.Rq=a.breadthLimit,this.Zr=a.rowSpacing,this.Yr=a.rowIndent,this.Xq=a.commentSpacing,this.Wq=a.commentMargin,this.ds=a.setsPortSpot,this.Vr=a.portSpot,this.cs=a.setsChildPortSpot,this.Uq=a.childPortSpot)}; +function st(a){fq.call(this,a);this.Ga=!1;this.yc=null;this.C=[];this.Pc=this.Wa=this.M=this.Ha=0;this.hd=null;this.U=new J(0,0);this.va=new M(0,0);this.fa=new J(0,0);this.Cm=this.Bm=this.TA=!1;this.Eq=this.sq=null;this.Zc=Jt;this.Sc=mq;this.xb=0;this.wb=mu;this.Pr=this.Or=0;this.Qr=20;this.Zd=50;this.Fr=0;this.Yq=Vt;this.Rq=0;this.Zr=25;this.Xq=this.Yr=10;this.Wq=20;this.ds=!0;this.Vr=Vc;this.cs=!0;this.Uq=Vc}ma(st,fq); +st.prototype.copyInheritedPropertiesFrom=function(a){null!==a&&(this.Zc=a.sorting,this.Sc=a.comparer,this.xb=a.angle,this.wb=a.alignment,this.Or=a.nodeIndent,this.Pr=a.nodeIndentPastParent,this.Qr=a.nodeSpacing,this.Zd=a.layerSpacing,this.Fr=a.layerSpacingParentOverlap,this.Yq=a.compaction,this.Rq=a.breadthLimit,this.Zr=a.rowSpacing,this.Yr=a.rowIndent,this.Xq=a.commentSpacing,this.Wq=a.commentMargin,this.ds=a.setsPortSpot,this.Vr=a.portSpot,this.cs=a.setsChildPortSpot,this.Uq=a.childPortSpot)}; na.Object.defineProperties(st.prototype,{initialized:{get:function(){return this.Ga},set:function(a){this.Ga!==a&&(this.Ga=a)}},parent:{get:function(){return this.yc},set:function(a){this.yc!==a&&(this.yc=a)}},children:{get:function(){return this.C},set:function(a){if(this.C!==a){if(null!==a)for(var b=a.length,c=0;cp.y+c.rowIndent&&(e=Math.min(e,Math.max(m.y,e-bu(c))))):c.alignment===cu?(e=d.top+b.y,0===b.y&&m.yp.x+c.rowIndent&&(e=Math.min(e,Math.max(m.x,e-bu(c))))):c.alignment===cu?(e=d.left+b.x,0===b.x&&m.xp.y+c.rowIndent&&(e=Math.min(e,Math.max(m.y,e-bu(c))))):c.alignment===cu?(e=d.top+b.y,0===b.y&&m.y * Definitions: https://github.com/NorthwoodsSoftware/GoJS @@ -13075,7 +13075,6 @@ export class Palette extends Diagram { */ constructor(div?: Element | string, init?: Partial); /** - * * @param {DiagramInitOptions=} init A JavaScript object specifying optional initialization properties object. * Can specify Palette properties, and Palette sub-properties such as `"undoManager.isEnabled": true` * Example: @@ -16092,7 +16091,7 @@ export abstract class GraphObject { * If you need to set properties without type checking, or attach new properties, use GraphObject#attach. * * - * ``` + * ```js * // Common init for use in many different shapes: * var shapeStyle = (() => { return { background: 'red', strokeWidth: 0 }; }) * @@ -16121,7 +16120,7 @@ export abstract class GraphObject { * unless you need to attach new properties that do not exist on the GraphObject, or to set sub-properties. * Calling this method is much less efficient than setting properties directly, and does not do compile-time type checking. * - * ``` + * ```js * new go.Shape() * .bind("fill", "color") * .bind("strokeWidth", "width") @@ -16147,7 +16146,7 @@ export abstract class GraphObject { * * For example: * - * ``` + * ```js * // This can be used by several node templates * // to set multiple properties and bindings on each * function nodeStyle(node) { diff --git a/release/go.js b/release/go.js index b5ccf0359..09f99ce7e 100644 --- a/release/go.js +++ b/release/go.js @@ -1,8 +1,8 @@ /* - * GoJS v2.2.9 JavaScript Library for HTML Diagrams, https://gojs.net + * GoJS v2.2.10 JavaScript Library for HTML Diagrams, https://gojs.net * GoJS and Northwoods Software are registered trademarks of Northwoods Software Corporation, https://www.nwoods.com. * Copyright (C) 1998-2022 by Northwoods Software Corporation. All Rights Reserved. - * THIS SOFTWARE IS LICENSED. THE LICENSE AGREEMENT IS AT: https://gojs.net/2.2.9/license.html. + * THIS SOFTWARE IS LICENSED. THE LICENSE AGREEMENT IS AT: https://gojs.net/2.2.10/license.html. * DO NOT MODIFY THIS FILE. DO NOT DISTRIBUTE A MODIFIED COPY OF THE CONTENTS OF THIS FILE. */ (function() { var t;function aa(a){var b=0;return function(){return bc;c++)b["0123456789abcdef".charAt(c>>4)+"0123456789abcdef".charAt(c&15)]=String.fromCharCode(c);a.length%2&&(a="0"+a);c=[];for(var d=0,e=0;ec;c++)b[c]=c;for(c=d=0;256>c;c++)d=(d+b[c]+119)%256,e=b[c],b[c]=b[d],b[d]=e;d=c=0;for(var f="",g=0;gthis.key)return!1;a=a.m;var b=a.length,c=++this.Qa,d=this.af;if(null!==d)for(;cthis.key)return!1;var b=--this.Qa;if(0<=b)return this.key=b,this.value=a.m[b],!0;this.Qd();return!1};fb.prototype.od=function(){return this.next()}; -fb.prototype.first=function(){var a=this.pb;this.ja=a.Ba;var b=a.m;this.Qa=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null};fb.prototype.any=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Qa=c;for(--c;0<=c;c--)if(a(b[c]))return!0;return!1};fb.prototype.all=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Qa=c;for(--c;0<=c;c--)if(!a(b[c]))return!1;return!0}; -fb.prototype.each=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Qa=c;for(--c;0<=c;c--)a(b[c]);return this};fb.prototype.map=function(a){var b=this.pb;b.Ng=null;var c=[];b=b.m;var d=b.length;this.Qa=d;for(--d;0<=d;d--)c.push(a(b[d]));a=new E;a.m=c;a.kb();return a.iterator};fb.prototype.filter=function(a){var b=this.pb;b.Ng=null;var c=[];b=b.m;var d=b.length;this.Qa=d;for(--d;0<=d;d--){var e=b[d];a(e)&&c.push(e)}a=new E;a.m=c;a.kb();return a.iterator}; -fb.prototype.Qd=function(){this.key=-1;this.value=null;this.ja=-1;this.pb.Ng=this};fb.prototype.toString=function(){return"ListIteratorBackwards("+this.Qa+"/"+this.pb.count+")"};na.Object.defineProperties(fb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.pb.m.length}}});fb.prototype.first=fb.prototype.first;fb.prototype.hasNext=fb.prototype.od;fb.prototype.next=fb.prototype.next;fb.prototype.reset=fb.prototype.reset; +b.sm[e.lk],{set:function(a,b){return function(){throw Error("Property "+a.sm[b.lk]+" of "+a.x+" is read-only.");}}(b,e)})}}}b={sm:b.sm,x:b.x}}}};function Ya(){}Ya.prototype.reset=function(){};Ya.prototype.next=function(){return!1};Ya.prototype.pd=function(){return!1};Ya.prototype.first=function(){return null};Ya.prototype.any=function(){return!1};Ya.prototype.all=function(){return!0};Ya.prototype.each=function(){return this};Ya.prototype.map=function(){return this};Ya.prototype.filter=function(){return this}; +Ya.prototype.Qd=function(){};Ya.prototype.toString=function(){return"EmptyIterator"};na.Object.defineProperties(Ya.prototype,{iterator:{get:function(){return this}},count:{get:function(){return 0}}});Ya.prototype.first=Ya.prototype.first;Ya.prototype.hasNext=Ya.prototype.pd;Ya.prototype.next=Ya.prototype.next;Ya.prototype.reset=Ya.prototype.reset;var Za=null;Ya.className="EmptyIterator";Za=new Ya;function $a(a){this.key=-1;this.value=a} +$a.prototype.reset=function(){this.key=-1};$a.prototype.next=function(){return-1===this.key?(this.key=0,!0):!1};$a.prototype.pd=function(){return this.next()};$a.prototype.first=function(){this.key=0;return this.value};$a.prototype.any=function(a){this.key=-1;return a(this.value)};$a.prototype.all=function(a){this.key=-1;return a(this.value)};$a.prototype.each=function(a){this.key=-1;a(this.value);return this};$a.prototype.map=function(a){return new $a(a(this.value))}; +$a.prototype.filter=function(a){return a(this.value)?new $a(this.value):Za};$a.prototype.Qd=function(){this.value=null};$a.prototype.toString=function(){return"SingletonIterator("+this.value+")"};na.Object.defineProperties($a.prototype,{iterator:{get:function(){return this}},count:{get:function(){return 1}}});$a.prototype.first=$a.prototype.first;$a.prototype.hasNext=$a.prototype.pd;$a.prototype.next=$a.prototype.next; +$a.prototype.reset=$a.prototype.reset;$a.className="SingletonIterator";function ab(a){this.pb=a;this.af=null;a.Ja=null;this.ja=a.Ba;this.Pa=-1}ab.prototype.reset=function(){var a=this.pb;a.Ja=null;this.ja=a.Ba;this.Pa=-1};ab.prototype.next=function(){var a=this.pb;if(a.Ba!==this.ja&&0>this.key)return!1;a=a.m;var b=a.length,c=++this.Pa,d=this.af;if(null!==d)for(;cthis.key)return!1;var b=--this.Pa;if(0<=b)return this.key=b,this.value=a.m[b],!0;this.Qd();return!1};fb.prototype.pd=function(){return this.next()}; +fb.prototype.first=function(){var a=this.pb;this.ja=a.Ba;var b=a.m;this.Pa=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null};fb.prototype.any=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Pa=c;for(--c;0<=c;c--)if(a(b[c]))return!0;return!1};fb.prototype.all=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Pa=c;for(--c;0<=c;c--)if(!a(b[c]))return!1;return!0}; +fb.prototype.each=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Pa=c;for(--c;0<=c;c--)a(b[c]);return this};fb.prototype.map=function(a){var b=this.pb;b.Ng=null;var c=[];b=b.m;var d=b.length;this.Pa=d;for(--d;0<=d;d--)c.push(a(b[d]));a=new E;a.m=c;a.kb();return a.iterator};fb.prototype.filter=function(a){var b=this.pb;b.Ng=null;var c=[];b=b.m;var d=b.length;this.Pa=d;for(--d;0<=d;d--){var e=b[d];a(e)&&c.push(e)}a=new E;a.m=c;a.kb();return a.iterator}; +fb.prototype.Qd=function(){this.key=-1;this.value=null;this.ja=-1;this.pb.Ng=this};fb.prototype.toString=function(){return"ListIteratorBackwards("+this.Pa+"/"+this.pb.count+")"};na.Object.defineProperties(fb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.pb.m.length}}});fb.prototype.first=fb.prototype.first;fb.prototype.hasNext=fb.prototype.pd;fb.prototype.next=fb.prototype.next;fb.prototype.reset=fb.prototype.reset; fb.className="ListIteratorBackwards";function E(a){Ta(this);this.v=!1;this.m=[];this.Ba=0;this.Ng=this.Ja=null;"string"===typeof a&&C("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=E.prototype;t.kb=function(){var a=this.Ba;a++;999999999a||a>=b.length)&&xa(a,"0 <= i < length",E,"elt:i");return b[a]};t.get=function(a){return this.J(a)};t.Lc=function(a,b){var c=this.m;(0>a||a>=c.length)&&xa(a,"0 <= i < length",E,"setElt:i");this.v&&wa(this,a);c[a]=b};t.set=function(a,b){this.Lc(a,b)};t.first=function(){var a=this.m;return 0===a.length?null:a[0]};t.Xb=function(){var a=this.m,b=a.length;return 0a||a>=b.length)&&xa(a,"0 <= i < length",E,"elt:i");return b[a]};t.get=function(a){return this.J(a)};t.Mc=function(a,b){var c=this.m;(0>a||a>=c.length)&&xa(a,"0 <= i < length",E,"setElt:i");this.v&&wa(this,a);c[a]=b};t.set=function(a,b){this.Mc(a,b)};t.first=function(){var a=this.m;return 0===a.length?null:a[0]};t.Xb=function(){var a=this.m,b=a.length;return 0a&&xa(a,">= 0",E,"insertAt:i");this.v&&wa(this,a);var c=this.m;a>=c.length?c.push(b):c.splice(a,0,b);this.kb()};t.remove=function(a){if(null===a)return!1;this.v&&wa(this,a);var b=this.m;a=b.indexOf(a);if(-1===a)return!1;a===b.length-1?b.pop():b.splice(a,1);this.kb();return!0};t.delete=function(a){return this.remove(a)}; t.eb=function(a){var b=this.m;(0>a||a>=b.length)&&xa(a,"0 <= i < length",E,"removeAt:i");this.v&&wa(this,a);a===b.length-1?b.pop():b.splice(a,1);this.kb()};t.removeRange=function(a,b){var c=this.m,d=c.length;if(0>a)a=0;else if(a>=d)return this;if(0>b)return this;b>=d&&(b=d-1);if(a>b)return this;this.v&&wa(this);for(var e=a,f=b+1;f=this.m.length)return Za;var a=this.Ja;return null!==a?(a.reset(),a):new ab(this)}},iteratorBackwards:{ get:function(){if(0>=this.m.length)return Za;var a=this.Ng;return null!==a?(a.reset(),a):new fb(this)}}});E.prototype.reverse=E.prototype.reverse;E.prototype.sortRange=E.prototype.Wi;E.prototype.sort=E.prototype.sort;E.prototype.toSet=E.prototype.ew;E.prototype.toArray=E.prototype.xa;E.prototype.removeRange=E.prototype.removeRange;E.prototype.removeAt=E.prototype.eb;E.prototype["delete"]=E.prototype.delete;E.prototype.remove=E.prototype.remove;E.prototype.insertAt=E.prototype.ub; -E.prototype.pop=E.prototype.pop;E.prototype.last=E.prototype.Xb;E.prototype.first=E.prototype.first;E.prototype.set=E.prototype.set;E.prototype.setElt=E.prototype.Lc;E.prototype.get=E.prototype.get;E.prototype.elt=E.prototype.J;E.prototype.indexOf=E.prototype.indexOf;E.prototype.has=E.prototype.has;E.prototype.contains=E.prototype.contains;E.prototype.clear=E.prototype.clear;E.prototype.addAll=E.prototype.addAll;E.prototype.push=E.prototype.push;E.prototype.add=E.prototype.add;E.prototype.thaw=E.prototype.ea; -E.prototype.freeze=E.prototype.freeze;E.className="List";function hb(a){this.ag=a;a.Ja=null;this.ja=a.Ba;this.la=null}hb.prototype.reset=function(){var a=this.ag;a.Ja=null;this.ja=a.Ba;this.la=null};hb.prototype.next=function(){var a=this.ag;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=b.value,this.key=b.key,!0;this.Qd();return!1};hb.prototype.od=function(){return this.next()}; +E.prototype.pop=E.prototype.pop;E.prototype.last=E.prototype.Xb;E.prototype.first=E.prototype.first;E.prototype.set=E.prototype.set;E.prototype.setElt=E.prototype.Mc;E.prototype.get=E.prototype.get;E.prototype.elt=E.prototype.J;E.prototype.indexOf=E.prototype.indexOf;E.prototype.has=E.prototype.has;E.prototype.contains=E.prototype.contains;E.prototype.clear=E.prototype.clear;E.prototype.addAll=E.prototype.addAll;E.prototype.push=E.prototype.push;E.prototype.add=E.prototype.add;E.prototype.thaw=E.prototype.ea; +E.prototype.freeze=E.prototype.freeze;E.className="List";function hb(a){this.ag=a;a.Ja=null;this.ja=a.Ba;this.la=null}hb.prototype.reset=function(){var a=this.ag;a.Ja=null;this.ja=a.Ba;this.la=null};hb.prototype.next=function(){var a=this.ag;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=b.value,this.key=b.key,!0;this.Qd();return!1};hb.prototype.pd=function(){return this.next()}; hb.prototype.first=function(){var a=this.ag;this.ja=a.Ba;a=a.ba;if(null!==a){this.la=a;var b=a.value;this.key=a.key;return this.value=b}return null};hb.prototype.any=function(a){var b=this.ag;this.la=b.Ja=null;for(b=b.ba;null!==b;){if(a(b.value))return!0;b=b.oa}return!1};hb.prototype.all=function(a){var b=this.ag;this.la=b.Ja=null;for(b=b.ba;null!==b;){if(!a(b.value))return!1;b=b.oa}return!0};hb.prototype.each=function(a){var b=this.ag;this.la=b.Ja=null;for(b=b.ba;null!==b;)a(b.value),b=b.oa;return this}; hb.prototype.map=function(a){var b=this.ag;b.Ja=null;var c=new E;for(b=b.ba;null!==b;)c.add(a(b.value)),b=b.oa;return c.iterator};hb.prototype.filter=function(a){var b=this.ag;b.Ja=null;var c=new E;for(b=b.ba;null!==b;){var d=b.value;a(d)&&c.add(d);b=b.oa}return c.iterator};hb.prototype.Qd=function(){this.value=this.key=null;this.ja=-1;this.ag.Ja=this};hb.prototype.toString=function(){return null!==this.la?"SetIterator@"+this.la.value:"SetIterator"}; -na.Object.defineProperties(hb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ag.Hb}}});hb.prototype.first=hb.prototype.first;hb.prototype.hasNext=hb.prototype.od;hb.prototype.next=hb.prototype.next;hb.prototype.reset=hb.prototype.reset;hb.className="SetIterator"; +na.Object.defineProperties(hb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ag.Hb}}});hb.prototype.first=hb.prototype.first;hb.prototype.hasNext=hb.prototype.pd;hb.prototype.next=hb.prototype.next;hb.prototype.reset=hb.prototype.reset;hb.className="SetIterator"; function G(a){Ta(this);this.v=!1;this.Ib={};this.Hb=0;this.Ja=null;this.Ba=0;this.We=this.ba=null;"string"===typeof a&&C("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=G.prototype;t.kb=function(){var a=this.Ba;a++;999999999=this.Hb)return Za;var a=this.Ja;return null!==a?(a.reset(),a):new hb(this)}}});G.prototype.toList=G.prototype.dw;G.prototype.toArray=G.prototype.xa;G.prototype.clear=G.prototype.clear;G.prototype.retainAll=G.prototype.SA;G.prototype.removeAll=G.prototype.Bq; G.prototype["delete"]=G.prototype.delete;G.prototype.remove=G.prototype.remove;G.prototype.first=G.prototype.first;G.prototype.containsAny=G.prototype.xz;G.prototype.containsAll=G.prototype.wz;G.prototype.has=G.prototype.has;G.prototype.contains=G.prototype.contains;G.prototype.addAll=G.prototype.addAll;G.prototype.add=G.prototype.add;G.prototype.thaw=G.prototype.ea;G.prototype.freeze=G.prototype.freeze;var kb=1;G.className="Set";G.uniqueHash=Ta;G.hashIdUnique=ib;G.hashId=gb; -function lb(a){this.ha=a;this.ja=a.Ba;this.la=null}lb.prototype.reset=function(){this.ja=this.ha.Ba;this.la=null};lb.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=this.key=a=b.key,!0;this.Qd();return!1};lb.prototype.od=function(){return this.next()};lb.prototype.first=function(){var a=this.ha;this.ja=a.Ba;a=a.ba;return null!==a?(this.la=a,this.value=this.key=a=a.key):null}; +function lb(a){this.ha=a;this.ja=a.Ba;this.la=null}lb.prototype.reset=function(){this.ja=this.ha.Ba;this.la=null};lb.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=this.key=a=b.key,!0;this.Qd();return!1};lb.prototype.pd=function(){return this.next()};lb.prototype.first=function(){var a=this.ha;this.ja=a.Ba;a=a.ba;return null!==a?(this.la=a,this.value=this.key=a=a.key):null}; lb.prototype.any=function(a){var b=this.ha;this.la=null;for(b=b.ba;null!==b;){if(a(b.key))return!0;b=b.oa}return!1};lb.prototype.all=function(a){var b=this.ha;this.la=null;for(b=b.ba;null!==b;){if(!a(b.key))return!1;b=b.oa}return!0};lb.prototype.each=function(a){var b=this.ha;this.la=null;for(b=b.ba;null!==b;)a(b.key),b=b.oa;return this};lb.prototype.map=function(a){var b=this.ha;this.la=null;var c=new E;for(b=b.ba;null!==b;)c.add(a(b.key)),b=b.oa;return c.iterator}; lb.prototype.filter=function(a){var b=this.ha;this.la=null;var c=new E;for(b=b.ba;null!==b;){var d=b.key;a(d)&&c.add(d);b=b.oa}return c.iterator};lb.prototype.Qd=function(){this.value=this.key=null;this.ja=-1};lb.prototype.toString=function(){return null!==this.la?"MapKeySetIterator@"+this.la.value:"MapKeySetIterator"};na.Object.defineProperties(lb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ha.Hb}}}); -lb.prototype.first=lb.prototype.first;lb.prototype.hasNext=lb.prototype.od;lb.prototype.next=lb.prototype.next;lb.prototype.reset=lb.prototype.reset;lb.className="MapKeySetIterator";function mb(a){G.call(this);Ta(this);this.v=!0;this.ha=a}ma(mb,G);t=mb.prototype;t.freeze=function(){return this};t.ea=function(){return this};t.toString=function(){return"MapKeySet("+this.ha.toString()+")"};t.add=function(){C("This Set is read-only: "+this.toString())};t.contains=function(a){return this.ha.contains(a)}; +lb.prototype.first=lb.prototype.first;lb.prototype.hasNext=lb.prototype.pd;lb.prototype.next=lb.prototype.next;lb.prototype.reset=lb.prototype.reset;lb.className="MapKeySetIterator";function mb(a){G.call(this);Ta(this);this.v=!0;this.ha=a}ma(mb,G);t=mb.prototype;t.freeze=function(){return this};t.ea=function(){return this};t.toString=function(){return"MapKeySet("+this.ha.toString()+")"};t.add=function(){C("This Set is read-only: "+this.toString())};t.contains=function(a){return this.ha.contains(a)}; t.has=function(a){return this.contains(a)};t.remove=function(){C("This Set is read-only: "+this.toString())};t.delete=function(a){return this.remove(a)};t.clear=function(){C("This Set is read-only: "+this.toString())};t.first=function(){var a=this.ha.ba;return null!==a?a.key:null};mb.prototype.any=function(a){for(var b=this.ha.ba;null!==b;){if(a(b.key))return!0;b=b.oa}return!1};mb.prototype.all=function(a){for(var b=this.ha.ba;null!==b;){if(!a(b.key))return!1;b=b.oa}return!0}; mb.prototype.each=function(a){for(var b=this.ha.ba;null!==b;)a(b.key),b=b.oa;return this};mb.prototype.map=function(a){for(var b=new G,c=this.ha.ba;null!==c;)b.add(a(c.key)),c=c.oa;return b};mb.prototype.filter=function(a){for(var b=new G,c=this.ha.ba;null!==c;){var d=c.key;a(d)&&b.add(d);c=c.oa}return b};mb.prototype.copy=function(){return new mb(this.ha)};mb.prototype.ew=function(){var a=new G,b=this.ha.Ib,c;for(c in b)a.add(b[c].key);return a}; mb.prototype.xa=function(){var a=this.ha.Ib,b=Array(this.ha.Hb),c=0,d;for(d in a)b[c]=a[d].key,c++;return b};mb.prototype.dw=function(){var a=new E,b=this.ha.Ib,c;for(c in b)a.add(b[c].key);return a};na.Object.defineProperties(mb.prototype,{count:{get:function(){return this.ha.Hb}},size:{get:function(){return this.ha.Hb}},iterator:{get:function(){return 0>=this.ha.Hb?Za:new lb(this.ha)}}}); mb.prototype.toList=mb.prototype.dw;mb.prototype.toArray=mb.prototype.xa;mb.prototype.toSet=mb.prototype.ew;mb.prototype.first=mb.prototype.first;mb.prototype.clear=mb.prototype.clear;mb.prototype["delete"]=mb.prototype.delete;mb.prototype.remove=mb.prototype.remove;mb.prototype.has=mb.prototype.has;mb.prototype.contains=mb.prototype.contains;mb.prototype.add=mb.prototype.add;mb.prototype.thaw=mb.prototype.ea;mb.prototype.freeze=mb.prototype.freeze;mb.className="MapKeySet"; -function nb(a){this.ha=a;a.Ve=null;this.ja=a.Ba;this.la=null}nb.prototype.reset=function(){var a=this.ha;a.Ve=null;this.ja=a.Ba;this.la=null};nb.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=b.value,this.key=b.key,!0;this.Qd();return!1};nb.prototype.od=function(){return this.next()}; +function nb(a){this.ha=a;a.Ve=null;this.ja=a.Ba;this.la=null}nb.prototype.reset=function(){var a=this.ha;a.Ve=null;this.ja=a.Ba;this.la=null};nb.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=b.value,this.key=b.key,!0;this.Qd();return!1};nb.prototype.pd=function(){return this.next()}; nb.prototype.first=function(){var a=this.ha;this.ja=a.Ba;a=a.ba;if(null!==a){this.la=a;var b=a.value;this.key=a.key;return this.value=b}return null};nb.prototype.any=function(a){var b=this.ha;this.la=b.Ve=null;for(b=b.ba;null!==b;){if(a(b.value))return!0;b=b.oa}return!1};nb.prototype.all=function(a){var b=this.ha;this.la=b.Ve=null;for(b=b.ba;null!==b;){if(!a(b.value))return!1;b=b.oa}return!0};nb.prototype.each=function(a){var b=this.ha;this.la=b.Ve=null;for(b=b.ba;null!==b;)a(b.value),b=b.oa;return this}; nb.prototype.map=function(a){var b=this.ha;this.la=b.Ve=null;var c=new E;for(b=b.ba;null!==b;)c.add(a(b.value)),b=b.oa;return c.iterator};nb.prototype.filter=function(a){var b=this.ha;this.la=b.Ve=null;var c=new E;for(b=b.ba;null!==b;){var d=b.value;a(d)&&c.add(d);b=b.oa}return c.iterator};nb.prototype.Qd=function(){this.value=this.key=null;this.ja=-1;this.ha.Ve=this};nb.prototype.toString=function(){return null!==this.la?"MapValueSetIterator@"+this.la.value:"MapValueSetIterator"}; -na.Object.defineProperties(nb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ha.Hb}}});nb.prototype.first=nb.prototype.first;nb.prototype.hasNext=nb.prototype.od;nb.prototype.next=nb.prototype.next;nb.prototype.reset=nb.prototype.reset;nb.className="MapValueSetIterator";function jb(a,b){this.key=a;this.value=b;this.Fl=this.oa=null}jb.prototype.toString=function(){return"{"+this.key+":"+this.value+"}"}; -jb.className="KeyValuePair";function ob(a){this.ha=a;a.Ja=null;this.ja=a.Ba;this.la=null}ob.prototype.reset=function(){var a=this.ha;a.Ja=null;this.ja=a.Ba;this.la=null};ob.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.key=b.key,this.value=b.value,!0;this.Qd();return!1};ob.prototype.od=function(){return this.next()}; +na.Object.defineProperties(nb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ha.Hb}}});nb.prototype.first=nb.prototype.first;nb.prototype.hasNext=nb.prototype.pd;nb.prototype.next=nb.prototype.next;nb.prototype.reset=nb.prototype.reset;nb.className="MapValueSetIterator";function jb(a,b){this.key=a;this.value=b;this.Fl=this.oa=null}jb.prototype.toString=function(){return"{"+this.key+":"+this.value+"}"}; +jb.className="KeyValuePair";function ob(a){this.ha=a;a.Ja=null;this.ja=a.Ba;this.la=null}ob.prototype.reset=function(){var a=this.ha;a.Ja=null;this.ja=a.Ba;this.la=null};ob.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.key=b.key,this.value=b.value,!0;this.Qd();return!1};ob.prototype.pd=function(){return this.next()}; ob.prototype.first=function(){var a=this.ha;this.ja=a.Ba;a=a.ba;return null!==a?(this.la=a,this.key=a.key,this.value=a.value,a):null};ob.prototype.any=function(a){var b=this.ha;this.la=b.Ja=null;for(b=b.ba;null!==b;){if(a(b))return!0;b=b.oa}return!1};ob.prototype.all=function(a){var b=this.ha;this.la=b.Ja=null;for(b=b.ba;null!==b;){if(!a(b))return!1;b=b.oa}return!0};ob.prototype.each=function(a){var b=this.ha;this.la=b.Ja=null;for(b=b.ba;null!==b;)a(b),b=b.oa;return this}; ob.prototype.map=function(a){var b=this.ha;this.la=b.Ja=null;var c=new E;for(b=b.ba;null!==b;)c.add(a(b)),b=b.oa;return c.iterator};ob.prototype.filter=function(a){var b=this.ha;this.la=b.Ja=null;var c=new E;for(b=b.ba;null!==b;)a(b)&&c.add(b),b=b.oa;return c.iterator};ob.prototype.Qd=function(){this.value=this.key=null;this.ja=-1;this.ha.Ja=this};ob.prototype.toString=function(){return null!==this.la?"MapIterator@"+this.la:"MapIterator"}; -na.Object.defineProperties(ob.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ha.Hb}}});ob.prototype.first=ob.prototype.first;ob.prototype.hasNext=ob.prototype.od;ob.prototype.next=ob.prototype.next;ob.prototype.reset=ob.prototype.reset;ob.className="MapIterator"; +na.Object.defineProperties(ob.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ha.Hb}}});ob.prototype.first=ob.prototype.first;ob.prototype.hasNext=ob.prototype.pd;ob.prototype.next=ob.prototype.next;ob.prototype.reset=ob.prototype.reset;ob.className="MapIterator"; function I(a){Ta(this);this.v=!1;this.Ib={};this.Hb=0;this.Ve=this.Ja=null;this.Ba=0;this.We=this.ba=null;"string"===typeof a&&C("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=I.prototype;t.kb=function(){var a=this.Ba;a++;999999999a&&(a+=360);if(90===a){a=0;var d=1}else 180===a?(a=-1,d=0):270===a?(a=0,d=-1):(d=a*Math.PI/180,a=Math.cos(d),d=Math.sin(d));this.x=a*b-d*c;this.y=d*b+a*c;return this};t=J.prototype; -t.scale=function(a,b){this.x*=a;this.y*=b;return this};t.tf=function(a){var b=a.x-this.x;a=a.y-this.y;return b*b+a*a};t.nd=function(a,b){a-=this.x;b-=this.y;return a*a+b*b};t.normalize=function(){var a=this.x,b=this.y,c=Math.sqrt(a*a+b*b);0b?270:0;if(0===b)return 0a?c=0>b?c+180:180-c:0>b&&(c=360-c);return c}t.vz=function(a,b){return L.em(a.x,a.y,b.x,b.y,this.x,this.y)};t.IA=function(a,b,c,d){L.Eh(a,b,c,d,this.x,this.y,this);return this};t.JA=function(a,b){L.Eh(a.x,a.y,b.x,b.y,this.x,this.y,this);return this};t.XA=function(a,b,c,d){L.jq(this.x,this.y,a,b,c,d,this);return this}; t.YA=function(a,b){L.jq(this.x,this.y,a.x,a.y,b.width,b.height,this);return this};t.Ui=function(a,b){this.x=a.x+b.x*a.width+b.offsetX;this.y=a.y+b.y*a.height+b.offsetY;return this};t.Vi=function(a,b,c,d,e){this.x=a+e.x*c+e.offsetX;this.y=b+e.y*d+e.offsetY;return this};t.transform=function(a){a.ya(this);return this};function Ab(a,b){b.Ed(a);return a} function Bb(a,b,c,d,e,f){var g=e-c,h=f-d,k=g*g+h*h;c-=a;d-=b;var l=-c*g-d*h;if(0>=l||l>=k)return g=e-a,h=f-b,Math.min(c*c+d*d,g*g+h*h);a=g*d-h*c;return a*a/k}function Cb(a,b,c,d){a=c-a;b=d-b;return a*a+b*b}function Gb(a,b,c,d){a=c-a;b=d-b;if(0===a)return 0b?270:0;if(0===b)return 0a?d=0>b?d+180:180-d:0>b&&(d=360-d);return d}t.u=function(){return isFinite(this.x)&&isFinite(this.y)}; J.alloc=function(){var a=Hb.pop();return void 0===a?new J:a};J.allocAt=function(a,b){var c=Hb.pop();if(void 0===c)return new J(a,b);c.x=a;c.y=b;return c};J.free=function(a){Hb.push(a)};J.prototype.isReal=J.prototype.u;J.prototype.setSpot=J.prototype.Vi;J.prototype.setRectSpot=J.prototype.Ui;J.prototype.snapToGridPoint=J.prototype.YA;J.prototype.snapToGrid=J.prototype.XA;J.prototype.projectOntoLineSegmentPoint=J.prototype.JA;J.prototype.projectOntoLineSegment=J.prototype.IA; -J.intersectingLineSegments=function(a,b,c,d,e,f,g,h){return L.lm(a,b,c,d,e,f,g,h)};J.prototype.compareWithLineSegmentPoint=J.prototype.vz;J.compareWithLineSegment=function(a,b,c,d,e,f){return L.em(a,b,c,d,e,f)};J.prototype.direction=J.prototype.direction;J.prototype.directionPoint=J.prototype.Oa;J.prototype.normalize=J.prototype.normalize;J.prototype.distanceSquared=J.prototype.nd;J.prototype.distanceSquaredPoint=J.prototype.tf;J.prototype.scale=J.prototype.scale;J.prototype.rotate=J.prototype.rotate; +J.intersectingLineSegments=function(a,b,c,d,e,f,g,h){return L.lm(a,b,c,d,e,f,g,h)};J.prototype.compareWithLineSegmentPoint=J.prototype.vz;J.compareWithLineSegment=function(a,b,c,d,e,f){return L.em(a,b,c,d,e,f)};J.prototype.direction=J.prototype.direction;J.prototype.directionPoint=J.prototype.Ra;J.prototype.normalize=J.prototype.normalize;J.prototype.distanceSquared=J.prototype.od;J.prototype.distanceSquaredPoint=J.prototype.tf;J.prototype.scale=J.prototype.scale;J.prototype.rotate=J.prototype.rotate; J.prototype.offset=J.prototype.offset;J.prototype.subtract=J.prototype.ge;J.prototype.add=J.prototype.add;J.prototype.equalsApprox=J.prototype.Ta;J.prototype.equalTo=J.prototype.Gi;J.prototype.equals=J.prototype.A;J.prototype.set=J.prototype.set;J.prototype.setTo=J.prototype.ng;var Hb=[];J.className="Point";J.parse=wb;J.stringify=xb;J.distanceLineSegmentSquared=Bb;J.distanceSquared=Cb;J.direction=Gb;J.Origin=pb=(new J(0,0)).ca();J.InfiniteTopLeft=rb=(new J(-Infinity,-Infinity)).ca(); J.InfiniteBottomRight=tb=(new J(Infinity,Infinity)).ca();J.SixPoint=ub=(new J(6,6)).ca();J.NoPoint=vb=(new J(NaN,NaN)).ca();J.parse=wb;J.stringify=xb;J.distanceLineSegmentSquared=Bb;J.distanceSquared=Cb;J.direction=Gb;function M(a,b){void 0===a?this.height=this.width=0:"number"===typeof a&&(0<=a||isNaN(a))&&"number"===typeof b&&(0<=b||isNaN(b))?(this.width=a,this.height=b):C("Invalid arguments to Size constructor: "+a+", "+b);this.v=!1}var Ib,Jb,Kb,Lb,Mb,Nb,Ob; M.prototype.assign=function(a){this.width=a.width;this.height=a.height;return this};M.prototype.h=function(a,b){this.width=a;this.height=b;return this};M.prototype.ng=function(a,b){this.width=a;this.height=b;return this};M.prototype.set=function(a){this.width=a.width;this.height=a.height;return this};M.prototype.copy=function(){var a=new M;a.width=this.width;a.height=this.height;return a};t=M.prototype;t.ca=function(){this.v=!0;Object.freeze(this);return this}; @@ -102,20 +102,20 @@ t.toString=function(){return"Size("+this.width+","+this.height+")"};t.A=function M.prototype.equalsApprox=M.prototype.Ta;M.prototype.equalTo=M.prototype.Gi;M.prototype.equals=M.prototype.A;M.prototype.set=M.prototype.set;M.prototype.setTo=M.prototype.ng;var Sb=[];M.className="Size";M.parse=Pb;M.stringify=Qb;M.ZeroSize=Ib=(new M(0,0)).ca();M.OneSize=Jb=(new M(1,1)).ca();M.SixSize=Kb=(new M(6,6)).ca();M.EightSize=Lb=(new M(8,8)).ca();M.TenSize=Mb=(new M(10,10)).ca();M.InfiniteSize=Nb=(new M(Infinity,Infinity)).ca();M.NoSize=Ob=(new M(NaN,NaN)).ca();M.parse=Pb;M.stringify=Qb; function N(a,b,c,d){void 0===a?this.height=this.width=this.y=this.x=0:"number"===typeof a&&"number"===typeof b&&"number"===typeof c&&(0<=c||isNaN(c))&&"number"===typeof d&&(0<=d||isNaN(d))?(this.x=a,this.y=b,this.width=c,this.height=d):a instanceof J?(c=a.x,a=a.y,b instanceof J?(d=b.x,b=b.y,this.x=Math.min(c,d),this.y=Math.min(a,b),this.width=Math.abs(c-d),this.height=Math.abs(a-b)):b instanceof M?(this.x=c,this.y=a,this.width=b.width,this.height=b.height):C("Incorrect second argument supplied to Rect constructor "+ b)):C("Invalid arguments to Rect constructor: "+a+", "+b+", "+c+", "+d);this.v=!1}t=N.prototype;t.assign=function(a){this.x=a.x;this.y=a.y;this.width=a.width;this.height=a.height;return this};t.h=function(a,b,c,d){this.x=a;this.y=b;this.width=c;this.height=d;return this};function Tb(a,b,c){a.width=b;a.height=c}t.ng=function(a,b,c,d){this.x=a;this.y=b;this.width=c;this.height=d;return this};t.set=function(a){this.x=a.x;this.y=a.y;this.width=a.width;this.height=a.height;return this}; -t.Mc=function(a){this.x=a.x;this.y=a.y;return this};t.WA=function(a){this.width=a.width;this.height=a.height;return this};N.prototype.copy=function(){var a=new N;a.x=this.x;a.y=this.y;a.width=this.width;a.height=this.height;return a};t=N.prototype;t.ca=function(){this.v=!0;Object.freeze(this);return this};t.I=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.v=!0;return this}; +t.Nc=function(a){this.x=a.x;this.y=a.y;return this};t.WA=function(a){this.width=a.width;this.height=a.height;return this};N.prototype.copy=function(){var a=new N;a.x=this.x;a.y=this.y;a.width=this.width;a.height=this.height;return a};t=N.prototype;t.ca=function(){this.v=!0;Object.freeze(this);return this};t.I=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.v=!0;return this}; t.ea=function(){Object.isFrozen(this)&&C("cannot thaw constant: "+this);this.v=!1;return this};function Ub(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));for(var f=0;""===a[b];)b++;(d=a[b++])&&(f=parseFloat(d));for(var g=0;""===a[b];)b++;(d=a[b++])&&(g=parseFloat(d));return new N(c,e,f,g)}return new N} function Vb(a){return a.x.toString()+" "+a.y.toString()+" "+a.width.toString()+" "+a.height.toString()}t.toString=function(){return"Rect("+this.x+","+this.y+","+this.width+","+this.height+")"};t.A=function(a){return a instanceof N?this.x===a.x&&this.y===a.y&&this.width===a.width&&this.height===a.height:!1};t.Gi=function(a,b,c,d){return this.x===a&&this.y===b&&this.width===c&&this.height===d};t.Ta=function(a){return L.w(this.x,a.x)&&L.w(this.y,a.y)&&L.w(this.width,a.width)&&L.w(this.height,a.height)}; function Wb(a,b){return L.aa(a.x,b.x)&&L.aa(a.y,b.y)&&L.aa(a.width,b.width)&&L.aa(a.height,b.height)}t.$=function(a){return this.x<=a.x&&this.x+this.width>=a.x&&this.y<=a.y&&this.y+this.height>=a.y};t.De=function(a){return this.x<=a.x&&a.x+a.width<=this.x+this.width&&this.y<=a.y&&a.y+a.height<=this.y+this.height};t.contains=function(a,b,c,d){void 0===c&&(c=0);void 0===d&&(d=0);return this.x<=a&&a+c<=this.x+this.width&&this.y<=b&&b+d<=this.y+this.height}; -t.offset=function(a,b){this.x+=a;this.y+=b;return this};t.Gc=function(a,b){return Xb(this,b,a,b,a)};t.Xp=function(a){return Xb(this,a.top,a.right,a.bottom,a.left)};t.cw=function(a){return Xb(this,-a.top,-a.right,-a.bottom,-a.left)};t.lA=function(a,b,c,d){return Xb(this,a,b,c,d)};function Xb(a,b,c,d,e){var f=a.width;c+e<=-f?(a.x+=f/2,a.width=0):(a.x-=e,a.width+=c+e);c=a.height;b+d<=-c?(a.y+=c/2,a.height=0):(a.y-=b,a.height+=b+d);return a}t.hy=function(a){return Yb(this,a.x,a.y,a.width,a.height)}; -t.zv=function(a,b,c,d){return Yb(this,a,b,c,d)};function Yb(a,b,c,d,e){var f=Math.max(a.x,b),g=Math.max(a.y,c);b=Math.min(a.x+a.width,b+d);c=Math.min(a.y+a.height,c+e);a.x=f;a.y=g;a.width=Math.max(0,b-f);a.height=Math.max(0,c-g);return a}t.Ic=function(a){return this.Av(a.x,a.y,a.width,a.height)}; -t.Av=function(a,b,c,d){var e=this.width,f=this.x;if(Infinity!==e&&Infinity!==c&&(e+=f,c+=a,isNaN(c)||isNaN(e)||f>c||a>e))return!1;a=this.height;c=this.y;return Infinity!==a&&Infinity!==d&&(a+=c,d+=b,isNaN(d)||isNaN(a)||c>d||b>a)?!1:!0};function Zb(a,b){var c=a.width,d=a.x,e=b.x-10;if(d>b.width+10+10+e||e>c+d)return!1;c=a.height;a=a.y;d=b.y-10;return a>b.height+10+10+d||d>c+a?!1:!0}t.Le=function(a){return $b(this,a.x,a.y,0,0)};t.Nc=function(a){return $b(this,a.x,a.y,a.width,a.height)}; +t.offset=function(a,b){this.x+=a;this.y+=b;return this};t.Hc=function(a,b){return Xb(this,b,a,b,a)};t.Xp=function(a){return Xb(this,a.top,a.right,a.bottom,a.left)};t.cw=function(a){return Xb(this,-a.top,-a.right,-a.bottom,-a.left)};t.lA=function(a,b,c,d){return Xb(this,a,b,c,d)};function Xb(a,b,c,d,e){var f=a.width;c+e<=-f?(a.x+=f/2,a.width=0):(a.x-=e,a.width+=c+e);c=a.height;b+d<=-c?(a.y+=c/2,a.height=0):(a.y-=b,a.height+=b+d);return a}t.hy=function(a){return Yb(this,a.x,a.y,a.width,a.height)}; +t.zv=function(a,b,c,d){return Yb(this,a,b,c,d)};function Yb(a,b,c,d,e){var f=Math.max(a.x,b),g=Math.max(a.y,c);b=Math.min(a.x+a.width,b+d);c=Math.min(a.y+a.height,c+e);a.x=f;a.y=g;a.width=Math.max(0,b-f);a.height=Math.max(0,c-g);return a}t.Jc=function(a){return this.Av(a.x,a.y,a.width,a.height)}; +t.Av=function(a,b,c,d){var e=this.width,f=this.x;if(Infinity!==e&&Infinity!==c&&(e+=f,c+=a,isNaN(c)||isNaN(e)||f>c||a>e))return!1;a=this.height;c=this.y;return Infinity!==a&&Infinity!==d&&(a+=c,d+=b,isNaN(d)||isNaN(a)||c>d||b>a)?!1:!0};function Zb(a,b){var c=a.width,d=a.x,e=b.x-10;if(d>b.width+10+10+e||e>c+d)return!1;c=a.height;a=a.y;d=b.y-10;return a>b.height+10+10+d||d>c+a?!1:!0}t.Le=function(a){return $b(this,a.x,a.y,0,0)};t.Oc=function(a){return $b(this,a.x,a.y,a.width,a.height)}; t.gw=function(a,b,c,d){void 0===c&&(c=0);void 0===d&&(d=0);return $b(this,a,b,c,d)};function $b(a,b,c,d,e){var f=Math.min(a.x,b),g=Math.min(a.y,c);b=Math.max(a.x+a.width,b+d);c=Math.max(a.y+a.height,c+e);a.x=f;a.y=g;a.width=b-f;a.height=c-g;return a}t.Vi=function(a,b,c){this.x=a-c.offsetX-c.x*this.width;this.y=b-c.offsetY-c.y*this.height;return this};function ac(a,b,c,d,e,f,g,h){void 0===g&&(g=0);void 0===h&&(h=0);return a<=e&&e+g<=a+c&&b<=f&&f+h<=b+d} function bc(a,b,c,d,e,f,g,h){return a>g+e||e>c+a?!1:b>h+f||f>d+b?!1:!0}t.u=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)};t.rA=function(){return 0===this.width&&0===this.height};N.alloc=function(){var a=cc.pop();return void 0===a?new N:a};N.allocAt=function(a,b,c,d){var e=cc.pop();return void 0===e?new N(a,b,c,d):e.h(a,b,c,d)};N.free=function(a){cc.push(a)}; na.Object.defineProperties(N.prototype,{left:{get:function(){return this.x},set:function(a){this.x=a}},top:{get:function(){return this.y},set:function(a){this.y=a}},right:{get:function(){return this.x+this.width},set:function(a){this.x+=a-(this.x+this.width)}},bottom:{get:function(){return this.y+this.height},set:function(a){this.y+=a-(this.y+this.height)}},position:{ get:function(){return new J(this.x,this.y)},set:function(a){this.x=a.x;this.y=a.y}},size:{get:function(){return new M(this.width,this.height)},set:function(a){this.width=a.width;this.height=a.height}},center:{get:function(){return new J(this.x+this.width/2,this.y+this.height/2)},set:function(a){this.x=a.x-this.width/2;this.y=a.y-this.height/2}},centerX:{get:function(){return this.x+this.width/2}, -set:function(a){this.x=a-this.width/2}},centerY:{get:function(){return this.y+this.height/2},set:function(a){this.y=a-this.height/2}}});N.prototype.isEmpty=N.prototype.rA;N.prototype.isReal=N.prototype.u;N.intersectsLineSegment=function(a,b,c,d,e,f,g,h){return L.iy(a,b,c,d,e,f,g,h)};N.prototype.setSpot=N.prototype.Vi;N.prototype.union=N.prototype.gw;N.prototype.unionRect=N.prototype.Nc;N.prototype.unionPoint=N.prototype.Le;N.prototype.intersects=N.prototype.Av; -N.prototype.intersectsRect=N.prototype.Ic;N.prototype.intersect=N.prototype.zv;N.prototype.intersectRect=N.prototype.hy;N.prototype.grow=N.prototype.lA;N.prototype.subtractMargin=N.prototype.cw;N.prototype.addMargin=N.prototype.Xp;N.prototype.inflate=N.prototype.Gc;N.prototype.offset=N.prototype.offset;N.prototype.contains=N.prototype.contains;N.prototype.containsRect=N.prototype.De;N.prototype.containsPoint=N.prototype.$;N.prototype.equalsApprox=N.prototype.Ta;N.prototype.equalTo=N.prototype.Gi; -N.prototype.equals=N.prototype.A;N.prototype.setSize=N.prototype.WA;N.prototype.setPoint=N.prototype.Mc;N.prototype.set=N.prototype.set;N.prototype.setTo=N.prototype.ng;var gc=null,hc=null,cc=[];N.className="Rect";N.parse=Ub;N.stringify=Vb;N.contains=ac;N.intersects=bc;N.ZeroRect=gc=(new N(0,0,0,0)).ca();N.NoRect=hc=(new N(NaN,NaN,NaN,NaN)).ca();N.parse=Ub;N.stringify=Vb;N.contains=ac;N.intersects=bc; +set:function(a){this.x=a-this.width/2}},centerY:{get:function(){return this.y+this.height/2},set:function(a){this.y=a-this.height/2}}});N.prototype.isEmpty=N.prototype.rA;N.prototype.isReal=N.prototype.u;N.intersectsLineSegment=function(a,b,c,d,e,f,g,h){return L.iy(a,b,c,d,e,f,g,h)};N.prototype.setSpot=N.prototype.Vi;N.prototype.union=N.prototype.gw;N.prototype.unionRect=N.prototype.Oc;N.prototype.unionPoint=N.prototype.Le;N.prototype.intersects=N.prototype.Av; +N.prototype.intersectsRect=N.prototype.Jc;N.prototype.intersect=N.prototype.zv;N.prototype.intersectRect=N.prototype.hy;N.prototype.grow=N.prototype.lA;N.prototype.subtractMargin=N.prototype.cw;N.prototype.addMargin=N.prototype.Xp;N.prototype.inflate=N.prototype.Hc;N.prototype.offset=N.prototype.offset;N.prototype.contains=N.prototype.contains;N.prototype.containsRect=N.prototype.De;N.prototype.containsPoint=N.prototype.$;N.prototype.equalsApprox=N.prototype.Ta;N.prototype.equalTo=N.prototype.Gi; +N.prototype.equals=N.prototype.A;N.prototype.setSize=N.prototype.WA;N.prototype.setPoint=N.prototype.Nc;N.prototype.set=N.prototype.set;N.prototype.setTo=N.prototype.ng;var gc=null,hc=null,cc=[];N.className="Rect";N.parse=Ub;N.stringify=Vb;N.contains=ac;N.intersects=bc;N.ZeroRect=gc=(new N(0,0,0,0)).ca();N.NoRect=hc=(new N(NaN,NaN,NaN,NaN)).ca();N.parse=Ub;N.stringify=Vb;N.contains=ac;N.intersects=bc; function ic(a,b,c,d){void 0===a?this.left=this.bottom=this.right=this.top=0:void 0===b?this.left=this.bottom=this.right=this.top=a:void 0===c?(this.top=a,this.right=b,this.bottom=a,this.left=b):void 0!==d?(this.top=a,this.right=b,this.bottom=c,this.left=d):C("Invalid arguments to Margin constructor: "+a+", "+b+", "+c+", "+d);this.v=!1}ic.prototype.assign=function(a){this.top=a.top;this.right=a.right;this.bottom=a.bottom;this.left=a.left;return this}; ic.prototype.ng=function(a,b,c,d){this.top=a;this.right=b;this.bottom=c;this.left=d;return this};ic.prototype.set=function(a){this.top=a.top;this.right=a.right;this.bottom=a.bottom;this.left=a.left;return this};ic.prototype.copy=function(){var a=new ic;a.top=this.top;a.right=this.right;a.bottom=this.bottom;a.left=this.left;return a};t=ic.prototype;t.ca=function(){this.v=!0;Object.freeze(this);return this};t.I=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()}; t.freeze=function(){this.v=!0;return this};t.ea=function(){Object.isFrozen(this)&&C("cannot thaw constant: "+this);this.v=!1;return this}; @@ -130,8 +130,8 @@ a)return Fc;if("RightSide"===a)return Gc;if("BottomSide"===a)return Hc;if("TopBo var d=a[b++];void 0!==d&&0c,f=0>d;if(al;++l){b=.5*(h+k);if(b===h||b===k)break;var m=a/(b+e),n=g/(b+f);m=m*m+n*n-1;if(0m)k=b;else break}c=e*c/(b+e)-c;d=f*d/(b+f)-d;c=Math.sqrt(c*c+d*d)}else c=Math.abs(d-b);else d=a*a-b*b,f=a*c,fg&&(g+=360),q.startAngle+=g);0>a&&(q.startAngle=180-q.startAngle,q.sweepAngle=-q.sweepAngle); 0>d&&(q.startAngle=-q.startAngle,q.sweepAngle=-q.sweepAngle);q.radiusX*=Math.sqrt(a*a+c*c);void 0!==q.radiusY&&(q.radiusY*=Math.sqrt(b*b+d*d));break;case Pd:g=q.endX;h=q.endY;q.endX=g*a+h*c+e;q.endY=g*b+h*d+f;if(0===q.radiusX||0===q.radiusY)break;0!==b&&(g=180*Math.atan2(b,a)/Math.PI,0>g&&(g+=360),q.xAxisRotation+=g);0>a&&(q.xAxisRotation=180-q.xAxisRotation,q.isClockwiseArc=!q.isClockwiseArc);0>d&&(q.xAxisRotation=-q.xAxisRotation,q.isClockwiseArc=!q.isClockwiseArc);q.radiusX*=Math.sqrt(a*a+c*c); q.radiusY*=Math.sqrt(b*b+d*d);break;default:C("Unknown Segment type: "+q.type)}}}}this.qa=!0;return this}; -t.$=function(a,b){void 0===b&&(b=0);var c=this.Zc,d=this.$c,e=this.fc,f=this.oc;switch(this.type){case Q.j:return L.Mb(c,d,e,f,b,a.x,a.y);case Q.C:var g=N.allocAt(Math.min(c,e)-b,Math.min(d,f)-b,Math.abs(e-c)+2*b,Math.abs(f-d)+2*b);a=g.$(a);N.free(g);return a;case Q.M:g=Math.min(c,e)-b;var h=Math.min(d,f)-b;c=(Math.abs(e-c)+2*b)/2;b=(Math.abs(f-d)+2*b)/2;if(0>=c||0>=b)return!1;g=a.x-(g+c);h=a.y-(h+b);return 1>=g*g/(c*c)+h*h/(b*b);case Q.o:return Sd(this,a,b,!0,!1);default:return!1}}; +t.$=function(a,b){void 0===b&&(b=0);var c=this.$c,d=this.ad,e=this.fc,f=this.oc;switch(this.type){case Q.j:return L.Mb(c,d,e,f,b,a.x,a.y);case Q.C:var g=N.allocAt(Math.min(c,e)-b,Math.min(d,f)-b,Math.abs(e-c)+2*b,Math.abs(f-d)+2*b);a=g.$(a);N.free(g);return a;case Q.M:g=Math.min(c,e)-b;var h=Math.min(d,f)-b;c=(Math.abs(e-c)+2*b)/2;b=(Math.abs(f-d)+2*b)/2;if(0>=c||0>=b)return!1;g=a.x-(g+c);h=a.y-(h+b);return 1>=g*g/(c*c)+h*h/(b*b);case Q.o:return Sd(this,a,b,!0,!1);default:return!1}}; function Sd(a,b,c,d,e){var f=b.x;b=b.y;for(var g=a.bounds.x-20,h=0,k,l,m,n,p=a.figures.m,r=p.length,q=0;qa?"M"+this.startX.toString()+" "+this.startY.toString():"M"+this.startX.toFixed(a)+" "+this.startY.toFixed(a);for(var c=this.segments.m,d=c.length,e=0;ea&&(a+=360),this.Ae=a,this.pi=0,this.ri=Math.max(d,0),this.ah=Math.max(e,0),this.rl="boolean"===typeof g?g:"number"===typeof g?!!g:!1,this.Nk=!!h):(this.Ae=d,this.pi=e,a===Od&&(f=Math.max(f,0)),this.ri=f,"number"===typeof g?(a===Od&&(g=Math.max(g,0)),this.ah=g):this.ah=0, this.Nk=this.rl=!1);this.yj=!1;this.qa=!0;this.Od=null}Xd.prototype.copy=function(){var a=new Xd;a.ia=this.ia;a.fc=this.fc;a.oc=this.oc;a.Ae=this.Ae;a.pi=this.pi;a.ri=this.ri;a.ah=this.ah;a.rl=this.rl;a.Nk=this.Nk;a.yj=this.yj;a.qa=this.qa;return a};t=Xd.prototype; t.Ta=function(a){if(!(a instanceof Xd)||this.type!==a.type||this.isClosed!==a.isClosed)return!1;switch(this.type){case Fd:case ud:return L.w(this.endX,a.endX)&&L.w(this.endY,a.endY);case Md:return L.w(this.endX,a.endX)&&L.w(this.endY,a.endY)&&L.w(this.point1X,a.point1X)&&L.w(this.point1Y,a.point1Y)&&L.w(this.point2X,a.point2X)&&L.w(this.point2Y,a.point2Y);case Nd:return L.w(this.endX,a.endX)&&L.w(this.endY,a.endY)&&L.w(this.point1X,a.point1X)&&L.w(this.point1Y,a.point1Y);case Od:return L.w(this.startAngle, @@ -234,15 +234,15 @@ wa(this,a);this.oc=a;this.qa=!0}},point1X:{get:function(){return this.Ae},set:fu wa(this,a);this.ah=a;this.qa=!0}},centerX:{get:function(){return this.Ae},set:function(a){this.v&&wa(this,a);this.Ae=a;this.qa=!0}},centerY:{get:function(){return this.pi},set:function(a){this.v&&wa(this,a);this.pi=a;this.qa=!0}},radiusX:{get:function(){return this.ri},set:function(a){0>a&&xa(a,">= zero",Xd,"radiusX");this.v&&wa(this,a);this.ri=a;this.qa=!0}},radiusY:{get:function(){return this.ah}, set:function(a){0>a&&xa(a,">= zero",Xd,"radiusY");this.v&&wa(this,a);this.ah=a;this.qa=!0}},startAngle:{get:function(){return this.fc},set:function(a){this.fc!==a&&(this.v&&wa(this,a),a%=360,0>a&&(a+=360),this.fc=a,this.qa=!0)}},sweepAngle:{get:function(){return this.oc},set:function(a){this.v&&wa(this,a);360a&&(a=-360);this.oc=a;this.qa=!0}},isClockwiseArc:{get:function(){return this.Nk},set:function(a){this.v&& wa(this,a);this.Nk=a;this.qa=!0}},isLargeArc:{get:function(){return this.rl},set:function(a){this.v&&wa(this,a);this.rl=a;this.qa=!0}},xAxisRotation:{get:function(){return this.Ae},set:function(a){a%=360;0>a&&(a+=360);this.v&&wa(this,a);this.Ae=a;this.qa=!0}}});Xd.prototype.equalsApprox=Xd.prototype.Ta; -var Fd=new D(Xd,"Move",0),ud=new D(Xd,"Line",1),Md=new D(Xd,"Bezier",2),Nd=new D(Xd,"QuadraticBezier",3),Od=new D(Xd,"Arc",4),Pd=new D(Xd,"SvgArc",4);Xd.className="PathSegment";Xd.Move=Fd;Xd.Line=ud;Xd.Bezier=Md;Xd.QuadraticBezier=Nd;Xd.Arc=Od;Xd.SvgArc=Pd;function Zd(){this.F=null;this.Wu=(new J(0,0)).freeze();this.Ht=(new J(0,0)).freeze();this.Sq=this.Lr=0;this.Tq=1;this.ci="";this.rs=this.hr=!1;this.fr=this.Vq=0;this.sg=this.ur=this.Ar=!1;this.lr=null;this.ps=0;this.md=this.os=null} -Zd.prototype.copy=function(){var a=new Zd;return this.clone(a)};Zd.prototype.clone=function(a){a.F=this.F;a.Wu.assign(this.viewPoint);a.Ht.assign(this.documentPoint);a.Lr=this.Lr;a.Sq=this.Sq;a.Tq=this.Tq;a.ci=this.ci;a.hr=this.hr;a.rs=this.rs;a.Vq=this.Vq;a.fr=this.fr;a.Ar=this.Ar;a.ur=this.ur;a.sg=this.sg;a.lr=this.lr;a.ps=this.ps;a.os=this.os;a.md=this.md;return a}; +var Fd=new D(Xd,"Move",0),ud=new D(Xd,"Line",1),Md=new D(Xd,"Bezier",2),Nd=new D(Xd,"QuadraticBezier",3),Od=new D(Xd,"Arc",4),Pd=new D(Xd,"SvgArc",4);Xd.className="PathSegment";Xd.Move=Fd;Xd.Line=ud;Xd.Bezier=Md;Xd.QuadraticBezier=Nd;Xd.Arc=Od;Xd.SvgArc=Pd;function Zd(){this.F=null;this.Wu=(new J(0,0)).freeze();this.Ht=(new J(0,0)).freeze();this.Sq=this.Lr=0;this.Tq=1;this.ci="";this.rs=this.hr=!1;this.fr=this.Vq=0;this.sg=this.ur=this.Ar=!1;this.lr=null;this.ps=0;this.nd=this.os=null} +Zd.prototype.copy=function(){var a=new Zd;return this.clone(a)};Zd.prototype.clone=function(a){a.F=this.F;a.Wu.assign(this.viewPoint);a.Ht.assign(this.documentPoint);a.Lr=this.Lr;a.Sq=this.Sq;a.Tq=this.Tq;a.ci=this.ci;a.hr=this.hr;a.rs=this.rs;a.Vq=this.Vq;a.fr=this.fr;a.Ar=this.Ar;a.ur=this.ur;a.sg=this.sg;a.lr=this.lr;a.ps=this.ps;a.os=this.os;a.nd=this.nd;return a}; Zd.prototype.toString=function(){var a="^";0!==this.modifiers&&(a+="M:"+this.modifiers);0!==this.button&&(a+="B:"+this.button);""!==this.key&&(a+="K:"+this.key);0!==this.clickCount&&(a+="C:"+this.clickCount);0!==this.delta&&(a+="D:"+this.delta);this.handled&&(a+="h");this.bubbles&&(a+="b");null!==this.documentPoint&&(a+="@"+this.documentPoint.toString());return a};Zd.prototype.mq=function(a,b){var c=this.diagram;if(null===c)return b;$d(c,this.event,a,b);return b}; Zd.prototype.fA=function(a,b){var c=this.diagram;if(null===c)return b;$d(c,this.event,a,b);b.assign(c.kt(b));return b}; na.Object.defineProperties(Zd.prototype,{diagram:{get:function(){return this.F},set:function(a){this.F=a}},viewPoint:{get:function(){return this.Wu},set:function(a){this.Wu.assign(a)}},documentPoint:{get:function(){return this.Ht},set:function(a){this.Ht.assign(a)}},modifiers:{get:function(){return this.Lr},set:function(a){this.Lr=a}},button:{get:function(){return this.Sq}, set:function(a){this.Sq=a;if(null===this.event)switch(a){case 0:this.buttons=1;break;case 1:this.buttons=4;break;case 2:this.buttons=2}}},buttons:{get:function(){return this.Tq},set:function(a){this.Tq=a}},key:{get:function(){return this.ci},set:function(a){this.ci=a}},down:{get:function(){return this.hr},set:function(a){this.hr=a}},up:{get:function(){return this.rs},set:function(a){this.rs= a}},clickCount:{get:function(){return this.Vq},set:function(a){this.Vq=a}},delta:{get:function(){return this.fr},set:function(a){this.fr=a}},isMultiTouch:{get:function(){return this.Ar},set:function(a){this.Ar=a}},handled:{get:function(){return this.ur},set:function(a){this.ur=a}},bubbles:{get:function(){return this.sg},set:function(a){this.sg=a}},event:{ get:function(){return this.lr},set:function(a){this.lr=a}},isTouchEvent:{get:function(){var a=x.TouchEvent,b=this.event;return a&&b instanceof a?!0:(a=x.PointerEvent)&&b instanceof a&&("touch"===b.pointerType||"pen"===b.pointerType)}},timestamp:{get:function(){return this.ps},set:function(a){this.ps=a}},targetDiagram:{get:function(){return this.os},set:function(a){this.os=a}},targetObject:{ -get:function(){return this.md},set:function(a){this.md=a}},control:{get:function(){return 0!==(this.modifiers&1)},set:function(a){this.modifiers=a?this.modifiers|1:this.modifiers&-2}},shift:{get:function(){return 0!==(this.modifiers&4)},set:function(a){this.modifiers=a?this.modifiers|4:this.modifiers&-5}},alt:{get:function(){return 0!==(this.modifiers&2)},set:function(a){this.modifiers=a?this.modifiers| +get:function(){return this.nd},set:function(a){this.nd=a}},control:{get:function(){return 0!==(this.modifiers&1)},set:function(a){this.modifiers=a?this.modifiers|1:this.modifiers&-2}},shift:{get:function(){return 0!==(this.modifiers&4)},set:function(a){this.modifiers=a?this.modifiers|4:this.modifiers&-5}},alt:{get:function(){return 0!==(this.modifiers&2)},set:function(a){this.modifiers=a?this.modifiers| 2:this.modifiers&-3}},meta:{get:function(){return 0!==(this.modifiers&8)},set:function(a){this.modifiers=a?this.modifiers|8:this.modifiers&-9}},left:{get:function(){var a=this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons&1):0===this.button},set:function(a){this.buttons=a?this.buttons|1:this.buttons&-2}},right:{get:function(){var a= this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons&2):2===this.button},set:function(a){this.buttons=a?this.buttons|2:this.buttons&-3}},middle:{get:function(){var a=this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons&4):1===this.button},set:function(a){this.buttons=a?this.buttons|4:this.buttons&-5}}}); Zd.prototype.getMultiTouchDocumentPoint=Zd.prototype.fA;Zd.prototype.getMultiTouchViewPoint=Zd.prototype.mq;Zd.className="InputEvent";function ae(){this.F=null;this.na="";this.Tr=this.ks=null}ae.prototype.copy=function(){var a=new ae;a.F=this.F;a.na=this.na;a.ks=this.ks;a.Tr=this.Tr;return a};ae.prototype.toString=function(){var a="*"+this.name;null!==this.subject&&(a+=":"+this.subject.toString());null!==this.parameter&&(a+="("+this.parameter.toString()+")");return a}; @@ -258,9 +258,9 @@ newValue:{get:function(){return this.No},set:function(a){this.No=a}},newParam:{g var de=new D(be,"Transaction",-1),ce=new D(be,"Property",0),ee=new D(be,"Insert",1),fe=new D(be,"Remove",2);be.className="ChangedEvent";be.Transaction=de;be.Property=ce;be.Insert=ee;be.Remove=fe;function oe(){this.o=(new E).freeze();this.na="";this.j=!1}oe.prototype.toString=function(a){var b="Transaction: "+this.name+" "+this.changes.count.toString()+(this.isComplete?"":", incomplete");if(void 0!==a&&0b&&a.Lc(b,d),b++);for(;a.length>b;)a.pop();a.freeze()}}; +oe.prototype.Zs=function(){if(this.isComplete){var a=this.changes;a.ea();for(var b=new I,c=0;cb&&a.Mc(b,d),b++);for(;a.length>b;)a.pop();a.freeze()}}; na.Object.defineProperties(oe.prototype,{changes:{get:function(){return this.o}},name:{get:function(){return this.na},set:function(a){this.na=a}},isComplete:{get:function(){return this.j},set:function(a){this.j=a}}});oe.prototype.optimize=oe.prototype.Zs;oe.prototype.redo=oe.prototype.redo;oe.prototype.canRedo=oe.prototype.canRedo;oe.prototype.undo=oe.prototype.undo;oe.prototype.canUndo=oe.prototype.canUndo; -oe.prototype.clear=oe.prototype.clear;oe.className="Transaction";function pe(){this.nu=new G;this.td=!1;this.C=(new E).freeze();this.pe=-1;this.o=999;this.re=!1;this.cr=null;this.yi=0;this.j=!1;this.we=(new E).freeze();this.Al=new E;this.Pt=!0;this.Zt=this.yr=this.bu=this.au=!1} +oe.prototype.clear=oe.prototype.clear;oe.className="Transaction";function pe(){this.nu=new G;this.ud=!1;this.C=(new E).freeze();this.pe=-1;this.o=999;this.re=!1;this.cr=null;this.yi=0;this.j=!1;this.we=(new E).freeze();this.Al=new E;this.Pt=!0;this.Zt=this.yr=this.bu=this.au=!1} pe.prototype.toString=function(a){var b="UndoManager "+this.historyIndex+"<"+this.history.count+"<="+this.maxHistoryLength;b+="[";for(var c=this.nestedTransactionNames.count,d=0;d=this.transactionLevel&&!this.Pt&&(a=a.diagram,null!==a&&!1===a.Pi||ya("Change not within a transaction: "+c.toString()))}}; pe.prototype.skipsEvent=function(a){if(null===a||0>a.change.value)return!0;a=a.object;if(null===a)return!1;if(void 0!==a.layer){if(a=a.layer,null!==a&&a.isTemporary)return!0}else if(a.isTemporary)return!0;return!1}; -na.Object.defineProperties(pe.prototype,{models:{get:function(){return this.nu.iterator}},isEnabled:{get:function(){return this.td},set:function(a){this.td=a}},transactionToUndo:{get:function(){return 0<=this.historyIndex&&this.historyIndex<=this.history.count-1?this.history.J(this.historyIndex):null}},transactionToRedo:{get:function(){return this.historyIndexe&&(e=-3),0g&&(g=-3);if(void 0===h||void 0===e||void 0===g||0===e&&0===g||b.shift)!b.shift&&a.allowVerticalScroll?(f=3*f*a.scrollVerticalLineChange,0e||Math.abs(b.y-a.y)>d}; -na.Object.defineProperties(re.prototype,{diagram:{get:function(){return this.F},set:function(a){a instanceof T&&(this.F=a)}},name:{get:function(){return this.na},set:function(a){this.na=a}},isEnabled:{get:function(){return this.td},set:function(a){this.td=a}},isActive:{get:function(){return this.Oc},set:function(a){this.Oc=a}},transactionResult:{get:function(){return this.tw}, -set:function(a){this.tw=a}}});re.prototype.startTransaction=re.prototype.wa;re.className="Tool";function Oa(){re.call(this);this.name="ToolManager";this.yc=new E;this.Pc=new E;this.Kd=new E;this.M=this.Ga=850;this.o=(new M(2,2)).ca();this.Wa=5E3;this.Ha=ve;this.C=xe;this.br=this.j=null;this.Vj=-1}ma(Oa,re);Oa.prototype.initializeStandardTools=function(){}; +na.Object.defineProperties(re.prototype,{diagram:{get:function(){return this.F},set:function(a){a instanceof T&&(this.F=a)}},name:{get:function(){return this.na},set:function(a){this.na=a}},isEnabled:{get:function(){return this.ud},set:function(a){this.ud=a}},isActive:{get:function(){return this.Pc},set:function(a){this.Pc=a}},transactionResult:{get:function(){return this.tw}, +set:function(a){this.tw=a}}});re.prototype.startTransaction=re.prototype.wa;re.className="Tool";function Oa(){re.call(this);this.name="ToolManager";this.yc=new E;this.Qc=new E;this.Kd=new E;this.M=this.Ga=850;this.o=(new M(2,2)).ca();this.Wa=5E3;this.Ha=ve;this.C=xe;this.br=this.j=null;this.Vj=-1}ma(Oa,re);Oa.prototype.initializeStandardTools=function(){}; Oa.prototype.updateAdornments=function(a){var b=this.currentToolTip;if(b instanceof we&&this.br===a){var c=b.adornedObject;(null!==a?c.part===a:null===c)?this.showToolTip(b,c):this.hideToolTip()}}; Oa.prototype.doMouseDown=function(){var a=this.diagram,b=a.lastInput;b.isTouchEvent&&this.gestureBehavior===ye&&(b.bubbles=!1);if(b.isMultiTouch){this.cancelWaitAfter();if(this.gestureBehavior===ze){b.bubbles=!0;return}if(this.gestureBehavior===ye)return;if(a.currentTool.canStartMultiTouch()){a.currentTool.standardPinchZoomStart();return}}for(var c=this.mouseDownTools.length,d=0;dg&&(g=l),m>h&&(h=m))}}Infinity===d?f.h(0,0,0,0):f.h(d,e,g-d,h-e);d=f.x+f.width/2;e=f.y+f.height/2;N.free(f); -f=a.hs;g=new I;h=J.alloc();for(k=b.iterator;k.next();)l=k.value,l instanceof U&&l.canCopy()&&(m=c.H(l),null!==m&&(m.points=l.points,cf(m,f.x-d,f.y-e),m.suspendsRouting=!0,g.add(m,a.yd())));for(b=b.iterator;b.next();)l=b.value,l.Jc()&&l.canCopy()&&(k=c.H(l),null!==k&&(l=l.location,h.h(f.x-(d-l.x),f.y-(e-l.y)),k.location=h,k.Sa(),g.add(k,a.yd(h))));J.free(h);a.copiedParts=g;Je(a,g.Ef());null!==a.draggedLink&&(c=a.draggedLink,b=c.routeBounds,cf(c,a.startPoint.x-(b.x+b.width/2),a.startPoint.y-(b.y+b.height/ +f=a.hs;g=new I;h=J.alloc();for(k=b.iterator;k.next();)l=k.value,l instanceof U&&l.canCopy()&&(m=c.H(l),null!==m&&(m.points=l.points,cf(m,f.x-d,f.y-e),m.suspendsRouting=!0,g.add(m,a.zd())));for(b=b.iterator;b.next();)l=b.value,l.Kc()&&l.canCopy()&&(k=c.H(l),null!==k&&(l=l.location,h.h(f.x-(d-l.x),f.y-(e-l.y)),k.location=h,k.Sa(),g.add(k,a.zd(h))));J.free(h);a.copiedParts=g;Je(a,g.Ef());null!==a.draggedLink&&(c=a.draggedLink,b=c.routeBounds,cf(c,a.startPoint.x-(b.x+b.width/2),a.startPoint.y-(b.y+b.height/ 2)));a.doUpdateCursor(null,!0)}}}De.prototype.doSimulatedDragOut=function(){var a=this.diagram;a.ht=!1;this.mayCopy()||this.mayMove()?a.currentCursor="":a.currentCursor=this.nodropCursor;this.qo=null};De.prototype.computeMove=function(a,b,c,d){c=this.diagram;return null!==c?c.computeMove(a,b,this.dragOptions,d):new J}; -na.Object.defineProperties(De.prototype,{isCopyEnabled:{get:function(){return this.Pc},set:function(a){this.Pc=a}},copiesEffectiveCollection:{get:function(){return this.C},set:function(a){this.C=a}},dragOptions:{get:function(){return this.Ha},set:function(a){this.Ha=a}},isGridSnapEnabled:{get:function(){return this.dragOptions.isGridSnapEnabled},set:function(a){this.dragOptions.isGridSnapEnabled= +na.Object.defineProperties(De.prototype,{isCopyEnabled:{get:function(){return this.Qc},set:function(a){this.Qc=a}},copiesEffectiveCollection:{get:function(){return this.C},set:function(a){this.C=a}},dragOptions:{get:function(){return this.Ha},set:function(a){this.Ha=a}},isGridSnapEnabled:{get:function(){return this.dragOptions.isGridSnapEnabled},set:function(a){this.dragOptions.isGridSnapEnabled= a}},isComplexRoutingRealtime:{get:function(){return this.yc},set:function(a){this.yc=a}},isGridSnapRealtime:{get:function(){return this.dragOptions.isGridSnapRealtime},set:function(a){this.dragOptions.isGridSnapRealtime=a}},gridSnapCellSize:{get:function(){return this.dragOptions.gridSnapCellSize},set:function(a){this.dragOptions.gridSnapCellSize.A(a)||(a=a.I(),this.dragOptions.gridSnapCellSize=a)}},gridSnapCellSpot:{ get:function(){return this.dragOptions.gridSnapCellSpot},set:function(a){this.dragOptions.gridSnapCellSpot.A(a)||(a=a.I(),this.dragOptions.gridSnapCellSpot=a)}},gridSnapOrigin:{get:function(){return this.dragOptions.gridSnapOrigin},set:function(a){this.dragOptions.gridSnapOrigin.A(a)||(a=a.I(),this.dragOptions.gridSnapOrigin=a)}},dragsLink:{get:function(){return this.dragOptions.dragsLink},set:function(a){this.dragOptions.dragsLink= a}},dragsTree:{get:function(){return this.dragOptions.dragsTree},set:function(a){this.dragOptions.dragsTree=a}},copyCursor:{get:function(){return this.M},set:function(a){this.M=a}},moveCursor:{get:function(){return this.Ih},set:function(a){this.Ih=a}},nodropCursor:{get:function(){return this.Jh},set:function(a){this.Jh=a}},currentPart:{get:function(){return this.Ga}, @@ -361,7 +361,7 @@ set:function(a){this.Ga=a}},copiedParts:{get:function(){return this.o},set:funct a}},isDragOutStarted:{get:function(){return this.Kd},set:function(a){this.Kd=a}},startPoint:{get:function(){return this.hs},set:function(a){this.hs.A(a)||this.hs.assign(a)}},delay:{get:function(){return this.Zk},set:function(a){this.Zk=a}}});De.prototype.getDraggingSource=De.prototype.eA;var Ie=null,Me=null;De.className="DraggingTool";He=new E; Ma("draggingTool",function(){return this.findTool("Dragging")},function(a){this.Za("Dragging",a,this.mouseMoveTools)});Oa.prototype.doCancel=function(){null!==Ie&&Ie.doCancel();re.prototype.doCancel.call(this)}; function tf(){re.call(this);this.Jh=100;this.Ha=!1;this.Sh="pointer";var a=new U,b=new uf;b.isPanelMain=!0;b.stroke="blue";a.add(b);b=new uf;b.toArrow="Standard";b.fill="blue";b.stroke="blue";a.add(b);a.layerName="Tool";this.rw=a;a=new W;b=new uf;b.portId="";b.figure="Rectangle";b.fill=null;b.stroke="magenta";b.strokeWidth=2;b.desiredSize=Jb;a.add(b);a.selectable=!1;a.layerName="Tool";this.Tm=a;this.j=b;a=new W;b=new uf;b.portId="";b.figure="Rectangle";b.fill=null;b.stroke="magenta";b.strokeWidth= -2;b.desiredSize=Jb;a.add(b);a.selectable=!1;a.layerName="Tool";this.sw=a;this.o=b;this.Ih=this.Kd=this.yc=this.Wa=this.Pc=null;this.Ga=!0;this.My=new I;this.Zi=this.ii=this.Sm=null}ma(tf,re);tf.prototype.doStop=function(){this.diagram.og();this.originalToPort=this.originalToNode=this.originalFromPort=this.originalFromNode=this.originalLink=null;this.validPortsCache.clear();this.targetPort=null}; +2;b.desiredSize=Jb;a.add(b);a.selectable=!1;a.layerName="Tool";this.sw=a;this.o=b;this.Ih=this.Kd=this.yc=this.Wa=this.Qc=null;this.Ga=!0;this.My=new I;this.Zi=this.ii=this.Sm=null}ma(tf,re);tf.prototype.doStop=function(){this.diagram.og();this.originalToPort=this.originalToNode=this.originalFromPort=this.originalFromNode=this.originalLink=null;this.validPortsCache.clear();this.targetPort=null}; tf.prototype.copyPortProperties=function(a,b,c,d,e){if(null!==a&&null!==b&&null!==c&&null!==d){var f=b.wf(),g=M.alloc();g.width=b.naturalBounds.width*f;g.height=b.naturalBounds.height*f;d.desiredSize=g;M.free(g);e?(d.toSpot=b.toSpot,d.toEndSegmentLength=b.toEndSegmentLength):(d.fromSpot=b.fromSpot,d.fromEndSegmentLength=b.fromEndSegmentLength);c.locationSpot=yc;f=J.alloc();c.location=b.da(yc,f);J.free(f);d.angle=b.Li();null!==this.portTargeted&&this.portTargeted(a,b,c,d,e)}}; tf.prototype.setNoTargetPortProperties=function(a,b,c){null!==b&&(b.desiredSize=Jb,b.fromSpot=rc,b.toSpot=rc);null!==a&&(a.location=this.diagram.lastInput.documentPoint);null!==this.portTargeted&&this.portTargeted(null,null,a,b,c)};tf.prototype.doMouseDown=function(){this.isActive&&this.doMouseMove()}; tf.prototype.doMouseMove=function(){if(this.isActive){var a=this.diagram;this.targetPort=this.findTargetPort(this.isForwards);if(null!==this.targetPort&&this.targetPort.part instanceof W){var b=this.targetPort.part;this.isForwards?this.copyPortProperties(b,this.targetPort,this.temporaryToNode,this.temporaryToPort,!0):this.copyPortProperties(b,this.targetPort,this.temporaryFromNode,this.temporaryFromPort,!1)}else this.isForwards?this.setNoTargetPortProperties(this.temporaryToNode,this.temporaryToPort, @@ -379,7 +379,7 @@ a)return!1;return!If(this,a,b,c,!0)}if(d===Kf)return a===b?a=!0:(d=new G,d.add(b function Lf(a,b,c,d,e){if(c===d)return!0;if(null===c||null===d||b.contains(c))return!1;b.add(c);for(var f=c.linksConnected;f.next();){var g=f.value;if(g!==e&&g.toNode===c&&(g=g.fromNode,g!==c&&Lf(a,b,g,d,e)))return!0}return!1}function Of(a,b,c,d,e){if(c===d)return!0;if(null===c||null===d||b.contains(c))return!1;b.add(c);for(var f=c.linksConnected;f.next();){var g=f.value;if(g!==e){var h=g.fromNode;g=g.toNode;h=h===c?g:h;if(h!==c&&Of(a,b,h,d,e))return!0}}return!1} na.Object.defineProperties(tf.prototype,{portGravity:{get:function(){return this.Jh},set:function(a){0<=a&&(this.Jh=a)}},isUnconnectedLinkValid:{get:function(){return this.Ha},set:function(a){this.Ha=a}},linkingCursor:{get:function(){return this.Sh},set:function(a){this.Sh=a}},temporaryLink:{get:function(){return this.rw},set:function(a){this.rw=a}},temporaryFromNode:{ get:function(){return this.Tm},set:function(a){if(this.Tm=a)this.j=a.port}},temporaryFromPort:{get:function(){return this.j},set:function(a){if(null!==this.j){var b=this.j.panel;if(null!==b){var c=b.T.indexOf(this.j);b.eb(c);b.ub(c,a)}}this.j=a}},temporaryToNode:{get:function(){return this.sw},set:function(a){if(this.sw=a)this.o=a.port}},temporaryToPort:{get:function(){return this.o},set:function(a){if(null!== -this.o){var b=this.o.panel;if(null!==b){var c=b.T.indexOf(this.o);b.eb(c);b.ub(c,a)}}this.o=a}},originalLink:{get:function(){return this.Pc},set:function(a){this.Pc=a}},originalFromNode:{get:function(){return this.Wa},set:function(a){this.Wa=a}},originalFromPort:{get:function(){return this.yc},set:function(a){this.yc=a}},originalToNode:{get:function(){return this.Kd},set:function(a){this.Kd= +this.o){var b=this.o.panel;if(null!==b){var c=b.T.indexOf(this.o);b.eb(c);b.ub(c,a)}}this.o=a}},originalLink:{get:function(){return this.Qc},set:function(a){this.Qc=a}},originalFromNode:{get:function(){return this.Wa},set:function(a){this.Wa=a}},originalFromPort:{get:function(){return this.yc},set:function(a){this.yc=a}},originalToNode:{get:function(){return this.Kd},set:function(a){this.Kd= a}},originalToPort:{get:function(){return this.Ih},set:function(a){this.Ih=a}},isForwards:{get:function(){return this.Ga},set:function(a){this.Ga=a}},validPortsCache:{get:function(){return this.My}},targetPort:{get:function(){return this.Sm},set:function(a){this.Sm=a}},linkValidation:{get:function(){return this.ii},set:function(a){this.ii=a}},portTargeted:{ get:function(){return this.Zi},set:function(a){this.Zi=a}}});tf.className="LinkingBaseTool";function Pf(){tf.call(this);this.name="Linking";this.M={};this.C=null;this.K=Qf;this.Kh=null}ma(Pf,tf);Pf.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;return a.isReadOnly||a.isModelReadOnly||!a.allowLink||!a.model.Ps()||!a.lastInput.left||a.currentTool!==this&&!this.isBeyondDragSize()?!1:null!==this.findLinkablePort()}; Pf.prototype.findLinkablePort=function(){var a=this.diagram,b=this.startObject;null===b&&(b=a.Wb(a.firstInput.documentPoint,null,null));if(null===b)return null;a=b.part;if(!(a instanceof W))return null;var c=this.direction;if(c===Qf||c===Rf){var d=this.findValidLinkablePort(b,!1);if(null!==d||this.startObject===a&&(d=a.port,this.findValidLinkablePort(d,!1)))return this.isForwards=!0,d}if(c===Qf||c===Sf)if(b=this.findValidLinkablePort(b,!0),null!==b||this.startObject===a&&(b=a.port,this.findValidLinkablePort(b, @@ -419,8 +419,8 @@ Wf.prototype.doActivate=function(){var a=this.diagram;null===this.handle&&(this. this.handle=this.findToolHandleAt(a.firstInput.documentPoint,this.name);if(null===this.handle){this.doDeactivate();return}}this.ix=b.i(this.handle.segmentIndex);this.Sr=b.points.copy();this.isActive=!0}}};Wf.prototype.doDeactivate=function(){this.stopTransaction();this.ot=this.handle=null;this.isActive=this.diagram.isMouseCaptured=!1};Wf.prototype.doCancel=function(){var a=this.adornedLink;null!==a&&(a.points=this.Sr);this.stopTool()};Wf.prototype.getResegmentingPoint=function(){return this.handle.da(yc)}; Wf.prototype.doMouseMove=function(){var a=this.diagram;this.isActive&&(a=this.computeReshape(a.lastInput.documentPoint),this.reshape(a))}; Wf.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){var b=this.computeReshape(a.lastInput.documentPoint);this.reshape(b);b=this.adornedLink;if(null!==b&&b.resegmentable){var c=this.handle.segmentIndex,d=b.i(c-1),e=b.i(c),f=b.i(c+1);if(b.isOrthogonal){if(c>b.firstPickIndex+1&&c=n&&(n=1);0>=p&&(p=1);n=p/n}p=J.alloc();L.jq(a.x,a.y,h,k,e.width,e.height,p);a=g.copy();0>=b.x?0>=b.y?(a.x=Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=Math.max(l-a.x,c.width),a.y=Math.max(p.y,m-d.height),a.y=Math.min(a.y,m-c.height),a.height=Math.max(m-a.y,c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n* a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width),a.x=l-a.width,a.y=m-a.height)):1<=b.y?(a.x=Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=Math.max(l-a.x,c.width),a.height=Math.max(Math.min(p.y-k,d.height),c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width),a.x=l-a.width)):(a.x= Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=l-a.x,f||(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n,a.y=k+.5*(m-k-a.height))):1<=b.x?0>=b.y?(a.width=Math.max(Math.min(p.x-h,d.width),c.width),a.y=Math.max(p.y,m-d.height),a.y=Math.min(a.y,m-c.height),a.height=Math.max(m-a.y,c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width), @@ -458,9 +458,9 @@ rg.prototype.doActivate=function(){var a=this.diagram;if(null===this.adornedObje rg.prototype.computeRotationPoint=function(a){var b=a.part,c=b.locationObject;return b.rotationSpot.hb()?a.da(b.rotationSpot):a===b||a===c?c.da(b.locationSpot):a.da(yc)}; rg.prototype.computeAdornmentLocation=function(a){var b=this.rotationPoint;b.u()||(b=this.computeRotationPoint(a));b=a.Hs(b);var c=this.handleAngle;0>c?c+=360:360<=c&&(c-=360);c=Math.round(45*Math.round(c/45));var d=this.handleDistance;0===c?b.x=a.naturalBounds.width+d:45===c?(b.x=a.naturalBounds.width+d,b.y=a.naturalBounds.height+d):90===c?b.y=a.naturalBounds.height+d:135===c?(b.x=-d,b.y=a.naturalBounds.height+d):180===c?b.x=-d:225===c?(b.x=-d,b.y=-d):270===c?b.y=-d:315===c&&(b.x=a.naturalBounds.width+ d,b.y=-d);return a.da(b)};rg.prototype.doDeactivate=function(){var a=this.diagram;this.stopTransaction();this.ie=this.handle=null;this.Xr=new J(NaN,NaN);this.isActive=a.isMouseCaptured=!1};rg.prototype.doCancel=function(){this.diagram.delaysLayout=!1;this.rotate(this.originalAngle);this.stopTool()};rg.prototype.doMouseMove=function(){var a=this.diagram;this.isActive&&(a=this.computeRotate(a.lastInput.documentPoint),this.rotate(a))}; -rg.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){a.delaysLayout=!1;var b=this.computeRotate(a.lastInput.documentPoint);this.rotate(b);a.Pa();this.transactionResult=this.name;a.S("PartRotated",this.adornedObject,this.originalAngle)}this.stopTool()}; -rg.prototype.rotate=function(a){var b=this.adornedObject;if(null!==b){b.angle=a;b=b.part;b.Sa();var c=b.locationObject,d=b.rotateObject;if(c===d||c.mg(d))c=this.Uo.copy(),b.location=c.ge(this.rotationPoint).rotate(a-this.originalAngle).add(this.rotationPoint);this.diagram.ed()}}; -rg.prototype.computeRotate=function(a){a=this.rotationPoint.Oa(a)-this.handleAngle;var b=this.adornedObject.panel;null!==b&&(a-=b.Li());360<=a?a-=360:0>a&&(a+=360);b=Math.min(Math.abs(this.snapAngleMultiple),180);var c=Math.min(Math.abs(this.snapAngleEpsilon),b/2);!this.diagram.lastInput.shift&&0b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a}; +rg.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){a.delaysLayout=!1;var b=this.computeRotate(a.lastInput.documentPoint);this.rotate(b);a.Oa();this.transactionResult=this.name;a.S("PartRotated",this.adornedObject,this.originalAngle)}this.stopTool()}; +rg.prototype.rotate=function(a){var b=this.adornedObject;if(null!==b){b.angle=a;b=b.part;b.Sa();var c=b.locationObject,d=b.rotateObject;if(c===d||c.mg(d))c=this.Uo.copy(),b.location=c.ge(this.rotationPoint).rotate(a-this.originalAngle).add(this.rotationPoint);this.diagram.fd()}}; +rg.prototype.computeRotate=function(a){a=this.rotationPoint.Ra(a)-this.handleAngle;var b=this.adornedObject.panel;null!==b&&(a-=b.Li());360<=a?a-=360:0>a&&(a+=360);b=Math.min(Math.abs(this.snapAngleMultiple),180);var c=Math.min(Math.abs(this.snapAngleEpsilon),b/2);!this.diagram.lastInput.shift&&0b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a}; na.Object.defineProperties(rg.prototype,{handleArchetype:{get:function(){return this.o},set:function(a){this.o=a}},handle:{get:function(){return this.j},set:function(a){if(null!==a&&!(a.part instanceof we))throw Error("new handle is not in an Adornment: "+a);this.j=a}},adornedObject:{get:function(){return this.ie},set:function(a){if(null!==a&&a.part instanceof we)throw Error("new handle must not be in an Adornment: "+ a);this.ie=a}},snapAngleMultiple:{get:function(){return this.Ha},set:function(a){this.Ha=a}},snapAngleEpsilon:{get:function(){return this.Ga},set:function(a){this.Ga=a}},originalAngle:{get:function(){return this.ex}},rotationPoint:{get:function(){return this.Xr},set:function(a){this.Xr=a.copy()}},handleAngle:{get:function(){return this.C},set:function(a){this.C= a}},handleDistance:{get:function(){return this.M},set:function(a){this.M=a}}});rg.className="RotatingTool";Ma("rotatingTool",function(){return this.findTool("Rotating")},function(a){this.Za("Rotating",a,this.mouseDownTools)});function sg(){re.call(this);this.name="ClickSelecting"}ma(sg,re);sg.prototype.canStart=function(){return!this.isEnabled||this.isBeyondDragSize()?!1:!0}; @@ -470,7 +470,7 @@ tg.prototype.doMouseMove=function(){if(this.isActive){var a=this.diagram.lastInp tg.prototype.doCancel=function(){var a=this.diagram.lastInput,b=this.Dk;null!==b&&(a.targetObject=b,null!==b.actionCancel&&b.actionCancel(a,b),this.stopTool())};tg.prototype.doStop=function(){this.Dk=null};tg.className="ActionTool";function ug(){re.call(this);this.name="ClickCreating";this.mj=null;this.o=!0;this.j=!1;this.Nw=new J(0,0)}ma(ug,re); ug.prototype.canStart=function(){if(!this.isEnabled||null===this.archetypeNodeData)return!1;var a=this.diagram;if(a.isReadOnly||a.isModelReadOnly||!a.allowInsert||!a.lastInput.left||this.isBeyondDragSize())return!1;if(this.isDoubleClick){if(1===a.lastInput.clickCount&&(this.Nw=a.lastInput.viewPoint.copy()),2!==a.lastInput.clickCount||this.isBeyondDragSize(this.Nw))return!1}else if(1!==a.lastInput.clickCount)return!1;return a.currentTool!==this&&null!==a.im(a.lastInput.documentPoint,!0)?!1:!0}; ug.prototype.doMouseUp=function(){var a=this.diagram;this.isActive&&this.insertPart(a.lastInput.documentPoint);this.stopTool()}; -ug.prototype.insertPart=function(a){var b=this.diagram,c=this.archetypeNodeData;if(null===c)return null;var d=null;try{b.S("ChangingSelection",b.selection);this.wa(this.name);if(c instanceof V)c.Jc()&&(ng(c),d=c.copy(),null!==d&&b.add(d));else if(null!==c){var e=b.model.copyNodeData(c);za(e)&&(b.model.nf(e),d=b.vc(e))}if(null!==d){var f=J.allocAt(a.x,a.y);this.isGridSnapEnabled&&vg(this.diagram,d,a,f);d.location=f;b.allowSelect&&(b.clearSelection(!0),d.isSelected=!0);J.free(f)}b.Pa();this.transactionResult= +ug.prototype.insertPart=function(a){var b=this.diagram,c=this.archetypeNodeData;if(null===c)return null;var d=null;try{b.S("ChangingSelection",b.selection);this.wa(this.name);if(c instanceof V)c.Kc()&&(ng(c),d=c.copy(),null!==d&&b.add(d));else if(null!==c){var e=b.model.copyNodeData(c);za(e)&&(b.model.nf(e),d=b.vc(e))}if(null!==d){var f=J.allocAt(a.x,a.y);this.isGridSnapEnabled&&vg(this.diagram,d,a,f);d.location=f;b.allowSelect&&(b.clearSelection(!0),d.isSelected=!0);J.free(f)}b.Oa();this.transactionResult= this.name;b.S("PartCreated",d)}finally{this.stopTransaction(),b.S("ChangedSelection",b.selection)}return d};na.Object.defineProperties(ug.prototype,{archetypeNodeData:{get:function(){return this.mj},set:function(a){this.mj=a}},isDoubleClick:{get:function(){return this.o},set:function(a){this.o=a}},isGridSnapEnabled:{get:function(){return this.j},set:function(a){this.j=a}}});ug.className="ClickCreatingTool"; function wg(){re.call(this);this.name="DragSelecting";this.Zk=175;this.o=!1;var a=new V;a.layerName="Tool";a.selectable=!1;var b=new uf;b.name="SHAPE";b.figure="Rectangle";b.fill=null;b.stroke="magenta";a.add(b);this.j=a}ma(wg,re); wg.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;if(!a.allowSelect)return!1;var b=a.lastInput;return!b.left||a.currentTool!==this&&(!this.isBeyondDragSize()||b.timestamp-a.firstInput.timestampa&&xa(a,">= 1",bh,"duration");this.Fg=a}},isAnimating:{get:function(){return this.hc}}, +na.Object.defineProperties(bh.prototype,{animationReasons:{get:function(){return this.Md}},isEnabled:{get:function(){return this.ud},set:function(a){(this.ud=a)&&this.$i.each(function(a){a.isAnimating||Infinity!==a.runCount||a.start()})}},duration:{get:function(){return this.Fg},set:function(a){1>a&&xa(a,">= 1",bh,"duration");this.Fg=a}},isAnimating:{get:function(){return this.hc}}, isTicking:{get:function(){return this.Dr}},isInitial:{get:function(){return this.Zh},set:function(a){this.Zh=a}},defaultAnimation:{get:function(){return this.Pd}},activeAnimations:{get:function(){return this.$i}},initialAnimationStyle:{get:function(){return this.hl},set:function(a){this.hl=a}}});bh.prototype.stopAnimation=bh.prototype.nc; var Kh=null,ch=!1,eh=new D(bh,"Default",1),kh=new D(bh,"AnimateLocations",2),jh=new D(bh,"None",3);bh.className="AnimationManager";bh.defineAnimationEffect=function(a,b){ch||(dh(),ch=!0);Kh.add(a,b)};bh.Default=eh;bh.AnimateLocations=kh;bh.None=jh; -function fh(a){this.Uu=this.qx=this.Ld=this.F=null;this.ol=this.hc=this.j=!1;this.In=this.zd=0;this.ar=this.Kt=Lh;this.nl=this.jp=!1;this.Bu=1;this.zu=0;this.sd=this.Fg=NaN;this.Hw=0;this.Jn=null;this.o=pb;this.jc=new I;this.ru=new I;this.Zl=new G;this.su=new G;this.Ew=Mh;a&&Object.assign(this,a)}fh.prototype.suspend=function(){this.ol=!0};fh.prototype.advanceTo=function(a,b){b&&(this.ol=!1);this.jp&&a>=this.sd&&(this.nl=!0,a-=this.sd);this.Hw=a;Eh(this,!0);oh(this.Ld);rf(this.F);Ah(this.Ld);this.F.redraw()}; -function lh(a,b){a.ru.clear();a.nl=!1;a.zu=0;a.sd=NaN;0=this.td&&(this.nl=!0,a-=this.td);this.Hw=a;Eh(this,!0);oh(this.Ld);rf(this.F);Ah(this.Ld);this.F.redraw()}; +function lh(a,b){a.ru.clear();a.nl=!1;a.zu=0;a.td=NaN;0a.In?a.sd:d-a.zd;b&&(e=a.Hw,ea.In&&(a.jp&&!a.nl?(a.zd=+new Date,a.In=a.zd+a.sd,a.nl=!0):a.gm(!1))}}} -function zh(a,b){for(var c=a.sd,d=a.jc.iterator,e=a.nl;d.next();){var f=d.key;if(!(f instanceof Y&&null===f.diagram)){var g=d.value,h=e?g.end:g.start;g=e?g.start:g.end;var k=Kh,l;for(l in g)"position"===l&&(g["position:placeholder"]||g["position:nodeCollapse"])||null===k.get(l)||k.get(l)(f,h[l],g[l],a.ar,b,c,a)}}}t.stop=function(){if(!this.hc)return this;this.gm(!0);return this}; +function Eh(a,b){if(!a.ol||b){var c=a.Ld;if(!1!==a.hc){var d=+new Date,e=d>a.In?a.td:d-a.Ad;b&&(e=a.Hw,ea.In&&(a.jp&&!a.nl?(a.Ad=+new Date,a.In=a.Ad+a.td,a.nl=!0):a.gm(!1))}}} +function zh(a,b){for(var c=a.td,d=a.jc.iterator,e=a.nl;d.next();){var f=d.key;if(!(f instanceof Y&&null===f.diagram)){var g=d.value,h=e?g.end:g.start;g=e?g.start:g.end;var k=Kh,l;for(l in g)"position"===l&&(g["position:placeholder"]||g["position:nodeCollapse"])||null===k.get(l)||k.get(l)(f,h[l],g[l],a.ar,b,c,a)}}}t.stop=function(){if(!this.hc)return this;this.gm(!0);return this}; t.gm=function(a){null!==this.Uu&&this.Uu.qp.remove(this.qx);if(this.hc){var b=this.F,c=this.Ld;this.ol=this.hc=c.gl=!1;oh(c);for(var d=this.jc,e=this.Zl.iterator;e.next();)b.remove(e.value);for(e=this.su.iterator;e.next();)e.value.s();e=this.jp;d=d.iterator;for(var f=Kh;d.next();){var g=d.key,h=d.value,k=e?h.end:h.start,l=e?h.start:h.end,m=h.nv,n;for(n in l)if(null!==f.get(n)){var p=n;!h.hv||"position:nodeCollapse"!==p&&"position:placeholder"!==p||(p="position");f.get(p)(g,k[n],void 0!==m[n]?m[n]: -h.hv?k[n]:l[n],this.ar,this.sd,this.sd,this)}h.hv&&void 0!==m.location&&g instanceof V&&(g.location=m.location);h.Pv&&g instanceof V&&g.Nb(!1)}b.Ts.clear();Te(b,!1);b.Pa();b.N();rf(b,!0);if(c.defaultAnimation===this){for(n=c.Il.iterator;n.next();)e=n.value,null!==e.cf&&(e.points=e.cf,e.cf=null);c.Il.clear()}this.isViewportUnconstrained&&(b.scrollMode=this.Ew);Ah(c);this.zu++;!a&&this.Bu>this.zu?(this.nl=!1,this.start()):(this.Jn&&this.Jn(this),lh(this,null),c.gm(this),b.Fb())}}; +h.hv?k[n]:l[n],this.ar,this.td,this.td,this)}h.hv&&void 0!==m.location&&g instanceof V&&(g.location=m.location);h.Pv&&g instanceof V&&g.Nb(!1)}b.Ts.clear();Te(b,!1);b.Oa();b.N();rf(b,!0);if(c.defaultAnimation===this){for(n=c.Il.iterator;n.next();)e=n.value,null!==e.cf&&(e.points=e.cf,e.cf=null);c.Il.clear()}this.isViewportUnconstrained&&(b.scrollMode=this.Ew);Ah(c);this.zu++;!a&&this.Bu>this.zu?(this.nl=!1,this.start()):(this.Jn&&this.Jn(this),lh(this,null),c.gm(this),b.Fb())}}; t.Yj=function(a,b){var c=b.actualBounds,d=null;b instanceof hf&&(d=b.placeholder);null!==d?(c=d.da(sc),d=d.padding,c.x+=d.left,c.y+=d.top,this.add(a,"position",c,a.position,!1)):this.add(a,"position",new J(c.x+c.width/2,c.y+c.height/2),a.position,!1);this.add(a,"scale",.01,a.scale,!1);if(a instanceof hf)for(a=a.memberParts;a.next();)d=a.value,d instanceof W&&this.Yj(d,b)}; t.Wj=function(a,b){if(a.isVisible()){var c=null;b instanceof hf&&(c=b.placeholder);null!==c?this.add(a,"position:placeholder",a.position,c,!0):this.add(a,"position:nodeCollapse",a.position,b,!0);this.add(a,"scale",a.scale,.01,!0);c=this.jc;c.contains(a)&&(c.H(a).Pv=!0);if(a instanceof hf)for(a=a.memberParts;a.next();)c=a.value,c instanceof W&&this.Wj(c,b)}};t.iA=function(a){var b=this.ru.get(a);null===b&&(b={},this.ru.add(a,b));return b}; na.Object.defineProperties(fh.prototype,{duration:{get:function(){return this.Fg},set:function(a){1>a&&xa(a,">= 1",fh,"duration");this.Fg=a}},reversible:{get:function(){return this.jp},set:function(a){this.jp=a}},runCount:{get:function(){return this.Bu},set:function(a){0a?c/2*a*a+b:-c/2*(--a*(a-2)-1)+b}function Nh(a,b,c,d){return a===d?b+c:c*(-Math.pow(2,-10*a/d)+1)+b}fh.className="Animation";fh.EaseLinear=function(a,b,c,d){return c*a/d+b};fh.EaseInOutQuad=Lh;fh.EaseInQuad=function(a,b,c,d){return c*(a/=d)*a+b};fh.EaseOutQuad=function(a,b,c,d){return-c*(a/=d)*(a-2)+b};fh.EaseInExpo=function(a,b,c,d){return 0===a?b:c*Math.pow(2,10*(a/d-1))+b};fh.EaseOutExpo=Nh; -function Th(a,b,c){this.start=a;this.end=b;this.nv={};this.hv=c;this.Pv=!1}Th.className="AnimationState";function Uh(a,b,c){this.md=null;this.bf=a;this.Hp=c||Vh;this.Ik=null;void 0!==b&&(this.Ik=b,void 0===c&&(this.Hp=Wh))}Uh.prototype.copy=function(){var a=new Uh(this.bf);a.Hp=this.Hp;var b=this.Ik;if(null!==b){var c={};void 0!==b.duration&&(c.duration=b.duration);void 0!==b.finished&&(c.finished=b.finished);void 0!==b.easing&&(c.easing=b.easing);a.Ik=c}return a}; +function Th(a,b,c){this.start=a;this.end=b;this.nv={};this.hv=c;this.Pv=!1}Th.className="AnimationState";function Uh(a,b,c){this.nd=null;this.bf=a;this.Hp=c||Vh;this.Ik=null;void 0!==b&&(this.Ik=b,void 0===c&&(this.Hp=Wh))}Uh.prototype.copy=function(){var a=new Uh(this.bf);a.Hp=this.Hp;var b=this.Ik;if(null!==b){var c={};void 0!==b.duration&&(c.duration=b.duration);void 0!==b.finished&&(c.finished=b.finished);void 0!==b.easing&&(c.easing=b.easing);a.Ik=c}return a}; function Xh(a,b){a=a.Ik;null!==a&&(a.duration&&(b.duration=a.duration),a.finished&&(b.finished=a.finished),a.easing&&(b.easing=a.easing))}na.Object.defineProperties(Uh.prototype,{propertyName:{get:function(){return this.bf},set:function(a){this.bf=a}},animationSettings:{get:function(){return this.Ik},set:function(a){this.Ik=a}},startCondition:{get:function(){return this.Hp},set:function(a){this.Hp=a}}}); var Vh=new D(Uh,"Default",1),Wh=new D(Uh,"Immediate",2),Yh=new D(Uh,"Bundled",3);Uh.className="AnimationTrigger";Uh.Default=Vh;Uh.Immediate=Wh;Uh.Bundled=Yh;function Zh(a){Ta(this);this.F=null;this.Fa=new E;this.na="";this.lb=1;this.o=!1;this.j=this.oi=this.C=this.jj=this.ij=this.hj=this.gj=this.ej=this.fj=this.dj=this.lj=this.cj=this.kj=this.bj=this.aj=!0;this.Vo=[];a&&Object.assign(this,a)}t=Zh.prototype;t.clear=function(){this.Fa.clear();this.Vo.length=0};t.Ke=function(a){this.F=a}; t.toString=function(a){void 0===a&&(a=0);var b='Layer "'+this.name+'"';if(0>=a)return b;for(var c=0,d=0,e=0,f=0,g=0,h=this.Fa.iterator;h.next();){var k=h.value;k instanceof hf?e++:k instanceof W?d++:k instanceof U?f++:k instanceof we?g++:c++}h="";0c.Jr||h.height*e>c.Jr?b.lc(a,c):(e=b.actualBounds,f=b.naturalBounds,0===e.width||0===e.height||isNaN(e.x)|| +t.Ei=function(a,b,c,d,e,f,g){if(!g||lg(b)){if(null!==d&&b instanceof U&&(b.isOrthogonal&&d.push(b),!1===b.sd))return;g=!1;for(d=b.containingGroup;null!==d;)g?null!==d.$a&&f.hy(d.$a):null!==d.$a&&(g=!0,f.assign(d.$a)),d=d.containingGroup;var h=b.actualBounds;d=!1;if(g&&b.isVisible()){if(!f.Jc(h))return;d=!f.De(h)}d&&(a.save(),a.beginPath(),a.rect(f.x,f.y,f.width,f.height),a.clip());h.width*e>c.Jr||h.height*e>c.Jr?b.lc(a,c):(e=b.actualBounds,f=b.naturalBounds,0===e.width||0===e.height||isNaN(e.x)|| isNaN(e.y)||!b.isVisible()||(c=b.transform,null!==b.areaBackground&&(bi(b,a,b.areaBackground,!0,!0,f,e),a.fillRect(e.x,e.y,e.width,e.height)),null===b.areaBackground&&null===b.background&&(bi(b,a,"rgba(0,0,0,0.3)",!0,!1,f,e),a.fillRect(e.x,e.y,e.width,e.height)),null!==b.background&&(a.transform(c.m11,c.m12,c.m21,c.m22,c.dx,c.dy),bi(b,a,b.background,!0,!1,f,e),a.fillRect(0,0,f.width/2,f.height/2),c.Os()||(b=1/(c.m11*c.m22-c.m12*c.m21),a.transform(c.m22*b,-c.m12*b,-c.m21*b,c.m11*b,b*(c.m21*c.dy-c.m22* c.dx),b*(c.m12*c.dx-c.m11*c.dy))))));d&&(a.restore(),a.Ec(!0))}};t.g=function(a,b,c,d,e){var f=this.diagram;null!==f&&f.Va(ce,a,this,b,c,d,e)};t.Oi=function(a,b,c){var d=this.Fa;b.ei=this;if(a>=d.count)a=d.count;else if(d.J(a)===b)return-1;d.ub(a,b);b.pq(c);d=this.diagram;null!==d&&(c?d.N():d.Oi(b));ci(this,a,b);return a}; t.bc=function(a,b,c){if(!c&&b.layer!==this&&null!==b.layer)return b.layer.bc(a,b,c);var d=this.Fa;if(0>a||a>=d.length){if(a=d.indexOf(b),0>a)return-1}else if(d.J(a)!==b&&(a=d.indexOf(b),0>a))return-1;b.qq(c);d.eb(a);d=this.diagram;null!==d&&(c?d.N():d.bc(b));b.ei=null;return a}; @@ -573,19 +573,19 @@ e&&(k=a.J(h).zOrder,isNaN(k)););}return b} na.Object.defineProperties(Zh.prototype,{parts:{get:function(){return this.Fa.iterator}},partsBackwards:{get:function(){return this.Fa.iteratorBackwards}},diagram:{get:function(){return this.F}},name:{get:function(){return this.na},set:function(a){var b=this.na;if(b!==a){var c=this.diagram;if(null!==c)for(""===b&&C("Cannot rename default Layer to: "+a),c=c.layers;c.next();)c.value.name=== a&&C("Layer.name is already present in this diagram: "+a);this.na=a;this.g("name",b,a);for(a=this.Fa.iterator;a.next();)a.value.layerName=this.na}}},opacity:{get:function(){return this.lb},set:function(a){var b=this.lb;b!==a&&((0>a||1q&&(this.position=v.h(-(b.scrollWidth-this.ua)+w-this.ua/e+m,this.position.y))),a.$y&&this.allowVerticalScroll&&(hu&&(this.position= v.h(this.position.x,-(b.scrollHeight-this.ta)+a.scrollTop-this.ta/e+f))),J.free(v),Qi(this),this.wj=this.$r=!1,d=this.documentBounds,e=this.viewportBounds,m=d.right,q=e.right,f=d.bottom,u=e.bottom,g=d.x,n=e.x,h=d.y,d=e.y,p>=k&&g>=n&&m<=q&&(c.style.width="1px"),r>=l&&h>=d&&f<=u&&(c.style.height="1px"))}};T.prototype.computeBounds=function(a){void 0===a&&(a=new N);hh(this);return Ri(this,a)}; -function Ri(a,b){if(a.fixedBounds.u())return b.assign(a.fixedBounds),b.Xp(a.mb),b;for(var c=!0,d=a.Na.m,e=d.length,f=0;fc&&(b=c),ba.maxScale&&(b=a.maxScale),b):b===Yi?(b=k>h?(g-a.sb)/d:(f-a.sb)/e,b>c&&(b=c),ba.maxScale&&(b=a.maxScale),b):a.scale} @@ -630,61 +630,61 @@ T.prototype.vA=function(a){var b=this.F;if(!b.isEnabled)return!1;var c=bj(b,a,!1 T.prototype.Gz=function(a){var b=this.F;if(!b.isEnabled)return!1;var c=bj(b,a,!0);null!==b.mouseEnter&&b.mouseEnter(c);return fj(c,a)};T.prototype.Hz=function(a){var b=this.F;if(!b.isEnabled)return!1;var c=bj(b,a,!0);null!==b.mouseLeave&&b.mouseLeave(c);return fj(c,a)}; T.prototype.getMouse=function(a){var b=this.Aa;if(null===b)return new J(0,0);var c=b.getBoundingClientRect();b=a.clientX-this.ua/c.width*c.left;a=a.clientY-this.ta/c.height*c.top;return null!==this.tb?Ab(new J(b,a),this.tb):new J(b,a)}; function cj(a,b,c){var d=a.Aa,e=a.ua,f=a.ta,g=0,h=0;null!==d&&(d=d.getBoundingClientRect(),g=b.clientX-e/d.width*d.left,h=b.clientY-f/d.height*d.top);c.viewPoint.h(g,h);null!==a.tb?(b=J.allocAt(g,h),a.tb.Ed(b),c.documentPoint.assign(b),J.free(b)):c.documentPoint.h(g,h)} -function $d(a,b,c,d){if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;b=b.targetTouches[c]}else if(null!==a.El[0])b=a.El[c];else return;c=a.Aa;null!==c&&(c=c.getBoundingClientRect(),d.h(b.clientX-a.ua/c.width*c.left,b.clientY-a.ta/c.height*c.top))}T.prototype.Pa=function(){this.vj||(this.vj=!0,this.Fb(!0))};function gj(a){a.Vc||hh(a);a.Sa()}T.prototype.redraw=function(){this.ob||this.Vc||(this.N(),Vi(this),this.ed())};t=T.prototype;t.tA=function(){return this.eg}; -t.Bz=function(a){void 0===a&&(a=null);var b=this.animationManager,c=b.isEnabled;b.nc();b.isEnabled=!1;rf(this);this.Qf=!1;this.Cu=new J(NaN,NaN);b.isEnabled=c;this.Vc=!0;var d=this;null!==a&&ua(function(){d.Vc=!1;gh(b,"Model");a(d)},1)};t.Fb=function(a){void 0===a&&(a=!1);if(!0!==this.eg&&!(this.ob||!1===a&&this.Vc)){this.eg=!0;var b=this;x.requestAnimationFrame(function(){b.eg&&b.ed()})}};t.ed=function(){if(!this.Ln||this.eg)this.Ln&&(this.Ln=!1),rf(this)}; +function $d(a,b,c,d){if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;b=b.targetTouches[c]}else if(null!==a.El[0])b=a.El[c];else return;c=a.Aa;null!==c&&(c=c.getBoundingClientRect(),d.h(b.clientX-a.ua/c.width*c.left,b.clientY-a.ta/c.height*c.top))}T.prototype.Oa=function(){this.vj||(this.vj=!0,this.Fb(!0))};function gj(a){a.Wc||hh(a);a.Sa()}T.prototype.redraw=function(){this.ob||this.Wc||(this.N(),Vi(this),this.fd())};t=T.prototype;t.tA=function(){return this.eg}; +t.Bz=function(a){void 0===a&&(a=null);var b=this.animationManager,c=b.isEnabled;b.nc();b.isEnabled=!1;rf(this);this.Qf=!1;this.Cu=new J(NaN,NaN);b.isEnabled=c;this.Wc=!0;var d=this;null!==a&&ua(function(){d.Wc=!1;gh(b,"Model");a(d)},1)};t.Fb=function(a){void 0===a&&(a=!1);if(!0!==this.eg&&!(this.ob||!1===a&&this.Wc)){this.eg=!0;var b=this;x.requestAnimationFrame(function(){b.eg&&b.fd()})}};t.fd=function(){if(!this.Ln||this.eg)this.Ln&&(this.Ln=!1),rf(this)}; function Wi(a,b,c){a.animationManager.defaultAnimation.isAnimating||a.ob||!a.wj||Oi(a)||(b&&hh(a),c&&Si(a,!1))} -function rf(a,b){if(!a.Vc&&(a.eg=!1,null!==a.Ea||a.Rp.u())){a.Vc=!0;var c=a.animationManager,d=a.$o;if(!c.isAnimating&&0!==d.length){for(var e=d.m,f=e.length,g=0;gb;b++){var c=a.qe.iterator;if(null===c||0===a.qe.count)break;a.qe=new G;a.kw(c,a.qe)}a.nodes.each(function(a){a instanceof hf&&0!==(a.R&65536)!==!1&&(a.R=a.R^65536)})}} -t.kw=function(a,b){for(a.reset();a.next();){var c=a.value;!c.Jc()||c instanceof hf||(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}for(a.reset();a.next();)c=a.value,c instanceof hf&&c.isVisible()&&lj(this,c);for(a.reset();a.next();)c=a.value,c instanceof U&&c.isVisible()&&(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c));for(a.reset();a.next();)c=a.value,c instanceof we&&c.isVisible()&&(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}; +b||a.lc(a.Sb);e&&(a.skipsUndoManager=d);a.Wc=!1}}function kj(a){var b=a.sa;if(a.Lg!==mh)a.scale=Ti(a,a.Lg);else if(a.Oh!==mh)a.scale=Ti(a,a.Oh);else{var c=a.initialScale;isFinite(c)&&0b;b++){var c=a.qe.iterator;if(null===c||0===a.qe.count)break;a.qe=new G;a.kw(c,a.qe)}a.nodes.each(function(a){a instanceof hf&&0!==(a.R&65536)!==!1&&(a.R=a.R^65536)})}} +t.kw=function(a,b){for(a.reset();a.next();){var c=a.value;!c.Kc()||c instanceof hf||(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}for(a.reset();a.next();)c=a.value,c instanceof hf&&c.isVisible()&&lj(this,c);for(a.reset();a.next();)c=a.value,c instanceof U&&c.isVisible()&&(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c));for(a.reset();a.next();)c=a.value,c instanceof we&&c.isVisible()&&(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}; function lj(a,b){for(var c=Fa(),d=Fa(),e=b.memberParts;e.next();){var f=e.value;f.isVisible()&&(f instanceof hf?(mj(f)||nj(f)||oj(f))&&lj(a,f):f instanceof U?f.fromNode===b||f.toNode===b?d.push(f):c.push(f):(f.measure(Infinity,Infinity),f.arrange()))}a=c.length;for(e=0;en&&(z=K.left,y= K.right),w.height>F&&(A=K.top,B=K.bottom)):(z=K.left,y=K.right,A=K.top,B=K.bottom);K=w.width+z+y;var S=w.height+A+B;z=w.x-z;var R=e.x;y=w.right+y;var O=e.right+r;A=w.y-A;var H=e.y;w=w.bottom+B;B=e.bottom+q;var da="1px",ba="1px";e=a.scale;u=K>u/e;v=S>v/e;a.scrollMode===Mh&&(u||v)&&(u&&a.hasHorizontalScrollbar&&a.allowHorizontalScroll&&(u=1,z+1O+1&&(u=Math.max((y-O)*e+a.ua,u)),n+r+1B+1&&(u=Math.max((w-B)*e+a.ta,u)),F+q+1O+1&&(r=Math.max((y-O)*e+a.ua,r)),n+1B+1&&(q=Math.max((w-B)*e+r,q)),F+1B+1&&(q=Math.max((w-B)*e+r,q)),F+1O+1&&(b=a.position.x*e));if(a.io)switch(a.Au){case "negative":b=-(l.scrollWidth-b-l.clientWidth);break;case "reverse":b=l.scrollWidth-b-l.clientWidth}l.scrollLeft=b;a.hasVerticalScrollbar&&a.allowVerticalScroll&&(F+1B+1&&(l.scrollTop=a.position.y*e));u=a.ua;v=a.ta;l.style.width=u+(a.Of?a.sb:0)+"px";l.style.height=v+(a.Ue?a.sb:0)+"px";return c!==u||d!==v||a.animationManager.rb?(c=N.allocAt(f,g,h,k),a.onViewportBoundsChanged(c,a.viewportBounds,e,p),N.free(c),!1):!0}t=T.prototype; -t.add=function(a){var b=a.diagram;if(b!==this&&(null!==b&&C("Cannot add part "+a.toString()+" to "+this.toString()+". It is already a part of "+b.toString()),b=this.ik(a.layerName),null===b&&(b=this.ik("")),null===b&&C('Cannot add a Part when unable find a Layer named "'+a.layerName+'" and there is no default Layer'),a.layer!==b)){var c=b.Oi(99999999,a,a.diagram===this);0<=c&&this.Va(ee,"parts",b,null,a,null,c);b.isTemporary||this.Pa();a.B(1);c=a.layerChanged;null!==c&&c(a,null,b)}}; -t.Oi=function(a){this.partManager.Oi(a);var b=this;zj(a,function(a){Aj(b,a)});(a instanceof we||a instanceof hf&&null!==a.placeholder)&&a.s();null!==a.data&&zj(a,function(a){Bj(b.partManager,a)});!0!==nj(a)&&!0!==oj(a)||this.qe.add(a);Cj(a,!0,this);Dj(a)?(a.actualBounds.u()&&this.N(xj(a,a.actualBounds)),this.Pa()):a.isVisible()&&a.actualBounds.u()&&this.N(xj(a,a.actualBounds));this.Fb()}; -t.bc=function(a){a.$j();this.partManager.bc(a);var b=this;null!==a.data&&zj(a,function(a){Ej(b.partManager,a,b)});this.qe.remove(a);Dj(a)?(a.actualBounds.u()&&this.N(xj(a,a.actualBounds)),this.Pa()):a.isVisible()&&a.actualBounds.u()&&this.N(xj(a,a.actualBounds));this.Fb()};t.remove=function(a){Fj(this,a,!0)}; +t.add=function(a){var b=a.diagram;if(b!==this&&(null!==b&&C("Cannot add part "+a.toString()+" to "+this.toString()+". It is already a part of "+b.toString()),b=this.ik(a.layerName),null===b&&(b=this.ik("")),null===b&&C('Cannot add a Part when unable find a Layer named "'+a.layerName+'" and there is no default Layer'),a.layer!==b)){var c=b.Oi(99999999,a,a.diagram===this);0<=c&&this.Va(ee,"parts",b,null,a,null,c);b.isTemporary||this.Oa();a.B(1);c=a.layerChanged;null!==c&&c(a,null,b)}}; +t.Oi=function(a){this.partManager.Oi(a);var b=this;zj(a,function(a){Aj(b,a)});(a instanceof we||a instanceof hf&&null!==a.placeholder)&&a.s();null!==a.data&&zj(a,function(a){Bj(b.partManager,a)});!0!==nj(a)&&!0!==oj(a)||this.qe.add(a);Cj(a,!0,this);Dj(a)?(a.actualBounds.u()&&this.N(xj(a,a.actualBounds)),this.Oa()):a.isVisible()&&a.actualBounds.u()&&this.N(xj(a,a.actualBounds));this.Fb()}; +t.bc=function(a){a.$j();this.partManager.bc(a);var b=this;null!==a.data&&zj(a,function(a){Ej(b.partManager,a,b)});this.qe.remove(a);Dj(a)?(a.actualBounds.u()&&this.N(xj(a,a.actualBounds)),this.Oa()):a.isVisible()&&a.actualBounds.u()&&this.N(xj(a,a.actualBounds));this.Fb()};t.remove=function(a){Fj(this,a,!0)}; function Fj(a,b,c){var d=b.layer;null!==d&&d.diagram===a&&(b.isSelected=!1,b.isHighlighted=!1,b.B(2),c&&b.fk(),c=d.bc(-1,b,!1),0<=c&&a.Va(fe,"parts",d,b,null,c,null),a=b.layerChanged,null!==a&&a(b,d,null))}t.bt=function(a,b){void 0===b&&(b=!1);if(Aa(a))for(var c=a.length,d=0;dd&&this.Pa();return this}; -t.fz=function(a,b){Lj(this,a,b);a.Ke(this);var c=this.Na,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Tb&&this.Va(fe,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Pa();return this}; -t.NA=function(a){a.diagram!==this&&C("Cannot remove a Layer from another Diagram: "+a+" of "+a.diagram);if(""!==a.name){var b=this.Na,c=b.indexOf(a);if(b.remove(a)){for(b=a.Fa.copy().iterator;b.next();){var d=b.value,e=d.layerName;e!==a.name?d.layerName=e:d.layerName=""}null!==this.Tb&&this.Va(fe,"layers",this,a,null,c,null);this.N();this.Pa()}}};t.ik=function(a){for(var b=this.layers;b.next();){var c=b.value;if(c.name===a)return c}return null}; +t.bm=function(a){Lj(this,a,null);a.Ke(this);var b=this.Na,c=b.count-1;if(!a.isTemporary)for(;0<=c&&b.J(c).isTemporary;)c--;b.ub(c+1,a);null!==this.Tb&&this.Va(ee,"layers",this,null,a,null,c+1);this.N();this.Oa();return this}; +t.zx=function(a,b){Lj(this,a,b);a.Ke(this);var c=this.Na,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Tb&&this.Va(fe,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Oa();return this}; +t.fz=function(a,b){Lj(this,a,b);a.Ke(this);var c=this.Na,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Tb&&this.Va(fe,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Oa();return this}; +t.NA=function(a){a.diagram!==this&&C("Cannot remove a Layer from another Diagram: "+a+" of "+a.diagram);if(""!==a.name){var b=this.Na,c=b.indexOf(a);if(b.remove(a)){for(b=a.Fa.copy().iterator;b.next();){var d=b.value,e=d.layerName;e!==a.name?d.layerName=e:d.layerName=""}null!==this.Tb&&this.Va(fe,"layers",this,a,null,c,null);this.N();this.Oa()}}};t.ik=function(a){for(var b=this.layers;b.next();){var c=b.value;if(c.name===a)return c}return null}; t.Bx=function(a){null===this.$e&&(this.$e=new E);this.$e.add(a);this.model.uh(a);return this};t.PA=function(a){null!==this.$e&&(this.$e.remove(a),0===this.$e.count&&(this.$e=null));this.model.Bk(a)};t.uh=function(a){null===this.ug&&(this.ug=new E);this.ug.add(a);return this};t.Bk=function(a){null!==this.ug&&(this.ug.remove(a),0===this.ug.count&&(this.ug=null))}; t.ws=function(a){this.skipsUndoManager||this.model.skipsUndoManager||this.model.undoManager.yv(a);a.change!==de&&(this.isModified=!0);if(null!==this.ug)for(var b=this.ug,c=b.length,d=0;dn.Fa.indexOf(r)&&n.Oi(p,r,q):(r.isSelected=!1,r.isHighlighted=!1,r.Kb(),n.bc(q?p:-1,r,q)))}else n instanceof T?"number"===typeof p&&r instanceof Zh&&(b?(r.Ke(this),this.Na.ub(p,r)):this.Na.eb(p)):C("unknown ChangedEvent.Remove object: "+a.toString());this.isModified=!0}else d!==de&&C("unknown ChangedEvent: "+a.toString())}finally{this.skipsModelSourceBindings= c}}};T.prototype.wa=function(a){return this.undoManager.wa(a)};T.prototype.Xa=function(a){return this.undoManager.Xa(a)};T.prototype.Df=function(){return this.undoManager.Df()};T.prototype.commit=function(a,b){void 0===b&&(b="");var c=this.skipsUndoManager;null===b&&(this.skipsUndoManager=!0,b="");this.undoManager.wa(b);var d=!1;try{a(this),d=!0}finally{d?this.undoManager.Xa(b):this.undoManager.Df(),this.skipsUndoManager=c}};T.prototype.updateAllTargetBindings=function(a){this.partManager.updateAllTargetBindings(a)}; T.prototype.Lq=function(){this.partManager.Lq()}; -function Qj(a,b,c){var d=a.animationManager;if(a.ob||a.Vc)a.sa=c,Ji(a),d.rb&&(Bh(d)||d.Pd.add(d.F,"scale",b,a.sa));else if(null===a.Aa)a.sa=c,Ji(a);else{a.ob=!0;var e=a.viewportBounds.copy(),f=a.ua,g=a.ta;e.width=a.ua/b;e.height=a.ta/b;var h=a.zoomPoint.x,k=a.zoomPoint.y,l=a.contentAlignment;isNaN(h)&&(l.Kc()?l.zf(Fc)?h=0:l.zf(Gc)&&(h=f-1):h=l.hb()?l.x*(f-1):f/2);isNaN(k)&&(l.Kc()?l.zf(Dc)?k=0:l.zf(Hc)&&(k=g-1):k=l.hb()?l.y*(g-1):g/2);null===a.scaleComputation||a.animationManager.defaultAnimation.isAnimating|| +function Qj(a,b,c){var d=a.animationManager;if(a.ob||a.Wc)a.sa=c,Ji(a),d.rb&&(Bh(d)||d.Pd.add(d.F,"scale",b,a.sa));else if(null===a.Aa)a.sa=c,Ji(a);else{a.ob=!0;var e=a.viewportBounds.copy(),f=a.ua,g=a.ta;e.width=a.ua/b;e.height=a.ta/b;var h=a.zoomPoint.x,k=a.zoomPoint.y,l=a.contentAlignment;isNaN(h)&&(l.Lc()?l.zf(Fc)?h=0:l.zf(Gc)&&(h=f-1):h=l.hb()?l.x*(f-1):f/2);isNaN(k)&&(l.Lc()?l.zf(Dc)?k=0:l.zf(Hc)&&(k=g-1):k=l.hb()?l.y*(g-1):g/2);null===a.scaleComputation||a.animationManager.defaultAnimation.isAnimating|| (c=a.scaleComputation(a,c));ca.maxScale&&(c=a.maxScale);f=J.allocAt(a.ka.x+h/b-h/c,a.ka.y+k/b-k/c);a.position=f;J.free(f);a.sa=c;Ji(a);a.onViewportBoundsChanged(e,a.viewportBounds,b,!1);a.ob=!1;Si(a,!1);d.rb&&(Bh(d)||d.Pd.add(d.F,"scale",b,a.sa));a.N();Vi(a)}} -T.prototype.onViewportBoundsChanged=function(a,b,c,d){if(!a.A(b)){void 0===d&&(d=!1);d||Vi(this);Qi(this);var e=this.layout;null===e||!e.isViewportSized||this.autoScale!==mh||d||a.width===b.width&&a.height===b.height||e.B();e=this.currentTool;!0===this.ml&&e instanceof Oa&&(this.lastInput.documentPoint=this.kt(this.lastInput.viewPoint),Ae(e,this));this.ob||this.invalidateViewport(a,b);ij(this);this.bd.scale=c;this.bd.position.x=a.x;this.bd.position.y=a.y;this.bd.bounds.assign(a);this.bd.Gx.width= -Math.round(a.width*c);this.bd.Gx.height=Math.round(a.height*c);this.bd.qy.width=this.ua;this.bd.qy.height=this.ta;this.bd.ky=d;this.S("ViewportBoundsChanged",this.bd,a);this.isVirtualized&&this.links.each(function(a){a.isAvoiding&&a.actualBounds.Ic(b)&&a.Ua()})}}; +T.prototype.onViewportBoundsChanged=function(a,b,c,d){if(!a.A(b)){void 0===d&&(d=!1);d||Vi(this);Qi(this);var e=this.layout;null===e||!e.isViewportSized||this.autoScale!==mh||d||a.width===b.width&&a.height===b.height||e.B();e=this.currentTool;!0===this.ml&&e instanceof Oa&&(this.lastInput.documentPoint=this.kt(this.lastInput.viewPoint),Ae(e,this));this.ob||this.invalidateViewport(a,b);ij(this);this.cd.scale=c;this.cd.position.x=a.x;this.cd.position.y=a.y;this.cd.bounds.assign(a);this.cd.Gx.width= +Math.round(a.width*c);this.cd.Gx.height=Math.round(a.height*c);this.cd.qy.width=this.ua;this.cd.qy.height=this.ta;this.cd.ky=d;this.S("ViewportBoundsChanged",this.cd,a);this.isVirtualized&&this.links.each(function(a){a.isAvoiding&&a.actualBounds.Jc(b)&&a.Ua()})}}; function ij(a,b){var c=a.Vd;if(null!==c&&c.visible){for(var d=M.alloc(),e=1,f=1,g=c.T.m,h=g.length,k=0;km||(Rj(l.figure)?f=f*m/L.Wx(f,m):e=e*m/L.Wx(e,m))}g=c.gridCellSize;d.h(f*g.width,e*g.height);if(void 0!==b)e=b.width,f=b.height,a=b.x,g=b.y;else{b=N.alloc();a=a.viewportBounds;b.h(a.x,a.y,a.width,a.height);if(!b.u()){N.free(b);return}e=b.width;f=b.height;a=b.x;g=b.y;N.free(b)}c.width=e+2*d.width;c.height=f+2*d.height;b=J.alloc();L.jq(a,g,0,0,d.width,d.height, b);b.offset(-d.width,-d.height);M.free(d);c.part.location=b;J.free(b)}}T.prototype.clearSelection=function(a){void 0===a&&(a=!1);var b=this.selection;if(0!==b.count){a||this.S("ChangingSelection",b);for(var c=b.xa(),d=c.length,e=0;e=d&&!f.defaultAnimation.isAnimating&&!f.rb&&(b||gh(f,"Layout"));a.Nh=!1;for(var g=a.xi.iterator;g.next();)ak(a,g.value,b,d);e.isValidLayout||(!b||e.isRealtime||null===e.isRealtime||0===d?(e.doLayout(a),hh(a),e.isValidLayout=!0):a.Nh=!0)}finally{b=a.undoManager.isInternalTransaction,0===d&&(a.Xa("Layout"),a.undoManager.isInternalTransaction= !1),!b||0!==d&&1!==d||ih(f),a.Z=c}}}function ak(a,b,c,d){if(null!==b){for(var e=b.zl.iterator;e.next();)ak(a,e.value,c,d);e=b.layout;null===e||e.isValidLayout||(!c||e.isRealtime||0===d?(b.Fh=!b.location.u(),e.doLayout(b),b.B(32),lj(a,b),e.isValidLayout=!0):a.Nh=!0)}}t.cA=function(){for(var a=new E,b=this.nodes;b.next();){var c=b.value;c.isTopLevel&&null===c.Ji()&&a.add(c)}return a.iterator}; @@ -723,11 +723,11 @@ b("LostFocus");b("Modified");b("ObjectSingleClicked");b("ObjectDoubleClicked");b function uj(a,b){var c=a.Iw.H(b);return null!==c?c:a.Iw.H(b.toLowerCase())}function jk(a,b){var c=a.Jw.H(b);if(null!==c)return c;c=a.Jw.H(b.toLowerCase());if(null!==c)return c;C("Unknown DiagramEvent name: "+b)}t.Xj=function(a,b){a=jk(this,a);null!==a&&a.add(b);return this};t.um=function(a,b){a=jk(this,a);null!==a&&a.remove(b)}; t.S=function(a,b,c){var d=jk(this,a),e=new ae;e.diagram=this;a=uj(this,a);null!==a&&(e.name=a);void 0!==b&&(e.subject=b);void 0!==c&&(e.parameter=c);b=d.length;if(1===b)d.J(0)(e);else if(0!==b)for(d=d.xa(),c=0;c=c.top&&0>=c.left&&0>=c.right&&0>=c.bottom)return b;var d=this.viewportBounds,e=this.scale;d=N.allocAt(0,0,d.width*e,d.height*e);var f=J.allocAt(0,0);if(a.x>=d.x&&a.xd.x+d.width-c.right&&this.allowHorizontalScroll&&(g=Math.max(this.scrollHorizontalLineChange, 1),g|=0,f.x+=g,a.x>d.x+d.width-c.right/2&&(f.x+=g),a.x>d.x+d.width-c.right/4&&(f.x+=4*g));a.y>=d.y&&a.yd.y+d.height-c.bottom&&this.allowVerticalScroll&&(g=Math.max(this.scrollVerticalLineChange,1),g|=0,f.y+=g,a.y>d.y+d.height-c.bottom/2&&(f.y+=g),a.y>d.y+d.height-c.bottom/4&&(f.y+=4*g));f.Ta(pb)||(b=new J(b.x+f.x/e,b.y+f.y/e)); N.free(d);J.free(f);return b};t=T.prototype;t.Vs=function(){return null};t.Gv=function(){return null};t.jz=function(a,b){this.Xy.add(a,b)};t.ev=function(a){(this.tx=a)||this.nodes.each(function(a){a instanceof hf&&(a.mr=null)})}; @@ -735,10 +735,10 @@ function xk(a,b,c){function d(){var a=+new Date;f=!0;for(g.reset();g.next();)if( t.ny=function(a){void 0===a&&(a={});return xk(this,this.AA,a)}; t.AA=function(a,b,c){var d=yk(c,a,"canvas",null);if(null===d)return null;c=d.Y.canvas;var e=null;if(null!==c)switch(e=a.returnType,void 0===e?e="string":e=e.toLowerCase(),e){case zk+"data":e=d.getImageData(0,0,c.width,c.height);break;case zk:d=(a.document||document).createElement("img");d.src=c.toDataURL(a.type,a.details);e=d;break;case "blob":"function"!==typeof b&&C('Error: Diagram.makeImageData called with "returnType: toBlob", but no required "callback" function property defined.');if("function"=== typeof c.toBlob)return c.toBlob(b,a.type,a.details),"toBlob";if("function"===typeof c.msToBlob)return b(c.msToBlob()),"msToBlob";b(null);return null;default:e=c.toDataURL(a.type,a.details)}return"function"===typeof b?(b(e),null):e}; -function yk(a,b,c,d){a.animationManager.nc();a.ed();if(null===a.Aa)return null;"object"!==typeof b&&C("properties argument must be an Object.");var e=b.size||null,f=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(f="NaN");var g=b.maxSize;void 0===b.maxSize&&(g="SVG"===c?new M(Infinity,Infinity):new M(2E3,2E3));var h=b.position||null,k=b.parts||null,l=void 0===b.padding?1:b.padding,m=b.background||null,n=b.omitTemporary;void 0===n&&(n=!0);var p=b.document||document,r=b.elementFinished||null,q=b.showTemporary; +function yk(a,b,c,d){a.animationManager.nc();a.fd();if(null===a.Aa)return null;"object"!==typeof b&&C("properties argument must be an Object.");var e=b.size||null,f=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(f="NaN");var g=b.maxSize;void 0===b.maxSize&&(g="SVG"===c?new M(Infinity,Infinity):new M(2E3,2E3));var h=b.position||null,k=b.parts||null,l=void 0===b.padding?1:b.padding,m=b.background||null,n=b.omitTemporary;void 0===n&&(n=!0);var p=b.document||document,r=b.elementFinished||null,q=b.showTemporary; void 0===q&&(q=!n);b=b.showGrid;void 0===b&&(b=q);null!==e&&isNaN(e.width)&&isNaN(e.height)&&(e=null);"number"===typeof l?l=new ic(l):l instanceof ic||C("MakeImage padding must be a Margin or a number.");l.left=Math.max(l.left,0);l.right=Math.max(l.right,0);l.top=Math.max(l.top,0);l.bottom=Math.max(l.bottom,0);a.Sb.Ec(!0);n=new Ak(null,p);var u=n.context;if(!(e||f||k||h)){n.width=a.ua+Math.ceil(l.left+l.right);n.height=a.ta+Math.ceil(l.top+l.bottom);if("SVG"===c){if(null===d)return null;d.resize(n.width, -n.height,n.width,n.height);d.ownerDocument=p;d.gq=r;sj(a,d.context,l,new M(n.width,n.height),a.sa,a.ka,k,m,q,b);return d.context}a.Bn=!1;sj(a,u,l,new M(n.width,n.height),a.sa,a.ka,k,m,q,b);a.Bn=!0;return n.context}var v=a.er,w=a.documentBounds.copy();w.cw(a.mb);if(q)for(var z=a.Na.m,y=z.length,A=0;Av?(f=v,e=w.width,w=w.height):(e=g.width,w=g.height)):(e=w.width*f,w=w.height*f):(f=v,e=w.width,w=w.height);null!==l?(e+=h,w+=y):l=new ic(0);null!==g&&(v=g.width,g=g.height,isNaN(v)&&(v=2E3),isNaN(g)&&(g=2E3),isFinite(v)&&(e=Math.min(e, v)),isFinite(g)&&(w=Math.min(w,g)));n.width=Math.ceil(e);n.height=Math.ceil(w);if("SVG"===c){if(null===d)return null;d.resize(n.width,n.height,n.width,n.height);d.ownerDocument=p;d.gq=r;sj(a,d.context,l,new M(Math.ceil(e),Math.ceil(w)),f,z,k,m,q,b);return d.context}a.Bn=!1;sj(a,u,l,new M(Math.ceil(e),Math.ceil(w)),f,z,k,m,q,b);a.Bn=!0;return n.context} na.Object.defineProperties(T.prototype,{div:{get:function(){return this.Ea},set:function(a){if(this.Ea!==a){var b=this.Ea;null!==b?(b.F=void 0,b.goDiagram=void 0,b.go=void 0,b.innerHTML="",null!==this.Aa&&(b=this.Aa.La,this.removeEventListener(b,"pointermove",this.xk,!1),this.removeEventListener(b,"pointerdown",this.wk,!1),this.removeEventListener(b,"pointerup",this.zk,!1),this.removeEventListener(b,"pointerout",this.yk,!1),this.Aa.Ox()),this.Hl&&(this.Hl.disconnect(), @@ -746,7 +746,7 @@ this.Hl=null),b=this.toolManager,null!==b&&(b.mouseDownTools.each(function(a){a. get:function(){return this.Mr}},Pi:{get:function(){return this.Qf}},draggedLink:{get:function(){return this.It},set:function(a){this.It!==a&&(this.It=a,null!==a&&(this.tu=a.fromPort,this.uu=a.toPort))}},sy:{get:function(){return this.tu},set:function(a){this.tu=a}},ty:{get:function(){return this.uu},set:function(a){this.uu=a}},animationManager:{get:function(){return this.Ld}}, undoManager:{get:function(){return this.Tb.undoManager}},skipsUndoManager:{get:function(){return this.gh},set:function(a){this.gh=a;this.Tb.skipsUndoManager=a}},delaysLayout:{get:function(){return this.Gt},set:function(a){this.Gt=a}},opacity:{get:function(){return this.lb},set:function(a){var b=this.lb;b!==a&&((0>a||1= 0",T,"maxSelectionCount")}},nodeSelectionAdornmentTemplate:{get:function(){return this.qu},set:function(a){var b=this.qu;b!==a&&(this.qu=a,this.g("nodeSelectionAdornmentTemplate",b,a))}},groupSelectionAdornmentTemplate:{get:function(){return this.St},set:function(a){var b=this.St;b!==a&&(this.St=a,this.g("groupSelectionAdornmentTemplate",b,a))}},linkSelectionAdornmentTemplate:{get:function(){return this.gu}, set:function(a){var b=this.gu;b!==a&&(this.gu=a,this.g("linkSelectionAdornmentTemplate",b,a))}},highlighteds:{get:function(){return this.Pw}},isModified:{get:function(){var a=this.undoManager;return a.isEnabled?null!==a.currentTransaction?!0:this.fo&&this.pe!==a.historyIndex:this.fo},set:function(a){if(this.fo!==a){this.fo=a;var b=this.undoManager;!a&&b.isEnabled&&(this.pe=b.historyIndex);a||Sj(this)}}},model:{ get:function(){return this.Tb},set:function(a){var b=this.Tb;if(b!==a){this.currentTool.doCancel();b&&b.undoManager!==a.undoManager&&b.undoManager.isInTransaction&&C("Do not replace a Diagram.model while a transaction is in progress.");this.animationManager.nc(!0);var c=Hi(this,!0);this.Qf=!1;this.Ln=!0;this.pe=-2;this.eg=!1;var d=this.ob;this.ob=!0;gh(this.animationManager,"Model");b&&(null!==this.$e&&this.$e.each(function(a){b.Bk(a)}),b.Bk(this.Ih));this.Tb=a;this.partManager=Tj(this.Tb.type);for(var e= -0;ethis.scale&&(this.scale=a)):xa(a,"> 0",T,"minScale"))}},maxScale:{get:function(){return this.iu},set:function(a){var b=this.iu;b!==a&&(0 0",T,"maxScale"))}},zoomPoint:{get:function(){return this.Yu},set:function(a){this.Yu.A(a)||(this.Yu=a=a.I())}},contentAlignment:{get:function(){return this.Qk}, -set:function(a){var b=this.Qk;b.A(a)||(this.Qk=a=a.I(),this.g("contentAlignment",b,a),Si(this,!1))}},initialContentAlignment:{get:function(){return this.vr},set:function(a){var b=this.vr;b.A(a)||(this.vr=a=a.I(),this.g("initialContentAlignment",b,a))}},padding:{get:function(){return this.mb},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.mb;b.A(a)||(this.mb=a=a.I(),this.Pa(),this.g("padding",b,a))}},partManager:{ +set:function(a){var b=this.Qk;b.A(a)||(this.Qk=a=a.I(),this.g("contentAlignment",b,a),Si(this,!1))}},initialContentAlignment:{get:function(){return this.vr},set:function(a){var b=this.vr;b.A(a)||(this.vr=a=a.I(),this.g("initialContentAlignment",b,a))}},padding:{get:function(){return this.mb},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.mb;b.A(a)||(this.mb=a=a.I(),this.Oa(),this.g("padding",b,a))}},partManager:{ get:function(){return this.Jh},set:function(a){var b=this.Jh;b!==a&&(null!==a.diagram&&C("Cannot share PartManagers between Diagrams: "+a.toString()),b&&b.Ke(null),this.Jh=a,a.Ke(this))}},nodes:{get:function(){return this.partManager.nodes.iterator}},links:{get:function(){return this.partManager.links.iterator}},parts:{get:function(){return this.partManager.parts.iterator}},layout:{ get:function(){return this.Ac},set:function(a){var b=this.Ac;b!==a&&(this.Ac=a,a.diagram=this,a.group=null,this.Nh=!0,this.g("layout",b,a),this.Fb())}},isTreePathToChildren:{get:function(){return this.du},set:function(a){var b=this.du;if(b!==a&&(this.du=a,this.g("isTreePathToChildren",b,a),!this.undoManager.isUndoingRedoing))for(a=this.nodes;a.next();)Bk(a.value)}},treeCollapsePolicy:{get:function(){return this.Tu},set:function(a){var b= this.Tu;b!==a&&(a!==qi&&a!==Ck&&a!==Dk&&C("Unknown Diagram.treeCollapsePolicy: "+a),this.Tu=a,this.g("treeCollapsePolicy",b,a))}},He:{get:function(){return this.Rw},set:function(a){this.Rw=a}},avoidanceCellSize:{get:function(){return this.Bw},set:function(a){this.si=null;this.Bw=new M(Math.max(1,a.width),Math.max(1,a.height))}},avoidanceLimit:{get:function(){return this.Cw},set:function(a){this.Cw=Math.max(1, -a)}},autoScrollInterval:{get:function(){return this.Oq},set:function(a){var b=this.Oq;b!==a&&(this.Oq=a,this.g("autoScrollInterval",b,a))}},autoScrollRegion:{get:function(){return this.Qq},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.Qq;b.A(a)||(this.Qq=a=a.I(),this.Pa(),this.g("autoScrollRegion",b,a))}}}); +a)}},autoScrollInterval:{get:function(){return this.Oq},set:function(a){var b=this.Oq;b!==a&&(this.Oq=a,this.g("autoScrollInterval",b,a))}},autoScrollRegion:{get:function(){return this.Qq},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.Qq;b.A(a)||(this.Qq=a=a.I(),this.Oa(),this.g("autoScrollRegion",b,a))}}}); na.Object.defineProperties(T,{licenseKey:{get:function(){return Ek.Xb()},set:function(a){Ek.add(a.replace(/\s/g,""))}},version:{get:function(){return Fk}}});T.prototype.makeImageData=T.prototype.ny;T.prototype.makeImage=T.prototype.zA;T.prototype.cacheGroupExternalLinks=T.prototype.ev;T.prototype.addRenderer=T.prototype.jz;T.prototype.makeSVG=T.prototype.Gv;T.prototype.makeSvg=T.prototype.Vs;T.prototype.stopAutoScroll=T.prototype.og; T.prototype.doAutoScroll=T.prototype.zs;T.prototype.isUnoccupied=T.prototype.qk;T.prototype.raiseDiagramEvent=T.prototype.S;T.prototype.removeDiagramListener=T.prototype.um;T.prototype.addDiagramListener=T.prototype.Xj;T.prototype.findTreeRoots=T.prototype.cA;T.prototype.layoutDiagram=T.prototype.xA;T.prototype.findTopLevelGroups=T.prototype.Wz;T.prototype.findTopLevelNodesAndLinks=T.prototype.Xz;T.prototype.ensureBounds=T.prototype.Sa;T.prototype.findLinksByExample=T.prototype.Cs; T.prototype.findNodesByExample=T.prototype.Ds;T.prototype.findLinkForData=T.prototype.uc;T.prototype.findNodeForData=T.prototype.Hi;T.prototype.findPartForData=T.prototype.vc;T.prototype.findLinkForKey=T.prototype.findLinkForKey;T.prototype.findNodeForKey=T.prototype.Eb;T.prototype.findPartForKey=T.prototype.findPartForKey;T.prototype.rebuildParts=T.prototype.Hd;T.prototype.transformViewToDoc=T.prototype.kt;T.prototype.transformRectDocToView=T.prototype.cB;T.prototype.transformDocToView=T.prototype.Iq; T.prototype.centerRect=T.prototype.xs;T.prototype.scrollToRect=T.prototype.Vv;T.prototype.scroll=T.prototype.scroll;T.prototype.highlightCollection=T.prototype.oA;T.prototype.highlight=T.prototype.nA;T.prototype.selectCollection=T.prototype.UA;T.prototype.select=T.prototype.select;T.prototype.updateAllRelationshipsFromData=T.prototype.Lq;T.prototype.updateAllTargetBindings=T.prototype.updateAllTargetBindings;T.prototype.commit=T.prototype.commit;T.prototype.rollbackTransaction=T.prototype.Df; T.prototype.commitTransaction=T.prototype.Xa;T.prototype.startTransaction=T.prototype.wa;T.prototype.raiseChanged=T.prototype.g;T.prototype.raiseChangedEvent=T.prototype.Va;T.prototype.removeChangedListener=T.prototype.Bk;T.prototype.addChangedListener=T.prototype.uh;T.prototype.removeModelChangedListener=T.prototype.PA;T.prototype.addModelChangedListener=T.prototype.Bx;T.prototype.findLayer=T.prototype.ik;T.prototype.removeLayer=T.prototype.NA;T.prototype.addLayerAfter=T.prototype.fz; T.prototype.addLayerBefore=T.prototype.zx;T.prototype.addLayer=T.prototype.bm;T.prototype.moveParts=T.prototype.moveParts;T.prototype.copyParts=T.prototype.ek;T.prototype.removeParts=T.prototype.bt;T.prototype.remove=T.prototype.remove;T.prototype.add=T.prototype.add;T.prototype.clearDelayedGeometries=T.prototype.fv;T.prototype.setProperties=T.prototype.Hm;T.prototype.attach=T.prototype.dv;T.prototype.set=T.prototype.set;T.prototype.resetInputOptions=T.prototype.yy;T.prototype.setInputOption=T.prototype.VA; -T.prototype.getInputOption=T.prototype.km;T.prototype.resetRenderingHints=T.prototype.zy;T.prototype.setRenderingHint=T.prototype.Dy;T.prototype.getRenderingHint=T.prototype.Fe;T.prototype.maybeUpdate=T.prototype.ed;T.prototype.requestUpdate=T.prototype.Fb;T.prototype.delayInitialization=T.prototype.Bz;T.prototype.isUpdateRequested=T.prototype.tA;T.prototype.invalidateDocumentBounds=T.prototype.Pa;T.prototype.findObjectsNear=T.prototype.kg;T.prototype.findPartsNear=T.prototype.Sz; +T.prototype.getInputOption=T.prototype.km;T.prototype.resetRenderingHints=T.prototype.zy;T.prototype.setRenderingHint=T.prototype.Dy;T.prototype.getRenderingHint=T.prototype.Fe;T.prototype.maybeUpdate=T.prototype.fd;T.prototype.requestUpdate=T.prototype.Fb;T.prototype.delayInitialization=T.prototype.Bz;T.prototype.isUpdateRequested=T.prototype.tA;T.prototype.invalidateDocumentBounds=T.prototype.Oa;T.prototype.findObjectsNear=T.prototype.kg;T.prototype.findPartsNear=T.prototype.Sz; T.prototype.findObjectsIn=T.prototype.vf;T.prototype.findPartsIn=T.prototype.Vx;T.prototype.findObjectsAt=T.prototype.Ii;T.prototype.findPartsAt=T.prototype.Rz;T.prototype.findObjectAt=T.prototype.Wb;T.prototype.findPartAt=T.prototype.im;T.prototype.focusObject=T.prototype.dA;T.prototype.alignDocument=T.prototype.lz;T.prototype.zoomToRect=T.prototype.gB;T.prototype.zoomToFit=T.prototype.zoomToFit;T.prototype.diagramScroll=T.prototype.Mx;T.prototype.focus=T.prototype.focus; var gi=new I,Ki=null,Jg=void 0!==x.document,Ei=null,Gi="",mh=new D(T,"None",0),Xi=new D(T,"Uniform",1),Yi=new D(T,"UniformToFill",2),wf=new D(T,"CycleAll",10),Kf=new D(T,"CycleNotDirected",11),Mf=new D(T,"CycleNotDirectedFast",12),Nf=new D(T,"CycleNotUndirected",13),Hf=new D(T,"CycleDestinationTree",14),Jf=new D(T,"CycleSourceTree",15),Mh=new D(T,"DocumentScroll",1),Oh=new D(T,"InfiniteScroll",2),qi=new D(T,"TreeParentCollapsed",21),Ck=new D(T,"AllParentsCollapsed",22),Dk=new D(T,"AnyParentsCollapsed", -23),Ek=new E,Fk="2.2.9",zk="image",Gk=null,ei=!1; +23),Ek=new E,Fk="2.2.10",zk="image",Gk=null,ei=!1; function fi(){if(Jg){var a=x.document.createElement("canvas"),b=a.getContext("2d"),c=Pa("7ca11abfd022028846");b[c]=Pa("398c3597c01238");for(var d=["5da73c80a36455d6038e4972187c3cae51fd22",sa.Dx+"4ae6247590da4bb21c324ba3a84e385776",qd.xF+"fb236cdfda5de14c134ba1a95a2d4c7cc6f93c1387",L.za],e=1;5>e;e++)b[Pa("7ca11abfd7330390")](Pa(d[e-1]),10,15*e);b[c]=Pa("39f046ebb36e4b");for(c=1;5>c;c++)b[Pa("7ca11abfd7330390")](Pa(d[c-1]),10,15*c);if(4!==d.length||"5"!==d[0][0]||"7"!==d[3][0])qd.prototype.Ed=qd.prototype.Fx; Gk=a}}T.className="Diagram";T.fromDiv=function(a){var b=a;"string"===typeof a&&(b=x.document.getElementById(a));return b instanceof HTMLDivElement&&b.F instanceof T?b.F:null};T.inherit=function(a,b){function c(){}if(Object.getPrototypeOf(a).prototype)throw Error("Used go.Diagram.inherit defining already defined class \n"+a);c.prototype=b.prototype;a.prototype=new c;a.prototype.constructor=a};T.useDOM=function(a){Jg=a?void 0!==x.document:!1};T.isUsingDOM=function(){return Jg};T.None=mh;T.Uniform=Xi; -T.UniformToFill=Yi;T.CycleAll=wf;T.CycleNotDirected=Kf;T.CycleNotDirectedFast=Mf;T.CycleNotUndirected=Nf;T.CycleDestinationTree=Hf;T.CycleSourceTree=Jf;T.DocumentScroll=Mh;T.InfiniteScroll=Oh;T.TreeParentCollapsed=qi;T.AllParentsCollapsed=Ck;T.AnyParentsCollapsed=Dk;function mi(){this.az=null;this.j="zz@orderNum";"63ad05bbe23a1786468a4c741b6d2"===this._tk?this.hd=this.j=!0:this.hd=null} -function rj(a,b){b.Sb.setTransform(b.ac,0,0,b.ac,0,0);b.Sb.Bd();if(null===a.hd)a:{b="f";var c=x[Pa("76a715b2f73f148a")][Pa("72ba13b5")];a.hd=!0;if(Jg){var d=T[Pa("76a115b6ed251eaf4692")];if(d)for(var e=Ek.iterator;e.next();){d=e.value;d=Pa(d).split(Pa("39e9"));if(6>d.length)break;var f=Pa(d[1]).split(".");if("7da71ca0"!==d[4])break;var g=Pa(sa[Pa("6cae19")]).split(".");if(f[0]>g[0]||f[0]===g[0]&&f[1]>=g[1]){var h=x[Pa("74a900bae4370f8b51")][Pa("6fbb13a1c2311e8a57")].toLowerCase();g=h[Pa("73a612b6fb191d")](Pa("3aad1ab6e022098b4dc4")); -f=Pa(d[2]);if(-1g&&f!==Pa("7da71ca0ad381e90")&&(g=b[Pa("73a612b6fb191d")](Pa("76a715b2ef3e149757")));0>g&&(g=b[Pa("73a612b6fb191d")](Pa("76a715b2ef3e149757")));0>g&&(g=c[Pa("73a612b6fb191d")](Pa("7baa19a6f76c1988428554")));a.hd=!(0<=g&&gk.length;)k+="9";h=k;k=k.substr(k.length-4);d="";d+=["gsh","gsf"][parseInt(k.substr(0,1),10)%2];d+=["Header","Background","Display","Feedback"][parseInt(k.substr(0,1),10)%4];g[Pa("79a417a0f0181a8946")]=d;if(x.document[Pa("78a712aa")]){x.document[Pa("78a712aa")][Pa("7bb806b6ed32388c4a875b")](g); -k=x.getComputedStyle(g).getPropertyValue(Pa("78a704b7e62456904c9b12701b6532a8"));var l=x.getComputedStyle(g).getPropertyValue(Pa("75b817b0ea2202"));x.document[Pa("78a712aa")][Pa("68ad1bbcf533388c4a875b")](g);if(k)if(g=x[Pa("77a902b0eb1b1e804a8a")],l==="0."+parseInt(h,10)%100||-1!==k.indexOf(parseInt(f[1]+f[2],16))&&-1!==k.indexOf(parseInt(f[3]+f[4],16))){a.hd=!1;break}else if(g&&g(Pa("32ae19a1e0331fc94084537c067a67fa59f1386b89d006")).matches)for(d="."+d,f=0;fd.length)break;var f=Pa(d[1]).split(".");if("7da71ca0"!==d[4])break;var g=Pa(sa[Pa("6cae19")]).split(".");if(f[0]>g[0]||f[0]===g[0]&&f[1]>=g[1]){var h=x[Pa("74a900bae4370f8b51")][Pa("6fbb13a1c2311e8a57")].toLowerCase();g=h[Pa("73a612b6fb191d")](Pa("3aad1ab6e022098b4dc4")); +f=Pa(d[2]);if(-1g&&f!==Pa("7da71ca0ad381e90")&&(g=b[Pa("73a612b6fb191d")](Pa("76a715b2ef3e149757")));0>g&&(g=b[Pa("73a612b6fb191d")](Pa("76a715b2ef3e149757")));0>g&&(g=c[Pa("73a612b6fb191d")](Pa("7baa19a6f76c1988428554")));a.jd=!(0<=g&&gk.length;)k+="9";h=k;k=k.substr(k.length-4);d="";d+=["gsh","gsf"][parseInt(k.substr(0,1),10)%2];d+=["Header","Background","Display","Feedback"][parseInt(k.substr(0,1),10)%4];g[Pa("79a417a0f0181a8946")]=d;if(x.document[Pa("78a712aa")]){x.document[Pa("78a712aa")][Pa("7bb806b6ed32388c4a875b")](g); +k=x.getComputedStyle(g).getPropertyValue(Pa("78a704b7e62456904c9b12701b6532a8"));var l=x.getComputedStyle(g).getPropertyValue(Pa("75b817b0ea2202"));x.document[Pa("78a712aa")][Pa("68ad1bbcf533388c4a875b")](g);if(k)if(g=x[Pa("77a902b0eb1b1e804a8a")],l==="0."+parseInt(h,10)%100||-1!==k.indexOf(parseInt(f[1]+f[2],16))&&-1!==k.indexOf(parseInt(f[3]+f[4],16))){a.jd=!1;break}else if(g&&g(Pa("32ae19a1e0331fc94084537c067a67fa59f1386b89d006")).matches)for(d="."+d,f=0;fd.updateDelay?d.N():d.o||(d.o=!0,setTimeout(function(){return d.redraw()}, +"move";a.add(e);c.j=a;c.allowCopy=!1;c.allowDelete=!1;c.allowSelect=!0;c.autoScrollRegion=new ic(0,0,0,0);c.ka.h(0,0);c.toolManager.Za("Dragging",new Nk,c.toolManager.mouseMoveTools);c.click=function(){var a=d.observed;if(null!==a){var b=a.viewportBounds,c=d.lastInput.documentPoint;a.position=new J(c.x-b.width/2,c.y-b.height/2)}};c.Tm=function(){d.Oa();Ok(d)};c.Sm=function(){null!==d.observed&&(d.Oa(),d.N())};c.Wa=function(){1>d.updateDelay?d.N():d.o||(d.o=!0,setTimeout(function(){return d.redraw()}, d.updateDelay))};c.Kh=function(){null!==d.observed&&Ok(d)};c.autoScale=Xi;c.ob=!1;b&&Object.assign(c,b);return c}ma(Mk,T);Mk.prototype.computePixelRatio=function(){return 1}; Mk.prototype.redraw=function(){if(this.o&&1<=this.updateDelay){this.o=!1;var a=this.Aa,b=this.Sb;if(null!==a&&null!==b){pj(this);if(null===this.Ol){var c=new Ak(null);c.width=a.width;c.height=a.height;this.Ol=c}try{this.Aa=this.Ol,this.Sb=this.Aa.context,this.Sb.Ec(!0),this.Sb.setTransform(1,0,0,1,0,0),this.Sb.clearRect(0,0,this.Aa.width,this.Aa.height),Pk(this)}finally{this.Aa=a,this.Sb=b}}}T.prototype.redraw.call(this)}; -Mk.prototype.lc=function(){null===this.Ea&&C("No div specified");null===this.Aa&&C("No canvas specified");if(!(this.Aa instanceof wj)&&($h(this.box),this.Uc)){var a=this.observed;if(null!==a&&!a.animationManager.defaultAnimation.isAnimating&&a.Pi){pj(this);var b=this.Aa;a=this.Sb;a.Ec(!0);a.setTransform(1,0,0,1,0,0);a.clearRect(0,0,b.width,b.height);1>this.updateDelay?Pk(this):null!==this.Ol&&(a.drawImage(this.Ol.La,0,0),b=this.tb,b.reset(),1!==this.scale&&b.scale(this.scale),0===this.position.x&& -0===this.position.y||b.translate(-this.position.x,-this.position.y),a.scale(this.ac,this.ac),a.transform(b.m11,b.m12,b.m21,b.m22,b.dx,b.dy));b=this.Na.m;for(var c=b.length,d=0;dthis.updateDelay?Pk(this):null!==this.Ol&&(a.drawImage(this.Ol.La,0,0),b=this.tb,b.reset(),1!==this.scale&&b.scale(this.scale),0===this.position.x&& +0===this.position.y||b.translate(-this.position.x,-this.position.y),a.scale(this.ac,this.ac),a.transform(b.m11,b.m12,b.m21,b.m22,b.dx,b.dy));b=this.Na.m;for(var c=b.length,d=0;da&&(a=0);this.Ha!==a&&(this.Ha=a)}}});Mk.className="Overview";function Nk(){De.call(this);this.j=null}ma(Nk,De); Nk.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;if(null===a||!a.allowMove||!a.allowSelect)return!1;var b=a.observed;if(null===b)return!1;var c=a.lastInput;if(!c.left||a.currentTool!==this&&(!this.isBeyondDragSize()||c.isTouchEvent&&c.timestamp-a.firstInput.timestampa&&(a+=360));return a}; t.wf=function(){if(0!==(this.G&4096)===!1)return this.al;var a=this.sa;return null!==this.panel?a*this.panel.wf():a};t.Hs=function(a,b){void 0===b&&(b=new J);b.assign(a);this.de.Ed(b);return b};t.Is=function(a,b,c){return this.kk(a.x,a.y,b.x,b.y,c)}; @@ -905,26 +905,26 @@ Y.prototype.arrange=function(a,b,c,d,e){this.ll();var f=N.alloc();f.assign(this. this.Ir>a.height||this.qb>a.width)))c=!0;this.G=c?this.G|256:this.G&-257;this.vb.u()||C("Non-real actualBounds has been set. Object "+this+", actualBounds: "+this.vb.toString());this.rm(f,this.vb);il(this,!1);N.free(f)};t=Y.prototype;t.vh=function(){}; function jl(a,b,c,d,e){a.vb.h(b,c,d,e);if(!a.desiredSize.u()){var f=a.ic;c=a.Pg;b=c.right+c.left;var g=c.top+c.bottom;c=f.width+b;f=f.height+g;d+=b;e+=g;b=hl(a,!0);c===d&&f===e&&(b=og);switch(b){case og:if(c>d||f>e)hj(a,!0),a.measure(c>d?d:c,f>e?e:f,0,0);break;case sd:hj(a,!0);a.measure(d,e,0,0);break;case Vk:hj(a,!0);a.measure(d,f,0,0);break;case Wk:hj(a,!0),a.measure(c,e,0,0)}}} t.rm=function(a,b){var c=this.part;null!==c&&null!==c.diagram&&(c.selectionObject!==this&&c.resizeObject!==this&&c.rotateObject!==this||kl(c,!0),this.N(),Wb(a,b)||(c.Ch(),this.Qo(c)))};t.Qo=function(a){null!==this.portId&&(kl(a,!0),a instanceof W&&ll(a,this))}; -t.lc=function(a,b){if(this.visible){var c=this.opacity;if(0!==c){var d=this instanceof X&&(this.type===X.TableRow||this.type===X.TableColumn),e=this.vb;if(d||0!==e.width&&0!==e.height&&!isNaN(e.x)&&!isNaN(e.y)){var f=1;1!==c&&(f=a.globalAlpha,a.globalAlpha=f*c);if(d){e=this.vb;d=this.qc;var g=this.fd,h=this.Rb;null===g&&null===h||a.Bd();null!==g&&(bi(this,a,g,!0,!0,d,e),g instanceof ml&&g.type===nl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.uf(g)):a.fillRect(e.x,e.y,e.width,e.height));null!== +t.lc=function(a,b){if(this.visible){var c=this.opacity;if(0!==c){var d=this instanceof X&&(this.type===X.TableRow||this.type===X.TableColumn),e=this.vb;if(d||0!==e.width&&0!==e.height&&!isNaN(e.x)&&!isNaN(e.y)){var f=1;1!==c&&(f=a.globalAlpha,a.globalAlpha=f*c);if(d){e=this.vb;d=this.qc;var g=this.gd,h=this.Rb;null===g&&null===h||a.Fc();null!==g&&(bi(this,a,g,!0,!0,d,e),g instanceof ml&&g.type===nl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.uf(g)):a.fillRect(e.x,e.y,e.width,e.height));null!== h&&(bi(this,a,h,!0,!1,d,e),h instanceof ml&&h.type===nl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.uf(h)):a.fillRect(e.x,e.y,e.width,e.height));this.Fi(a,b)}else if(!this.Px(a,b)){this instanceof U&&this.sk(!1);d=this.transform;g=this.panel;0!==(this.G&4096)===!0&&ol(this);var k=this.part;h=!1;var l=0;if(k&&b.Fe("drawShadows")&&(h=k.isShadowed)){var m=k.shadowOffset;l=Math.max(m.y,m.x)*b.scale*b.ac}m=this.Ri();var n;if(!(n=b.zj||!m)){var p=this.naturalBounds;n=this.Mh;var r=n.m11,q=n.m21,u= n.dx,v=n.m12,w=n.m22,z=n.dy,y,A=y=0;n=y*r+A*q+u;var B=y*v+A*w+z;y=p.width+l;A=0;var F=y*r+A*q+u;y=y*v+A*w+z;A=Math.min(n,F);var K=Math.min(B,y);var S=Math.max(n+0,F)-A;var R=Math.max(B+0,y)-K;n=A;B=K;y=p.width+l;A=p.height+l;F=y*r+A*q+u;y=y*v+A*w+z;A=Math.min(n,F);K=Math.min(B,y);S=Math.max(n+S,F)-A;R=Math.max(B+R,y)-K;n=A;B=K;y=0;A=p.height+l;F=y*r+A*q+u;y=y*v+A*w+z;A=Math.min(n,F);K=Math.min(B,y);S=Math.max(n+S,F)-A;R=Math.max(B+R,y)-K;n=A;B=K;l=b.viewportBounds;p=l.x;r=l.y;n=!(n>l.width+p||p>S+ n||B>l.height+r||r>R+B)}if(n){n=0!==(this.G&256);a.clipInsteadOfFill&&(n=!1);this instanceof Lg&&(a.font=this.font);if(n){B=g.he()?g.naturalBounds:g.actualBounds;null!==this.$a?(p=this.$a,S=p.x,R=p.y,l=p.width,p=p.height):(S=Math.max(e.x,B.x),R=Math.max(e.y,B.y),l=Math.min(e.right,B.right)-S,p=Math.min(e.bottom,B.bottom)-R);if(S>e.width+e.x||e.x>B.width+B.x){1!==c&&(a.globalAlpha=f);return}a.save();a.beginPath();a.rect(S,R,l,p);a.clip()}if(m){if(!k.isVisible()){1!==c&&(a.globalAlpha=f);return}h&& -(B=k.shadowOffset,a.bw(B.x*b.scale*b.ac,B.y*b.scale*b.ac,k.shadowBlur),pl(a),a.shadowColor=k.shadowColor)}h&&!0===this.shadowVisible?pl(a):h&&!1===this.shadowVisible&&ql(a);k=this.naturalBounds;null!==this.fd&&(a.Bd(),bi(this,a,this.fd,!0,!0,k,e),this.fd instanceof ml&&this.fd.type===nl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.uf(this.fd)):a.fillRect(e.x,e.y,e.width,e.height));a.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);h&&(null!==g&&0!==(g.G&512)||null!==g&&(g.type===X.Auto||g.type=== -X.Spot)&&g.nb()!==this)&&null===this.shadowVisible&&ql(a);null!==this.Rb&&(a.Bd(),rl(this,a,k,e));h&&(null!==this.Rb||null!==this.fd||null!==g&&0!==(g.G&512)||null!==g&&(g.type===X.Auto||g.type===X.Spot)&&g.nb()!==this)?(sl(this,!0),null===this.shadowVisible&&ql(a)):sl(this,!1);this.Fi(a,b);h&&0!==(this.G&512)===!0&&pl(a);m&&h&&ql(a);n&&(a.restore(),a.Ec(this instanceof X));d.Os()||(b=1/(d.m11*d.m22-d.m12*d.m21),a.transform(d.m22*b,-d.m12*b,-d.m21*b,d.m11*b,b*(d.m21*d.dy-d.m22*d.dx),b*(d.m12*d.dx- +(B=k.shadowOffset,a.bw(B.x*b.scale*b.ac,B.y*b.scale*b.ac,k.shadowBlur),pl(a),a.shadowColor=k.shadowColor)}h&&!0===this.shadowVisible?pl(a):h&&!1===this.shadowVisible&&ql(a);k=this.naturalBounds;null!==this.gd&&(a.Fc(),bi(this,a,this.gd,!0,!0,k,e),this.gd instanceof ml&&this.gd.type===nl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.uf(this.gd)):a.fillRect(e.x,e.y,e.width,e.height));a.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);h&&(null!==g&&0!==(g.G&512)||null!==g&&(g.type===X.Auto||g.type=== +X.Spot)&&g.nb()!==this)&&null===this.shadowVisible&&ql(a);null!==this.Rb&&(a.Fc(),rl(this,a,k,e));h&&(null!==this.Rb||null!==this.gd||null!==g&&0!==(g.G&512)||null!==g&&(g.type===X.Auto||g.type===X.Spot)&&g.nb()!==this)?(sl(this,!0),null===this.shadowVisible&&ql(a)):sl(this,!1);this.Fi(a,b);h&&0!==(this.G&512)===!0&&pl(a);m&&h&&ql(a);n&&(a.restore(),a.Ec(this instanceof X));d.Os()||(b=1/(d.m11*d.m22-d.m12*d.m21),a.transform(d.m22*b,-d.m12*b,-d.m21*b,d.m11*b,b*(d.m21*d.dy-d.m22*d.dx),b*(d.m12*d.dx- d.m11*d.dy)))}}1!==c&&(a.globalAlpha=f)}}}};function rl(a,b,c,d){var e=a.naturalBounds,f=0,g=0,h=e.width;e=e.height;var k=a.Ow();a instanceof uf&&(e=a.ma.bounds,f=e.x,g=e.y,h=e.width,e=e.height);bi(a,b,a.Rb,!0,!1,c,d);a.Rb instanceof ml&&a.Rb.type===nl?(b.beginPath(),b.rect(f-k/2,g-k/2,h+k,e+k),b.uf(a.Rb)):b.fillRect(f-k/2,g-k/2,h+k,e+k)}t.Px=function(){return!1};t.Fi=function(){}; function bi(a,b,c,d,e,f,g){if(null!==c){var h=1,k=1;if("string"===typeof c)d?b.fillStyle=c:b.strokeStyle=c;else if(c.type===tl)d?b.fillStyle=c.color:b.strokeStyle=c.color;else{var l=0;a instanceof uf&&(l=a.strokeWidth);h=f.width;k=f.height;e?(h=g.width,k=g.height):d||(h+=l,k+=l);if((f=b instanceof ul)&&c.ke&&(c.type===vl||c.Pk===h&&c.At===k))var m=c.ke;else{var n=0,p=0,r=0,q=0,u=0,v=0;v=u=0;e?(u=g.x,v=g.y):d||(u-=l/2,v-=l/2);n=c.start.x*h+c.start.offsetX;p=c.start.y*k+c.start.offsetY;r=c.end.x*h+ c.end.offsetX;q=c.end.y*k+c.end.offsetY;n+=u;r+=u;p+=v;q+=v;if(c.type===wl)m=b.createLinearGradient(n,p,r,q);else if(c.type===nl)v=isNaN(c.endRadius)?Math.max(h,k)/2:c.endRadius,isNaN(c.startRadius)?(u=0,v=Math.max(h,k)/2):u=c.startRadius,m=b.createRadialGradient(n,p,u,r,q,v);else if(c.type===vl)try{m=b.createPattern(c.pattern,"repeat")}catch(z){m=null}if(c.type!==vl&&(e=c.colorStops,null!==e))for(e=e.iterator;e.next();)m.addColorStop(e.key,e.value);if(f&&(c.ke=m,null!==m&&(c.Pk=h,c.At=k),null=== m&&c.type===vl&&-1!==c.Pk)){c.Pk=-1;var w=a.diagram;null!==w&&-1===c.Pk&&ua(function(){w.redraw()},600)}}d?b.fillStyle=m:b.strokeStyle=m}}}t.mg=function(a){if(a instanceof X)a:{if(this!==a&&null!==a)for(var b=this.panel;null!==b;){if(b===a){a=!0;break a}b=b.panel}a=!1}else a=!1;return a};t.Bf=function(){if(!this.visible)return!1;var a=this.panel;return null!==a?a.Bf():!0};t.Af=function(){for(var a=this instanceof X?this:this.panel;null!==a&&a.isEnabled;)a=a.panel;return null===a}; function ol(a){if(0!==(a.G&2048)===!0){var b=a.tb;b.reset();if(!a.vb.u()||!a.ic.u()){xl(a,!1);return}b.translate(a.vb.x-a.ic.x,a.vb.y-a.ic.y);if(1!==a.scale||0!==a.angle){var c=a.naturalBounds;a.zp(b,c.x,c.y,c.width,c.height)}xl(a,!1);yl(a,!0)}0!==(a.G&4096)===!0&&(b=a.panel,null===b?(a.Mh.set(a.tb),a.al=a.scale,yl(a,!1)):null!==b.de&&(c=a.Mh,c.reset(),b.he()?c.multiply(b.Mh):null!==b.panel&&c.multiply(b.panel.Mh),c.multiply(a.tb),a.al=a.scale*b.al,yl(a,!1)))} -t.zp=function(a,b,c,d,e){1!==this.sa&&a.scale(this.sa);if(0!==this.xb){var f=J.alloc();f.Vi(b,c,d,e,yc);a.rotate(this.xb,f.x,f.y);J.free(f)}};t.s=function(a){if(!mj(this)){void 0===a&&(a=!1);hj(this,!0);il(this,!0);var b=this.panel;null===b||a||b.s()}};t.mk=function(){mj(this)||(hj(this,!0),il(this,!0))};function zl(a){if(!nj(a)){var b=a.panel;null!==b?b.s():a.Ri()&&(b=a.diagram,null!==b&&(b.qe.add(a),a instanceof W&&a.pd(),b.Fb()));il(a,!0)}} +t.zp=function(a,b,c,d,e){1!==this.sa&&a.scale(this.sa);if(0!==this.xb){var f=J.alloc();f.Vi(b,c,d,e,yc);a.rotate(this.xb,f.x,f.y);J.free(f)}};t.s=function(a){if(!mj(this)){void 0===a&&(a=!1);hj(this,!0);il(this,!0);var b=this.panel;null===b||a||b.s()}};t.mk=function(){mj(this)||(hj(this,!0),il(this,!0))};function zl(a){if(!nj(a)){var b=a.panel;null!==b?b.s():a.Ri()&&(b=a.diagram,null!==b&&(b.qe.add(a),a instanceof W&&a.qd(),b.Fb()));il(a,!0)}} t.ll=function(){0!==(this.G&2048)===!1&&(xl(this,!0),yl(this,!0))};t.Bv=function(){yl(this,!0)};t.N=function(){var a=this.part;null!==a&&a.N()}; function hl(a,b){var c=a.stretch,d=a.panel;if(null!==d&&d.type===X.Table)return Al(a,d.getRowDefinition(a.row),d.getColumnDefinition(a.column),b);if(null!==d&&d.type===X.Auto&&d.nb()===a)return Bl(a,sd,b);if(c===Uk){if(null!==d){if(d.type===X.Spot&&d.nb()===a)return Bl(a,sd,b);c=d.defaultStretch;return c===Uk?Bl(a,og,b):Bl(a,c,b)}return Bl(a,og,b)}return Bl(a,c,b)} function Al(a,b,c,d){var e=a.stretch;if(e!==Uk)return Bl(a,e,d);var f=e=null;switch(b.stretch){case Wk:f=!0;break;case sd:f=!0}switch(c.stretch){case Vk:e=!0;break;case sd:e=!0}b=a.panel.defaultStretch;null===e&&(e=b===Vk||b===sd);null===f&&(f=b===Wk||b===sd);return!0===e&&!0===f?Bl(a,sd,d):!0===e?Bl(a,Vk,d):!0===f?Bl(a,Wk,d):Bl(a,og,d)} function Bl(a,b,c){if(c)return b;if(b===og)return og;c=a.desiredSize;if(c.u())return og;a=a.angle;if(!isNaN(c.width))if(90!==a&&270!==a){if(b===Vk)return og;if(b===sd)return Wk}else{if(b===Wk)return og;if(b===sd)return Vk}if(!isNaN(c.height))if(90!==a&&270!==a){if(b===Wk)return og;if(b===sd)return Vk}else{if(b===Vk)return og;if(b===sd)return Wk}return b}function sl(a,b){a.G=b?a.G|512:a.G&-513}function dl(a){return 0!==(a.G&1024)}function Cl(a,b){a.G=b?a.G|1024:a.G&-1025} function xl(a,b){a.G=b?a.G|2048:a.G&-2049}function yl(a,b){a.G=b?a.G|4096:a.G&-4097}function mj(a){return 0!==(a.G&8192)}function hj(a,b){a.G=b?a.G|8192:a.G&-8193}function nj(a){return 0!==(a.G&16384)}function il(a,b){a.G=b?a.G|16384:a.G&-16385}t.Ti=function(a){this.Xf=a};t.gt=function(){};t.Zv=function(a){this.ka=a;zl(this);return!0};t.Gm=function(a,b){if(this.ka.x!==a||this.ka.y!==b)this.ka.h(a,b),this.ll()};t.Ow=function(){return 0}; -function Dl(a){var b=a.part;if(b instanceof W&&(null!==a.portId||a===b.port)){var c=b.diagram;null===c||c.undoManager.isUndoingRedoing||ll(b,a)}}function El(a){var b=a.diagram;null===b||b.undoManager.isUndoingRedoing||(a instanceof X?a instanceof W?a.pd():a.Mm(a,function(a){Dl(a)}):Dl(a))} -t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new ri(a,b,c,d):e=a;e.md=this;a=this.yh();null!==a&&Fl(a)&&C("Cannot add a Binding to a template that has already been copied: "+e);null===this.fb&&(this.fb=new E);this.fb.add(e);return this};t.set=function(a){Object.assign(this,a);return this};t.dv=function(a){Gl(this,a);return this};t.apply=function(a){a(this);return this};t.Hm=function(a){tj(this,a);return this};t.Vz=function(){return this.yh()}; -t.yh=function(){for(var a=this instanceof X?this:this.panel;null!==a;){if(null!==a.Ph)return a;a=a.panel}return null};t.fw=function(a){a.md=this;null===this.rg&&(this.rg=new I);this.rg.add(a.propertyName,a);return this}; +function Dl(a){var b=a.part;if(b instanceof W&&(null!==a.portId||a===b.port)){var c=b.diagram;null===c||c.undoManager.isUndoingRedoing||ll(b,a)}}function El(a){var b=a.diagram;null===b||b.undoManager.isUndoingRedoing||(a instanceof X?a instanceof W?a.qd():a.Mm(a,function(a){Dl(a)}):Dl(a))} +t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new ri(a,b,c,d):e=a;e.nd=this;a=this.yh();null!==a&&Fl(a)&&C("Cannot add a Binding to a template that has already been copied: "+e);null===this.fb&&(this.fb=new E);this.fb.add(e);return this};t.set=function(a){Object.assign(this,a);return this};t.dv=function(a){Gl(this,a);return this};t.apply=function(a){a(this);return this};t.Hm=function(a){tj(this,a);return this};t.Vz=function(){return this.yh()}; +t.yh=function(){for(var a=this instanceof X?this:this.panel;null!==a;){if(null!==a.Ph)return a;a=a.panel}return null};t.fw=function(a){a.nd=this;null===this.rg&&(this.rg=new I);this.rg.add(a.propertyName,a);return this}; function Hl(a,b){for(var c=1;ca||1=a&&C("GraphObject.scale for "+this+" must be greater than zero, not: "+a),this.sa=a,this.s(),this.g("scale",b,a))}},angle:{get:function(){return this.xb},set:function(a){var b=this.xb;b!==a&&(a%=360,0>a&&(a+=360),b!==a&&(this.xb=a,El(this),this.s(),this.g("angle",b,a)))}},desiredSize:{get:function(){return this.Sc},set:function(a){var b=a.width,c=a.height,d=this.Sc,e= -d.width,f=d.height;(e===b||isNaN(e)&&isNaN(b))&&(f===c||isNaN(f)&&isNaN(c))||(this.Sc=a=a.I(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",d,a),dl(this)&&(a=this.part,null!==a&&(el(this,a,"width"),el(this,a,"height"))))}},width:{get:function(){return this.Sc.width},set:function(a){var b=this.Sc.width;b===a||isNaN(b)&&isNaN(a)||(b=this.Sc,this.Sc=a=(new M(a,this.Sc.height)).freeze(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",b,a),dl(this)&& -(a=this.part,null!==a&&el(this,a,"width")))}},height:{get:function(){return this.Sc.height},set:function(a){var b=this.Sc.height;b===a||isNaN(b)&&isNaN(a)||(b=this.Sc,this.Sc=a=(new M(this.Sc.width,a)).freeze(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",b,a),dl(this)&&(a=this.part,null!==a&&el(this,a,"height")))}},minSize:{get:function(){return this.Uf},set:function(a){var b=this.Uf;b.A(a)||(a=a.copy(),isNaN(a.width)&&(a.width= +get:function(){return this.sa},set:function(a){var b=this.sa;b!==a&&(0>=a&&C("GraphObject.scale for "+this+" must be greater than zero, not: "+a),this.sa=a,this.s(),this.g("scale",b,a))}},angle:{get:function(){return this.xb},set:function(a){var b=this.xb;b!==a&&(a%=360,0>a&&(a+=360),b!==a&&(this.xb=a,El(this),this.s(),this.g("angle",b,a)))}},desiredSize:{get:function(){return this.Tc},set:function(a){var b=a.width,c=a.height,d=this.Tc,e= +d.width,f=d.height;(e===b||isNaN(e)&&isNaN(b))&&(f===c||isNaN(f)&&isNaN(c))||(this.Tc=a=a.I(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",d,a),dl(this)&&(a=this.part,null!==a&&(el(this,a,"width"),el(this,a,"height"))))}},width:{get:function(){return this.Tc.width},set:function(a){var b=this.Tc.width;b===a||isNaN(b)&&isNaN(a)||(b=this.Tc,this.Tc=a=(new M(a,this.Tc.height)).freeze(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",b,a),dl(this)&& +(a=this.part,null!==a&&el(this,a,"width")))}},height:{get:function(){return this.Tc.height},set:function(a){var b=this.Tc.height;b===a||isNaN(b)&&isNaN(a)||(b=this.Tc,this.Tc=a=(new M(this.Tc.width,a)).freeze(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",b,a),dl(this)&&(a=this.part,null!==a&&el(this,a,"height")))}},minSize:{get:function(){return this.Uf},set:function(a){var b=this.Uf;b.A(a)||(a=a.copy(),isNaN(a.width)&&(a.width= 0),isNaN(a.height)&&(a.height=0),a.freeze(),this.Uf=a,this.s(),this.g("minSize",b,a))}},maxSize:{get:function(){return this.Tf},set:function(a){var b=this.Tf;b.A(a)||(a=a.copy(),isNaN(a.width)&&(a.width=Infinity),isNaN(a.height)&&(a.height=Infinity),a.freeze(),this.Tf=a,this.s(),this.g("maxSize",b,a))}},measuredBounds:{get:function(){return this.ic}},naturalBounds:{get:function(){return this.qc}},margin:{ get:function(){return this.Pg},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.Pg;b.A(a)||(this.Pg=a=a.I(),this.s(),this.g("margin",b,a))}},transform:{get:function(){0!==(this.G&2048)===!0&&ol(this);return this.tb}},de:{get:function(){0!==(this.G&4096)===!0&&ol(this);return this.Mh}},alignment:{get:function(){return this.wb},set:function(a){var b=this.wb;b.A(a)||(a.wc()&&!a.Lb()&& C("GraphObject.alignment for "+this+" must be a real Spot or Spot.Default, not: "+a),this.wb=a=a.I(),zl(this),this.g("alignment",b,a))}},column:{get:function(){return this.wg},set:function(a){a=Math.round(a);var b=this.wg;b!==a&&(0>a&&xa(a,">= 0",Y,"column"),this.wg=a,this.s(),this.g("column",b,a))}},columnSpan:{get:function(){return this.jn},set:function(a){a=Math.round(a);var b=this.jn;b!==a&&(1>a&&xa(a,">= 1",Y,"columnSpan"),this.jn=a, this.s(),this.g("columnSpan",b,a))}},row:{get:function(){return this.np},set:function(a){a=Math.round(a);var b=this.np;b!==a&&(0>a&&xa(a,">= 0",Y,"row"),this.np=a,this.s(),this.g("row",b,a))}},rowSpan:{get:function(){return this.op},set:function(a){a=Math.round(a);var b=this.op;b!==a&&(1>a&&xa(a,">= 1",Y,"rowSpan"),this.op=a,this.s(),this.g("rowSpan",b,a))}},spanAllocation:{get:function(){return this.Fp},set:function(a){var b= this.Fp;b!==a&&(this.Fp=a,this.s(),this.g("spanAllocation",b,a))}},alignmentFocus:{get:function(){return this.Gk},set:function(a){var b=this.Gk;b.A(a)||(this.Gk=a=a.I(),this.s(),this.g("alignmentFocus",b,a))}},portId:{get:function(){return this.ap},set:function(a){var b=this.ap;if(b!==a){var c=this.part;null===c||c instanceof W||C("Cannot set portID on a Link: "+a);null!==b&&null!==c&&Ol(c,this);this.ap=a;null!==a&&null!==c&&(c.Ge=!0,Pl(c, -this));this.g("portId",b,a)}}},toSpot:{get:function(){return null!==this.P?this.P.ph:rc},set:function(a){this.Hc();var b=this.P.ph;b.A(a)||(a=a.I(),this.P.ph=a,this.g("toSpot",b,a),Dl(this))}},toEndSegmentLength:{get:function(){return null!==this.P?this.P.nh:10},set:function(a){this.Hc();var b=this.P.nh;b!==a&&(0>a&&xa(a,">= 0",Y,"toEndSegmentLength"),this.P.nh=a,this.g("toEndSegmentLength",b,a),Dl(this))}},toShortLength:{ -get:function(){return null!==this.P?this.P.oh:0},set:function(a){this.Hc();var b=this.P.oh;b!==a&&(this.P.oh=a,this.g("toShortLength",b,a),Dl(this))}},toLinkable:{get:function(){return null!==this.P?this.P.Mp:null},set:function(a){this.Hc();var b=this.P.Mp;b!==a&&(this.P.Mp=a,this.g("toLinkable",b,a))}},toMaxLinks:{get:function(){return null!==this.P?this.P.Np:Infinity},set:function(a){this.Hc();var b=this.P.Np;b!==a&&(0>a&& -xa(a,">= 0",Y,"toMaxLinks"),this.P.Np=a,this.g("toMaxLinks",b,a))}},fromSpot:{get:function(){return null!==this.P?this.P.Jg:rc},set:function(a){this.Hc();var b=this.P.Jg;b.A(a)||(a=a.I(),this.P.Jg=a,this.g("fromSpot",b,a),Dl(this))}},fromEndSegmentLength:{get:function(){return null!==this.P?this.P.Hg:10},set:function(a){this.Hc();var b=this.P.Hg;b!==a&&(0>a&&xa(a,">= 0",Y,"fromEndSegmentLength"),this.P.Hg=a,this.g("fromEndSegmentLength", -b,a),Dl(this))}},fromShortLength:{get:function(){return null!==this.P?this.P.Ig:0},set:function(a){this.Hc();var b=this.P.Ig;b!==a&&(this.P.Ig=a,this.g("fromShortLength",b,a),Dl(this))}},fromLinkable:{get:function(){return null!==this.P?this.P.Mn:null},set:function(a){this.Hc();var b=this.P.Mn;b!==a&&(this.P.Mn=a,this.g("fromLinkable",b,a))}},fromMaxLinks:{get:function(){return null!==this.P?this.P.Nn:Infinity}, -set:function(a){this.Hc();var b=this.P.Nn;b!==a&&(0>a&&xa(a,">= 0",Y,"fromMaxLinks"),this.P.Nn=a,this.g("fromMaxLinks",b,a))}},cursor:{get:function(){return this.Sh},set:function(a){var b=this.Sh;b!==a&&(this.Sh=a,this.g("cursor",b,a))}},click:{get:function(){return null!==this.O?this.O.vg:null},set:function(a){al(this);var b=this.O.vg;b!==a&&(this.O.vg=a,this.g("click",b,a))}},doubleClick:{get:function(){return null!== +this));this.g("portId",b,a)}}},toSpot:{get:function(){return null!==this.P?this.P.ph:rc},set:function(a){this.Ic();var b=this.P.ph;b.A(a)||(a=a.I(),this.P.ph=a,this.g("toSpot",b,a),Dl(this))}},toEndSegmentLength:{get:function(){return null!==this.P?this.P.nh:10},set:function(a){this.Ic();var b=this.P.nh;b!==a&&(0>a&&xa(a,">= 0",Y,"toEndSegmentLength"),this.P.nh=a,this.g("toEndSegmentLength",b,a),Dl(this))}},toShortLength:{ +get:function(){return null!==this.P?this.P.oh:0},set:function(a){this.Ic();var b=this.P.oh;b!==a&&(this.P.oh=a,this.g("toShortLength",b,a),Dl(this))}},toLinkable:{get:function(){return null!==this.P?this.P.Mp:null},set:function(a){this.Ic();var b=this.P.Mp;b!==a&&(this.P.Mp=a,this.g("toLinkable",b,a))}},toMaxLinks:{get:function(){return null!==this.P?this.P.Np:Infinity},set:function(a){this.Ic();var b=this.P.Np;b!==a&&(0>a&& +xa(a,">= 0",Y,"toMaxLinks"),this.P.Np=a,this.g("toMaxLinks",b,a))}},fromSpot:{get:function(){return null!==this.P?this.P.Jg:rc},set:function(a){this.Ic();var b=this.P.Jg;b.A(a)||(a=a.I(),this.P.Jg=a,this.g("fromSpot",b,a),Dl(this))}},fromEndSegmentLength:{get:function(){return null!==this.P?this.P.Hg:10},set:function(a){this.Ic();var b=this.P.Hg;b!==a&&(0>a&&xa(a,">= 0",Y,"fromEndSegmentLength"),this.P.Hg=a,this.g("fromEndSegmentLength", +b,a),Dl(this))}},fromShortLength:{get:function(){return null!==this.P?this.P.Ig:0},set:function(a){this.Ic();var b=this.P.Ig;b!==a&&(this.P.Ig=a,this.g("fromShortLength",b,a),Dl(this))}},fromLinkable:{get:function(){return null!==this.P?this.P.Mn:null},set:function(a){this.Ic();var b=this.P.Mn;b!==a&&(this.P.Mn=a,this.g("fromLinkable",b,a))}},fromMaxLinks:{get:function(){return null!==this.P?this.P.Nn:Infinity}, +set:function(a){this.Ic();var b=this.P.Nn;b!==a&&(0>a&&xa(a,">= 0",Y,"fromMaxLinks"),this.P.Nn=a,this.g("fromMaxLinks",b,a))}},cursor:{get:function(){return this.Sh},set:function(a){var b=this.Sh;b!==a&&(this.Sh=a,this.g("cursor",b,a))}},click:{get:function(){return null!==this.O?this.O.vg:null},set:function(a){al(this);var b=this.O.vg;b!==a&&(this.O.vg=a,this.g("click",b,a))}},doubleClick:{get:function(){return null!== this.O?this.O.Dg:null},set:function(a){al(this);var b=this.O.Dg;b!==a&&(this.O.Dg=a,this.g("doubleClick",b,a))}},contextClick:{get:function(){return null!==this.O?this.O.xg:null},set:function(a){al(this);var b=this.O.xg;b!==a&&(this.O.xg=a,this.g("contextClick",b,a))}},mouseEnter:{get:function(){return null!==this.O?this.O.Sg:null},set:function(a){al(this);var b=this.O.Sg;b!==a&&(this.O.Sg=a,this.g("mouseEnter",b,a))}},mouseLeave:{ get:function(){return null!==this.O?this.O.Vg:null},set:function(a){al(this);var b=this.O.Vg;b!==a&&(this.O.Vg=a,this.g("mouseLeave",b,a))}},mouseOver:{get:function(){return null!==this.O?this.O.Wg:null},set:function(a){al(this);var b=this.O.Wg;b!==a&&(this.O.Wg=a,this.g("mouseOver",b,a))}},mouseHover:{get:function(){return null!==this.O?this.O.Ug:null},set:function(a){al(this);var b=this.O.Ug;b!==a&&(this.O.Ug=a,this.g("mouseHover", b,a))}},mouseHold:{get:function(){return null!==this.O?this.O.Tg:null},set:function(a){al(this);var b=this.O.Tg;b!==a&&(this.O.Tg=a,this.g("mouseHold",b,a))}},mouseDragEnter:{get:function(){return null!==this.O?this.O.Ho:null},set:function(a){al(this);var b=this.O.Ho;b!==a&&(this.O.Ho=a,this.g("mouseDragEnter",b,a))}},mouseDragLeave:{get:function(){return null!==this.O?this.O.Io:null},set:function(a){al(this); @@ -962,7 +962,7 @@ var b=this.O.Io;b!==a&&(this.O.Io=a,this.g("mouseDragLeave",b,a))}},mouseDrop:{g this.O?this.O.Wm:null},set:function(a){al(this);var b=this.O.Wm;b!==a&&(this.O.Wm=a,this.g("actionMove",b,a))}},actionUp:{get:function(){return null!==this.O?this.O.Xm:null},set:function(a){al(this);var b=this.O.Xm;b!==a&&(this.O.Xm=a,this.g("actionUp",b,a))}},actionCancel:{get:function(){return null!==this.O?this.O.Um:null},set:function(a){al(this);var b=this.O.Um;b!==a&&(this.O.Um=a,this.g("actionCancel",b,a))}},toolTip:{ get:function(){return null!==this.O?this.O.qh:null},set:function(a){al(this);var b=this.O.qh;b!==a&&(this.O.qh=a,this.g("toolTip",b,a))}},contextMenu:{get:function(){return null!==this.O?this.O.yg:null},set:function(a){al(this);var b=this.O.yg;b!==a&&(this.O.yg=a,this.g("contextMenu",b,a))}}});Y.prototype.trigger=Y.prototype.fw;Y.prototype.findBindingPanel=Y.prototype.yh;Y.prototype.findTemplateBinder=Y.prototype.Vz;Y.prototype.setProperties=Y.prototype.Hm; Y.prototype.apply=Y.prototype.apply;Y.prototype.attach=Y.prototype.dv;Y.prototype.set=Y.prototype.set;Y.prototype.isEnabledObject=Y.prototype.Af;Y.prototype.isVisibleObject=Y.prototype.Bf;Y.prototype.isContainedBy=Y.prototype.mg;Y.prototype.getNearestIntersectionPoint=Y.prototype.Is;Y.prototype.getLocalPoint=Y.prototype.Hs;Y.prototype.getDocumentScale=Y.prototype.wf;Y.prototype.getDocumentAngle=Y.prototype.Li;Y.prototype.getDocumentBounds=Y.prototype.Mi;Y.prototype.getDocumentPoint=Y.prototype.da; -Y.prototype.intersectsRect=Y.prototype.Ic;Y.prototype.containedInRect=Y.prototype.wh;Y.prototype.containsRect=Y.prototype.De;Y.prototype.containsPoint=Y.prototype.$;Y.prototype.raiseChanged=Y.prototype.g;Y.prototype.raiseChangedEvent=Y.prototype.Va;Y.prototype.addCopyProperty=Y.prototype.yx;var Il=null;Y.className="GraphObject";Il=new I; +Y.prototype.intersectsRect=Y.prototype.Jc;Y.prototype.containedInRect=Y.prototype.wh;Y.prototype.containsRect=Y.prototype.De;Y.prototype.containsPoint=Y.prototype.$;Y.prototype.raiseChanged=Y.prototype.g;Y.prototype.raiseChangedEvent=Y.prototype.Va;Y.prototype.addCopyProperty=Y.prototype.yx;var Il=null;Y.className="GraphObject";Il=new I; Ll("Button",function(){function a(a,b){return null!==a.diagram.Wb(a.documentPoint,function(a){for(;null!==a.panel&&!a.isActionable;)a=a.panel;return a},function(a){return a===b})}var b=Hl(X,X.Auto,{isActionable:!0,enabledChanged:function(a,b){if(a instanceof X){var c=a.Ya("ButtonBorder");null!==c&&(c.fill=b?a._buttonFillNormal:a._buttonFillDisabled)}},cursor:"pointer",_buttonFillNormal:"#F5F5F5",_buttonStrokeNormal:"#BDBDBD",_buttonFillOver:"#E0E0E0",_buttonStrokeOver:"#9E9E9E",_buttonFillPressed:"#BDBDBD", _buttonStrokePressed:"#9E9E9E",_buttonFillDisabled:"#E5E5E5"},Hl(uf,{name:"ButtonBorder",figure:"RoundedRectangle",spot1:new P(0,0,2.76142374915397,2.761423749153969),spot2:new P(1,1,-2.76142374915397,-2.761423749153969),parameter1:2,parameter2:2,fill:"#F5F5F5",stroke:"#BDBDBD"}));b.mouseEnter=function(a,b){if(b.Af()&&b instanceof X&&(a=b.Ya("ButtonBorder"),a instanceof uf)){var c=b._buttonFillOver;b._buttonFillNormal=a.fill;a.fill=c;c=b._buttonStrokeOver;b._buttonStrokeNormal=a.stroke;a.stroke=c}}; b.mouseLeave=function(a,b){b.Af()&&b instanceof X&&(a=b.Ya("ButtonBorder"),a instanceof uf&&(a.fill=b._buttonFillNormal,a.stroke=b._buttonStrokeNormal))};b.actionDown=function(a,b){if(b.Af()&&b instanceof X&&null!==b._buttonFillPressed&&0===a.button){var c=b.Ya("ButtonBorder");if(c instanceof uf){a=a.diagram;var d=a.skipsUndoManager;a.skipsUndoManager=!0;var g=b._buttonFillPressed;b._buttonFillOver=c.fill;c.fill=g;g=b._buttonStrokePressed;b._buttonStrokeOver=c.stroke;c.stroke=g;a.skipsUndoManager= @@ -989,8 +989,8 @@ function wj(a,b){this.ownerDocument=a=void 0===b?x.document:b;this.FA="http://ww wj.prototype.resize=function(a,b,c,d){return this.width!==a||this.height!==b?(this.style.width=c+"px",this.style.height=d+"px",this.La.setAttributeNS(null,"width",c+"px"),this.La.setAttributeNS(null,"height",d+"px"),this.La.setAttributeNS(null,"viewBox","0 0 "+c+" "+d),this.context.Yw.firstElementChild.setAttributeNS(null,"width",c+"px"),this.context.Yw.firstElementChild.setAttributeNS(null,"height",d+"px"),!0):!1}; wj.prototype.Ob=function(a,b,c){a=this.ownerDocument.createElementNS(this.FA,a);if(za(b))for(var d in b)a.setAttributeNS("href"===d?"http://www.w3.org/1999/xlink":"",d,b[d]);void 0!==c&&(a.textContent=c);return a};wj.prototype.getBoundingClientRect=function(){return this.La.getBoundingClientRect()};wj.prototype.focus=function(){this.La.focus()};wj.prototype.Ox=function(){this.ownerDocument=null}; na.Object.defineProperties(wj.prototype,{width:{get:function(){return this.La.width.baseVal.value},set:function(a){this.La.width=a}},height:{get:function(){return this.La.height.baseVal.value},set:function(a){this.La.height=a}},style:{get:function(){return this.La.style}}});wj.className="SVGSurface"; -function Sl(a){this.jt=a;this.svg=a.La;this.stack=[];this.dd=[];this.fillStyle="#000000";this.font="10px sans-serif";this.globalAlpha=1;this.lineCap="butt";this.lineDashOffset=0;this.lineJoin="miter";this.lineWidth=1;this.miterLimit=10;this.shadowBlur=0;this.shadowColor="rgba(0, 0, 0, 0)";this.shadowOffsetY=this.shadowOffsetX=0;this.strokeStyle="#000000";this.textAlign="start";this.clipInsteadOfFill=!1;this.bg=this.fs=this.es=0;this.Rs=null;this.path=[];this.Yt=!1;this.ih=null;this.jh=0;this.Ee=new Ql; -Tl(this,1,0,0,1,0,0);var b=kb++,c=this.Ob("clipPath",{id:"mainClip"+b});c.appendChild(this.Ob("rect",{x:0,y:0,width:a.width,height:a.height}));this.Yw=c;this.jt.La.appendChild(c);this.dd[0].setAttributeNS(null,"clip-path","url(#mainClip"+b+")");this.HA={}}t=Sl.prototype; +function Sl(a){this.jt=a;this.svg=a.La;this.stack=[];this.ed=[];this.fillStyle="#000000";this.font="10px sans-serif";this.globalAlpha=1;this.lineCap="butt";this.lineDashOffset=0;this.lineJoin="miter";this.lineWidth=1;this.miterLimit=10;this.shadowBlur=0;this.shadowColor="rgba(0, 0, 0, 0)";this.shadowOffsetY=this.shadowOffsetX=0;this.strokeStyle="#000000";this.textAlign="start";this.clipInsteadOfFill=!1;this.bg=this.fs=this.es=0;this.Rs=null;this.path=[];this.Yt=!1;this.ih=null;this.jh=0;this.Ee=new Ql; +Tl(this,1,0,0,1,0,0);var b=kb++,c=this.Ob("clipPath",{id:"mainClip"+b});c.appendChild(this.Ob("rect",{x:0,y:0,width:a.width,height:a.height}));this.Yw=c;this.jt.La.appendChild(c);this.ed[0].setAttributeNS(null,"clip-path","url(#mainClip"+b+")");this.HA={}}t=Sl.prototype; t.arc=function(a,b,c,d,e,f,g,h){var k=2*Math.PI,l=k-1E-6,m=c*Math.cos(d),n=c*Math.sin(d),p=a+m,r=b+n,q=f?0:1;d=f?d-e:e-d;(1E-6d&&(d=d%k+k);d>l?(this.path.push(["A",c,c,0,1,q,a-m,b-n]),this.path.push(["A",c,c,0,1,q,p,r])):1E-6=Math.PI),q,a+c*Math.cos(e),b+c*Math.sin(e)])};t.beginPath=function(){this.path=[]};t.bezierCurveTo=function(a,b,c,d,e,f){this.path.push(["C",a,b,c,d,e,f])};t.clearRect=function(){}; t.clip=function(){this.addPath("clipPath",this.path,this.Ee)};t.closePath=function(){this.path.push(["z"])};t.createLinearGradient=function(a,b,c,d){var e=new Rl("linear");e.x1=a;e.y1=b;e.x2=c;e.y2=d;return e}; t.createPattern=function(a){var b="";a instanceof HTMLCanvasElement&&(b=a.toDataURL());a instanceof HTMLImageElement&&(b=a.getAttribute("src"));var c=this.HA;if(c[b])return"url(#"+c[b]+")";var d="PATTERN"+kb++,e={x:0,y:0,width:a.width,height:a.height,href:b};a=this.Ob("pattern",{width:a.width,height:a.height,id:d,patternUnits:"userSpaceOnUse"});a.appendChild(this.Ob(zk,e));this.svg.appendChild(a);c[b]=d;return"url(#"+d+")"}; @@ -1001,38 +1001,38 @@ t.uf=function(){this.clipInsteadOfFill?this.clip():this.fill()};t.fillRect=funct t.moveTo=function(a,b){this.path.push(["M",a,b])};t.quadraticCurveTo=function(a,b,c,d){this.path.push(["Q",a,b,c,d])};t.rect=function(a,b,c,d){this.path.push(["M",a,b],["L",a+c,b],["L",a+c,b+d],["L",a,b+d],["z"])}; t.restore=function(){this.Ee=this.stack.pop();this.path=this.stack.pop();var a=this.stack.pop();this.fillStyle=a.fillStyle;this.font=a.font;this.globalAlpha=a.globalAlpha;this.lineCap=a.lineCap;this.lineDashOffset=a.lineDashOffset;this.lineJoin=a.lineJoin;this.lineWidth=a.lineWidth;this.miterLimit=a.miterLimit;this.shadowBlur=a.shadowBlur;this.shadowColor=a.shadowColor;this.shadowOffsetX=a.shadowOffsetX;this.shadowOffsetY=a.shadowOffsetY;this.strokeStyle=a.strokeStyle;this.textAlign=a.textAlign}; t.save=function(){this.stack.push({fillStyle:this.fillStyle,font:this.font,globalAlpha:this.globalAlpha,lineCap:this.lineCap,lineDashOffset:this.lineDashOffset,lineJoin:this.lineJoin,lineWidth:this.lineWidth,miterLimit:this.miterLimit,shadowBlur:this.shadowBlur,shadowColor:this.shadowColor,shadowOffsetX:this.shadowOffsetX,shadowOffsetY:this.shadowOffsetY,strokeStyle:this.strokeStyle,textAlign:this.textAlign});for(var a=[],b=0;bb.offset?1:-1});for(e=0;eg.width+g.x||g.x> k.width+k.x||n>g.height+g.y||g.y>k.height+k.y)return!0;k=!0;Tl(a,1,0,0,1,0,0);a.save();a.beginPath();a.rect(m,n,p,l);a.clip()}if(this.Ri()&&!this.isVisible())return!0;a.Ee.Ma=[1,0,0,1,0,0];(this instanceof Lg&&1b?(this.scale(b/a,1),this.translate((a-b)/2,0)):b>a&&(this.scale(1,a/b),this.translate(0,(b-a)/2));this.hn?this.clip():this.fill();a>b?(this.translate(-(a-b)/2,0),this.scale(1/(b/a),1)):b>a&&(this.translate(0,-(b-a)/2),this.scale(1,1/(a/b)))}else this.hn?this.clip():this.fill()};t.Xi=function(){this.hn||this.stroke()};t.bw=function(a,b,c){this.es=a;this.fs=b;this.bg=c}; t.As=function(a,b){var c=this.Y;void 0!==c.setLineDash&&(c.setLineDash(a),c.lineDashOffset=b)};t.ys=function(){var a=this.Y;void 0!==a.setLineDash&&(a.setLineDash(Wl),a.lineDashOffset=0)};t.Ec=function(a){a&&(this.yt="");this.xt=this.zt=""}; na.Object.defineProperties(ul.prototype,{fillStyle:{get:function(){return this.Y.fillStyle},set:function(a){this.xt!==a&&(this.xt=this.Y.fillStyle=a)}},font:{get:function(){return this.Y.font},set:function(a){this.yt!==a&&(this.yt=this.Y.font=a)}},globalAlpha:{get:function(){return this.Y.globalAlpha},set:function(a){this.Y.globalAlpha=a}},lineCap:{get:function(){return this.Y.lineCap}, set:function(a){this.Y.lineCap=a}},lineDashOffset:{get:function(){return this.Y.lineDashOffset},set:function(a){this.Y.lineDashOffset=a}},lineJoin:{get:function(){return this.Y.lineJoin},set:function(a){this.Y.lineJoin=a}},lineWidth:{get:function(){return this.Y.lineWidth},set:function(a){this.Y.lineWidth=a}},miterLimit:{get:function(){return this.Y.miterLimit},set:function(a){this.Y.miterLimit= a}},shadowBlur:{get:function(){return this.Y.shadowBlur},set:function(a){this.Y.shadowBlur=a}},shadowColor:{get:function(){return this.Y.shadowColor},set:function(a){this.Y.shadowColor=a}},shadowOffsetX:{get:function(){return this.Y.shadowOffsetX},set:function(a){this.Y.shadowOffsetX=a}},shadowOffsetY:{get:function(){return this.Y.shadowOffsetY},set:function(a){this.Y.shadowOffsetY= a}},strokeStyle:{get:function(){return this.Y.strokeStyle},set:function(a){this.zt!==a&&(this.zt=this.Y.strokeStyle=a)}},textAlign:{get:function(){return this.Y.textAlign},set:function(a){this.Y.textAlign=a}},imageSmoothingEnabled:{get:function(){return this.Y.imageSmoothingEnabled},set:function(a){this.Y.imageSmoothingEnabled=a}},clipInsteadOfFill:{get:function(){return this.hn}, -set:function(a){this.hn=a}}});var Wl=Object.freeze([]);ul.className="CanvasSurfaceContext";function Xl(){this.M=this.o=this.C=this.j=0}Xl.className="ColorNumbers";function ml(a,b){Yl||(Zl(),Yl=!0);Ta(this);this.v=!1;void 0===a?(this.ia=tl,this.Ok="black"):"string"===typeof a?(this.ia=tl,this.Ok=a):(this.ia=a,this.Ok="black");a=this.ia;a===wl?(this.zd=vc,this.bl=Bc):this.bl=a===nl?this.zd=yc:this.zd=rc;this.js=0;this.jr=NaN;this.ke=this.Ur=this.je=null;this.At=this.Pk=0;b&&Object.assign(this,b)} -ml.prototype.copy=function(){var a=new ml;a.ia=this.ia;a.Ok=this.Ok;a.zd=this.zd.I();a.bl=this.bl.I();a.js=this.js;a.jr=this.jr;null!==this.je&&(a.je=this.je.copy());a.Ur=this.Ur;return a};t=ml.prototype;t.freeze=function(){this.v=!0;null!==this.je&&this.je.freeze();return this};t.ea=function(){Object.isFrozen(this)&&C("cannot thaw constant: "+this);this.v=!1;null!==this.je&&this.je.ea();return this};t.gb=function(a){a.classType===ml&&(this.type=a)}; +set:function(a){this.hn=a}}});var Wl=Object.freeze([]);ul.className="CanvasSurfaceContext";function Xl(){this.M=this.o=this.C=this.j=0}Xl.className="ColorNumbers";function ml(a,b){Yl||(Zl(),Yl=!0);Ta(this);this.v=!1;void 0===a?(this.ia=tl,this.Ok="black"):"string"===typeof a?(this.ia=tl,this.Ok=a):(this.ia=a,this.Ok="black");a=this.ia;a===wl?(this.Ad=vc,this.bl=Bc):this.bl=a===nl?this.Ad=yc:this.Ad=rc;this.js=0;this.jr=NaN;this.ke=this.Ur=this.je=null;this.At=this.Pk=0;b&&Object.assign(this,b)} +ml.prototype.copy=function(){var a=new ml;a.ia=this.ia;a.Ok=this.Ok;a.Ad=this.Ad.I();a.bl=this.bl.I();a.js=this.js;a.jr=this.jr;null!==this.je&&(a.je=this.je.copy());a.Ur=this.Ur;return a};t=ml.prototype;t.freeze=function(){this.v=!0;null!==this.je&&this.je.freeze();return this};t.ea=function(){Object.isFrozen(this)&&C("cannot thaw constant: "+this);this.v=!1;null!==this.je&&this.je.ea();return this};t.gb=function(a){a.classType===ml&&(this.type=a)}; t.toString=function(){var a="Brush(";if(this.type===tl)a+=this.color;else if(a=this.type===wl?a+"Linear ":this.type===nl?a+"Radial ":this.type===vl?a+"Pattern ":a+"(unknown) ",a+=this.start+" "+this.end,null!==this.colorStops)for(var b=this.colorStops.iterator;b.next();)a+=" "+b.key+":"+b.value;return a+")"}; t.addColorStop=function(a,b){this.v&&wa(this);("number"!==typeof a||!isFinite(a)||1a)&&xa(a,"0 <= loc <= 1",ml,"addColorStop:loc");null===this.je&&(this.je=new I);this.je.add(a,b);this.ia===tl&&(this.type=wl);this.ke=null;return this}; t.yA=function(a,b){this.v&&wa(this);a=void 0===a||"number"!==typeof a?.2:a;b=void 0===b?$l:b;if(this.type===tl)Ph(this.color),this.color=am(a,b);else if((this.type===wl||this.type===nl)&&null!==this.colorStops)for(var c=this.colorStops.iterator;c.next();)Ph(c.value),this.addColorStop(c.key,am(a,b));return this};function bm(a,b,c){b=void 0===b||"number"!==typeof b?.2:b;c=void 0===c?$l:c;Ph(a);return am(b,c)} @@ -1045,8 +1045,8 @@ hm.C+.041556*hm.o;b=.0556434*hm.j+-.2040259*hm.C+1.0572252*hm.o;em.j=255*om((3.2 Rh.M+")";default:C("Unknown color space: "+b)}}function Ph(a){Yl||(Zl(),Yl=!0);var b=qm;if(null!==b){b.clearRect(0,0,1,1);b.fillStyle="#000000";var c=b.fillStyle;b.fillStyle=a;b.fillStyle!==c?(b.fillRect(0,0,1,1),a=b.getImageData(0,0,1,1).data,em.j=a[0],em.C=a[1],em.o=a[2],em.M=a[3]/255):(b.fillStyle="#FFFFFF",b.fillStyle=a,em.j=0,em.C=0,em.o=0,em.M=1)}} function Qh(){var a=em.j/255,b=em.C/255,c=em.o/255,d=Math.max(a,b,c),e=Math.min(a,b,c),f=d-e;e=(d+e)/2;if(0===f)var g=a=0;else{switch(d){case a:g=(b-c)/f%6;break;case b:g=(c-a)/f+2;break;case c:g=(a-b)/f+4}g*=60;0>g&&(g+=360);a=f/(1-Math.abs(2*e-1))}Rh.j=Math.round(g);Rh.C=Math.round(100*a);Rh.o=Math.round(100*e);Rh.M=em.M}function gm(a){a/=255;return.04045>=a?a/12.92:Math.pow((a+.055)/1.055,2.4)}function om(a){return.0031308>=a?12.92*a:1.055*Math.pow(a,1/2.4)-.055} function im(a){return a>nm?Math.pow(a,1/3):(mm*a+16)/116}function lm(a){var b=a*a*a;return b>nm?b:(116*a-16)/mm}function Nl(a,b){"string"!==typeof a&&(a instanceof ml||C("Value for "+b+" must be a color string or a Brush, not "+a))}function Zl(){qm=Jg?(new Ak(null)).context:null} -na.Object.defineProperties(ml.prototype,{type:{get:function(){return this.ia},set:function(a){this.v&&wa(this,a);this.ia=a;this.start.wc()&&(a===wl?this.start=vc:a===nl&&(this.start=yc));this.end.wc()&&(a===wl?this.end=Bc:a===nl&&(this.end=yc));this.ke=null}},color:{get:function(){return this.Ok},set:function(a){this.v&&wa(this,a);this.Ok=a;this.ke=null}},start:{get:function(){return this.zd},set:function(a){this.v&& -wa(this,a);this.zd=a.I();this.ke=null}},end:{get:function(){return this.bl},set:function(a){this.v&&wa(this,a);this.bl=a.I();this.ke=null}},startRadius:{get:function(){return this.js},set:function(a){this.v&&wa(this,a);0>a&&xa(a,">= zero",ml,"startRadius");this.js=a;this.ke=null}},endRadius:{get:function(){return this.jr},set:function(a){this.v&&wa(this,a);0>a&&xa(a,">= zero",ml,"endRadius");this.jr=a;this.ke= +na.Object.defineProperties(ml.prototype,{type:{get:function(){return this.ia},set:function(a){this.v&&wa(this,a);this.ia=a;this.start.wc()&&(a===wl?this.start=vc:a===nl&&(this.start=yc));this.end.wc()&&(a===wl?this.end=Bc:a===nl&&(this.end=yc));this.ke=null}},color:{get:function(){return this.Ok},set:function(a){this.v&&wa(this,a);this.Ok=a;this.ke=null}},start:{get:function(){return this.Ad},set:function(a){this.v&& +wa(this,a);this.Ad=a.I();this.ke=null}},end:{get:function(){return this.bl},set:function(a){this.v&&wa(this,a);this.bl=a.I();this.ke=null}},startRadius:{get:function(){return this.js},set:function(a){this.v&&wa(this,a);0>a&&xa(a,">= zero",ml,"startRadius");this.js=a;this.ke=null}},endRadius:{get:function(){return this.jr},set:function(a){this.v&&wa(this,a);0>a&&xa(a,">= zero",ml,"endRadius");this.jr=a;this.ke= null}},colorStops:{get:function(){return this.je},set:function(a){this.v&&wa(this,a);this.je=a;this.ke=null}},pattern:{get:function(){return this.Ur},set:function(a){this.v&&wa(this,a);this.Ur=a;this.ke=null}}});ml.prototype.isDark=ml.prototype.jy;ml.prototype.darkenBy=ml.prototype.Az;ml.prototype.lightenBy=ml.prototype.yA;ml.prototype.addColorStop=ml.prototype.addColorStop; var nm=216/24389,mm=24389/27,jm=[95.047,100,108.883],qm=null,em=new Xl,Rh=new Xl,hm=new Xl,km=new Xl,Yl=!1;ml.className="Brush";var tl;ml.Solid=tl=new D(ml,"Solid",0);var wl;ml.Linear=wl=new D(ml,"Linear",1);var nl;ml.Radial=nl=new D(ml,"Radial",2);var vl;ml.Pattern=vl=new D(ml,"Pattern",4);var $l;ml.Lab=$l=new D(ml,"Lab",5);var pm;ml.HSL=pm=new D(ml,"HSL",6); ml.randomColor=function(a,b){void 0===a&&(a=128);void 0===b&&(b=Math.max(a,255));var c=Math.abs(b-a);b=Math.floor(a+Math.random()*c).toString(16);var d=Math.floor(a+Math.random()*c).toString(16);a=Math.floor(a+Math.random()*c).toString(16);2>b.length&&(b="0"+b);2>d.length&&(d="0"+d);2>a.length&&(a="0"+a);return"#"+b+d+a}; @@ -1077,29 +1077,29 @@ Math.abs(y.offsetY)+q;u=k.stretch;u===Uk&&(u=hl(k,!1));switch(u){case og:g=f=0;b xm.prototype.arrange=function(a,b){var c=b.length,d=a.nb(),e=d.measuredBounds,f=N.alloc();f.h(0,0,1,1);var g=d.margin,h=g.left;g=g.top;var k=a.padding,l=k.left;k=k.top;d.arrange(l+h,k+g,e.width,e.height);var m=ym(d),n=zm(d),p=m.y*e.height+m.offsetY,r=n.x*e.width+n.offsetX;n=n.y*e.height+n.offsetY;f.x=m.x*e.width+m.offsetX;f.y=p;$b(f,r,n,0,0);f.x+=h+l;f.y+=g+k;for(e=0;eS&&(Ha=Math.max(S-tc,0));var fg=0===H.ga;H.$b=H.$b+Ha;H.actual=H.ga+Ha;S=Math.max(S-(Ha+(fg?tc:0)),0)}if(1===sb.columnSpan&&(eb===og|| -eb===Wk)){H=a.getColumnDefinition(Rb);var rh=H.Fc();Ha=Math.max(kc-H.actual,0);Ha+rh>K&&(Ha=Math.max(K-rh,0));var wn=0===H.ga;H.$b=H.$b+Ha;H.actual=H.ga+Ha;K=Math.max(K-(Ha+(wn?rh:0)),0)}he&&sb.mk()}}}}}Ia(z);var Gd=0,ie=0;f=a.columnCount;for(var gg=0;ggS&&(Ha=Math.max(S-tc,0));var fg=0===H.ga;H.$b=H.$b+Ha;H.actual=H.ga+Ha;S=Math.max(S-(Ha+(fg?tc:0)),0)}if(1===sb.columnSpan&&(bb===og|| +bb===Wk)){H=a.getColumnDefinition(Rb);var rh=H.Gc();Ha=Math.max(kc-H.actual,0);Ha+rh>K&&(Ha=Math.max(K-rh,0));var wn=0===H.ga;H.$b=H.$b+Ha;H.actual=H.ga+Ha;K=Math.max(K-(Ha+(wn?rh:0)),0)}he&&sb.mk()}}}}}Ia(z);var Gd=0,ie=0;f=a.columnCount;for(var gg=0;gg=a.rowCount);Cf++)H=a.getRowDefinition(Na.row+Cf),Ha=0,Ha=eb===sd||eb===Wk?Math.max(H.minimum,0===ke[Na.row+Cf]?H.maximum:Math.min(ke[Na.row+Cf],H.maximum)):Math.max(H.minimum,isNaN(H.rc)?H.maximum:Math.min(H.rc,H.maximum)),Qc.height+=Ha,Ld+=H.minimum;for(var nd=1;nd=a.columnCount);nd++)H=a.getColumnDefinition(Na.column+ -nd),Ha=0,Ha=eb===sd||eb===Vk?Math.max(H.minimum,0===md[Na.column+nd]?H.maximum:Math.min(md[Na.column+nd],H.maximum)):Math.max(H.minimum,isNaN(H.rc)?H.maximum:Math.min(H.rc,H.maximum)),Qc.width+=Ha,vh+=H.minimum;bb.width+=Qc.width;bb.height+=Qc.height;var Df=Na.margin,zi=Df.right+Df.left,me=Df.top+Df.bottom;Na.measure(bb.width,bb.height,vh,Ld);for(var ig=Na.measuredBounds,Ef=Math.max(ig.width+zi,0),Ai=Math.max(ig.height+me,0),Ze=0,Zc=0;Zc=a.rowCount);Zc++)H=a.getRowDefinition(Na.row+ +0;Bf=a.rowCount);Cf++)H=a.getRowDefinition(Na.row+Cf),Ha=0,Ha=bb===sd||bb===Wk?Math.max(H.minimum,0===ke[Na.row+Cf]?H.maximum:Math.min(ke[Na.row+Cf],H.maximum)):Math.max(H.minimum,isNaN(H.rc)?H.maximum:Math.min(H.rc,H.maximum)),Qc.height+=Ha,Ld+=H.minimum;for(var nd=1;nd=a.columnCount);nd++)H=a.getColumnDefinition(Na.column+ +nd),Ha=0,Ha=bb===sd||bb===Vk?Math.max(H.minimum,0===md[Na.column+nd]?H.maximum:Math.min(md[Na.column+nd],H.maximum)):Math.max(H.minimum,isNaN(H.rc)?H.maximum:Math.min(H.rc,H.maximum)),Qc.width+=Ha,vh+=H.minimum;cb.width+=Qc.width;cb.height+=Qc.height;var Df=Na.margin,zi=Df.right+Df.left,me=Df.top+Df.bottom;Na.measure(cb.width,cb.height,vh,Ld);for(var ig=Na.measuredBounds,Ef=Math.max(ig.width+zi,0),Ai=Math.max(ig.height+me,0),Ze=0,Zc=0;Zc=a.rowCount);Zc++)H=a.getRowDefinition(Na.row+ Zc),Ze+=H.total||0;if(Ze=od)&&!(Na.row+ne>=a.rowCount);ne++){H=a.getRowDefinition(Na.row+ne);var zd=H.ga||0,fk=Gf(Na,H,Ff);H.actual=Math.min(H.maximum,zd+fk);H.ga!==zd&&(od-=H.ga-zd)}for(;0Ge&&(H.actual=Math.min(H.maximum,Ge+od),H.ga!==Ge&&(od-=H.ga-Ge));if(0===H.index)break;H=a.getRowDefinition(H.index-1)}}for(var wh=0,xh=0;xh=a.columnCount);xh++)H=a.getColumnDefinition(Na.column+xh),wh+=H.total||0;if(wh=$c)&&!(Na.column+yh>=a.columnCount);yh++){H=a.getColumnDefinition(Na.column+yh);var yn=H.ga||0,Wt=xn(Na,H,Bi);H.actual=Math.min(H.maximum,yn+Wt);H.ga!==yn&&($c-=H.ga-yn)}for(;0<$c;){var gk=H.ga||0;isNaN(H.width)&&H.maximum>gk&&(H.actual=Math.min(H.maximum,gk+$c),H.ga!==gk&&($c-=H.ga-gk));if(0=== -H.index)break;H=a.getColumnDefinition(H.index-1)}}}}Ia(y);M.free(Qc);M.free(bb);void 0!==ke&&Ia(ke);void 0!==md&&Ia(md);var jg=0,kg=0,hk=a.desiredSize,fr=a.maxSize;eb=hl(a,!0);var Ci=ie=Gd=0,Di=0;f=a.columnCount;for(var ik=0;ik=a.rowCount);R++){var O=a.getRowDefinition(v+ -R);0!==O.ga&&(u.height+=O.total)}for(R=1;R=a.columnCount);R++)O=a.getColumnDefinition(z+R),0!==O.ga&&(u.width+=O.total);var H=y.ga+u.width,da=w.ga+u.height;R=h;O=k;var ba=H,ra=da,Ca=h,cb=k,db=H,Ha=da;h+H>c.width&&(db=Math.max(c.width-h,0));k+da>c.height&&(Ha=Math.max(c.height-k,0));var zb=K.alignment;if(zb.Lb()){zb=a.defaultAlignment;zb.hb()||(zb=yc);var Db=zb.x;var Yc=zb.y;var Rb=zb.offsetX;zb=zb.offsetY;var jc=y.alignment,Ec=w.alignment;jc.hb()&&(Db=jc.x,Rb=jc.offsetX);Ec.hb()&& +R);0!==O.ga&&(u.height+=O.total)}for(R=1;R=a.columnCount);R++)O=a.getColumnDefinition(z+R),0!==O.ga&&(u.width+=O.total);var H=y.ga+u.width,da=w.ga+u.height;R=h;O=k;var ba=H,ra=da,Ca=h,db=k,eb=H,Ha=da;h+H>c.width&&(eb=Math.max(c.width-h,0));k+da>c.height&&(Ha=Math.max(c.height-k,0));var zb=K.alignment;if(zb.Lb()){zb=a.defaultAlignment;zb.hb()||(zb=yc);var Db=zb.x;var Yc=zb.y;var Rb=zb.offsetX;zb=zb.offsetY;var jc=y.alignment,Ec=w.alignment;jc.hb()&&(Db=jc.x,Rb=jc.offsetX);Ec.hb()&& (Yc=Ec.y,zb=Ec.offsetY)}else Db=zb.x,Yc=zb.y,Rb=zb.offsetX,zb=zb.offsetY;if(isNaN(Db)||isNaN(Yc))Yc=Db=.5,zb=Rb=0;jc=S.width;Ec=S.height;var ge=K.margin,xf=ge.left+ge.right,sb=ge.top+ge.bottom,he=Al(K,w,y,!1);!isNaN(K.desiredSize.width)||he!==sd&&he!==Vk||(jc=Math.max(H-xf,0));!isNaN(K.desiredSize.height)||he!==sd&&he!==Wk||(Ec=Math.max(da-sb,0));H=K.maxSize;da=K.minSize;jc=Math.min(H.width,jc);Ec=Math.min(H.height,Ec);jc=Math.max(da.width,jc);Ec=Math.max(da.height,Ec);H=Ec+sb;R+=ba*Db-(jc+xf)*Db+ -Rb+ge.left;O+=ra*Yc-H*Yc+zb+ge.top;K.visible&&(ac(Ca,cb,db,Ha,R,O,S.width,S.height)?K.arrange(R,O,jc,Ec):K.arrange(R,O,jc,Ec,new N(Ca,cb,db,Ha)))}}M.free(u);for(a=0;ab)return a%b===c;if(a%b!==c)return!1;b=d.length;for(var e=0;en)z.measure(Infinity,Infinity,0,0),y=z.measuredBounds,b.Nc(y),q.push(y);else{var A=z.segmentIndex,B=z.segmentFraction,F=z.alignmentFocus;F.wc()&&(F=yc);var K=z.segmentOrientation,S=z.segmentOffset;if(isNaN(A)){var R=h.ma;y=Fa();R.vv(B,y);var O=J.allocAt(y[0],y[1]);O.add(h.i(0)); +k&&(Jm(a,p,r,k),g=k.measuredBounds,b.Oc(g),q.push(g));g=qd.alloc();for(var u=J.alloc(),v=J.alloc(),w=0;wn)z.measure(Infinity,Infinity,0,0),y=z.measuredBounds,b.Oc(y),q.push(y);else{var A=z.segmentIndex,B=z.segmentFraction,F=z.alignmentFocus;F.wc()&&(F=yc);var K=z.segmentOrientation,S=z.segmentOffset;if(isNaN(A)){var R=h.ma;y=Fa();R.vv(B,y);var O=J.allocAt(y[0],y[1]);O.add(h.i(0)); R.type===Q.j?O.offset(-R.startX,-R.startY):(R=R.figures.first(),null!==R&&O.offset(-R.startX,-R.startY));R=y[2];if(K!==Vf){var H=h.computeAngle(z,K,R);z.xb=H}H=O.x-l.x;var da=O.y-l.y;J.free(O);Ia(y)}else if(A<-n||A>=n)y=J.alloc(),h.pg(),h.computeMidPoint(y),R=h.midAngle,K!==Vf&&(H=h.computeAngle(z,K,R),z.xb=H),H=y.x-l.x,da=y.y-l.y,J.free(y);else{H=0;0<=A?(da=m.J(A),y=Aba+10?0<=A?R.Oa(da):da.Oa(R):ba>O+10?0<=A?y.Oa(H):H.Oa(y):0<=A?R.Oa(H):H.Oa(R)}else R=0<=A?da.Oa(y):y.Oa(da);K!==Vf&&(H=h.computeAngle(z,K,R),z.xb=H);H=da.x+(y.x-da.x)*B-l.x;da=da.y+(y.y-da.y)*B-l.y}z.measure(Infinity,Infinity,0,0);y=z.measuredBounds;O=z.naturalBounds;var ra=0;z instanceof uf&&(ra=z.strokeWidth);ba=O.width+ra;var Ca=O.height+ra;g.reset();g.translate(-y.x,-y.y);g.scale(z.scale,z.scale);g.rotate(K===Vf?z.angle:R,ba/2,Ca/2);K!==Km&&K!== -Lm||g.rotate(90,ba/2,Ca/2);K!==Mm&&K!==Nm||g.rotate(-90,ba/2,Ca/2);K===Om&&(45R||225R)&&g.rotate(-R,ba/2,Ca/2);O=new N(0,0,ba,Ca);u.Ui(O,F);g.ya(u);F=-u.x+ra/2*z.scale;z=-u.y+ra/2*z.scale;v.assign(S);ra=isNaN(S.x);var cb=isNaN(S.y);if(ra||cb){ba=ba/2+3;Ca=Ca/2+3;var db=45<=R&&135>=R,Ha=225<=R&&315>=R;K===Vf&&(db||Ha)?(v.x=cb?ba:S.y,v.y=ra?Ca:S.x,db?0<=A||isNaN(A)&&.5>B||!ra||(v.y=-Ca):Ha&&((0<=A||isNaN(A)&&.5>B)&&ra&&(v.y=-Ca),cb&&(v.x=-ba))):(ra&&(v.x=0<=A||isNaN(A)&&.5>B?ba:-ba), -cb&&(v.y=-Ca),v.rotate(R))}else v.rotate(R);H+=v.x;da+=v.y;O.set(y);O.h(H+F,da+z,y.width,y.height);q.push(O);b.Nc(O)}}if(null!==f)for(d=f.labelNodes;d.next();)d.value.measure(Infinity,Infinity);a.dg=b;a=a.location;a.h(a.x+b.x,a.y+b.y);Tb(e,b.width||0,b.height||0);qd.free(g);J.free(u);J.free(v)}}}}; +H=1ba+10?0<=A?R.Ra(da):da.Ra(R):ba>O+10?0<=A?y.Ra(H):H.Ra(y):0<=A?R.Ra(H):H.Ra(R)}else R=0<=A?da.Ra(y):y.Ra(da);K!==Vf&&(H=h.computeAngle(z,K,R),z.xb=H);H=da.x+(y.x-da.x)*B-l.x;da=da.y+(y.y-da.y)*B-l.y}z.measure(Infinity,Infinity,0,0);y=z.measuredBounds;O=z.naturalBounds;var ra=0;z instanceof uf&&(ra=z.strokeWidth);ba=O.width+ra;var Ca=O.height+ra;g.reset();g.translate(-y.x,-y.y);g.scale(z.scale,z.scale);g.rotate(K===Vf?z.angle:R,ba/2,Ca/2);K!==Km&&K!== +Lm||g.rotate(90,ba/2,Ca/2);K!==Mm&&K!==Nm||g.rotate(-90,ba/2,Ca/2);K===Om&&(45R||225R)&&g.rotate(-R,ba/2,Ca/2);O=new N(0,0,ba,Ca);u.Ui(O,F);g.ya(u);F=-u.x+ra/2*z.scale;z=-u.y+ra/2*z.scale;v.assign(S);ra=isNaN(S.x);var db=isNaN(S.y);if(ra||db){ba=ba/2+3;Ca=Ca/2+3;var eb=45<=R&&135>=R,Ha=225<=R&&315>=R;K===Vf&&(eb||Ha)?(v.x=db?ba:S.y,v.y=ra?Ca:S.x,eb?0<=A||isNaN(A)&&.5>B||!ra||(v.y=-Ca):Ha&&((0<=A||isNaN(A)&&.5>B)&&ra&&(v.y=-Ca),db&&(v.x=-ba))):(ra&&(v.x=0<=A||isNaN(A)&&.5>B?ba:-ba), +db&&(v.y=-Ca),v.rotate(R))}else v.rotate(R);H+=v.x;da+=v.y;O.set(y);O.h(H+F,da+z,y.width,y.height);q.push(O);b.Oc(O)}}if(null!==f)for(d=f.labelNodes;d.next();)d.value.measure(Infinity,Infinity);a.dg=b;a=a.location;a.h(a.x+b.x,a.y+b.y);Tb(e,b.width||0,b.height||0);qd.free(g);J.free(u);J.free(v)}}}}; Im.prototype.arrange=function(a,b){var c=b.length;if(a instanceof we||a instanceof U){var d=a,e=null;a instanceof we&&(e=a,d=e.adornedPart);var f=a instanceof we?null:d.path,g=a.j;if(0!==g.length){var h=0;if(null!==f&&h=c)q=J.alloc(),r=n,v=q,r.pg(),r.computeMidPoint(v),r=n.midAngle,l!==Vf&&(n=n.computeAngle(g,l,r),g.angle=n),n=q.x,v=q.y, -J.free(q);else{u=0;0<=h?(q=b.m[h],v=hz+10?0<=h?r.Oa(q):q.Oa(r):z>w+10?0<=h?v.Oa(u):u.Oa(v):0<=h?r.Oa(u):u.Oa(r)}else r=0<=h?q.Oa(v):v.Oa(q);l!==Vf&&(n=n.computeAngle(g,l,r),g.angle=n);n=q.x+(v.x-q.x)*k;v=q.y+(v.y-q.y)*k}if(p.Qs())g.location=new J(n,v);else{p.wc()&&(p=yc);q=qd.alloc();q.reset();q.scale(g.scale,g.scale);q.rotate(g.angle, +J.free(q);else{u=0;0<=h?(q=b.m[h],v=hz+10?0<=h?r.Ra(q):q.Ra(r):z>w+10?0<=h?v.Ra(u):u.Ra(v):0<=h?r.Ra(u):u.Ra(r)}else r=0<=h?q.Ra(v):v.Ra(q);l!==Vf&&(n=n.computeAngle(g,l,r),g.angle=n);n=q.x+(v.x-q.x)*k;v=q.y+(v.y-q.y)*k}if(p.Qs())g.location=new J(n,v);else{p.wc()&&(p=yc);q=qd.alloc();q.reset();q.scale(g.scale,g.scale);q.rotate(g.angle, 0,0);var y=g.naturalBounds;u=N.allocAt(0,0,y.width,y.height);w=J.alloc();w.Ui(u,p);q.ya(w);p=-w.x;z=-w.y;var A=y.width,B=y.height;y=J.alloc();y.assign(m);var F=isNaN(m.x),K=isNaN(m.y);if(F||K){A=A/2+3;B=B/2+3;var S=45<=r&&135>=r,R=225<=r&&315>=r;l===Vf&&(S||R)?(y.x=K?A:m.y,y.y=F?B:m.x,S?0<=h||isNaN(h)&&.5>k||!F||(y.y=-B):R&&((0<=h||isNaN(h)&&.5>k)&&F&&(y.y=-B),K&&(y.x=-A))):(F&&(y.x=0<=h||isNaN(h)&&.5>k?A:-A),K&&(y.y=-B),y.rotate(r))}else y.rotate(r);n+=y.x;v+=y.y;q.Jq(u);p+=u.x;z+=u.y;h=J.allocAt(n+ p,v+z);g.move(h);J.free(h);J.free(y);J.free(w);N.free(u);qd.free(q)}}null!==e?e.sk(!1):d.sk(!1)}}; function Jm(a,b,c,d){if(!1!==mj(d)){var e=d.strokeWidth;0===e&&a instanceof we&&a.type===X.Link&&a.adornedObject instanceof uf&&(e=a.adornedObject.strokeWidth);e*=d.sa;a instanceof U&&null!==a.ma?(a=a.ma.bounds,d.ue(a.x-e/2,a.y-e/2,a.width+e,a.height+e)):a instanceof we&&null!==a.adornedPart.ma?(a=a.adornedPart.ma.bounds,d.ue(a.x-e/2,a.y-e/2,a.width+e,a.height+e)):d.ue(-(e/2),-(e/2),b+e,c+e);hj(d,!1)}}function Pm(){this.na="Base"}ma(Pm,Kl); Pm.prototype.measure=function(a,b,c,d,e,f,g){var h=a.nb();a.Kg=[];var k=h.margin,l=k.right+k.left,m=k.top+k.bottom;h.measure(b,c,f,g);var n=h.measuredBounds,p=new N(-k.left,-k.top,Math.max(n.width+l,0),Math.max(n.height+m,0));a.Kg.push(p);e.assign(p);for(var r=h.geometry,q=h.strokeWidth,u=r.flattenedSegments,v=r.flattenedLengths,w=r.flattenedTotalLength,z=u.length,y=0,A=0,B=Fa(),F=0;Fba&&(ba+=360);S.push(ba)}y=H;A=da}B.push(S)}if(null===a.Nf){for(var ra=[],Ca=a.T.m,cb=Ca.length,db=0;dbDb))for(var Yc=0;YcDb&&zb.push(jc)}}}}a.Nf=ra}var Ec=a.Nf;var ge=a.T.m,xf=ge.length,sb=0,he=0,dg=w;a.tj=[];for(var ph,qh=0;qhbk*ti*w/a.graduatedRange)){var eg=v[0][0],ld=0,kc=0;he=w*eb.graduatedStart-1E-4;dg=w*eb.graduatedEnd+1E-4;var yf=bk*ti,tc=a.graduatedTickBase;if(tca.graduatedMin+yf&&(tc-=Math.floor((tc-a.graduatedMin)/yf)*yf);for(var rh=Ec[qh],wn=tc,Gd=1;tcw&&(sb=w),he<=sb&&sb<=dg)){for(var Hd=B[ld][kc],yd=v[ld][kc];ldeg&&kcec&&.4995ec?0ec||.9995vi){var ck=1-Math.abs(.5-ec);Hd=(je*ck+Pc*(1-ck))%360;break a}}}Hd=je}if(eb instanceof Lg){var Id="";null!== -eb.graduatedFunction?(Id=eb.graduatedFunction(tc),Id=null!==Id&&void 0!==Id?Id.toString():""):Id=(+tc.toFixed(2)).toString();""!==Id&&ph.push({tm:ui,angle:Hd,text:Id})}else ph.push({tm:ui,angle:Hd})}tc=wn+Gd*yf}}}a.tj.push(ph)}Ia(B);var uh=a.tj;if(null!==uh)for(var zf=d.length,bb=0;bbBf;Bf++){switch(Bf){case 0:fc.h(Xe,Ye);break;case 1:fc.h(Xe+wi,Ye);break;case 2:fc.h(Xe,Ye+xi);break;case 3:fc.h(Xe+wi,Ye+xi)}fc.rotate(ek+Eb.angle);fc.offset(dk,Af);0===md&&0===Bf?Qc.h(fc.x,fc.y,0,0):Qc.Le(fc);fc.offset(-dk,-Af);fc.rotate(-ek-Eb.angle)}J.free(fc);null!==lc.Kg&& -lc.Kg.push(Qc);$b(uc,Qc.x,Qc.y,Qc.width,Qc.height)}else if(Eb instanceof Lg){var Na=a,Kd=e;null===Na.mh&&(Na.mh=new Lg);var qb=Na.mh;Qm(qb,Eb);var vh=Eb.alignmentFocus;vh.wc()&&(vh=vc);for(var Ld=Eb.segmentOrientation,Cf=Eb.segmentOffset,nd=new N,Df=0,zi=0,me=0,ig=0,Ef=0,Ai=Fb.length,Ze=0;Zeme||225me)&&zd.rotate(-me,Gf/2,ne/2);var fk=N.allocAt(0,0,Gf,ne),Ge=J.alloc();Ge.Ui(fk,vh);zd.ya(Ge);var wh=-Ge.x,xh=-Ge.y,$c=J.alloc();$c.assign(Cf);isNaN($c.x)&&($c.x=Gf/2+3);isNaN($c.y)&&($c.y=-(ne/2+3));$c.rotate(me); -Df+=$c.x+wh;zi+=$c.y+xh;var Bi=new N(Df,zi,od.width,od.height),xn=new N(od.x,od.y,od.width,od.height),yh=new N(Ff.x,Ff.y,Ff.width,Ff.height);Zc.wA=ig;Zc.lineCount=qb.lineCount;Zc.lines=[qb.qb,qb.di,qb.oe,qb.ze,qb.zc,qb.Pb,qb.me];Zc.actualBounds=Bi;Zc.measuredBounds=xn;Zc.naturalBounds=yh;0===Ze?nd.assign(Bi):nd.Nc(Bi);J.free($c);J.free(Ge);N.free(fk);qd.free(zd)}null!==Na.Kg&&Na.Kg.push(nd);$b(Kd,nd.x,nd.y,nd.width,nd.height)}hj(Eb,!1)}}}; +A,H-y)/Math.PI;0>ba&&(ba+=360);S.push(ba)}y=H;A=da}B.push(S)}if(null===a.Nf){for(var ra=[],Ca=a.T.m,db=Ca.length,eb=0;ebDb))for(var Yc=0;YcDb&&zb.push(jc)}}}}a.Nf=ra}var Ec=a.Nf;var ge=a.T.m,xf=ge.length,sb=0,he=0,dg=w;a.tj=[];for(var ph,qh=0;qhbk*ti*w/a.graduatedRange&&null===bb.graduatedSkip)){var eg=v[0][0],ld=0,kc=0;he=w*bb.graduatedStart-1E-4;dg=w*bb.graduatedEnd+1E-4;var yf=bk*ti,tc=a.graduatedTickBase;if(tca.graduatedMin+yf&&(tc-=Math.floor((tc-a.graduatedMin)/yf)*yf);for(var rh=Ec[qh],wn=tc,Gd=1;tcw&&(sb=w),he<=sb&&sb<=dg)){for(var Hd=B[ld][kc],yd=v[ld][kc];ldeg&&kcec&&.4995ec?0ec||.9995vi){var ck=1-Math.abs(.5-ec);Hd=(je*ck+Pc*(1-ck))%360;break a}}}Hd=je}if(bb instanceof Lg){var Id= +"";null!==bb.graduatedFunction?(Id=bb.graduatedFunction(tc),Id=null!==Id&&void 0!==Id?Id.toString():""):Id=(+tc.toFixed(2)).toString();""!==Id&&ph.push({tm:ui,angle:Hd,text:Id})}else ph.push({tm:ui,angle:Hd})}tc=wn+Gd*yf}}}a.tj.push(ph)}Ia(B);var uh=a.tj;if(null!==uh)for(var zf=d.length,cb=0;cbBf;Bf++){switch(Bf){case 0:fc.h(Xe,Ye);break;case 1:fc.h(Xe+wi,Ye);break;case 2:fc.h(Xe,Ye+xi);break;case 3:fc.h(Xe+wi,Ye+xi)}fc.rotate(ek+Eb.angle);fc.offset(dk,Af);0===md&&0===Bf?Qc.h(fc.x,fc.y,0,0):Qc.Le(fc);fc.offset(-dk,-Af);fc.rotate(-ek-Eb.angle)}J.free(fc); +null!==lc.Kg&&lc.Kg.push(Qc);$b(uc,Qc.x,Qc.y,Qc.width,Qc.height)}else if(Eb instanceof Lg){var Na=a,Kd=e;null===Na.mh&&(Na.mh=new Lg);var qb=Na.mh;Qm(qb,Eb);var vh=Eb.alignmentFocus;vh.wc()&&(vh=vc);for(var Ld=Eb.segmentOrientation,Cf=Eb.segmentOffset,nd=new N,Df=0,zi=0,me=0,ig=0,Ef=0,Ai=Fb.length,Ze=0;Zeme||225me)&&zd.rotate(-me,Gf/2,ne/2);var fk=N.allocAt(0,0,Gf,ne),Ge=J.alloc();Ge.Ui(fk,vh);zd.ya(Ge);var wh=-Ge.x,xh=-Ge.y,$c=J.alloc();$c.assign(Cf);isNaN($c.x)&&($c.x=Gf/2+3);isNaN($c.y)&&($c.y=-(ne/2+3));$c.rotate(me); +Df+=$c.x+wh;zi+=$c.y+xh;var Bi=new N(Df,zi,od.width,od.height),xn=new N(od.x,od.y,od.width,od.height),yh=new N(Ff.x,Ff.y,Ff.width,Ff.height);Zc.wA=ig;Zc.lineCount=qb.lineCount;Zc.lines=[qb.qb,qb.di,qb.oe,qb.ze,qb.zc,qb.Pb,qb.me];Zc.actualBounds=Bi;Zc.measuredBounds=xn;Zc.naturalBounds=yh;0===Ze?nd.assign(Bi):nd.Oc(Bi);J.free($c);J.free(Ge);N.free(fk);qd.free(zd)}null!==Na.Kg&&Na.Kg.push(nd);$b(Kd,nd.x,nd.y,nd.width,nd.height)}hj(Eb,!1)}}}; Pm.prototype.arrange=function(a,b,c){if(null!==a.Kg){var d=a.nb(),e=a.tj;if(null!==e){var f=a.Kg,g=0,h=f[g];g++;null!==d&&d.arrange(h.x-c.x,h.y-c.y,h.width,h.height);for(var k=b.length,l=0;l=e&&(e=1);for(var g=f.actualBounds,h=a.T.m,k=a.tj,l=h.length,m=0;ma.graduatedTickUnit*n.interval*f.geometry.flattenedTotalLength/a.graduatedRange*e)){var q=n.measuredBounds,u=n.strokeWidth*n.scale,v=n.alignmentFocus;v.wc()&& -(v=vc);for(var w=0;w=e&&(e=1);for(var g=f.actualBounds,h=a.T.m,k=a.tj,l=h.length,m=0;ma.graduatedTickUnit*n.interval*f.geometry.flattenedTotalLength/a.graduatedRange*e&&null===n.graduatedSkip)){var q=n.measuredBounds,u=n.strokeWidth*n.scale, +v=n.alignmentFocus;v.wc()&&(v=vc);for(var w=0;wf.height)continue}else if(l.position>f.width)continue;var m=l.separatorStrokeWidth;isNaN(m)&&(m=c?a.Bg:a.Ag);var n=l.separatorStroke;null===n&&(n=c?a.Vh:a.zg);if(0!==m&&null!==n){bi(a,b,n,!1,!1,g,f);n=!1;var p=l.separatorDashArray;null===p&&(p=c?a.Uh:a.Th);null!==p&&(n=!0,b.As(p,0));b.beginPath();p=l.position+m;c?p>f.height&&(m-= p-f.height):p>f.width&&(m-=p-f.width);l=l.position+m/2;b.lineWidth=m;m=a.mb;c?(l+=m.top,p=f.width-m.right,b.moveTo(m.left,l),b.lineTo(p,l)):(l+=m.left,p=f.height-m.bottom,b.moveTo(l,m.top),b.lineTo(l,p));b.stroke();n&&b.ys()}}}} -function Vm(a,b,c,d,e){for(var f=d.length,g=a.actualBounds,h=a.naturalBounds,k=Xm(a,!0),l=Xm(a,!1),m=0;mp)){var r=n.Fc(),q=n.separatorStrokeWidth;isNaN(q)&&(q=c?a.Bg:a.Ag);var u=n.separatorStroke;null===u&&(u=c?a.Vh:a.zg);if(null===u||n.index===(c?k:l))q=0;r-=q;q=n.position+q;r+=n.actual;q+r>p&&(r=p-q);0>=r||(p=a.mb,bi(a,b,n.background,!0,!1,h,g),c?b.fillRect(p.left, +function Vm(a,b,c,d,e){for(var f=d.length,g=a.actualBounds,h=a.naturalBounds,k=Xm(a,!0),l=Xm(a,!1),m=0;mp)){var r=n.Gc(),q=n.separatorStrokeWidth;isNaN(q)&&(q=c?a.Bg:a.Ag);var u=n.separatorStroke;null===u&&(u=c?a.Vh:a.zg);if(null===u||n.index===(c?k:l))q=0;r-=q;q=n.position+q;r+=n.actual;q+r>p&&(r=p-q);0>=r||(p=a.mb,bi(a,b,n.background,!0,!1,h,g),c?b.fillRect(p.left, q+p.top,g.width-(p.left+p.right),r):b.fillRect(q+p.left,p.top,r,g.height-(p.top+p.bottom)))}}}}function Xm(a,b){for(var c=b?a.Db.length:a.yb.length,d=0;dd&&e.set(q),J.free(q));J.free(m);f&&e.transform(g);return l}; @@ -1153,7 +1153,7 @@ t.ll=function(){if(0!==(this.G&2048)===!1){xl(this,!0);yl(this,!0);for(var a=thi t.qm=function(a,b,c,d){var e=this.dg;e.h(0,0,0,0);var f=this.desiredSize,g=this.minSize;void 0===c&&(c=g.width,d=g.height);c=Math.max(c,g.width);d=Math.max(d,g.height);var h=this.maxSize;isNaN(f.width)||(a=Math.min(f.width,h.width));isNaN(f.height)||(b=Math.min(f.height,h.height));a=Math.max(c,a);b=Math.max(d,b);var k=this.mb;a=Math.max(a-k.left-k.right,0);b=Math.max(b-k.top-k.bottom,0);var l=this.T.m;0!==l.length&&this.ia.measure(this,a,b,l,e,c,d);a=e.width+k.left+k.right;k=e.height+k.top+k.bottom; isFinite(f.width)&&(a=f.width);isFinite(f.height)&&(k=f.height);a=Math.min(h.width,a);k=Math.min(h.height,k);a=Math.max(g.width,a);k=Math.max(g.height,k);a=Math.max(c,a);k=Math.max(d,k);Tb(e,a,k);Tb(this.naturalBounds,a,k);this.ue(0,0,a,k)};t.nb=function(){if(null===this.lh){var a=this.T.m,b=a.length;if(0===b)return null;for(var c=0;cc||f>d)this.s(),this.measure(b>c?c:b,f>d?d:f,0,0);break;case sd:this.s(!0);this.measure(c+h,d+g,0,0);break;case Vk:this.s(!0);this.measure(c+h,f+g,0,0);break;case Wk:this.s(!0),this.measure(b+h,d+g,0,0)}}this.ia.arrange(this,e,this.dg)}}; -t.xh=function(a){var b=this.naturalBounds,c=sm(this);if(ac(0,0,b.width,b.height,a.x,a.y)){b=this.T.m;for(var d=b.length,e=J.allocAt(0,0);d--;){var f=b[d];if(f.visible||f===c)if(Ab(e.set(a),f.transform),f.$(e))return J.free(e),!0}J.free(e);return null===this.Rb&&null===this.fd?!1:!0}return!1};t.Bs=function(a){if(this.Mk===a)return this;for(var b=this.T.m,c=b.length,d=0;dp.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof X?m:null;p=qd.alloc();p.set(g); +t.vf=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var g=f;void 0===f&&(g=qd.alloc(),g.reset());g.multiply(this.transform);if(this.wh(a,g))return dn(this,b,c,e),void 0===f&&qd.free(g),!0;if(this.Jc(a,g)){if(!this.isAtomic)for(var h=sm(this),k=this.T.m,l=k.length;l--;){var m=k[l];if(m.visible||m===h){var n=m.actualBounds,p=this.naturalBounds;if(!(n.x>p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof X?m:null;p=qd.alloc();p.set(g); if(null!==m?m.vf(a,b,c,d,e,p):gl(n,a,d,p))null!==b&&(n=b(n)),null===n||null!==c&&!c(n)||e.add(n);qd.free(p)}}}void 0===f&&qd.free(g);return d}void 0===f&&qd.free(g);return!1};function dn(a,b,c,d){for(var e=a.T.m,f=e.length;f--;){var g=e[f];if(g.visible){var h=g.actualBounds,k=a.naturalBounds;h.x>k.width||h.y>k.height||0>h.x+h.width||0>h.y+h.height||(g instanceof X&&dn(g,b,c,d),null!==b&&(g=b(g)),null===g||null!==c&&!c(g)||d.add(g))}}} -t.kg=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===c&&(c=null);void 0===d&&(d=null);var g=this.naturalBounds,h=this.he(),k=h?a:Ab(J.allocAt(a.x,a.y),this.transform),l=h?b:Ab(J.allocAt(b.x,b.y),this.transform),m=k.tf(l),n=0v.width||u.y>v.height||0>u.x+u.width||0>u.y+u.height))if(q.he()?(u=q.transform,Ab(k.set(a),u),Ab(l.set(b),u)):(k.set(a),l.set(b)),u=q,q=q instanceof X?q:null,null!==q?q.kg(k,l,c,d,e,f):u.Ux(k,l,e))null!==c&&(u=c(u)),null===u||null!==d&&!d(u)||f.add(u)}}J.free(k);J.free(l)}return e?n:g}return!1}; function ym(a){var b=null;a instanceof uf&&(b=a.spot1,b===Vc&&(b=null),a=a.geometry,null!==a&&null===b&&(b=a.spot1));null===b&&(b=sc);return b}function zm(a){var b=null;a instanceof uf&&(b=a.spot2,b===Vc&&(b=null),a=a.geometry,null!==a&&null===b&&(b=a.spot2));null===b&&(b=Cc);return b}t.add=function(a){for(var b=[],c=0;ca&&xa(a,">= 0",X,"removeColumnDefinition:idx");a=Math.round(a t.Tz=function(a){if(0>a||this.type!==X.Table)return-1;for(var b=0,c=this.Db,d=c.length,e=this.wi;ea||this.type!==X.Table)return-1;for(var b=0,c=this.yb,d=c.length,e=this.fi;ea;)this.bc(this.T.length-1,!1);jn(this,this.itemArray)}; function jn(a,b){var c=bn(a);if(null===b||0===b.length)for(;a.T.length>c;)a.bc(a.T.length-1,!1);else if(a.T.length<=c){c=b.length;for(var d=0;da&&xa(a,">= 0",Nj,"height"),this.rc=a,this.actual=this.ga,null!==this.panel&&this.panel.s(), +t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new ri(a,b,c,d):e=a;e.nd=this;a=this.panel;null!==a&&(b=a.yh(),null!==b&&Fl(b)&&C("Cannot add a Binding to a RowColumnDefinition that is already frozen: "+e+" on "+a));null===this.fb&&(this.fb=new E);this.fb.add(e);return this}; +na.Object.defineProperties(Nj.prototype,{panel:{get:function(){return this.Xf}},isRow:{get:function(){return this.Br},set:function(a){this.Br=a}},index:{get:function(){return this.Pa},set:function(a){this.Pa=a}},height:{get:function(){return this.rc},set:function(a){var b=this.rc;b!==a&&(0>a&&xa(a,">= 0",Nj,"height"),this.rc=a,this.actual=this.ga,null!==this.panel&&this.panel.s(), this.Cb("height",b,a))}},width:{get:function(){return this.rc},set:function(a){var b=this.rc;b!==a&&(0>a&&xa(a,">= 0",Nj,"width"),this.rc=a,this.actual=this.ga,null!==this.panel&&this.panel.s(),this.Cb("width",b,a))}},minimum:{get:function(){return this.Ij},set:function(a){var b=this.Ij;b!==a&&((0>a||!isFinite(a))&&xa(a,">= 0",Nj,"minimum"),this.Ij=a,this.actual=this.ga,null!==this.panel&&this.panel.s(),this.Cb("minimum",b,a))}},maximum:{ get:function(){return this.Hj},set:function(a){var b=this.Hj;b!==a&&(0>a&&xa(a,">= 0",Nj,"maximum"),this.Hj=a,this.actual=this.ga,null!==this.panel&&this.panel.s(),this.Cb("maximum",b,a))}},alignment:{get:function(){return this.wb},set:function(a){var b=this.wb;b.A(a)||(this.wb=a.I(),null!==this.panel&&this.panel.s(),this.Cb("alignment",b,a))}},stretch:{get:function(){return this.Be},set:function(a){var b=this.Be;b!==a&&(this.Be= a,null!==this.panel&&this.panel.s(),this.Cb("stretch",b,a))}},separatorPadding:{get:function(){return this.$f},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.$f;null!==a&&null!==b&&b.A(a)||(null!==a&&(a=a.I()),this.$f=a,null!==this.panel&&this.panel.s(),this.Cb("separatorPadding",b,a))}},separatorStroke:{get:function(){return this.xp},set:function(a){var b=this.xp;b!==a&&(null!==a&&Nl(a,"RowColumnDefinition.separatorStroke"), a instanceof ml&&a.freeze(),this.xp=a,null!==this.panel&&this.panel.s(),this.Cb("separatorStroke",b,a))}},separatorStrokeWidth:{get:function(){return this.yp},set:function(a){var b=this.yp;b!==a&&(this.yp=a,null!==this.panel&&this.panel.s(),this.Cb("separatorStrokeWidth",b,a))}},separatorDashArray:{get:function(){return this.Tj},set:function(a){var b=this.Tj;if(b!==a){if(null!==a){for(var c=a.length,d=0,e=0;ee)){var f=d.measuredBounds,g=Math.max(1,f.width);f=f.height;for(var h=c[0],k=c[1],l,m,n,p,r,q,u=0,v=Fa(),w=2;wn&&(n=1);e=c=n;l=g/2;m=0===l?!1:!0;w=0;q=v[w];n=q[0];r=q[1];p=q[2];q=q[3];for(var z=0;.1<=u;){0===z&&(m?(e=c,e-=l,u-=l,m=!1):e=c,0===e&&(e=1)); if(e>u){Ia(v);return}e>q?(z=e-q,e=q):z=0;var y=Math.sqrt(e*e/(1+p*p));0>n&&(y=-y);h+=y;k+=p*y;a.translate(h,k);a.rotate(r);a.translate(-(g/2),-(f/2));0===z&&d.Fi(a,b);a.translate(g/2,f/2);a.rotate(-r);a.translate(-h,-k);u-=e;q-=e;if(0!==z){w++;if(w===v.length){Ia(v);return}q=v[w];n=q[0];r=q[1];p=q[2];q=q[3];e=z}}Ia(v)}} -t.Fi=function(a,b){var c=this.Dc,d=this.cl;if(null!==c||null!==d){var e=this.ma;if(null!==e){a.Bd();var f=this.actualBounds,g=this.naturalBounds;null!==d&&bi(this,a,d,!0,!1,g,f);var h=this.part,k=this.cg;null===c||0!==k||null===h||!this.isPanelMain&&h.nb()!==this||(k=h.type===X.Link&&h instanceof we&&"Selection"===h.category&&h.adornedObject instanceof uf&&h.adornedPart.nb()===h.adornedObject?h.adornedObject.strokeWidth:0);0===k&&(c=null);null!==c&&0!==k&&(bi(this,a,c,!1,!1,g,f),a.lineWidth=k,a.lineJoin= +t.Fi=function(a,b){var c=this.Dc,d=this.cl;if(null!==c||null!==d){var e=this.ma;if(null!==e){a.Fc();var f=this.actualBounds,g=this.naturalBounds;null!==d&&bi(this,a,d,!0,!1,g,f);var h=this.part,k=this.cg;null===c||0!==k||null===h||!this.isPanelMain&&h.nb()!==this||(k=h.type===X.Link&&h instanceof we&&"Selection"===h.category&&h.adornedObject instanceof uf&&h.adornedPart.nb()===h.adornedObject?h.adornedObject.strokeWidth:0);0===k&&(c=null);null!==c&&0!==k&&(bi(this,a,c,!1,!1,g,f),a.lineWidth=k,a.lineJoin= this.Ul,a.lineCap=this.Tl,a.miterLimit=this.Uj);f=!1;h&&b.Fe("drawShadows")&&(f=h.isShadowed);h=!0;null===c||null!==d&&"transparent"!==d||(h=!1);g=!1;k=this.strokeDashArray;null!==k&&(g=!0,a.As(k,this.jh));if(e.type===Q.j)a.beginPath(),a.moveTo(e.startX,e.startY),a.lineTo(e.endX,e.endY),null!==c&&a.Xi();else if(e.type===Q.C){var l=e.startX;k=e.startY;var m=e.endX,n=e.endY;e=Math.min(l,m);var p=Math.min(k,n);l=Math.abs(m-l);k=Math.abs(n-k);a.beginPath();a.rect(e,p,l,k);null!==d&&a.uf(d);if(null!== c){h&&f&&ql(a);if(0===l||0===k)a.beginPath(),a.rect(e,p,Math.max(l,.1),Math.max(k,.1));a.Xi();h&&f&&pl(a)}}else if(e.type===Q.M)l=e.startX,k=e.startY,m=e.endX,n=e.endY,e=Math.abs(m-l)/2,p=Math.abs(n-k)/2,l=Math.min(l,m)+e,k=Math.min(k,n)+p,a.beginPath(),a.moveTo(l,k-p),a.bezierCurveTo(l+L.qg*e,k-p,l+e,k-L.qg*p,l+e,k),a.bezierCurveTo(l+e,k+L.qg*p,l+L.qg*e,k+p,l,k+p),a.bezierCurveTo(l-L.qg*e,k+p,l-e,k+L.qg*p,l-e,k),a.bezierCurveTo(l-e,k-L.qg*p,l-L.qg*e,k-p,l,k-p),a.closePath(),null!==d&&a.uf(d),null!== c&&(h&&f?(ql(a),a.Xi(),pl(a)):a.Xi());else if(e.type===Q.o)for(e=e.figures,k=e.length,p=0;p(c.startX-c.endX)*(a.x-c.endX)+(c.startY-c.endY)*(a.y-c.endY)||0>d)return!1;N.free(f);return L.Mb(c.startX,c.startY,c.endX,c.endY,e,a.x,a.y)}if(c.type=== -Q.C){b=c.startX;var g=c.startY,h=c.endX;c=c.endY;f.x=Math.min(b,h);f.y=Math.min(g,c);f.width=Math.abs(h-b);f.height=Math.abs(c-g);if(null===this.fill){f.Gc(-d,-d);if(f.$(a))return N.free(f),!1;f.Gc(d,d)}null!==this.stroke&&f.Gc(e,e);a=f.$(a);N.free(f);return a}if(c.type===Q.M){g=c.startX;e=c.startY;h=c.endX;var k=c.endY;c=Math.min(g,h);b=Math.min(e,k);g=Math.abs(h-g)/2;e=Math.abs(k-e)/2;c=a.x-(c+g);b=a.y-(b+e);if(null===this.fill){g-=d;e-=d;if(0>=g||0>=e||1>=c*c/(g*g)+b*b/(e*e))return N.free(f),!1; +t.Mi=function(a){void 0===a&&(a=new N);var b=this.naturalBounds,c=this.de;b=N.allocAt(b.x,b.y,b.width,b.height);var d=this.strokeWidth;b.Hc(d/2,d/2);d=J.allocAt(b.x,b.y).transform(c);a.h(d.x,d.y,0,0);d.h(b.right,b.y).transform(c);$b(a,d.x,d.y,0,0);d.h(b.right,b.bottom).transform(c);$b(a,d.x,d.y,0,0);d.h(b.x,b.bottom).transform(c);$b(a,d.x,d.y,0,0);N.free(b);J.free(d);return a}; +t.xh=function(a,b){var c=this.geometry;if(null===c||null===this.fill&&null===this.stroke)return!1;var d=c.bounds,e=this.strokeWidth/2;c.type!==Q.j||b||(e+=2);var f=N.alloc();f.assign(d);f.Hc(e+2,e+2);if(!f.$(a))return N.free(f),!1;d=e+1E-4;if(c.type===Q.j){if(null===this.stroke)return!1;d=(c.endX-c.startX)*(a.x-c.startX)+(c.endY-c.startY)*(a.y-c.startY);if(0>(c.startX-c.endX)*(a.x-c.endX)+(c.startY-c.endY)*(a.y-c.endY)||0>d)return!1;N.free(f);return L.Mb(c.startX,c.startY,c.endX,c.endY,e,a.x,a.y)}if(c.type=== +Q.C){b=c.startX;var g=c.startY,h=c.endX;c=c.endY;f.x=Math.min(b,h);f.y=Math.min(g,c);f.width=Math.abs(h-b);f.height=Math.abs(c-g);if(null===this.fill){f.Hc(-d,-d);if(f.$(a))return N.free(f),!1;f.Hc(d,d)}null!==this.stroke&&f.Hc(e,e);a=f.$(a);N.free(f);return a}if(c.type===Q.M){g=c.startX;e=c.startY;h=c.endX;var k=c.endY;c=Math.min(g,h);b=Math.min(e,k);g=Math.abs(h-g)/2;e=Math.abs(k-e)/2;c=a.x-(c+g);b=a.y-(b+e);if(null===this.fill){g-=d;e-=d;if(0>=g||0>=e||1>=c*c/(g*g)+b*b/(e*e))return N.free(f),!1; g+=d;e+=d}null!==this.stroke&&(g+=d,e+=d);N.free(f);return 0>=g||0>=e?!1:1>=c*c/(g*g)+b*b/(e*e)}if(c.type===Q.o)return N.free(f),null===this.fill?Ud(c,a.x,a.y,e):Sd(c,a,e,1=this.strokeWidth)m=L.Ie(l.startX,l.startY,l.endX,l.endY,f,g,h,k,e);else{l.startX===l.endX?(d=n,m=0):(b=(l.endY-l.startY)/(l.endX-l.startX),m=n/Math.sqrt(1+b*b), d=m*b);b=Fa();a=new J;L.Ie(l.startX+d,l.startY+m,l.endX+d,l.endY+m,f,g,h,k,a)&&b.push(a);a=new J;L.Ie(l.startX-d,l.startY-m,l.endX-d,l.endY-m,f,g,h,k,a)&&b.push(a);a=new J;L.Ie(l.startX+d,l.startY+m,l.startX-d,l.startY-m,f,g,h,k,a)&&b.push(a);a=new J;L.Ie(l.endX+d,l.endY+m,l.endX-d,l.endY-m,f,g,h,k,a)&&b.push(a);h=b.length;if(0===h)return Ia(b),!1;m=!0;k=Infinity;for(d=0;dMath.abs(c)){k=g-m-c*(f-d);if(0>a*a*c*c+l*l-k*k){e.x=NaN;e.y=NaN;m=!1;break a}n=Math.sqrt(a*a*c*c+l*l-k*k);h=(-(a*a*c*k)+a*l*n)/(l*l+a*a*c*c)+d;a=(-(a*a*c*k)-a*l*n)/(l*l+a*a*c*c)+d;l=c*(h-d)+k+m;k=c* +n,r.y+r.height+n,f,g,h,k,e);else if(l.type===Q.M){b=N.allocAt(r.x,r.y,r.width,r.height).Hc(n,n);a:if(0===b.width)m=L.Ie(b.x,b.y,b.x,b.y+b.height,f,g,h,k,e);else if(0===b.height)m=L.Ie(b.x,b.y,b.x+b.width,b.y,f,g,h,k,e);else{a=b.width/2;l=b.height/2;d=b.x+a;m=b.y+l;c=9999;f!==h&&(c=(g-k)/(f-h));if(9999>Math.abs(c)){k=g-m-c*(f-d);if(0>a*a*c*c+l*l-k*k){e.x=NaN;e.y=NaN;m=!1;break a}n=Math.sqrt(a*a*c*c+l*l-k*k);h=(-(a*a*c*k)+a*l*n)/(l*l+a*a*c*c)+d;a=(-(a*a*c*k)-a*l*n)/(l*l+a*a*c*c)+d;l=c*(h-d)+k+m;k=c* (a-d)+k+m;Math.abs((f-h)*(f-h))+Math.abs((g-l)*(g-l))h){e.x=NaN;e.y=NaN;m=!1;break a}k=Math.sqrt(h);h=m+k;k=m-k;Math.abs(h-g)Math.abs(q)?(u*=.5/q,q=.5):0!==u&&.5>Math.abs(u)&&(q*=.5/u,u=.5),w-=q,z-= u;r.contains(w,z);)w-=q,z-=u;e.x=h;e.y=k;for(u=0;uc?a-c:c-a)<(b>d?b-d:d-b)?(a=ba||L.aa(k.y,a))&&(k.yb||L.aa(k.x,b))&&(k.x=a&&d<=b;a=d&&c<=a} -t.Ux=function(a,b,c){function d(a,b){for(var c=a.length,d=0;de)return!0;return!1}if(c&&null!==this.fill&&this.xh(a,!0))return!0;var e=a.tf(b),f=e;1.5e)return!0;return!1}if(c&&null!==this.fill&&this.xh(a,!0))return!0;var e=a.tf(b),f=e;1.5=e||Cb(b,f,0,-n)>=e||Cb(b, -f,0,n)>=e||Cb(b,f,m,0)>=e?!1:!0}else if(b.type===Q.o){l=b.bounds;f=l.x;h=l.y;k=l.x+l.width;l=l.y+l.height;if(a.x>k&&a.xl&&a.ye&&Bb(a.x,a.y,f,h,k,h)>e&&Bb(a.x,a.y,k,l,f,l)>e&&Bb(a.x,a.y,k,l,k,h)>e)return!1;f=Math.sqrt(e);if(c){if(null===this.fill?Ud(b,a.x,a.y,f):Sd(b,a,f,!0,!1))return!0}else{c=b.figures;for(b=0;be)return!1;h=f.segments.m;k=h.length;for(l=0;le)return!1;break;case Md:var p=Fa();L.Ce(g,m,n.point1X,n.point1Y,n.point2X,n.point2Y,n.endX,n.endY,.8,p);g=d(p,a);Ia(p);if(g)return!1;g=n.endX;m=n.endY;if(a.nd(g,m)>e)return!1;break;case Nd:p=Fa();L.xq(g,m,n.point1X,n.point1Y,n.endX,n.endY,.8,p);g=d(p,a);Ia(p);if(g)return!1;g=n.endX;m=n.endY;if(a.nd(g,m)>e)return!1;break;case Od:case Pd:p=n.type===Od?Qd(n,f):Rd(n,f,g,m);var r=p.length;if(0===r){g=n.type===Od?n.centerX:n.endX;m=n.type===Od?n.centerY:n.endY;if(a.nd(g,m)>e)return!1; +f,0,n)>=e||Cb(b,f,m,0)>=e?!1:!0}else if(b.type===Q.o){l=b.bounds;f=l.x;h=l.y;k=l.x+l.width;l=l.y+l.height;if(a.x>k&&a.xl&&a.ye&&Bb(a.x,a.y,f,h,k,h)>e&&Bb(a.x,a.y,k,l,f,l)>e&&Bb(a.x,a.y,k,l,k,h)>e)return!1;f=Math.sqrt(e);if(c){if(null===this.fill?Ud(b,a.x,a.y,f):Sd(b,a,f,!0,!1))return!0}else{c=b.figures;for(b=0;be)return!1;h=f.segments.m;k=h.length;for(l=0;le)return!1;break;case Md:var p=Fa();L.Ce(g,m,n.point1X,n.point1Y,n.point2X,n.point2Y,n.endX,n.endY,.8,p);g=d(p,a);Ia(p);if(g)return!1;g=n.endX;m=n.endY;if(a.od(g,m)>e)return!1;break;case Nd:p=Fa();L.xq(g,m,n.point1X,n.point1Y,n.endX,n.endY,.8,p);g=d(p,a);Ia(p);if(g)return!1;g=n.endX;m=n.endY;if(a.od(g,m)>e)return!1;break;case Od:case Pd:p=n.type===Od?Qd(n,f):Rd(n,f,g,m);var r=p.length;if(0===r){g=n.type===Od?n.centerX:n.endX;m=n.type===Od?n.centerY:n.endY;if(a.od(g,m)>e)return!1; break}n=null;for(var q=Fa(),u=0;u= 0",uf,"strokeWidth:value")}},strokeCap:{get:function(){return this.Tl}, set:function(a){var b=this.Tl;b!==a&&("string"!==typeof a||"butt"!==a&&"round"!==a&&"square"!==a?xa(a,'"butt", "round", or "square"',uf,"strokeCap"):(this.Tl=a,this.N(),this.g("strokeCap",b,a)))}},strokeJoin:{get:function(){return this.Ul},set:function(a){var b=this.Ul;b!==a&&("string"!==typeof a||"miter"!==a&&"bevel"!==a&&"round"!==a?xa(a,'"miter", "bevel", or "round"',uf,"strokeJoin"):(this.Ul=a,this.N(),this.g("strokeJoin",b,a)))}},strokeMiterLimit:{ get:function(){return this.Uj},set:function(a){var b=this.Uj;if(b!==a&&1<=a){this.Uj=a;this.N();var c=this.part;null!==c&&(c.Sf=NaN);this.g("strokeMiterLimit",b,a)}}},strokeDashArray:{get:function(){return this.ih},set:function(a){var b=this.ih;if(b!==a){if(null!==a){for(var c=a.length,d=0,e=0;ea?a=0:1a?a=0:1(n*n+m*m)*p*p&&(c=!0);b.Sb!==a&&(c=!1);!1===b.Fe("textGreeking")&&(c=!1);b=this.ff;n= -this.gf;switch(this.flip){case Zk:a.translate(e,0);a.scale(-1,1);break;case Yk:a.translate(0,f);a.scale(1,-1);break;case $k:a.translate(e,f),a.scale(-1,-1)}a.Bd();m=this.Wc;p=(b+g+n)*m;f>p&&(d=this.Bi,d=d.y*f-d.y*p+d.offsetY);if(1===m&&null!==this.me)n=this.qb,n>e&&(n=e),this.Ei(this.me,a,0,d+b,e,g,n,c,h,k,l);else if(null!==this.zc&&null!==this.Pb)for(p=0;pe&&(r=e);d+=b;this.Ei(this.Pb[p],a,0,d,e,g,r,c,h,k,l);d+=g+n}switch(this.flip){case Zk:a.scale(-1,1);a.translate(-e, +this.gf;switch(this.flip){case Zk:a.translate(e,0);a.scale(-1,1);break;case Yk:a.translate(0,f);a.scale(1,-1);break;case $k:a.translate(e,f),a.scale(-1,-1)}a.Fc();m=this.Xc;p=(b+g+n)*m;f>p&&(d=this.Bi,d=d.y*f-d.y*p+d.offsetY);if(1===m&&null!==this.me)n=this.qb,n>e&&(n=e),this.Ei(this.me,a,0,d+b,e,g,n,c,h,k,l);else if(null!==this.zc&&null!==this.Pb)for(p=0;pe&&(r=e);d+=b;this.Ei(this.Pb[p],a,0,d,e,g,r,c,h,k,l);d+=g+n}switch(this.flip){case Zk:a.scale(-1,1);a.translate(-e, 0);break;case Yk:a.scale(1,-1);a.translate(0,-f);break;case $k:a.scale(-1,-1),a.translate(-e,-f)}}}; t.Ei=function(a,b,c,d,e,f,g,h,k,l,m){var n=0;h?("left"===k?n=0:"right"===k?n=e-g:"center"===k&&(n=(e-g)/2),b.fillRect(c+n,d+.25*f,g,1)):("left"===k?n=0:"right"===k?n=e:"center"===k&&(n=e/2),e=null!==Nn?Nn(this,f):.75*f,b.fillText(a,c+n,d+e),a=f/20|0,0===a&&(a=1),"right"===k?n-=g:"center"===k&&(n-=g/2),l&&(k=null!==On?On(this,f):.8*f,b.beginPath(),b.lineWidth=a,b.moveTo(c+n,d+k),b.lineTo(c+n+g,d+k),b.stroke()),m&&(b.beginPath(),b.lineWidth=a,d=d+f-f/2.2|0,0!==a%2&&(d+=.5),b.moveTo(c+n,d),b.lineTo(c+ n+g,d),b.stroke()))}; t.qm=function(a,b,c,d){this.di=a;var e=this.ne;null!==In&&Pn!==e&&(Pn=In.font=e);this.qb=this.ze=0;this.me=this.Pb=this.zc=this.oe=null;var f;if(isNaN(this.desiredSize.width)){e=this.Ub.replace(/\r\n/g,"\n").replace(/\r/g,"\n");if(0===e.length)e=0;else if(this.isMultiline){for(var g=f=0,h=!1;!h;){var k=e.indexOf("\n",g);-1===k&&(k=e.length,h=!0);g=e.substr(g,k-g);this.Xh===Ln&&(g=g.trim());f=Math.max(f,Qn(g));g=k+1}e=f}else f=e.indexOf("\n",0),0<=f&&(e=e.substr(0,f)),e=Qn(e);e=Math.min(e,a/this.scale); e=Math.max(8,e)}else e=this.desiredSize.width;null!==this.panel&&(e=Math.min(e,this.panel.maxSize.width));f=Rn(this,e);isNaN(this.desiredSize.height)?f=Math.min(f,b/this.scale):f=this.desiredSize.height;h=f;if(0!==this.qb&&null!==this.zc&&null!==this.Pb&&this.Vf===Sn&&(b=this.ne,b=this.Vf===Sn?Tn(b):0,k=this.ff+this.gf,k=Math.max(0,Mn(this)+k),h=Math.min(this.maxLines-1,Math.max(Math.floor(h/k+.01)-1,0)),!(h+1>=this.Pb.length))){k=this.Pb[h];for(b=Math.max(1,a-b);Qn(k)>b&&1=a.te)null!==d&&d.h(0,h);else if(g=b,a.gg===Yn){a.ze=1;var l=Qn(b);if(0===k||l<=c)a.qb=Math.max(a.qb,l),Wn(a,b,a.qb),null!==d&&d.h(l,h);else{f=Zn(a,g);g=g.substr(f.length);b=Zn(a,g);for(l=Qn(f+b);0c&&1c;){var n=1;l=Qn(b.substr(0,n));for(m=0;l<=c;)n++,m=l,l=Qn(b.substr(0,n));if(1===n){var p=l;f=Math.max(f,l)}else p=m,f=Math.max(f,m);n--;1>n&&(n=1);Wn(a,b.substr(0,n),p);k++;b=b.substr(n);if(a.Wc+k>a.te)break}m=Zn(a,g);for(l=Qn(b+m);0a.te))break}a.ze=Math.min(a.te,k);a.qb=Math.max(a.qb,f);null!==d&&d.h(a.qb,h*a.ze)}}function Zn(a,b){if(a.gg===$n)return b.substr(0,1);for(var c=b.length,d=0,e=ao;d=b.length?b:b.substr(0,d)}function Qn(a){return null===In?8*a.length:In.measureText(a).width} +function Xn(a,b,c,d){var e=a.Xh===Ln;e&&(b=b.trim());var f=0,g=a.ne,h=a.ff+a.gf;h=Math.max(0,Mn(a)+h);var k=a.Vf===Sn?Tn(g):0;if(a.Xc>=a.te)null!==d&&d.h(0,h);else if(g=b,a.gg===Yn){a.ze=1;var l=Qn(b);if(0===k||l<=c)a.qb=Math.max(a.qb,l),Wn(a,b,a.qb),null!==d&&d.h(l,h);else{f=Zn(a,g);g=g.substr(f.length);b=Zn(a,g);for(l=Qn(f+b);0c&&1c;){var n=1;l=Qn(b.substr(0,n));for(m=0;l<=c;)n++,m=l,l=Qn(b.substr(0,n));if(1===n){var p=l;f=Math.max(f,l)}else p=m,f=Math.max(f,m);n--;1>n&&(n=1);Wn(a,b.substr(0,n),p);k++;b=b.substr(n);if(a.Xc+k>a.te)break}m=Zn(a,g);for(l=Qn(b+m);0a.te))break}a.ze=Math.min(a.te,k);a.qb=Math.max(a.qb,f);null!==d&&d.h(a.qb,h*a.ze)}}function Zn(a,b){if(a.gg===$n)return b.substr(0,1);for(var c=b.length,d=0,e=ao;d=b.length?b:b.substr(0,d)}function Qn(a){return null===In?8*a.length:In.measureText(a).width} function Mn(a){if(null!==a.oe)return a.oe;var b=a.ne;if(null===In){var c=16;return a.oe=c}void 0!==co[b]&&5E3>eo?c=co[b]:(c=1.3*In.measureText("M").width,co[b]=c,eo++);return a.oe=c}function Tn(a){if(null===In)return 6;if(void 0!==fo[a]&&5E3>go)var b=fo[a];else b=In.measureText(Un).width,fo[a]=b,go++;return b} -function Rn(a,b){var c=a.Ub.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),d=a.ff+a.gf;d=Math.max(0,Mn(a)+d);if(0===c.length)return a.qb=0,a.Wc=1,d;if(!a.isMultiline){var e=c.indexOf("\n",0);0<=e&&(c=c.substr(0,e))}e=0;for(var f=a.Wc=0,g,h=!1;!h;){g=c.indexOf("\n",f);-1===g&&(g=c.length,h=!0);if(f<=g){f=c.substr(f,g-f);if(a.gg!==Yn){a.ze=0;var k=M.alloc();Xn(a,f,b,k);e+=k.height;M.free(k);a.Wc+=a.ze}else Xn(a,f,b,null),e+=d,a.Wc++;a.Wc===a.te&&(h=!0)}f=g+1}return a.Ir=e} +function Rn(a,b){var c=a.Ub.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),d=a.ff+a.gf;d=Math.max(0,Mn(a)+d);if(0===c.length)return a.qb=0,a.Xc=1,d;if(!a.isMultiline){var e=c.indexOf("\n",0);0<=e&&(c=c.substr(0,e))}e=0;for(var f=a.Xc=0,g,h=!1;!h;){g=c.indexOf("\n",f);-1===g&&(g=c.length,h=!0);if(f<=g){f=c.substr(f,g-f);if(a.gg!==Yn){a.ze=0;var k=M.alloc();Xn(a,f,b,k);e+=k.height;M.free(k);a.Xc+=a.ze}else Xn(a,f,b,null),e+=d,a.Xc++;a.Xc===a.te&&(h=!0)}f=g+1}return a.Ir=e} na.Object.defineProperties(Lg.prototype,{font:{get:function(){return this.ne},set:function(a){var b=this.ne;b!==a&&(this.ne=a,this.oe=null,this.s(),this.g("font",b,a))}},text:{get:function(){return this.Ub},set:function(a){var b=this.Ub;null!==a&&void 0!==a?a=a.toString():a="";b!==a&&(this.Ub=a,this.s(),this.g("text",b,a))}},textAlign:{get:function(){return this.ui},set:function(a){var b=this.ui;b===a||"start"!== a&&"end"!==a&&"left"!==a&&"right"!==a&&"center"!==a||(this.ui=a,this.N(),this.g("textAlign",b,a))}},flip:{get:function(){return this.Rd},set:function(a){var b=this.Rd;b!==a&&(this.Rd=a,this.N(),this.g("flip",b,a))}},verticalAlignment:{get:function(){return this.Bi},set:function(a){var b=this.Bi;b.A(a)||(this.Bi=a=a.I(),zl(this),this.g("verticalAlignment",b,a))}},naturalBounds:{get:function(){if(!this.qc.u()){var a= M.alloc();Xn(this,this.Ub,999999,a);var b=a.width;M.free(a);a=Rn(this,b);var c=this.desiredSize;isNaN(c.width)||(b=c.width);isNaN(c.height)||(a=c.height);Tb(this.qc,b,a)}return this.qc}},isMultiline:{get:function(){return this.Aj},set:function(a){var b=this.Aj;b!==a&&(this.Aj=a,this.s(),this.g("isMultiline",b,a))}},isUnderline:{get:function(){return this.ai},set:function(a){var b=this.ai;b!==a&&(this.ai=a,this.N(),this.g("isUnderline",b, a))}},isStrikethrough:{get:function(){return this.$h},set:function(a){var b=this.$h;b!==a&&(this.$h=a,this.N(),this.g("isStrikethrough",b,a))}},wrap:{get:function(){return this.gg},set:function(a){var b=this.gg;b!==a&&(this.gg=a,this.s(),this.g("wrap",b,a))}},overflow:{get:function(){return this.Vf},set:function(a){var b=this.Vf;b!==a&&(this.Vf=a,this.s(),this.g("overflow",b,a))}},stroke:{ -get:function(){return this.Dc},set:function(a){var b=this.Dc;b!==a&&(null!==a&&Nl(a,"TextBlock.stroke"),a instanceof ml&&a.freeze(),this.Dc=a,this.N(),this.g("stroke",b,a))}},lineCount:{get:function(){return this.Wc}},lineHeight:{get:function(){return Mn(this)}},editable:{get:function(){return this.En},set:function(a){var b=this.En;b!==a&&(this.En=a,this.g("editable",b,a))}},textEditor:{ -get:function(){return this.Lp},set:function(a){var b=this.Lp;b!==a&&(this.Lp=a,this.g("textEditor",b,a))}},errorFunction:{get:function(){return this.kd},set:function(a){var b=this.kd;b!==a&&(this.kd=a,this.g("errorFunction",b,a))}},interval:{get:function(){return this.Wd},set:function(a){var b=this.Wd;a=Math.round(a);if(b!==a&&0!==a&&isFinite(a)){this.Wd=a;this.s();var c=this.panel;null!==c&&(c.Nf=null);this.g("interval",b,a)}}},graduatedStart:{ +get:function(){return this.Dc},set:function(a){var b=this.Dc;b!==a&&(null!==a&&Nl(a,"TextBlock.stroke"),a instanceof ml&&a.freeze(),this.Dc=a,this.N(),this.g("stroke",b,a))}},lineCount:{get:function(){return this.Xc}},lineHeight:{get:function(){return Mn(this)}},editable:{get:function(){return this.En},set:function(a){var b=this.En;b!==a&&(this.En=a,this.g("editable",b,a))}},textEditor:{ +get:function(){return this.Lp},set:function(a){var b=this.Lp;b!==a&&(this.Lp=a,this.g("textEditor",b,a))}},errorFunction:{get:function(){return this.ld},set:function(a){var b=this.ld;b!==a&&(this.ld=a,this.g("errorFunction",b,a))}},interval:{get:function(){return this.Wd},set:function(a){var b=this.Wd;a=Math.round(a);if(b!==a&&0!==a&&isFinite(a)){this.Wd=a;this.s();var c=this.panel;null!==c&&(c.Nf=null);this.g("interval",b,a)}}},graduatedStart:{ get:function(){return this.Ud},set:function(a){var b=this.Ud;b!==a&&(0>a?a=0:1a?a=0:1=a&&xa(a,"> 0",Lg,"maxLines"),this.te=a,this.s(),this.g("maxLines",b,a))}},metrics:{get:function(){return{arrSize:null!==this.zc?this.zc:[this.qb],arrText:null!==this.Pb?this.Pb:[this.me],maxLineWidth:this.qb,fontHeight:this.oe}}},choices:{get:function(){return this.gn},set:function(a){var b=this.gn;b!==a&&(this.gn=a,this.g("choices",b,a))}}}); var Nn=null,On=null,Yn=new D(Lg,"None",0),Vn=new D(Lg,"WrapFit",1),Kn=new D(Lg,"WrapDesiredSize",2),$n=new D(Lg,"WrapBreakAll",3),Jn=new D(Lg,"OverflowClip",0),Sn=new D(Lg,"OverflowEllipsis",1),Ln=new D(Lg,"FormatTrim",0),bo=new D(Lg,"FormatNone",0),ao=/[ \u200b\u00ad]/,co=new Wa,eo=0,fo=new Wa,go=0,Un="...",Pn="",In=null,Hn=!1;Lg.className="TextBlock";Lg.getEllipsis=function(){return Un};Lg.setEllipsis=function(a){Un=a;fo=new Wa;go=0};Lg.getBaseline=function(){return Nn}; Lg.setBaseline=function(a){Nn=a};Lg.getUnderline=function(){return On};Lg.setUnderline=function(a){On=a};Lg.isValidFont=function(a){Hn||(In=Jg?(new Ak(null)).context:null,Hn=!0);if(null===In)return!0;var b=In.font;if(a===b||"10px sans-serif"===a)return!0;In.font="10px sans-serif";In.font=a;var c=In.font;if("10px sans-serif"!==c)return In.font=b,!0;In.font="19px serif";var d=In.font;In.font=a;c=In.font;In.font=b;return c!==d};Lg.FormatNone=bo;Lg.FormatTrim=Ln;Lg.None=Yn;Lg.OverflowClip=Jn; -Lg.OverflowEllipsis=Sn;Lg.WrapBreakAll=$n;Lg.WrapDesiredSize=Kn;Lg.WrapFit=Vn;function Vj(a,b){Y.call(this);this.Gg=null;this.Ep="";this.hh=hc;this.fl=sd;this.kh=this.kd=null;this.el=yc;this.Rd=og;this.Wl=null;this.co=!1;this.Kn=!0;this.ul=!1;this.Pl=null;"string"===typeof a?this.source=a:a&&Object.assign(this,a);b&&Object.assign(this,b)}var ho;ma(Vj,Y); -Vj.prototype.cloneProtected=function(a){Y.prototype.cloneProtected.call(this,a);a.element=this.Gg;a.Ep=this.Ep;a.hh=this.hh.I();a.fl=this.fl;a.Rd=this.Rd;a.kd=this.kd;a.kh=this.kh;a.el=this.el.I();a.Kn=this.Kn;a.Pl=this.Pl};Vj.prototype.gb=function(a){a===og||a===qg||a===Xk?this.imageStretch=a:Y.prototype.gb.call(this,a)};Vj.prototype.toString=function(){return"Picture("+this.source+")#"+gb(this)};function Ii(a){void 0===a&&(a="");""!==a?ho[a]&&(delete ho[a],io--):(ho=new Wa,io=0)} +Lg.OverflowEllipsis=Sn;Lg.WrapBreakAll=$n;Lg.WrapDesiredSize=Kn;Lg.WrapFit=Vn;function Vj(a,b){Y.call(this);this.Gg=null;this.Ep="";this.hh=hc;this.fl=sd;this.kh=this.ld=null;this.el=yc;this.Rd=og;this.Wl=null;this.co=!1;this.Kn=!0;this.ul=!1;this.Pl=null;"string"===typeof a?this.source=a:a&&Object.assign(this,a);b&&Object.assign(this,b)}var ho;ma(Vj,Y); +Vj.prototype.cloneProtected=function(a){Y.prototype.cloneProtected.call(this,a);a.element=this.Gg;a.Ep=this.Ep;a.hh=this.hh.I();a.fl=this.fl;a.Rd=this.Rd;a.ld=this.ld;a.kh=this.kh;a.el=this.el.I();a.Kn=this.Kn;a.Pl=this.Pl};Vj.prototype.gb=function(a){a===og||a===qg||a===Xk?this.imageStretch=a:Y.prototype.gb.call(this,a)};Vj.prototype.toString=function(){return"Picture("+this.source+")#"+gb(this)};function Ii(a){void 0===a&&(a="");""!==a?ho[a]&&(delete ho[a],io--):(ho=new Wa,io=0)} function jo(a,b){b.Vy||(b.Hr=function(c){b.zr=!0;b.Xn=!1;var d=b.Cg.copy();if(null!==d&&void 0!==d){for(d=d.iterator;d.next();){var e=d.value;var f=b.getAttribute("src")||"";var g=e.$g.H(f);if(null!==g)for(var h=g.length,k=0;k=d.width&&(e=e+r.offsetX+(m*r.x-d.width*r.x));n>=d.height&&(f=f+r.offsetY+(n*r.y-d.height*r.y));h=Math.min(d.width,m);g=Math.min(d.height,n);break;case sd:m=d.width;n=d.height;break;case qg:case Xk:p===qg?(p=Math.min(d.height/n,d.width/m),m*=p,n*=p):p===Xk&&(p=Math.max(d.height/n,d.width/m),m*=p,n*=p,m>=d.width&&(e=(e+r.offsetX+(m*r.x-d.width*r.x)/m)*h),n>=d.height&&(f=(f+r.offsetY+(n*r.y-d.height*r.y)/n)*g),h*=1/(m/ d.width),g*=1/(n/d.height),m=d.width,n=d.height)}p=this.wf()*b.scale;var q=m*p*n*p,u=h*g/q,v=c.__goCache;p=null;var w=ko;if(c.zr&&void 0!==v&&4w*w)for(null===v.Di&&(lo(v,4,k,l,c),lo(v,16,k,l,c)),k=v.Di,l=k.length,q=0;qe.x&&a.y>e.y&&a.righte.x&&b.y>e.y&&b.righte.x&&a.y>e.y&&a.righte.x&&b.y>e.y&&b.right=c.maxSelectionCount)){this.D^=4096;var d=!1;if(null!==c){d=c.skipsUndoManager;c.skipsUndoManager=!0;var e=c.selection;e.ea();a?e.add(this):e.remove(this);e.freeze()}this.g("isSelected",b,a);this.Kb();a=this.selectionChanged;null!==a&&a(this);null!==c&&(c.Fb(),c.skipsUndoManager=d)}}}},isHighlighted:{get:function(){return 0!== (this.D&524288)},set:function(a){var b=0!==(this.D&524288);if(b!==a){this.D^=524288;var c=this.diagram;null!==c&&(c=c.highlighteds,c.ea(),a?c.add(this):c.remove(this),c.freeze());this.g("isHighlighted",b,a);this.N();a=this.highlightedChanged;null!==a&&a(this)}}},isShadowed:{get:function(){return 0!==(this.D&8192)},set:function(a){var b=0!==(this.D&8192);b!==a&&(this.D^=8192,this.g("isShadowed",b,a),this.N())}},isAnimated:{get:function(){return 0!== @@ -1410,19 +1410,19 @@ get:function(){return this.tp},set:function(a){var b=this.tp;b!==a&&(this.tp=a,t b!==a&&(this.vp=a,this.g("selectionChanged",b,a))}},resizeAdornmentTemplate:{get:function(){return this.gp},set:function(a){var b=this.gp;b!==a&&(this.gp=a,this.g("resizeAdornmentTemplate",b,a))}},resizeObjectName:{get:function(){return this.ip},set:function(a){var b=this.ip;b!==a&&(this.ip=a,this.g("resizeObjectName",b,a))}},resizeObject:{get:function(){var a=this.resizeObjectName;return""!==a&&(a=this.Ya(a), null!==a)?a:this}},resizeCellSize:{get:function(){return this.hp},set:function(a){var b=this.hp;b.A(a)||(this.hp=a=a.I(),this.g("resizeCellSize",b,a))}},rotateAdornmentTemplate:{get:function(){return this.kp},set:function(a){var b=this.kp;b!==a&&(this.kp=a,this.g("rotateAdornmentTemplate",b,a))}},rotateObjectName:{get:function(){return this.lp},set:function(a){var b=this.lp;b!==a&&(this.lp=a,this.g("rotateObjectName", b,a))}},rotateObject:{get:function(){var a=this.rotateObjectName;return""!==a&&(a=this.Ya(a),null!==a)?a:this}},rotationSpot:{get:function(){return this.mp},set:function(a){var b=this.mp;b.A(a)||(this.mp=a=a.I(),this.g("rotationSpot",b,a))}},text:{get:function(){return this.Ub},set:function(a){var b=this.Ub;b!==a&&(this.Ub=a,this.g("text",b,a))}},containingGroup:{get:function(){return this.Qh}, -set:function(a){if(this.Jc()){var b=this.Qh;if(b!==a){null===a||this!==a&&!a.Fd(this)||(this===a&&C("Cannot make a Group a member of itself: "+this.toString()),C("Cannot make a Group indirectly contain itself: "+this.toString()+" already contains "+a.toString()));this.B(2);var c=this.diagram;null!==b?Do(b,this):this instanceof hf&&null!==c&&c.xi.remove(this);this.Qh=a;null!==a?Co(a,this):this instanceof hf&&null!==c&&c.xi.add(this);this.B(1);if(null!==c&&c.Z){var d=this.data,e=c.model;if(null!==d&& +set:function(a){if(this.Kc()){var b=this.Qh;if(b!==a){null===a||this!==a&&!a.Fd(this)||(this===a&&C("Cannot make a Group a member of itself: "+this.toString()),C("Cannot make a Group indirectly contain itself: "+this.toString()+" already contains "+a.toString()));this.B(2);var c=this.diagram;null!==b?Do(b,this):this instanceof hf&&null!==c&&c.xi.remove(this);this.Qh=a;null!==a?Co(a,this):this instanceof hf&&null!==c&&c.xi.add(this);this.B(1);if(null!==c&&c.Z){var d=this.data,e=c.model;if(null!==d&& e.pk()){var f=e.pa(null!==a?a.data:null);e.Gq(d,f)}}d=this.containingGroupChanged;null!==d&&(e=!0,null!==c&&(e=c.Z,c.Z=!0),d(this,b,a),null!==c&&(c.Z=e));if(this instanceof hf)for(c=new G,Rk(c,this,!0,0,!0),c=c.iterator;c.next();)if(d=c.value,d instanceof W)for(d=d.linksConnected;d.next();)Io(d.value);if(this instanceof W){for(c=this.linksConnected;c.next();)Io(c.value);c=this.labeledLink;null!==c&&Io(c)}this.g("containingGroup",b,a);null!==a&&(b=a.layer,null!==b&&ci(b,-1,a))}}else C("cannot set the Part.containingGroup of a Link or Adornment")}}, containingGroupChanged:{get:function(){return this.kn},set:function(a){var b=this.kn;b!==a&&(this.kn=a,this.g("containingGroupChanged",b,a))}},isTopLevel:{get:function(){return null!==this.containingGroup||this instanceof W&&null!==this.labeledLink?!1:!0}},layoutConditions:{get:function(){return this.so},set:function(a){var b=this.so;b!==a&&(this.so=a,this.g("layoutConditions",b,a))}},dragComputation:{ get:function(){return this.An},set:function(a){var b=this.An;b!==a&&(this.An=a,this.g("dragComputation",b,a))}},shadowOffset:{get:function(){return this.Bp},set:function(a){var b=this.Bp;b.A(a)||(this.Bp=a=a.I(),this.N(),this.g("shadowOffset",b,a))}},shadowColor:{get:function(){return this.Ap},set:function(a){var b=this.Ap;b!==a&&(this.Ap=a,this.N(),this.g("shadowColor",b,a))}},shadowBlur:{get:function(){return this.bg}, set:function(a){var b=this.bg;b!==a&&(this.bg=a,this.N(),this.g("shadowBlur",b,a))}}});V.prototype.invalidateLayout=V.prototype.B;V.prototype.findCommonContainingGroup=V.prototype.Rx;V.prototype.isMemberOf=V.prototype.Fd;V.prototype.findTopLevelPart=V.prototype.Yz;V.prototype.findSubGraphLevel=V.prototype.Uz;V.prototype.ensureBounds=V.prototype.Sa;V.prototype.getDocumentBounds=V.prototype.Mi;V.prototype.findObject=V.prototype.Ya;V.prototype.moveTo=V.prototype.moveTo; V.prototype.invalidateAdornments=V.prototype.Kb;V.prototype.clearAdornments=V.prototype.$j;V.prototype.removeAdornment=V.prototype.Cf;V.prototype.addAdornment=V.prototype.th;V.prototype.findAdornment=V.prototype.hk;V.prototype.updateTargetBindings=V.prototype.Da;var Ao=!1;V.className="Part";V.LayoutNone=0;V.LayoutAdded=1;V.LayoutRemoved=2;V.LayoutShown=4;V.LayoutHidden=8;V.LayoutNodeSized=16;V.LayoutGroupLayout=32;V.LayoutNodeReplaced=64;V.LayoutStandard=127;V.LayoutAll=16777215; -function we(a,b){void 0===a||a instanceof Kl||"string"===typeof a?V.call(this,a):(V.call(this),a&&(b=a));this.D&=-257;this.Og="Adornment";this.ie=null;this.ax=0;this.xx=!1;this.j=this.Ra=null;b&&Object.assign(this,b)}ma(we,V);we.prototype.toString=function(){var a=this.adornedPart;return"Adornment("+this.category+")"+(null!==a?a.toString():"")};we.prototype.updateRelationshipsFromData=function(){}; -we.prototype.sk=function(a){var b=this.adornedObject,c=null===b||void 0===b?void 0:b.part;if(c instanceof U&&b instanceof uf){b=c.path;c.sk(a);a=b.geometry;c=this.T.m;b=c.length;for(var d=0;da&&(a=1);var b=this.diagram;if(null!==b&&!b.He){b.He=!0;var c=new G;c.add(this);To(this,c,b.isTreePathToChildren,a,b,this,b.treeCollapsePolicy===qi);b.He=!1}};function To(a,b,c,d,e,f,g){if(1a&&(a=2);var b=this.diagram;if(null!==b&&!b.He){b.He=!0;var c=new G;c.add(this);Vo(this,c,b.isTreePathToChildren,a,b,this,b.treeCollapsePolicy===qi);b.He=!1}}; -function Vo(a,b,c,d,e,f,g){for(var h=f===a?!1:a.isTreeExpanded,k=c?a.iq():a.Dd();k.next();){var l=k.value;l.isTreeLink&&(h||l.rd||l.Ua(),l=l.nq(a),null!==l&&l!==a&&!b.contains(l)&&(b.add(l),h||(l.Nb(!0),l.Ch(),g&&e.Yj(l,f)),2e&&(e=h.right);h.bottom>f&&(f=h.bottom)}}isFinite(c)&&isFinite(d)?a.h(c,d,e-c,f-d):(b=b.location, a.h(b.x,b.y,0,0));return a};na.Object.defineProperties(mg.prototype,{padding:{get:function(){return this.mb},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.mb;b.A(a)||(this.mb=a=a.I(),this.g("padding",b,a),this.s())}}});mg.className="Placeholder"; -function U(a){V.call(this,X.Link);this.Ia=8;this.Se=null;this.Te="";this.kf=this.On=null;this.lf="";this.Op=null;this.Ek=Vf;this.rn=0;this.tn=Vf;this.un=NaN;this.Oj=$o;this.Dp=.5;this.ld=null;this.Bb=(new E).freeze();this.cf=this.Zg=null;this.Gl=new N;this.ma=new Q;this.C=this.o=this.If=this.Mf=null;this.Ru=new J;this.qr=this.px=this.ox=null;this.Rt=NaN;this.P=null;this.j=[];a&&Object.assign(this,a)}ma(U,V); +function U(a){V.call(this,X.Link);this.Ia=8;this.Se=null;this.Te="";this.kf=this.On=null;this.lf="";this.Op=null;this.Ek=Vf;this.rn=0;this.tn=Vf;this.un=NaN;this.Oj=$o;this.Dp=.5;this.md=null;this.Bb=(new E).freeze();this.cf=this.Zg=null;this.Gl=new N;this.ma=new Q;this.C=this.o=this.If=this.Mf=null;this.Ru=new J;this.qr=this.px=this.ox=null;this.Rt=NaN;this.P=null;this.j=[];a&&Object.assign(this,a)}ma(U,V); U.prototype.cloneProtected=function(a){V.prototype.cloneProtected.call(this,a);a.Ia=this.Ia&-113;a.Te=this.Te;a.On=this.On;a.lf=this.lf;a.Op=this.Op;a.Ek=this.Ek;a.rn=this.rn;a.tn=this.tn;a.un=this.un;a.Oj=this.Oj;a.Dp=this.Dp;null!==this.P&&(a.P=this.P.copy())};t=U.prototype;t.sf=function(a){V.prototype.sf.call(this,a);this.Te=a.Te;this.lf=a.lf;a.Zg=null;a.Ua();a.If=this.If;var b=a.fromPort;null!==b&&Mo(b);a=a.toPort;null!==a&&Mo(a)}; -t.gb=function(a){a.classType===U?2===(a.value&2)?this.routing=a:a===Yf||a===Uf||a===Tf?this.curve=a:a===ap||a===bp||a===cp?this.adjusting=a:a!==$o&&a!==Vf&&C("Unknown Link enum value for a Link property: "+a):V.prototype.gb.call(this,a)};t.Hc=function(){null===this.P&&(this.P=new cl)};t.Si=function(){var a=this.fromNode;if(null!==a){var b=a.findVisibleNode();null!==b&&(a=b);if(nj(a)||oj(a))return!1}a=this.toNode;return null!==a&&(b=a.findVisibleNode(),null!==b&&(a=b),nj(a)||oj(a))?!1:!0};t.Zv=function(){return!1}; -t.gt=function(){};t.Jc=function(){return!1};U.prototype.computeAngle=function(a,b,c){return U.computeAngle(b,c)};U.computeAngle=function(a,b){switch(a){default:case Vf:a=0;break;case Rm:a=b;break;case Km:a=b+90;break;case Mm:a=b-90;break;case dp:a=b+180;break;case Sm:a=L.vq(b);90a&&(a-=180);break;case Lm:a=L.vq(b+90);90a&&(a-=180);break;case Nm:a=L.vq(b-90);90a&&(a-=180);break;case Om:a=L.vq(b);if(45a||225a)return 0;90a&&(a-=180)}return L.vq(a)}; -function Io(a){var b=a.fromNode,c=a.toNode,d=null;null!==b?d=null!==c?b.Rx(c):b.containingGroup:null!==c?d=c.containingGroup:d=null;b=d;c=a.Qh;if(c!==b){null!==c&&Do(c,a);a.Qh=b;null!==b&&Co(b,a);var e=a.containingGroupChanged;if(null!==e){var f=!0,g=a.diagram;null!==g&&(f=g.Z,g.Z=!0);e(a,c,b);null!==g&&(g.Z=f)}!a.rd||a.ox!==c&&a.px!==c||a.Ua()}if(a.isLabeledLink)for(a=a.labelNodes;a.next();)a.value.containingGroup=d}t=U.prototype; -t.Ch=function(){var a=this.containingGroup;null!==a&&this.fromNode!==a&&this.toNode!==a&&a.computesBoundsIncludingLinks&&V.prototype.Ch.call(this)};t.nq=function(a){var b=this.fromNode;return a===b?this.toNode:b};t.gA=function(a){var b=this.fromPort;return a===b?this.toPort:b};function Qo(a,b){null===a.ld&&(a.ld=new G);a.ld.add(b);a.s()} +t.gb=function(a){a.classType===U?2===(a.value&2)?this.routing=a:a===Yf||a===Uf||a===Tf?this.curve=a:a===ap||a===bp||a===cp?this.adjusting=a:a!==$o&&a!==Vf&&C("Unknown Link enum value for a Link property: "+a):V.prototype.gb.call(this,a)};t.Ic=function(){null===this.P&&(this.P=new cl)};t.Si=function(){var a=this.fromNode;if(null!==a){var b=a.findVisibleNode();null!==b&&(a=b);if(nj(a)||oj(a))return!1}a=this.toNode;return null!==a&&(b=a.findVisibleNode(),null!==b&&(a=b),nj(a)||oj(a))?!1:!0};t.Zv=function(){return!1}; +t.gt=function(){};t.Kc=function(){return!1};U.prototype.computeAngle=function(a,b,c){return U.computeAngle(b,c)};U.computeAngle=function(a,b){switch(a){default:case Vf:a=0;break;case Rm:a=b;break;case Km:a=b+90;break;case Mm:a=b-90;break;case dp:a=b+180;break;case Sm:a=L.vq(b);90a&&(a-=180);break;case Lm:a=L.vq(b+90);90a&&(a-=180);break;case Nm:a=L.vq(b-90);90a&&(a-=180);break;case Om:a=L.vq(b);if(45a||225a)return 0;90a&&(a-=180)}return L.vq(a)}; +function Io(a){var b=a.fromNode,c=a.toNode,d=null;null!==b?d=null!==c?b.Rx(c):b.containingGroup:null!==c?d=c.containingGroup:d=null;b=d;c=a.Qh;if(c!==b){null!==c&&Do(c,a);a.Qh=b;null!==b&&Co(b,a);var e=a.containingGroupChanged;if(null!==e){var f=!0,g=a.diagram;null!==g&&(f=g.Z,g.Z=!0);e(a,c,b);null!==g&&(g.Z=f)}!a.sd||a.ox!==c&&a.px!==c||a.Ua()}if(a.isLabeledLink)for(a=a.labelNodes;a.next();)a.value.containingGroup=d}t=U.prototype; +t.Ch=function(){var a=this.containingGroup;null!==a&&this.fromNode!==a&&this.toNode!==a&&a.computesBoundsIncludingLinks&&V.prototype.Ch.call(this)};t.nq=function(a){var b=this.fromNode;return a===b?this.toNode:b};t.gA=function(a){var b=this.fromPort;return a===b?this.toPort:b};function Qo(a,b){null===a.md&&(a.md=new G);a.md.add(b);a.s()} t.pq=function(a){V.prototype.pq.call(this,a);ep(this)&&this.rq(this.actualBounds);if(!a){a=this.Se;var b=null;null!==a&&(b=this.fromPort,Oo(a,this,b));var c=this.kf;if(null!==c){var d=this.toPort;c===a&&d===b||Oo(c,this,d)}fp(this)}};t.qq=function(a){V.prototype.qq.call(this,a);ep(this)&&this.rq(this.actualBounds);if(!a){a=this.Se;var b=null;null!==a&&(b=this.fromPort,Po(a,this,b));var c=this.kf;if(null!==c){var d=this.toPort;c===a&&d===b||Po(c,this,d)}gp(this)}}; -t.fk=function(){this.rd=!0;if(null!==this.ld){var a=this.diagram;if(null!==a)for(var b=this.ld.copy().iterator;b.next();)a.remove(b.value)}null!==this.data&&(a=this.diagram,null!==a&&a.partManager.removeDataForLink(this))};U.prototype.updateRelationshipsFromData=function(){if(null!==this.data){var a=this.diagram;null!==a&&a.partManager.updateRelationshipsFromData(this)}}; +t.fk=function(){this.sd=!0;if(null!==this.md){var a=this.diagram;if(null!==a)for(var b=this.md.copy().iterator;b.next();)a.remove(b.value)}null!==this.data&&(a=this.diagram,null!==a&&a.partManager.removeDataForLink(this))};U.prototype.updateRelationshipsFromData=function(){if(null!==this.data){var a=this.diagram;null!==a&&a.partManager.updateRelationshipsFromData(this)}}; U.prototype.move=function(a,b){var c=b?this.location:this.position,d=c.x;isNaN(d)&&(d=0);var e=c.y;isNaN(e)&&(e=0);d=a.x-d;e=a.y-e;!0===b?V.prototype.move.call(this,a,!1):(a=J.allocAt(c.x+d,c.y+e),V.prototype.move.call(this,a,!1),J.free(a));cf(this,d,e);for(a=this.labelNodes;a.next();)b=a.value,c=b.position,b.moveTo(c.x+d,c.y+e)}; U.prototype.canRelinkFrom=function(){if(!this.relinkableFrom)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowRelink)return!1;a=a.diagram;return null===a||a.allowRelink?!0:!1};U.prototype.canRelinkTo=function(){if(!this.relinkableTo)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowRelink)return!1;a=a.diagram;return null===a||a.allowRelink?!0:!1}; U.prototype.computeMidPoint=function(a){var b=this.pointsCount;if(0===b)return a.assign(vb),a;if(1===b)return a.assign(this.i(0)),a;if(2===b){var c=this.i(0),d=this.i(1);a.h((c.x+d.x)/2,(c.y+d.y)/2);return a}if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===Yf))return this.ma.uv(.5,a),a.add(this.i(0)),c=this.ma.figures.first(),a.offset(-c.startX,-c.startY),a;if(this.computeCurve()===Yf){if(3===b)return this.i(1);d=(b-1)/3|0;c=3*(d/2|0);if(1===d%2){d=this.i(c);var e=this.i(c+1), f=this.i(c+2);c=this.i(c+3);L.pz(d.x,d.y,e.x,e.y,f.x,f.y,c.x,c.y,a)}else a.assign(this.i(c));return a}var g=this.flattenedLengths;c=this.flattenedTotalLength;for(e=f=d=0;dc/2)break;d+=e;f++}b=this.i(f);f=this.i(f+1);1>Math.abs(b.x-f.x)?b.y>f.y?a.h(b.x,b.y-(c/2-d)):a.h(b.x,b.y+(c/2-d)):1>Math.abs(b.y-f.y)?b.x>f.x?a.h(b.x-(c/2-d),b.y):a.h(b.x+(c/2-d),b.y):(c=(c/2-d)/e,a.h(b.x+c*(f.x-b.x),b.y+c*(f.y-b.y)));return a}; -U.prototype.computeMidAngle=function(){var a=this.pointsCount;if(2>a)return NaN;if(2===a)return this.i(0).Oa(this.i(1));if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===Yf))return this.ma.Xx(.5);if(this.computeCurve()===Yf&&4<=a){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){c=Math.floor(c);a=this.i(c);b=this.i(c+1);var d=this.i(c+2);c=this.i(c+3);return L.oz(a.x,a.y,b.x,b.y,d.x,d.y,c.x,c.y)}if(0d/2)break;e+=f;c++}b=this.i(c);d=this.i(c+1);if(1>Math.abs(b.x-d.x)&&1>Math.abs(b.y-d.y)){if(0Math.abs(b.x-d.x))return b.y>d.y?270:90;if(1>Math.abs(b.y-d.y))return b.x>d.x?180:0}return b.Oa(d)};t=U.prototype;t.i=function(a){return this.Bb.m[a]};t.Mc=function(a,b){this.Bb.Lc(a,b)};t.L=function(a,b,c){this.Bb.Lc(a,new J(b,c))};t.pA=function(a,b){this.Bb.ub(a,b)}; +U.prototype.computeMidAngle=function(){var a=this.pointsCount;if(2>a)return NaN;if(2===a)return this.i(0).Ra(this.i(1));if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===Yf))return this.ma.Xx(.5);if(this.computeCurve()===Yf&&4<=a){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){c=Math.floor(c);a=this.i(c);b=this.i(c+1);var d=this.i(c+2);c=this.i(c+3);return L.oz(a.x,a.y,b.x,b.y,d.x,d.y,c.x,c.y)}if(0d/2)break;e+=f;c++}b=this.i(c);d=this.i(c+1);if(1>Math.abs(b.x-d.x)&&1>Math.abs(b.y-d.y)){if(0Math.abs(b.x-d.x))return b.y>d.y?270:90;if(1>Math.abs(b.y-d.y))return b.x>d.x?180:0}return b.Ra(d)};t=U.prototype;t.i=function(a){return this.Bb.m[a]};t.Nc=function(a,b){this.Bb.Mc(a,b)};t.L=function(a,b,c){this.Bb.Mc(a,new J(b,c))};t.pA=function(a,b){this.Bb.ub(a,b)}; t.l=function(a,b,c){this.Bb.ub(a,new J(b,c))};t.ce=function(a){this.Bb.add(a)};t.pf=function(a,b){this.Bb.add(new J(a,b))};t.Rv=function(a){this.Bb.eb(a)};t.ak=function(){this.Bb.clear()}; -function cf(a,b,c){if(0!==b||0!==c)if(0===a.pointsCount)a.defaultFromPoint&&a.defaultFromPoint.offset(b,c),a.defaultToPoint&&a.defaultToPoint.offset(b,c);else{for(var d=a.rd,e=new E,f=a.Bb.iterator;f.next();){var g=f.value;e.add((new J(g.x+b,g.y+c)).freeze())}e.freeze();f=a.Bb;a.Bb=e;g=a.diagram;isNaN(b)||isNaN(c)||null!==g&&g.animationManager.rb?a.s():(a.ae.h(a.ae.x+b,a.ae.y+c),a.ka.h(a.ka.x+b,a.ka.y+c),zl(a));d?hp(a):(a.defaultFromPoint&&(a.defaultFromPoint=a.i(0)),a.defaultToPoint&&(a.defaultToPoint= +function cf(a,b,c){if(0!==b||0!==c)if(0===a.pointsCount)a.defaultFromPoint&&a.defaultFromPoint.offset(b,c),a.defaultToPoint&&a.defaultToPoint.offset(b,c);else{for(var d=a.sd,e=new E,f=a.Bb.iterator;f.next();){var g=f.value;e.add((new J(g.x+b,g.y+c)).freeze())}e.freeze();f=a.Bb;a.Bb=e;g=a.diagram;isNaN(b)||isNaN(c)||null!==g&&g.animationManager.rb?a.s():(a.ae.h(a.ae.x+b,a.ae.y+c),a.ka.h(a.ka.x+b,a.ka.y+c),zl(a));d?hp(a):(a.defaultFromPoint&&(a.defaultFromPoint=a.i(0)),a.defaultToPoint&&(a.defaultToPoint= a.i(a.pointsCount-1)));null!==g&&g.animationManager.rb&&(b=g.animationManager,a.cf=e,b.Il.add(a));a.g("points",f,e)}}t.Hh=function(){null===this.Zg&&(this.Zg=this.Bb,this.Bb=this.Bb.copy())}; t.rf=function(){if(null!==this.Zg){for(var a=this.Zg,b=this.Bb,c=Infinity,d=Infinity,e=a.m,f=e.length,g=0;gl&&(n=-n),u= -(0>k?-1:1)*n+r,v=m*(u-r)+q);r=f.x+2*h/3;q=f.y+2*k/3;var w=r,z=q;L.w(k,0)?z=0k?-1:1)*n+r,z=m*(w-r)+q);this.ak();this.ce(f);this.pf(u,v);this.pf(w,z);this.ce(p);this.Mc(0,this.getLinkPoint(a,b,g,!0,!1,d,e));this.Mc(3,this.getLinkPoint(d,e,c,!1,!1,a,b))}else if(f=d,p=e,d=this.getLinkPoint(a,b,g,!0,!1,f,p),e=this.getLinkPoint(f,p,c,!1,!1,a,b),this.hasCurviness())p=e.x-d.x,c=e.y-d.y,g=this.computeCurviness(),a=d.x+p/2,b=d.y+c/2,f=a,h=b,L.w(c,0)?h=0g&&(f=-f),f=(0>c?-1:1)*f+a,h=p*(f-a)+b),this.ce(d),this.pf(f,h),this.ce(e);else{this.ce(d);this.ce(e);h=N.alloc();b.Mi(h);k=h.$(e);p.Mi(h);l=h.$(d);if(k||l)g=b.da(mp(g),new J),this.Mc(0,this.getLinkPointFromPoint(a,b,g,e,!0,g)),c=p.da(mp(c),new J),this.Mc(1,this.getLinkPointFromPoint(f,p,c,d,!1,c));N.free(h)}}else{n=this.isAvoiding;p&&(m&&n||l)&&this.ak();var y=l?this.computeCurviness():0;n=this.getLinkPoint(a,b,g,!0,m,d,e);r=u=q=0;if(m||!h||l)v=this.computeEndSegmentLength(a,b,g,!0),r=this.getLinkDirection(a, +(0>k?-1:1)*n+r,v=m*(u-r)+q);r=f.x+2*h/3;q=f.y+2*k/3;var w=r,z=q;L.w(k,0)?z=0k?-1:1)*n+r,z=m*(w-r)+q);this.ak();this.ce(f);this.pf(u,v);this.pf(w,z);this.ce(p);this.Nc(0,this.getLinkPoint(a,b,g,!0,!1,d,e));this.Nc(3,this.getLinkPoint(d,e,c,!1,!1,a,b))}else if(f=d,p=e,d=this.getLinkPoint(a,b,g,!0,!1,f,p),e=this.getLinkPoint(f,p,c,!1,!1,a,b),this.hasCurviness())p=e.x-d.x,c=e.y-d.y,g=this.computeCurviness(),a=d.x+p/2,b=d.y+c/2,f=a,h=b,L.w(c,0)?h=0g&&(f=-f),f=(0>c?-1:1)*f+a,h=p*(f-a)+b),this.ce(d),this.pf(f,h),this.ce(e);else{this.ce(d);this.ce(e);h=N.alloc();b.Mi(h);k=h.$(e);p.Mi(h);l=h.$(d);if(k||l)g=b.da(mp(g),new J),this.Nc(0,this.getLinkPointFromPoint(a,b,g,e,!0,g)),c=p.da(mp(c),new J),this.Nc(1,this.getLinkPointFromPoint(f,p,c,d,!1,c));N.free(h)}}else{n=this.isAvoiding;p&&(m&&n||l)&&this.ak();var y=l?this.computeCurviness():0;n=this.getLinkPoint(a,b,g,!0,m,d,e);r=u=q=0;if(m||!h||l)v=this.computeEndSegmentLength(a,b,g,!0),r=this.getLinkDirection(a, b,n,g,!0,m,d,e),l&&(h||g.A(c)||!m&&1===g.x+c.x&&1===g.y+c.y)&&(r-=m?90:30,0>y&&(r-=180)),0>r?r+=360:360<=r&&(r-=360),l&&(v+=Math.abs(y)*(m?1:2)),0===r?q=v:90===r?u=v:180===r?q=-v:270===r?u=-v:(q=v*Math.cos(r*Math.PI/180),u=v*Math.sin(r*Math.PI/180)),g.wc()&&l&&(v=b.da(yc,J.alloc()),w=J.allocAt(v.x+1E3*q,v.y+1E3*u),this.getLinkPointFromPoint(a,b,v,w,!0,n),J.free(v),J.free(w));v=this.getLinkPoint(d,e,c,!1,m,a,b);var A=z=w=0;if(m||!k||l){var B=this.computeEndSegmentLength(d,e,c,!1);A=this.getLinkDirection(d, -e,v,c,!1,m,a,b);l&&(k||g.A(c)||!m&&1===g.x+c.x&&1===g.y+c.y)&&(A+=m?0:30,0>y&&(A+=180));0>A?A+=360:360<=A&&(A-=360);l&&(B+=Math.abs(y)*(m?1:2));0===A?w=B:90===A?z=B:180===A?w=-B:270===A?z=-B:(w=B*Math.cos(A*Math.PI/180),z=B*Math.sin(A*Math.PI/180));c.wc()&&l&&(c=e.da(yc,J.alloc()),g=J.allocAt(c.x+1E3*w,c.y+1E3*z),this.getLinkPointFromPoint(d,e,c,g,!1,v),J.free(c),J.free(g))}c=n;if(m||!h||l)c=new J(n.x+q,n.y+u);g=v;if(m||!k||l)g=new J(v.x+w,v.y+z);!p&&!m&&h&&3Math.abs(b.y-a.y)?(b.x>=a.x?b.x=a.x+9E9:b.x=a.x-9E9,b.y=a.y):(b.y>=a.y?b.y=a.y+9E9:b.y=a.y-9E9,b.x=a.x);return b} +e,v,c,!1,m,a,b);l&&(k||g.A(c)||!m&&1===g.x+c.x&&1===g.y+c.y)&&(A+=m?0:30,0>y&&(A+=180));0>A?A+=360:360<=A&&(A-=360);l&&(B+=Math.abs(y)*(m?1:2));0===A?w=B:90===A?z=B:180===A?w=-B:270===A?z=-B:(w=B*Math.cos(A*Math.PI/180),z=B*Math.sin(A*Math.PI/180));c.wc()&&l&&(c=e.da(yc,J.alloc()),g=J.allocAt(c.x+1E3*w,c.y+1E3*z),this.getLinkPointFromPoint(d,e,c,g,!1,v),J.free(c),J.free(g))}c=n;if(m||!h||l)c=new J(n.x+q,n.y+u);g=v;if(m||!k||l)g=new J(v.x+w,v.y+z);!p&&!m&&h&&3Math.abs(b.y-a.y)?(b.x>=a.x?b.x=a.x+9E9:b.x=a.x-9E9,b.y=a.y):(b.y>=a.y?b.y=a.y+9E9:b.y=a.y-9E9,b.x=a.x);return b} U.prototype.getLinkPointFromPoint=function(a,b,c,d,e,f){void 0===f&&(f=new J);if(null===a||null===b)return f.assign(c),f;a.isVisible()||(e=a.findVisibleNode(),null!==e&&e!==a&&(b=e.port));a=null;e=b.panel;null===e||e.he()||(e=e.panel);if(null===e){e=d.x;d=d.y;var g=c.x;c=c.y}else{a=e.de;e=1/(a.m11*a.m22-a.m12*a.m21);g=a.m22*e;var h=-a.m12*e,k=-a.m21*e,l=a.m11*e,m=e*(a.m21*a.dy-a.m22*a.dx),n=e*(a.m12*a.dx-a.m11*a.dy);e=d.x*g+d.y*k+m;d=d.x*h+d.y*l+n;g=c.x*g+c.y*k+m;c=c.x*h+c.y*l+n}b.kk(e,d,g,c,f);null!== a&&f.transform(a);return f};function op(a,b){var c=b.bp;null===c&&(c=new pp,c.port=b,c.node=b.part,b.bp=c);return qp(c,a)} -U.prototype.getLinkPoint=function(a,b,c,d,e,f,g,h){void 0===h&&(h=new J);if(c.hb()&&!lp(c))return b.da(c,h),h;if(c.Kc()){var k=op(this,b);if(null!==k){h.assign(k.tq);if(e&&this.routing===rp){var l=op(this,g);if(null!==l&&k.fm=m.y&&a.y<=m.y+m.height?h.y=a.y:(c.zf(Dc)||c.zf(Hc))&&a.x>=m.x&&a.x<=m.x+m.width&&(h.x=a.x);J.free(k);J.free(l)}}return h}}c= +U.prototype.getLinkPoint=function(a,b,c,d,e,f,g,h){void 0===h&&(h=new J);if(c.hb()&&!lp(c))return b.da(c,h),h;if(c.Lc()){var k=op(this,b);if(null!==k){h.assign(k.tq);if(e&&this.routing===rp){var l=op(this,g);if(null!==l&&k.fm=m.y&&a.y<=m.y+m.height?h.y=a.y:(c.zf(Dc)||c.zf(Hc))&&a.x>=m.x&&a.x<=m.x+m.width&&(h.x=a.x);J.free(k);J.free(l)}}return h}}c= b.da(mp(c),J.alloc());this.pointsCount>(e?6:2)?(g=d?this.i(1):this.i(this.pointsCount-2),e&&(g=np(c,g.copy()))):(k=this.computeSpot(!d,g),f=J.alloc(),g=g.da(mp(k),f),e&&(g=np(c,g)),J.free(f));this.getLinkPointFromPoint(a,b,c,g,d,h);J.free(c);return h}; -U.prototype.getLinkDirection=function(a,b,c,d,e,f,g,h){a:if(d.hb())var k=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x1-d.y?90:d.x<1-d.y?180:135:.5>d.x?225:.5(f?6:2)?(h=e?this.i(1):this.i(this.pointsCount-2),h=f?np(k,h.copy()):c):(c=J.alloc(),h=h.da(yc,c),J.free(c));c=Math.abs(h.x-k.x)>Math.abs(h.y-k.y)?h.x>= -k.x?0:180:h.y>=k.y?90:270;J.free(k);k=c}d.wc()&&g.Fd(a)&&(k+=180,360<=k&&(k-=360));if(lp(d))return k;a=b.Li();if(0===a)return k;45<=a&&135>a?k+=90:135<=a&&225>a?k+=180:225<=a&&315>a&&(k+=270);360<=k&&(k-=360);return k};U.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.Kc()&&(a=op(this,b),null!==a))return a.mv;a=d?this.fromEndSegmentLength:this.toEndSegmentLength;null!==b&&isNaN(a)&&(a=d?b.fromEndSegmentLength:b.toEndSegmentLength);isNaN(a)&&(a=10);return a}; +U.prototype.getLinkDirection=function(a,b,c,d,e,f,g,h){a:if(d.hb())var k=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x1-d.y?90:d.x<1-d.y?180:135:.5>d.x?225:.5(f?6:2)?(h=e?this.i(1):this.i(this.pointsCount-2),h=f?np(k,h.copy()):c):(c=J.alloc(),h=h.da(yc,c),J.free(c));c=Math.abs(h.x-k.x)>Math.abs(h.y-k.y)?h.x>= +k.x?0:180:h.y>=k.y?90:270;J.free(k);k=c}d.wc()&&g.Fd(a)&&(k+=180,360<=k&&(k-=360));if(lp(d))return k;a=b.Li();if(0===a)return k;45<=a&&135>a?k+=90:135<=a&&225>a?k+=180:225<=a&&315>a&&(k+=270);360<=k&&(k-=360);return k};U.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.Lc()&&(a=op(this,b),null!==a))return a.mv;a=d?this.fromEndSegmentLength:this.toEndSegmentLength;null!==b&&isNaN(a)&&(a=d?b.fromEndSegmentLength:b.toEndSegmentLength);isNaN(a)&&(a=10);return a}; U.prototype.computeSpot=function(a,b){void 0===b&&(b=null);a?(a=b?b:this.fromPort,null===a?a=yc:(b=this.fromSpot,b.Lb()&&(b=a.fromSpot),a=b===Vc?rc:b)):(a=b?b:this.toPort,null===a?a=yc:(b=this.toSpot,b.Lb()&&(b=a.toSpot),a=b===Vc?rc:b));return a};function lp(a){return a===rc||.5===a.x&&.5===a.y}function mp(a){return.5===a.x&&.5===a.y?a:yc} U.prototype.computeOtherPoint=function(a,b){if(this.computeAdjusting()!==Vf&&4p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=qd.alloc();n.set(g); +U.prototype.vf=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var g=f;void 0===f&&(g=qd.alloc(),g.reset());g.multiply(this.transform);if(this.wh(a,g))return dn(this,b,c,e),void 0===f&&qd.free(g),!0;if(this.Jc(a,g)){var h=!1;if(!this.isAtomic)for(var k=this.T.m,l=k.length;l--;){var m=k[l];if(m.visible||m===this.locationObject){var n=m.actualBounds,p=this.naturalBounds;if(!(n.x>p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=qd.alloc();n.set(g); if(m instanceof X)h=m.vf(a,b,c,d,e,n);else if(this.path===m){if(m instanceof uf)if(h=a,p=d,!1===m.pickable)h=!1;else if(n.multiply(m.transform),p)b:{var r=h,q=n;if(m.wh(r,q))h=!0;else{if(void 0===q&&(q=m.transform,r.De(m.actualBounds))){h=!0;break b}h=r.left;p=r.right;var u=r.top;r=r.bottom;var v=J.alloc(),w=J.alloc(),z=J.alloc(),y=qd.alloc();y.set(q);y.Hv(m.transform);y.Ns();w.x=p;w.y=u;w.transform(y);v.x=h;v.y=u;v.transform(y);q=!1;Dn(m,v,w,z)?q=!0:(v.x=p,v.y=r,v.transform(y),Dn(m,v,w,z)?q=!0:(w.x= h,w.y=r,w.transform(y),Dn(m,v,w,z)?q=!0:(v.x=h,v.y=u,v.transform(y),Dn(m,v,w,z)&&(q=!0))));qd.free(y);J.free(v);J.free(w);J.free(z);h=q}}else h=m.wh(h,n)}else h=gl(m,a,d,n);h&&(p=m,null!==b&&(p=b(m)),p&&(null===c||c(p))&&e.add(p));qd.free(n)}}}void 0===f&&qd.free(g);return h||null!==this.background||null!==this.areaBackground}void 0===f&&qd.free(g);return!1}; U.prototype.computeCurve=function(){if(null===this.Mf){var a=this.fromPort,b=this.isOrthogonal;this.Mf=null!==a&&a===this.toPort&&!b}return this.Mf?Yf:this.curve};U.prototype.computeCorner=function(){if(this.curve===Yf)return 0;var a=this.corner;if(isNaN(a)||0>a)a=10;return a}; U.prototype.findMidLabel=function(){for(var a=this.path,b=this.T.m,c=b.length,d=0;dk?-Math.PI/2:Math.PI/2;else m=Math.atan(k/Math.abs(h)),0>h&&(m=Math.PI-m);g=b.x;var n=b.y;h=d.x-g;var p=d.y-n;k=Math.sqrt(h*h+p*p);L.aa(h,0)?p=0>p?-Math.PI/2:Math.PI/2:(p=Math.atan(p/Math.abs(h)),0>h&&(p=Math.PI-p)); -l=k/l;m=p-m;this.Mc(a,b);for(a+=1;ak?-Math.PI/2:Math.PI/2:(k=Math.atan(k/Math.abs(h)),0>h&&(k=Math.PI-k)),h=k+m,b*=l,this.L(a,g+b*Math.cos(h),n+b*Math.sin(h)));this.Mc(c,d)}}return!0;case cp:f=this.i(a);n=this.i(c);if(!f.Ta(b)||!n.Ta(d)){e=f.x;f=f.y;g=n.x;n=n.y;l=(g-e)*(g-e)+(n-f)*(n-f);h=b.x;m=b.y;k=d.x;p=d.y;var r=1;if(0!==k-h){var q=(p-m)/(k-h);r=Math.sqrt(1+1/(q*q))}else q=9E9;this.Mc(a,b);for(a+=1;ab?b+=360:360<=b&&(b-=360);0>d?d+=360:360<=d&&(d-=360);var g=d;b=315<=b||45>b?0:45<=b&&135>b?90:135<=b&&225>b?180:270;d=315<=d||45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.actualBounds.copy(),k=f.actualBounds.copy();if(h.u()&&k.u()){h.Gc(up,up);k.Gc(up,up);h.Le(a);k.Le(c);var l=J.alloc(),m=J.alloc();if(0===b)if(c.x>a.x||270===d&&c.ya.x||90===d&&c.y>a.y&&k.right>a.x)l.h(c.x,a.y),m.h(c.x,(a.y+c.y)/2),180===d?(l.x=this.computeMidOrthoPosition(a.x, +l=k/l;m=p-m;this.Nc(a,b);for(a+=1;ak?-Math.PI/2:Math.PI/2:(k=Math.atan(k/Math.abs(h)),0>h&&(k=Math.PI-k)),h=k+m,b*=l,this.L(a,g+b*Math.cos(h),n+b*Math.sin(h)));this.Nc(c,d)}}return!0;case cp:f=this.i(a);n=this.i(c);if(!f.Ta(b)||!n.Ta(d)){e=f.x;f=f.y;g=n.x;n=n.y;l=(g-e)*(g-e)+(n-f)*(n-f);h=b.x;m=b.y;k=d.x;p=d.y;var r=1;if(0!==k-h){var q=(p-m)/(k-h);r=Math.sqrt(1+1/(q*q))}else q=9E9;this.Nc(a,b);for(a+=1;ab?b+=360:360<=b&&(b-=360);0>d?d+=360:360<=d&&(d-=360);var g=d;b=315<=b||45>b?0:45<=b&&135>b?90:135<=b&&225>b?180:270;d=315<=d||45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.actualBounds.copy(),k=f.actualBounds.copy();if(h.u()&&k.u()){h.Hc(up,up);k.Hc(up,up);h.Le(a);k.Le(c);var l=J.alloc(),m=J.alloc();if(0===b)if(c.x>a.x||270===d&&c.ya.x||90===d&&c.y>a.y&&k.right>a.x)l.h(c.x,a.y),m.h(c.x,(a.y+c.y)/2),180===d?(l.x=this.computeMidOrthoPosition(a.x, a.y,c.x,c.y,!1),m.x=l.x,m.y=c.y):270===d&&c.ya.y?(l.x=a.xk.bottom)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):k.right,m.x=l.x,m.y=c.y):0===d&&a.xk.top&&a.yh.bottom)180===d&&(k.$(a)||h.$(c))?l.y= this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!0):c.ya.y&&(180===d||270===d)&&(l.y=this.computeMidOrthoPosition(a.x,h.bottom,c.x,Math.min(c.y,k.top),!0)),m.x=c.x,m.y=l.y;if(l.y>h.top&&l.y=h.left&&c.x<=a.x||a.x<=k.right&&a.x>=c.x){if(90===d||270===d)l.h(Math.max((a.x+c.x)/2,a.x),a.y),m.h(l.x,c.y)}else l.y=270===d||(0===d||180===d)&&c.ya.y&&k.lefta.y?(l.x=a.x>k.right?this.computeMidOrthoPosition(a.x,a.y,k.right,c.y,!1):a.x>k.left&&(270===d&&a.yk.bottom)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):k.left,m.x=l.x,m.y=c.y): @@ -1551,15 +1551,15 @@ a.y,c.x,c.y,!1):c.xa.x&&k.top=a.x?(l.y=a.y>k.bottom?this.computeMidOrthoPosition(a.x,a.y,c.x,k.bottom,!0):a.y>k.top&&(180===d&&a.xk.right)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!0):k.top,m.x=c.x,m.y=l.y):270===d&&a.y>k.bottom&&a.x>k.left&&a.xh.right)90===d&&(k.$(a)||h.$(c))?l.x=this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):c.xa.x&&(90===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right,a.y,Math.min(c.x,k.left),c.y,!1)),m.x=l.x,m.y=c.y;if(l.x>h.left&&l.x=a.y||a.y>=k.top&&a.y<=c.y){if(0===d||180===d)l.h(a.x,Math.min((a.y+c.y)/2,a.y)),m.h(c.x,l.y)}else l.x=180===d||(90===d||270===d)&&c.x=xp&&(sk(r),h.Gc(r.bq*r.ly,r.aq*r.my),vp(r,a,b,n,d,h,!1),k=wp(r, +Math.min(a.y,l.y),Math.abs(a.x-l.x),Math.abs(a.y-l.y))&&r.qk(Math.min(l.x,m.x),Math.min(l.y,m.y),Math.abs(l.x-m.x),Math.abs(l.y-m.y))&&r.qk(Math.min(m.x,n.x),Math.min(m.y,n.y),Math.abs(m.x-n.x),Math.abs(m.y-n.y)))b=!1;else{e=a;f=n;var q=c=null;if(p.isVirtualized){p=r.bounds.copy();p.Hc(-r.bq,-r.aq);var u=J.alloc();tk(r,a.x,a.y)||(L.yf(p.x,p.y,p.x+p.width,p.y+p.height,a.x,a.y,l.x,l.y,u)?(c=a=u.copy(),b=u.Ra(l)):L.yf(p.x,p.y,p.x+p.width,p.y+p.height,l.x,l.y,m.x,m.y,u)?(c=a=u.copy(),b=u.Ra(m)):L.yf(p.x, +p.y,p.x+p.width,p.y+p.height,m.x,m.y,n.x,n.y,u)&&(c=a=u.copy(),b=u.Ra(n)));tk(r,n.x,n.y)||(L.yf(p.x,p.y,p.x+p.width,p.y+p.height,n.x,n.y,m.x,m.y,u)?(q=n=u.copy(),d=m.Ra(u)):L.yf(p.x,p.y,p.x+p.width,p.y+p.height,m.x,m.y,l.x,l.y,u)?(q=n=u.copy(),d=l.Ra(u)):L.yf(p.x,p.y,p.x+p.width,p.y+p.height,l.x,l.y,a.x,a.y,u)&&(q=n=u.copy(),d=a.Ra(u)));J.free(u)}h=h.copy().Oc(k);h.Hc(r.bq*r.it,r.aq*r.it);vp(r,a,b,n,d,h,!0);k=wp(r,n.x,n.y);!r.abort&&k>=xp&&(sk(r),h.Hc(r.bq*r.ly,r.aq*r.my),vp(r,a,b,n,d,h,!1),k=wp(r, n.x,n.y));if(!r.abort&&kthis.pointsCount)0===b||180===b?(h.x=a.x,h.y=n.y):(h.x=n.x,h.y=a.y),this.L(2,h.x,h.y),this.l(3,h.x,h.y);else if(g=this.i(3),0===b||180===b)L.w(h.x,g.x)?(h=0===b?Math.max(h.x,a.x):Math.min(h.x,a.x),this.L(2,h,a.y),this.L(3,h,g.y)):L.w(h.y,g.y)?(Math.abs(a.y-h.y)<=r.aq/2&&(this.L(2,h.x,a.y),this.L(3,g.x,a.y)),this.l(2,h.x,a.y)):this.L(2,a.x,h.y);else if(90===b||270===b)L.w(h.y,g.y)?(h=90===b?Math.max(h.y,a.y): Math.min(h.y,a.y),this.L(2,a.x,h),this.L(3,g.x,h)):L.w(h.x,g.x)?(Math.abs(a.x-h.x)<=r.bq/2&&(this.L(2,a.x,h.y),this.L(3,a.x,g.y)),this.l(2,a.x,h.y)):this.L(2,h.x,a.y);null!==c&&(a=this.i(1),g=this.i(2),a.x!==g.x&&a.y!==g.y?0===b||180===b?this.l(2,a.x,g.y):this.l(2,g.x,a.y):0===b||180===b?this.l(2,e.x,c.y):this.l(2,c.x,e.y));null!==q&&(0===d||180===d?this.pf(f.x,q.y):this.pf(q.x,f.y));b=!0}else b=!1}}}else b=!1;b||(this.ce(l.copy()),this.ce(m.copy()));J.free(l);J.free(m)}}; -U.prototype.computeMidOrthoPosition=function(a,b,c,d,e){var f=0;!this.hasCurviness()||this.computeSpot(!0,this.fromPort).Kc()||this.computeSpot(!1,this.toPort).Kc()||(f=this.computeCurviness());return e?(b+d)/2+f:(a+c)/2+f}; +U.prototype.computeMidOrthoPosition=function(a,b,c,d,e){var f=0;!this.hasCurviness()||this.computeSpot(!0,this.fromPort).Lc()||this.computeSpot(!1,this.toPort).Lc()||(f=this.computeCurviness());return e?(b+d)/2+f:(a+c)/2+f}; function Kj(a){if(null===a.diagram||!a.isAvoiding||!nk(a.diagram))return!1;var b=a.points.m,c=b.length;if(4>c)return!1;a=ok(a.diagram,!0,a.containingGroup,null);for(var d=1;dzp&&wp(b,m,n)!==l-1&&(wp(b,c-h,d)===l-1?(e=180,m=c-h,n=d):wp(b,c+h,d)===l-1?(e=0,m=c+h,n=d):wp(b,c,d-k)===l-1?(e=270,m=c,n=d-k):wp(b,c,d+k)===l-1&&(e=90,m=c,n=d+k));for(;l>zp&&wp(b,m,n)===l-1;)c=m,d=n,0===e?m+=h:90===e?n+=k:180===e?m-=h:n-=k,--l;if(f){if(l>zp)if(180===e||0===e)c=Math.floor(c/h)*h+h/2;else if(90===e||270===e)d=Math.floor(d/k)*k+k/2}else c=Math.floor(c/h)*h+h/2,d=Math.floor(d/ k)*k+k/2;l>zp&&(f=e,g=c,m=d,0===e?(f=90,m+=k):90===e?(f=180,g-=h):180===e?(f=270,m-=k):270===e&&(f=0,g+=h),wp(b,g,m)===l-1?yp(a,b,g,m,f,!1,f):(g=c,m=d,0===e?(f=270,m-=k):90===e?(f=0,g+=h):180===e?(f=90,m+=k):270===e&&(f=180,g-=h),wp(b,g,m)===l-1&&yp(a,b,g,m,f,!1,f)));a.pf(c,d)}U.prototype.Kz=function(a){var b=a.x;a=a.y;for(var c=this.i(0),d=this.i(1),e=Bb(b,a,c.x,c.y,d.x,d.y),f=0,g=1;gb)return a.type=Q.j,this.Lm=!0,a;var c=!1,d=this.diagram;null!==d&&ep(this)&&d.Wh.contains(this)&&(0!==this.Gl.width||0!==this.Gl.height)&&(c=!0);var e=this.i(0).copy(),f=e.copy();d=this.Bb.m;var g=this.computeCurve();if(g===Yf&&3<=b&&!L.aa(this.smoothness,0))if(3===b){var h=this.i(1);d=Math.min(e.x,h.x);var k=Math.min(e.y,h.y);h=this.i(2);d=Math.min(d,h.x);k=Math.min(k,h.y)}else{if(this.isOrthogonal)for(k=0;k=b&&(d=b-1),k=this.i(d),f.x=Math.min(k.x,f.x),f.y=Math.min(k.y,f.y);d=f.x;k=f.y}else{for(k=0;kv?q>r?(f.x= @@ -1573,13 +1573,13 @@ function Bp(a,b,c,d){for(var e=a.pointsCount,f=b;L.aa(b.x,f.x)&&L.aa(b.y,f.y);){ function Dp(a,b,c,d,e,f,g){if(!g&&ep(a)){g=a.computeJumpLength();var h=g/2,k=[],l=0;a.isVisible()&&(l=Ep(a,e,f,k));if(0n-g)l--,n=Math.max(m-h,f.x);else break;m=f.y-g+d;n+=c;r=f.y+d;a.curve===Uf?wd(b,n,r,!1):xd(b,p,m,n,m,n,r)}else if(L.w(e.x,f.x))if(e.ym-g)l--,m=Math.max(n-h,f.y);else break;n=f.x-g+c;r=f.x+c;m+=d;a.curve===Uf?wd(b,r,m,!1):xd(b,n,p,n,m,r,m)}}b.lineTo(f.x+c,f.y+d)} -function Ep(a,b,c,d){var e=a.diagram;if(null===e||b.A(c))return 0;for(e=e.layers;e.next();){var f=e.value;if(null!==f&&f.visible){f=f.Fa.m;for(var g=f.length,h=0;hg.x&&m.x>=l.x||l.xg.y&&m.y>=l.y||l.yq&&Math.min(g,v)n&&!L.w(g,v)){h.x=q;h.y=n;m=!0;break a}}else if(!L.w(n,r)&& L.w(g,v)&&Math.min(n,r)g&&Math.min(q,u)m&&!L.w(q,u)){h.x=m;h.y=g;m=!0;break a}h.x=0;h.y=0;m=!1}m&&(e?c.push(h.x):c.push(h.y));g=l}J.free(h)}function ep(a){a=a.curve;return a===Tf||a===Uf}function ip(a,b){if(b||ep(a))b=a.diagram,null===b||b.animationManager.isTicking||b.Wh.contains(a)||0===a.Gl.width&&0===a.Gl.height||b.Wh.add(a,a.Gl.copy())} U.prototype.rq=function(a){var b=this.layer;if(null!==b&&b.visible&&!b.isTemporary){var c=b.diagram;if(null!==c&&!c.animationManager.isTicking){var d=!1;for(c=c.layers;c.next();){var e=c.value;if(e.visible)if(e===b){d=!0;var f=!1;e=e.Fa.m;for(var g=e.length,h=0;ha&&xa(a,">= 0",U,"fromEndSegmentLength"),this.P.Hg=a,this.g("fromEndSegmentLength",b,a),this.Ua())}}, -fromShortLength:{get:function(){return null!==this.P?this.P.Ig:NaN},set:function(a){this.Hc();var b=this.P.Ig;b!==a&&(this.P.Ig=a,this.cc(!0),this.g("fromShortLength",b,a))}},toSpot:{get:function(){return null!==this.P?this.P.ph:Vc},set:function(a){this.Hc();var b=this.P.ph;b.A(a)||(a=a.I(),this.P.ph=a,this.g("toSpot",b,a),(b.Kc()||a.Kc())&&null!==this.toNode&&Mo(this.toPort),this.Ua())}},toEndSegmentLength:{ -get:function(){return null!==this.P?this.P.nh:NaN},set:function(a){this.Hc();var b=this.P.nh;b!==a&&(0>a&&xa(a,">= 0",U,"toEndSegmentLength"),this.P.nh=a,this.g("toEndSegmentLength",b,a),this.Ua())}},toShortLength:{get:function(){return null!==this.P?this.P.oh:NaN},set:function(a){this.Hc();var b=this.P.oh;b!==a&&(this.P.oh=a,this.cc(!0),this.g("toShortLength",b,a))}},isLabeledLink:{get:function(){return null===this.ld?!1:0a&&xa(a,">= 0",U,"fromEndSegmentLength"),this.P.Hg=a,this.g("fromEndSegmentLength",b,a),this.Ua())}}, +fromShortLength:{get:function(){return null!==this.P?this.P.Ig:NaN},set:function(a){this.Ic();var b=this.P.Ig;b!==a&&(this.P.Ig=a,this.cc(!0),this.g("fromShortLength",b,a))}},toSpot:{get:function(){return null!==this.P?this.P.ph:Vc},set:function(a){this.Ic();var b=this.P.ph;b.A(a)||(a=a.I(),this.P.ph=a,this.g("toSpot",b,a),(b.Lc()||a.Lc())&&null!==this.toNode&&Mo(this.toPort),this.Ua())}},toEndSegmentLength:{ +get:function(){return null!==this.P?this.P.nh:NaN},set:function(a){this.Ic();var b=this.P.nh;b!==a&&(0>a&&xa(a,">= 0",U,"toEndSegmentLength"),this.P.nh=a,this.g("toEndSegmentLength",b,a),this.Ua())}},toShortLength:{get:function(){return null!==this.P?this.P.oh:NaN},set:function(a){this.Ic();var b=this.P.oh;b!==a&&(this.P.oh=a,this.cc(!0),this.g("toShortLength",b,a))}},isLabeledLink:{get:function(){return null===this.md?!1:0=d&&(f=d-1);var h=this.i(f-1),k=this.i(f);L.cm(e.x,e.y,g.x,g.y,h.x,h.y,k.x,k.y,.5,a);b=Math.min(k.x,b);c=Math.min(k.y,c);e=k}else for(e=this.i(0),f=this.i(1),b=Math.min(e.x,f.x),c=Math.min(e.y,f.y),a.h(e.x,e.y,0,0),a.Le(f),e=2;ed&&(d=-d)):L.aa(d.y,e.y)?(d=e.x-d.x,0>d&&(d=-d)):d=Math.sqrt(d.tf(e));a.push(d)}}return this.qr}},flattenedTotalLength:{get:function(){var a=this.Rt;if(isNaN(a)){for(var b= +midAngle:{get:function(){this.pg();return this.computeMidAngle()}},flattenedLengths:{get:function(){if(null===this.qr){this.sd||hp(this);for(var a=this.qr=[],b=this.pointsCount,c=0;cd&&(d=-d)):L.aa(d.y,e.y)?(d=e.x-d.x,0>d&&(d=-d)):d=Math.sqrt(d.tf(e));a.push(d)}}return this.qr}},flattenedTotalLength:{get:function(){var a=this.Rt;if(isNaN(a)){for(var b= this.flattenedLengths,c=b.length,d=a=0;d=this.pointsCount?0:this.isOrthogonal||!lp(this.computeSpot(!0))?1:0}},lastPickIndex:{get:function(){var a=this.pointsCount;return 0===a?0:2>=a?a-1:this.isOrthogonal||!lp(this.computeSpot(!1))?a-2:a-1}},adjusting:{get:function(){return this.Ek},set:function(a){var b=this.Ek;b!== a&&(this.Ek=a,this.g("adjusting",b,a))}},corner:{get:function(){return this.rn},set:function(a){var b=this.rn;b!==a&&(this.rn=a,this.cc(!0),this.g("corner",b,a))}},curve:{get:function(){return this.tn},set:function(a){var b=this.tn;b!==a&&(this.tn=a,this.Ua(),this.cc(!0),ip(this,b===Uf||b===Tf||a===Uf||a===Tf),this.g("curve",b,a))}},curviness:{get:function(){return this.un},set:function(a){var b=this.un;b!== a&&(this.un=a,this.Ua(),this.cc(!1),this.g("curviness",b,a))}},routing:{get:function(){return this.Oj},set:function(a){var b=this.Oj;b!==a&&(this.Oj=a,this.Mf=null,this.Ua(),ip(this,2===(b.value&2)||2===(a.value&2)),this.g("routing",b,a))}},smoothness:{get:function(){return this.Dp},set:function(a){var b=this.Dp;b!==a&&(this.Dp=a,this.cc(!0),this.g("smoothness",b,a))}},key:{get:function(){var a=this.diagram; if(null!==a&&a.model.Qi())return a.model.mc(this.data)}}});U.prototype.invalidateOtherJumpOvers=U.prototype.rq;U.prototype.findClosestSegment=U.prototype.Kz;U.prototype.updateRoute=U.prototype.pg;U.prototype.invalidateRoute=U.prototype.Ua;U.prototype.rollbackRoute=U.prototype.Tv;U.prototype.commitRoute=U.prototype.rf;U.prototype.startRoute=U.prototype.Hh;U.prototype.clearPoints=U.prototype.ak;U.prototype.removePoint=U.prototype.Rv;U.prototype.addPointAt=U.prototype.pf;U.prototype.addPoint=U.prototype.ce; -U.prototype.insertPointAt=U.prototype.l;U.prototype.insertPoint=U.prototype.pA;U.prototype.setPointAt=U.prototype.L;U.prototype.setPoint=U.prototype.Mc;U.prototype.getPoint=U.prototype.i;U.prototype.getOtherPort=U.prototype.gA;U.prototype.getOtherNode=U.prototype.nq; +U.prototype.insertPointAt=U.prototype.l;U.prototype.insertPoint=U.prototype.pA;U.prototype.setPointAt=U.prototype.L;U.prototype.setPoint=U.prototype.Nc;U.prototype.getPoint=U.prototype.i;U.prototype.getOtherPort=U.prototype.gA;U.prototype.getOtherNode=U.prototype.nq; var jp=null,kp=null,$o=new D(U,"Normal",1),Ip=new D(U,"Orthogonal",2),Jp=new D(U,"AvoidsNodes",6),rp=new D(U,"AvoidsNodesStraight",7),Vf=new D(U,"None",0),Yf=new D(U,"Bezier",9),Uf=new D(U,"JumpGap",10),Tf=new D(U,"JumpOver",11),ap=new D(U,"End",17),bp=new D(U,"Scale",18),cp=new D(U,"Stretch",19),Rm=new D(U,"OrientAlong",21),Km=new D(U,"OrientPlus90",22),Mm=new D(U,"OrientMinus90",23),dp=new D(U,"OrientOpposite",24),Sm=new D(U,"OrientUpright",25),Lm=new D(U,"OrientPlus90Upright",26),Nm=new D(U,"OrientMinus90Upright", 27),Om=new D(U,"OrientUpright45",28),tp=16,sp=14,up=8;U.className="Link";U.Normal=$o;U.Orthogonal=Ip;U.AvoidsNodes=Jp;U.AvoidsNodesStraight=rp;U.None=Vf;U.Bezier=Yf;U.JumpGap=Uf;U.JumpOver=Tf;U.End=ap;U.Scale=bp;U.Stretch=cp;U.OrientAlong=Rm;U.OrientPlus90=Km;U.OrientMinus90=Mm;U.OrientOpposite=dp;U.OrientUpright=Sm;U.OrientPlus90Upright=Lm;U.OrientMinus90Upright=Nm;U.OrientUpright45=Om;U.EndSegmentStep=8;U.CurvinessStart=tp;U.SpacingMin=sp;U.OrthoShortCut=up; function Hp(a,b,c,d){Ta(this);this.re=this.wr=!1;this.Ws=a;this.uy=b;this.Iv=c;this.vy=d;this.links=[]}Hp.prototype.mm=function(){if(!this.wr){var a=this.links;0=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.wd=Math.floor((a.x-this.dc)/this.dc)*this.dc;this.xd=Math.floor((b-this.ec)/this.ec)*this.ec;this.Ao=Math.ceil((c+2*this.dc)/this.dc)*this.dc;this.Bo=Math.ceil((d+2*this.ec)/this.ec)*this.ec;a=1+(Math.ceil((this.Ao-this.wd)/this.dc)|0);b=1+(Math.ceil((this.Bo-this.xd)/this.ec)|0);if(null===this.Qb||this.zi=zp&&(c[d]=Kp)} -pk.prototype.qk=function(a,b,c,d){if(a>this.Ao||a+cthis.Bo||b+da&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e)return!0;d=Math.min(a+c-1,this.zi)|0;for(c=Math.min(b+e-1,this.Ai)|0;a<=d;a++){e=this.Qb[a];for(var f=b;f<=c;f++)if(e[f]===uk)return!1}return!0}; +function pk(a){Ta(this);this.Fy=this.group=null;this.Ms=!0;this.abort=!1;this.yd=this.xd=1;this.Bo=this.Ao=-1;this.dc=a.width;this.ec=a.height;this.Qb=null;this.Ai=this.zi=0;this.it=11;this.my=this.ly=22} +pk.prototype.initialize=function(a){if(!(0>=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.xd=Math.floor((a.x-this.dc)/this.dc)*this.dc;this.yd=Math.floor((b-this.ec)/this.ec)*this.ec;this.Ao=Math.ceil((c+2*this.dc)/this.dc)*this.dc;this.Bo=Math.ceil((d+2*this.ec)/this.ec)*this.ec;a=1+(Math.ceil((this.Ao-this.xd)/this.dc)|0);b=1+(Math.ceil((this.Bo-this.yd)/this.ec)|0);if(null===this.Qb||this.zi=zp&&(c[d]=Kp)} +pk.prototype.qk=function(a,b,c,d){if(a>this.Ao||a+cthis.Bo||b+da&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e)return!0;d=Math.min(a+c-1,this.zi)|0;for(c=Math.min(b+e-1,this.Ai)|0;a<=d;a++){e=this.Qb[a];for(var f=b;f<=c;f++)if(e[f]===uk)return!1}return!0}; function Lp(a,b,c,d,e,f,g,h,k){if(!(bg||ck)){var l=b|0;var m=c|0;var n=a.Qb[l][m];if(n>=zp&&n=a.Qb[l][m]);)a.Qb[l][m]=n,n+=1,e?m+=d:l+=d;l=e?m:l;if(e)if(0l;c+=d)Lp(a,b,c,1,!e,f,g,h,k),Lp(a,b,c,-1,!e,f,g,h,k);else if(0l;b+=d)Lp(a,b,c,1,!e,f,g,h,k),Lp(a,b,c,-1,!e,f,g,h, k)}}function Mp(a,b,c,d,e,f,g,h,k){b|=0;c|=0;var l=uk,m=zp;for(a.Qb[b][c]=m;l===uk&&b>f&&bh&&cf&&bh&&c=Math.abs(h-l)&&1>=Math.abs(k-m))a.abort=!0;else{var n=f.x;d=f.y;b=f.x+f.width;var p=f.y+f.height;n-=a.wd;n/=a.dc;d-=a.xd;d/=a.ec;b-=a.wd;b/=a.dc;p-=a.xd;p/=a.ec;f=Math.max(0,Math.min(a.zi,n|0));b=Math.min(a.zi,Math.max(0,b|0));n=Math.max(0,Math.min(a.Ai,d|0));p=Math.min(a.Ai,Math.max(0,p|0));d=a.Qb;h|=0;k|=0;l|=0;m|= +function vp(a,b,c,d,e,f,g){if(null!==a.Qb){a.abort=!1;var h=b.x,k=b.y;if(tk(a,h,k)){h-=a.xd;h/=a.dc;k-=a.yd;k/=a.ec;var l=d.x,m=d.y;if(tk(a,l,m))if(l-=a.xd,l/=a.dc,m-=a.yd,m/=a.ec,1>=Math.abs(h-l)&&1>=Math.abs(k-m))a.abort=!0;else{var n=f.x;d=f.y;b=f.x+f.width;var p=f.y+f.height;n-=a.xd;n/=a.dc;d-=a.yd;d/=a.ec;b-=a.xd;b/=a.dc;p-=a.yd;p/=a.ec;f=Math.max(0,Math.min(a.zi,n|0));b=Math.min(a.zi,Math.max(0,b|0));n=Math.max(0,Math.min(a.Ai,d|0));p=Math.min(a.Ai,Math.max(0,p|0));d=a.Qb;h|=0;k|=0;l|=0;m|= 0;var r=0===c||90===c?1:-1;c=90===c||270===c;d[h][k]===uk?(Mp(a,h,k,r,c,f,b,n,p),Mp(a,h,k,1,!c,f,b,n,p),Mp(a,h,k,-1,!c,f,b,n,p)):Mp(a,h,k,r,c,h,k,h,k);d[l][m]===uk?(Np(a,l,m,0===e||90===e?1:-1,90===e||270===e,f,b,n,p),Np(a,l,m,1,!(90===e||270===e),f,b,n,p),Np(a,l,m,-1,!(90===e||270===e),f,b,n,p)):Np(a,l,m,r,c,l,m,l,m);c=Fa();if(g&&Op(a,l,m,e,h,k,c)){if(c[0]!==l||c[1]!==m)c.unshift(m),c.unshift(l);if(c[c.length-2]!==h||c[c.length-1]!==k)c.push(h),c.push(k);a=zp;e=c[c.length-2];g=c[c.length-1];d[e][g]= a++;for(f=c.length-4;0<=f;f-=2)for(e=c[f+2],g=c[f+3],b=c[f],l=c[f+1];b>e?e++:bg?g++:le)m--;else break;else if(n>f)n--;else break;var p=h[m][n];if(0===p||p===Pp)break;k=m;l=n}for(;;){m=d;n=k;p=l;0===d?pf&&(m=270,p--):90===d?ne&&(m=180,n--):180===d?pf&&(m=270,p--):ne&&(m=180,n--);n=h[n][p];if(m!==d&&0!==n&&n!==Pp){g.push(k);g.push(l);if(Op(a,k,l, m,e,f,g))return!0;g.pop();g.pop()}h[k][l]=Pp;if(0===d){if(k===b)return!1;k--}else if(90===d){if(l===c)return!1;l--}else if(180===d){if(k===b)return!1;k++}else{if(l===c)return!1;l++}}} -na.Object.defineProperties(pk.prototype,{bounds:{get:function(){return new N(this.wd,this.xd,this.Ao-this.wd,this.Bo-this.xd)}},bq:{get:function(){return this.dc},set:function(a){0=c?180:0}a=180*Math.atan2(a.height,a.width)/Math.PI;switch(b){case 3:return c>a&&c<=180+a?180:270;case 5:return c>180-a&&c<=360-a?270:0;case 12:return c>a&&c<=180+a?90:0;case 10:return c>180-a&&c<=360-a?180:90;case 7:return 90180+a&&c<=360-a?270:0;case 13:return 180a&&180>=c?90:0;case 14:return c> a&&c<=180-a?90:c>180-a&&270>=c?180:0;case 11:return c>180-a&&c<=180+a?180:c>180+a?270:90}d&&15!==b&&(c-=15,0>c&&(c+=360));return c>a&&c<180-a?90:c>=180-a&&c<=180+a?180:c>180+a&&c<360-a?270:0}pp.prototype.mm=function(){this.ee.length=0}; function qp(a,b){var c=a.ee;if(0===c.length){a:if(!a.uq){c=a.uq;a.uq=!0;var d=null,e=a.node,f=e instanceof hf?e:null;if(null===f||f.isSubGraphExpanded)var g=e.isTreeExpanded?e.findLinksConnected(a.port.portId):e.Sx();else{if(!f.actualBounds.u()){a.uq=c;break a}d=f;g=d.ov()}f=a.ee.length=0;var h=a.port.da(sc,J.alloc()),k=a.port.da(Cc,J.alloc());e=N.allocAt(h.x,h.y,0,0);e.Le(k);J.free(h);J.free(k);h=J.allocAt(e.x+e.width/2,e.y+e.height/2);k=a.port.Li();for(g=g.iterator;g.next();){var l=g.value;if(l.isVisible()&& -l.fromPort!==l.toPort){var m=l.fromPort===a.port||null!==l.fromNode&&l.fromNode.Fd(d),n=l.computeSpot(m,a.port);if(n.Kc()){var p=m?l.toPort:l.fromPort;if(null!==p&&(m=p.part,null!==m)){var r=m.findVisibleNode();null!==r&&r!==m&&(m=r,p=m.port);m=l.computeOtherPoint(m,p);p=h.Oa(p.da(yc));p+=(h.Oa(m)-p)/360;p-=k;0>p?p+=360:360<=p&&(p-=360);n=Qp(e,n,p,l.isOrthogonal);0===n?(n=4,180p&&(p+=360));r=a.ee[f];void 0===r?(r=new Rp(l,p,n),a.ee[f]= -r):(r.link=l,r.angle=p,r.xc=n);r.Kv.set(m);f++}}}}J.free(h);a.ee.sort(pp.prototype.j);k=a.ee.length;d=-1;for(f=h=0;fMath.abs(u)?(z=Math.abs(u)/p,p=Math.abs(u)):z=1;break;case 2:r>Math.abs(y)?(z=Math.abs(y)/r,r=Math.abs(y)):z=1;break;case 1:n>Math.abs(u)?(z=Math.abs(u)/n,n=Math.abs(u)):z=1;break;default:case 4:m> -Math.abs(y)?(z=Math.abs(y)/m,m=Math.abs(y)):z=1}w=0}var F=A.tq;if(d===Xo){A=A.link.computeThickness();A*=z;F.set(B);switch(q){case 8:F.x=B.x+u/2+p/2-w-A/2;break;case 2:F.y=B.y+y/2+r/2-w-A/2;break;case 1:F.x=B.x+u/2-n/2+w+A/2;break;default:case 4:F.y=B.y+y/2-m/2+w+A/2}w+=A}else{var K=.5;d===Jo&&(K=(A.oq+1)/(A.fm+1));F.x=B.x+u*K;F.y=B.y+y*K}}}J.free(h);J.free(k);J.free(g);J.free(l);B=a.ee;for(f=0;fb.xc?1:a.angleb.angle?1:0}; +l.fromPort!==l.toPort){var m=l.fromPort===a.port||null!==l.fromNode&&l.fromNode.Fd(d),n=l.computeSpot(m,a.port);if(n.Lc()&&(m=m?l.toPort:l.fromPort,null!==m)){var p=m.part;if(null!==p){var r=p.findVisibleNode();null!==r&&r!==p&&(p=r,m=p.port);m=l.computeOtherPoint(p,m);p=h.Ra(m);p-=k;0>p?p+=360:360<=p&&(p-=360);n=Qp(e,n,p,l.isOrthogonal);0===n?(n=4,180p&&(p+=360));r=a.ee[f];void 0===r?(r=new Rp(l,p,n),a.ee[f]=r):(r.link=l,r.angle=p,r.xc= +n);r.Kv.set(m);f++}}}}J.free(h);a.ee.sort(pp.prototype.j);k=a.ee.length;d=-1;for(f=h=0;fMath.abs(u)?(z=Math.abs(u)/p,p=Math.abs(u)):z=1;break;case 2:r>Math.abs(y)?(z=Math.abs(y)/r,r=Math.abs(y)):z=1;break;case 1:n>Math.abs(u)?(z=Math.abs(u)/n,n=Math.abs(u)):z=1;break;default:case 4:m>Math.abs(y)?(z=Math.abs(y)/ +m,m=Math.abs(y)):z=1}w=0}var F=A.tq;if(d===Xo){A=A.link.computeThickness();A*=z;F.set(B);switch(q){case 8:F.x=B.x+u/2+p/2-w-A/2;break;case 2:F.y=B.y+y/2+r/2-w-A/2;break;case 1:F.x=B.x+u/2-n/2+w+A/2;break;default:case 4:F.y=B.y+y/2-m/2+w+A/2}w+=A}else{var K=.5;d===Jo&&(K=(A.oq+1)/(A.fm+1));F.x=B.x+u*K;F.y=B.y+y*K}}}J.free(h);J.free(k);J.free(g);J.free(l);B=a.ee;for(f=0;fb.xc?1:a.angleb.angle?1:0}; pp.prototype.computeEndSegmentLength=function(a){var b=a.link,c=b.computeEndSegmentLength(this.node,this.port,rc,b.fromPort===this.port),d=a.oq;if(0>d)return c;var e=a.fm;if(1>=e||!b.isOrthogonal)return c;b=a.Kv;var f=a.tq;if(2===a.xc||8===a.xc)d=e-1-d;return((a=2===a.xc||4===a.xc)?b.y=b-1?(f=0,d=c,e+=g+20,g=0):f++}}; li.prototype.doMinimalNetworkLayout=function(){var a=Math.ceil(Math.sqrt(this.network.vertexes.count));this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin);for(var b=this.arrangementOrigin.x,c=b,d=this.arrangementOrigin.y,e=0,f=0,g=this.network.vertexes.iterator;g.next();){var h=g.value.node;if(!(null===h||h instanceof U)&&(Up(h),this.Fh(h))){var k=h.measuredBounds,l=k.width;k=k.height;h.moveTo(c,d);h instanceof hf&&(h.Fh=!1);c+=Math.max(l,50)+20;f=Math.max(f,Math.max(k,50));e>=a-1?(e= -0,c=b,d+=f+20,f=0):e++}}};li.prototype.Fh=function(a){return!a.location.u()||a instanceof hf&&a.Fh?!0:!1};function Tp(a,b,c,d,e,f,g,h){for(c=c.iterator;c.next();){var k=c.value;d&&!k.isTopLevel||null!==e&&!e(k)||!k.canLayout()||(f&&k instanceof W?k.isLinkLabel||(k instanceof hf?null===k.layout?Tp(a,b,k.memberParts,!1,e,f,g,h):(Up(k),b.add(k)):(Up(k),b.add(k))):g&&k instanceof U?b.add(k):!h||!k.Jc()||k instanceof W||(Up(k),b.add(k)))}} +0,c=b,d+=f+20,f=0):e++}}};li.prototype.Fh=function(a){return!a.location.u()||a instanceof hf&&a.Fh?!0:!1};function Tp(a,b,c,d,e,f,g,h){for(c=c.iterator;c.next();){var k=c.value;d&&!k.isTopLevel||null!==e&&!e(k)||!k.canLayout()||(f&&k instanceof W?k.isLinkLabel||(k instanceof hf?null===k.layout?Tp(a,b,k.memberParts,!1,e,f,g,h):(Up(k),b.add(k)):(Up(k),b.add(k))):g&&k instanceof U?b.add(k):!h||!k.Kc()||k instanceof W||(Up(k),b.add(k)))}} function Up(a){var b=a.actualBounds;(0===b.width||0===b.height||isNaN(b.width)||isNaN(b.height))&&a.Sa()}li.prototype.Ni=function(a,b){var c=this.boundsComputation;if(null!==c)return b||(b=new N),c(a,this,b);if(!b)return a.actualBounds;b.set(a.actualBounds);return b}; li.prototype.Hx=function(a){var b=new G;a instanceof T?(Tp(this,b,a.nodes,!0,null,!0,!0,!0),Tp(this,b,a.links,!0,null,!0,!0,!0),Tp(this,b,a.parts,!0,null,!0,!0,!0)):a instanceof hf?Tp(this,b,a.memberParts,!1,null,!0,!0,!0):Tp(this,b,a.iterator,!1,null,!0,!0,!0);return b}; li.prototype.initialOrigin=function(a){var b=this.group;if(null!==b){var c=b.position.copy();(isNaN(c.x)||isNaN(c.y))&&c.set(a);b=b.placeholder;null!==b&&(c=b.da(sc),(isNaN(c.x)||isNaN(c.y))&&c.set(a),a=b.padding,c.x+=a.left,c.y+=a.top);return c}return a};li.prototype.mayUseWorker=function(){return this.mayUseWorkerFunction?this.mayUseWorkerFunction(this):!1};li.prototype.workerLayout=function(){return!1}; @@ -1662,36 +1662,36 @@ Sp.prototype.clear=function(){if(this.mf)for(var a=this.mf.iterator;a.next();)a. Sp.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutNetwork"+(null!==this.layout?"("+this.layout.toString()+")":"");if(0>=a)return b;b+=" vertexes: "+this.mf.count+" edges: "+this.le.count;if(1b?1:0):1:null!==b?-1:0} -na.Object.defineProperties(fq.prototype,{sourceEdgesArrayAccess:{get:function(){return this.qd._dataArray}},destinationEdgesArrayAccess:{get:function(){return this.Cd._dataArray}},data:{get:function(){return this.ib},set:function(a){this.ib=a;if(null!==a&&a.bounds){var b=a.bounds;a=b.x;var c=b.y,d=b.width;b=b.height;this.o.h(d/2,b/2);this.j.h(a,c,d,b)}}},node:{get:function(){return this.mi}, +function fq(a){Ta(this);this.Qc=a;this.j=(new N(0,0,10,10)).freeze();this.o=(new J(5,5)).freeze();this.mi=this.ib=null;this.rd=new E;this.Cd=new E} +fq.prototype.serializeVertexProperties=function(a){a.id=gb(this);a.key=this.node?this.node.key:this.data?this.data.ci:void 0;void 0===a.key&&(a.key=null);a.x=this.bounds.x;a.y=this.bounds.y;a.eB=this.bounds.width;a.mA=this.bounds.height;a.fx=this.focus.x;a.fy=this.focus.y;var b=[];this.rd.each(function(a){b.push(gb(a))});a.Ey=b;var c=[];this.Cd.each(function(a){c.push(gb(a))});a.Nx=c}; +fq.prototype.deserializeVertexProperties=function(a,b,c){if(null!==a){this.x=a.x;this.y=a.y;this.width=a.eB;this.height=a.mA;this.focusX=a.fx;this.focusY=a.fy;var d=this;a.Ey&&a.Ey.forEach(function(a){(a=c.get(a))&&d.rd.add(a)});a.Nx&&a.Nx.forEach(function(a){(a=c.get(a))&&d.Cd.add(a)})}};fq.prototype.clear=function(){this.mi=this.ib=null;this.rd=new E;this.Cd=new E}; +fq.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutVertex#"+gb(this);if(0b?1:0):1:null!==b?-1:0} +na.Object.defineProperties(fq.prototype,{sourceEdgesArrayAccess:{get:function(){return this.rd._dataArray}},destinationEdgesArrayAccess:{get:function(){return this.Cd._dataArray}},data:{get:function(){return this.ib},set:function(a){this.ib=a;if(null!==a&&a.bounds){var b=a.bounds;a=b.x;var c=b.y,d=b.width;b=b.height;this.o.h(d/2,b/2);this.j.h(a,c,d,b)}}},node:{get:function(){return this.mi}, set:function(a){if(this.mi!==a){this.mi=a;a.Sa();var b=this.network.layout,c=N.alloc(),d=b.Ni(a,c);b=d.x;var e=d.y,f=d.width;d=d.height;isNaN(b)&&(b=0);isNaN(e)&&(e=0);this.j.h(b,e,f,d);N.free(c);if(!(a instanceof hf)&&(a=a.locationObject.da(yc),a.u())){this.o.h(a.x-b,a.y-e);return}this.o.h(f/2,d/2)}}},bounds:{get:function(){return this.j},set:function(a){this.j.A(a)||this.j.assign(a)}},focus:{get:function(){return this.o},set:function(a){this.o.A(a)|| this.o.assign(a)}},centerX:{get:function(){return this.j.x+this.o.x},set:function(a){var b=this.j;b.x+this.o.x!==a&&(b.ea(),b.x=a-this.o.x,b.freeze())}},centerY:{get:function(){return this.j.y+this.o.y},set:function(a){var b=this.j;b.y+this.o.y!==a&&(b.ea(),b.y=a-this.o.y,b.freeze())}},focusX:{get:function(){return this.o.x},set:function(a){var b=this.o;b.x!==a&&(b.ea(),b.x=a,b.freeze())}},focusY:{ get:function(){return this.o.y},set:function(a){var b=this.o;b.y!==a&&(b.ea(),b.y=a,b.freeze())}},x:{get:function(){return this.j.x},set:function(a){var b=this.j;b.x!==a&&(b.ea(),b.x=a,b.freeze())}},y:{get:function(){return this.j.y},set:function(a){var b=this.j;b.y!==a&&(b.ea(),b.y=a,b.freeze())}},width:{get:function(){return this.j.width},set:function(a){var b=this.j;b.width!==a&&(b.ea(),b.width= -a,b.freeze())}},height:{get:function(){return this.j.height},set:function(a){var b=this.j;b.height!==a&&(b.ea(),b.height=a,b.freeze())}},network:{get:function(){return this.Pc},set:function(a){this.Pc=a}},sourceVertexes:{get:function(){for(var a=new G,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);return a.iterator}},destinationVertexes:{get:function(){for(var a=new G,b= -this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},vertexes:{get:function(){for(var a=new G,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);for(b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},sourceEdges:{get:function(){return this.qd.iterator}},destinationEdges:{get:function(){return this.Cd.iterator}},edges:{get:function(){for(var a= -new E,b=this.sourceEdges;b.next();)a.add(b.value);for(b=this.destinationEdges;b.next();)a.add(b.value);return a.iterator}},edgesCount:{get:function(){return this.qd.count+this.Cd.count}}});fq.prototype.deleteDestinationEdge=fq.prototype.jv;fq.prototype.addDestinationEdge=fq.prototype.$u;fq.prototype.deleteSourceEdge=fq.prototype.kv;fq.prototype.addSourceEdge=fq.prototype.bv;fq.className="LayoutVertex";fq.standardComparer=mq; +a,b.freeze())}},height:{get:function(){return this.j.height},set:function(a){var b=this.j;b.height!==a&&(b.ea(),b.height=a,b.freeze())}},network:{get:function(){return this.Qc},set:function(a){this.Qc=a}},sourceVertexes:{get:function(){for(var a=new G,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);return a.iterator}},destinationVertexes:{get:function(){for(var a=new G,b= +this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},vertexes:{get:function(){for(var a=new G,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);for(b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},sourceEdges:{get:function(){return this.rd.iterator}},destinationEdges:{get:function(){return this.Cd.iterator}},edges:{get:function(){for(var a= +new E,b=this.sourceEdges;b.next();)a.add(b.value);for(b=this.destinationEdges;b.next();)a.add(b.value);return a.iterator}},edgesCount:{get:function(){return this.rd.count+this.Cd.count}}});fq.prototype.deleteDestinationEdge=fq.prototype.jv;fq.prototype.addDestinationEdge=fq.prototype.$u;fq.prototype.deleteSourceEdge=fq.prototype.kv;fq.prototype.addSourceEdge=fq.prototype.bv;fq.className="LayoutVertex";fq.standardComparer=mq; fq.smartComparer=function(a,b){if(null!==a){if(null!==b){a=a.mi;var c=b.mi;if(null!==a){if(null!==c){b=a.text.toLocaleLowerCase().split(/([+-]?[.]?\d+(?:\.\d*)?(?:e[+-]?\d+)?)/);a=c.text.toLocaleLowerCase().split(/([+-]?[.]?\d+(?:\.\d*)?(?:e[+-]?\d+)?)/);for(c=0;c=f&&0>=g&&(f=1);b=this.spacing.width;isFinite(b)||(b=0);c=this.spacing.height;isFinite(c)||(c=0);null!==a&&a.wa("Layout");d=[];switch(this.alignment){case vq:var h=b,k=c,l=N.alloc(),m=Math.max(this.cellSize.width,1);if(!isFinite(m))for(var n=m=0;nf-1||0g)d.push(new N(0,u,g+h,w)),v=0,q=r,u+=w,w=0;w=Math.max(w,F);switch(p){case uq:A=-A.width;break;default:A= @@ -1701,13 +1701,13 @@ m&&u>m-1||0k){d.push(new N(0,F?z-f:z,k+n,A+f+p));for(S=0;Sl&&(f.width+=f.x-l,f.x=l);N.free(g)}for(h=f=g=e=0;hb?1:0} na.Object.defineProperties(Lk.prototype,{wrappingWidth:{get:function(){return this.Vp},set:function(a){this.Vp!==a&&(0d.indexOf(a.newValue)&&d.splice(c,0,a.newValue));return}}else if(a.change===fe){c=a.oldParam;if("linkDataArray"===a.modelChange){a=a.oldValue;za(a)&&"number"===typeof c&&(d=this.mc(a),b?(this.Rf.add(a),this.Xc[c]!==a&&this.Xc.splice(c,0,a),void 0!==d&&this.jb.add(d,a)):(this.Rf.remove(a),this.Xc[c]=== -a&&this.Xc.splice(c,1),void 0!==d&&this.jb.remove(d)));return}if("linkLabelKeys"===a.modelChange){d=this.xf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue):(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)));return}}Z.prototype.changeState.call(this,a,b)}};t=nr.prototype;t.pm=function(a){if(void 0!==a){var b=this.mj;if(null!==b){var c=this.Vb(a);null===c&&(c=this.copyNodeData(b),Mj(c,this.nodeKeyProperty,a),this.nf(c))}return a}}; +nr.prototype.changeState=function(a,b){if(null!==a&&a.model===this){if(a.change===ce){var c=a.object,d=a.propertyName;if(d===this.linkKeyProperty&&this.tc(c)){var e=a.H(b);b=a.H(!b);void 0!==b&&this.jb.remove(b);void 0!==e&&this.jb.add(e,c);Mj(c,d,e);return}}else if(a.change===ee){c=a.newParam;if("linkDataArray"===a.modelChange){a=a.newValue;za(a)&&"number"===typeof c&&(d=this.mc(a),b?(this.Rf.remove(a),this.Yc[c]===a&&this.Yc.splice(c,1),void 0!==d&&this.jb.remove(d)):(this.Rf.add(a),this.Yc[c]!== +a&&this.Yc.splice(c,0,a),void 0!==d&&this.jb.add(d,a)));return}if("linkLabelKeys"===a.modelChange){d=this.xf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)):0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue));return}}else if(a.change===fe){c=a.oldParam;if("linkDataArray"===a.modelChange){a=a.oldValue;za(a)&&"number"===typeof c&&(d=this.mc(a),b?(this.Rf.add(a),this.Yc[c]!==a&&this.Yc.splice(c,0,a),void 0!==d&&this.jb.add(d,a)):(this.Rf.remove(a),this.Yc[c]=== +a&&this.Yc.splice(c,1),void 0!==d&&this.jb.remove(d)));return}if("linkLabelKeys"===a.modelChange){d=this.xf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue):(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)));return}}Z.prototype.changeState.call(this,a,b)}};t=nr.prototype;t.pm=function(a){if(void 0!==a){var b=this.mj;if(null!==b){var c=this.Vb(a);null===c&&(c=this.copyNodeData(b),Mj(c,this.nodeKeyProperty,a),this.nf(c))}return a}}; t.Zx=function(a){return Jq(this,a,!0)};t.Wv=function(a,b){Rq(this,a,b,!0)};t.by=function(a){return Jq(this,a,!1)};t.$v=function(a,b){Rq(this,a,b,!1)};function Jq(a,b,c){if(null!==b&&(a=c?a.Xe:a.Ye,""!==a&&(a=on(b,a),void 0!==a))){if(Lq(a))return a;C((c?"FromKey":"ToKey")+" value for link data "+b+" is not a number or a string: "+a)}} function Rq(a,b,c,d){null===c&&(c=void 0);if(null!==b){var e=d?a.Xe:a.Ye;if(""!==e)if(c=a.pm(c),a.tc(b)){var f=on(b,e);f!==c&&(Pq(a,f,b),Mj(b,e,c),null===a.Vb(c)&&Qq(a,c,b),ir(a,d?"linkFromKey":"linkToKey",ce,e,b,f,c),"string"===typeof e&&a.Da(b,e))}else Mj(b,e,c)}}t.$x=function(a){return Iq(this,a,!0)};t.Xv=function(a,b){Sq(this,a,b,!0)};t.ey=function(a){return Iq(this,a,!1)};t.aw=function(a,b){Sq(this,a,b,!1)}; function Iq(a,b,c){if(null===b)return"";a=c?a.Fj:a.Gj;if(""===a)return"";b=on(b,a);return void 0===b?"":b}function Sq(a,b,c,d){if(null!==b){var e=d?a.Fj:a.Gj;if(""!==e)if(a.tc(b)){var f=on(b,e);void 0===f&&(f="");f!==c&&(Mj(b,e,c),ir(a,d?"linkFromPortId":"linkToPortId",ce,e,b,f,c),"string"===typeof e&&a.Da(b,e))}else Mj(b,e,c)}}t.xf=function(a){if(null===a)return qr;var b=this.$d;if(""===b)return qr;a=on(a,b);return void 0===a?qr:a}; @@ -1863,8 +1863,8 @@ t.av=function(a,b){if(null!==b&&void 0!==b&&null!==a){var c=this.$d;if(""!==c){v t.wy=function(a,b){if(null!==b&&void 0!==b&&null!==a){var c=this.$d;if(""!==c){var d=on(a,c);if(Array.isArray(d)){var e=d.indexOf(b);0>e||(d.splice(e,1),this.tc(a)&&(Pq(this,b,a),ir(this,"linkLabelKeys",fe,c,a,b,null,e,null)))}else void 0!==d&&C(c+" property is not an Array; cannot removeLabelKeyforLinkData: "+a)}}};t.mc=function(a){if(null!==a){var b=this.gi;if(""!==b&&(b=on(a,b),void 0!==b)){if(Lq(b))return b;C("Key value for link data "+a+" is not a number or a string: "+b)}}}; t.dt=function(a,b){if(null!==a){var c=this.gi;if(""!==c)if(this.tc(a)){var d=on(a,c);d!==b&&null===this.zh(b)&&(Mj(a,c,b),void 0!==d&&this.jb.remove(d),this.jb.add(b,a),ir(this,"linkKey",ce,c,a,d,b),"string"===typeof c&&this.Da(a,c))}else Mj(a,c,b)}};t.zh=function(a){null===a&&C("GraphLinksModel.findLinkDataForKey:key must not be null");return void 0!==a&&Lq(a)?this.jb.H(a):null}; t.Us=function(a){if(null!==a){var b=this.gi;if(""!==b){var c=this.mc(a);if(void 0===c||this.jb.contains(c)){var d=this.wl;if(null!==d&&(c=d(this,a),void 0!==c&&null!==c&&!this.jb.contains(c))){Mj(a,b,c);return}if("string"===typeof c){for(d=2;this.jb.contains(c+d);)d++;Mj(a,b,c+d)}else if(void 0===c||"number"===typeof c){for(c=-this.jb.count-1;this.jb.contains(c);)c--;Mj(a,b,c)}}}}};t.tc=function(a){return null===a?!1:this.Rf.contains(a)};t.Ci=function(a){null!==a&&(ib(a),this.tc(a)||Nq(this,a,!0))}; -function Nq(a,b,c){if(""!==a.linkKeyProperty){var d=a.mc(b);if(void 0!==d&&a.jb.H(d)===b)return;a.Us(b);d=a.mc(b);void 0===d&&C("GraphLinksModel.makeLinkDataKeyUnique failed on "+b+". Data not added to model.");a.jb.add(d,b)}a.Rf.add(b);d=null;c&&(d=a.Xc.length,a.Xc.splice(d,0,b));ir(a,"linkDataArray",ee,"linkDataArray",a,null,b,null,d);rr(a,b)}t.hz=function(a){if(Array.isArray(a))for(var b=a.length,c=0;cd)return;a.Xc.splice(d,1)}ir(a,"linkDataArray",fe,"linkDataArray",a,b,null,d,null);c=Jq(a,b,!0);Pq(a,c,b);c=Jq(a,b,!1);Pq(a,c,b);d=a.xf(b);if(Array.isArray(d))for(var e=d.length,f=0;fd)return;a.Yc.splice(d,1)}ir(a,"linkDataArray",fe,"linkDataArray",a,b,null,d,null);c=Jq(a,b,!0);Pq(a,c,b);c=Jq(a,b,!1);Pq(a,c,b);d=a.xf(b);if(Array.isArray(d))for(var e=d.length,f=0;f=a.count)1===a.count&&(a=a.first(),a.centerX=0,a.centerY=0);else{var b=new E;b.addAll(a.iterator);a=new E;var c=new E;var d=this.sort(b);var e,f,g=this.$q;var h=this.arrangement;var k=this.nodeDiameterFormula;var l=this.radius;if(!isFinite(l)||0>=l)l=NaN;var m=this.aspectRatio;if(!isFinite(m)||0>=m)m=1;var n=this.startAngle; isFinite(n)||(n=0);var p=this.sweepAngle;if(!isFinite(p)||360p)p=360;b=this.spacing;isFinite(b)||(b=NaN);h===Ir&&k===Jr?h=ur:h===Ir&&k!==Jr&&(h=this.arrangement);if((this.direction===Dr||this.direction===Er)&&this.sorting!==xr){for(k=0;!(k>=d.length);k+=2){a.add(d.J(k));if(k+1>=d.length)break;c.add(d.J(k+1))}this.direction===Dr?(this.arrangement===Ir&&a.reverse(),d=new E,d.addAll(a),d.addAll(c)):(this.arrangement===Ir&&c.reverse(),d=new E,d.addAll(c),d.addAll(a))}k=d.length;for(var r=f=e=0;r< @@ -1926,8 +1926,8 @@ p=-1,r=[],q=0;qb[c[q]].indexOf(c[q===c.length-1?0:q+1])&&r.push( c.indexOf(b[l][z]),0<=B&&(B=Math.abs(u-(B>=u?B+1:B)),w+=B=u&&B++,y>=u&&y++,B>y&&(A=y,y=B,B=A),y-B<(c.length+2)/2===(Br||r===m||(q=r>m?r-m:m-r,n+=rg-q?1:-1);c.splice(0>n?m:m+1,0,k);d.splice(h,1);h--}else f=!1;if(f)break;else c.push(d[0]),d.splice(0,1)}for(b=0;b=a?this.Vl=a:this.Vl=360,this.B())}},arrangement:{get:function(){return this.Gb},set:function(a){this.Gb===a||a!==Ir&&a!==ur&&a!==Hr&&a!==Gr||(this.Gb=a,this.B())}},direction:{get:function(){return this.K},set:function(a){this.K===a||a!==wr&&a!==Fr&&a!==Dr&&a!==Er||(this.K=a,this.B())}},sorting:{get:function(){return this.Yc},set:function(a){this.Yc===a||a!==Br&&a!==Cr&& -a!==zr&&!Ar&&a!==xr||(this.Yc=a,this.B())}},comparer:{get:function(){return this.Rc},set:function(a){this.Rc!==a&&(this.Rc=a,this.B())}},spacing:{get:function(){return this.ef},set:function(a){this.ef!==a&&(this.ef=a,this.B())}},nodeDiameterFormula:{get:function(){return this.Oo},set:function(a){this.Oo===a||a!==yr&&a!==Jr||(this.Oo=a,this.B())}},actualXRadius:{get:function(){return this.Zb}}, +set:function(a){this.Vl!==a&&(0=a?this.Vl=a:this.Vl=360,this.B())}},arrangement:{get:function(){return this.Gb},set:function(a){this.Gb===a||a!==Ir&&a!==ur&&a!==Hr&&a!==Gr||(this.Gb=a,this.B())}},direction:{get:function(){return this.K},set:function(a){this.K===a||a!==wr&&a!==Fr&&a!==Dr&&a!==Er||(this.K=a,this.B())}},sorting:{get:function(){return this.Zc},set:function(a){this.Zc===a||a!==Br&&a!==Cr&& +a!==zr&&!Ar&&a!==xr||(this.Zc=a,this.B())}},comparer:{get:function(){return this.Sc},set:function(a){this.Sc!==a&&(this.Sc=a,this.B())}},spacing:{get:function(){return this.ef},set:function(a){this.ef!==a&&(this.ef=a,this.B())}},nodeDiameterFormula:{get:function(){return this.Oo},set:function(a){this.Oo===a||a!==yr&&a!==Jr||(this.Oo=a,this.B())}},actualXRadius:{get:function(){return this.Zb}}, actualYRadius:{get:function(){return this.be}},actualSpacing:{get:function(){return this.qj}},actualCenter:{get:function(){return this.zw}}}); var ur=new D(tr,"ConstantSpacing",0),Hr=new D(tr,"ConstantDistance",1),Gr=new D(tr,"ConstantAngle",2),Ir=new D(tr,"Packed",3),wr=new D(tr,"Clockwise",4),Fr=new D(tr,"Counterclockwise",5),Dr=new D(tr,"BidirectionalLeft",6),Er=new D(tr,"BidirectionalRight",7),Br=new D(tr,"Forwards",8),Cr=new D(tr,"Reverse",9),zr=new D(tr,"Ascending",10),Ar=new D(tr,"Descending",11),xr=new D(tr,"Optimized",12),yr=new D(tr,"Pythagorean",13),Jr=new D(tr,"Circular",14);tr.className="CircularLayout";tr.ConstantSpacing=ur; tr.ConstantDistance=Hr;tr.ConstantAngle=Gr;tr.Packed=Ir;tr.Clockwise=wr;tr.Counterclockwise=Fr;tr.BidirectionalLeft=Dr;tr.BidirectionalRight=Er;tr.Forwards=Br;tr.Reverse=Cr;tr.Ascending=zr;tr.Descending=Ar;tr.Optimized=xr;tr.Pythagorean=yr;tr.Circular=Jr;function vr(){this.jm=-Infinity;this.Pm=this.Ck=null} @@ -1935,8 +1935,8 @@ vr.prototype.compare=function(a,b){if(0this.jm||Math.abs(a)h?(e=p.x+p.width/2,f=p.y+p.height/2,l[0]=new J(p.x+p.width+d.width,p.y),l[1]=new J(p.x,p.y+p.height+d.height),h=2):(k=cs(l,h,e,f,p.width,p.height,d),n=l[k],r=new J(n.x+ p.width+d.width,n.y),p=new J(n.x,n.y+p.height+d.height),k+1this.network.vertexes.count)return!1;for(var a=0,b=0,c=this.network.vertexes.first().bounds,d=this.network.vertexes.iterator;d.next();){if(d.value.bounds.Ic(c)&&(a++,2this.network.vertexes.count)return!1;for(var a=0,b=0,c=this.network.vertexes.first().bounds,d=this.network.vertexes.iterator;d.next();){if(d.value.bounds.Jc(c)&&(a++,2a.network.vertexes.count)return!1;a.sh=a.network.vertexes.xa();a=a.sh;a.sort(function(a,b){return null===a||null===b||a===b?0:b.Gd-a.Gd});for(b=a.length-1;0<=b&&1>=a[b].Gd;)b--;return 1u&&0u&&0a[this.pc]&&(this.ji=a[c]-1,this.pc=c),a[c]c)for(g=a.Ca;0c)for(d.reset();d.next();)c=d.value,e[c.component]&&(c.column+=1)} os.prototype.commitLayout=function(){if(this.setsPortSpots)for(var a=vs(this,!0),b=vs(this,!1),c=this.network.edges.iterator;c.next();){var d=c.value.link;null!==d&&(d.fromSpot=a,d.toSpot=b)}this.commitNodes();this.gv();this.isRouting&&this.commitLinks()};function vs(a,b){return 270===a.K?b?cd:fd:90===a.K?b?fd:cd:180===a.K?b?dd:ed:b?ed:dd} -os.prototype.commitNodes=function(){this.Yd=[];this.vd=[];this.ud=[];this.Ka=[];for(var a=0;a<=this.ra;a++)this.Yd[a]=0,this.vd[a]=0,this.ud[a]=0,this.Ka[a]=0;for(a=this.network.vertexes.iterator;a.next();){var b=a.value,c=b.layer;this.Yd[c]=Math.max(this.Yd[c],this.nodeMinLayerSpace(b,!0));this.vd[c]=Math.max(this.vd[c],this.nodeMinLayerSpace(b,!1))}b=0;c=this.Zd;for(var d=0;d<=this.ra;d++){var e=c;0>=this.Yd[d]+this.vd[d]&&(e=0);0=this.Yd[d]+this.wd[d]&&(e=0);0=n.bounds.bottom?(n=n.bounds.y+n.bounds.height,b.l(q++,A,n+F),b.l(q++,A,n),b.l(q++,A,n-y)):(b.l(q++,A,B+F),b.l(q++,A,B),b.l(q++,A,B-y)):270===this.K?B<=n.bounds.y?(n=n.bounds.y,b.l(q++,A,n-y),b.l(q++,A,n),b.l(q++,A,n+F)):(b.l(q++,A,B-y),b.l(q++,A,B),b.l(q++,A,B+F)):0===this.K&&(A>=n.bounds.right?(n=n.bounds.x+n.bounds.width,b.l(q++,n+F,B),b.l(q++,n,B),b.l(q++,n-y,B)):(b.l(q++,A+F,B),b.l(q++,A,B),b.l(q++,A-y,B)));else{b.l(q++,w,z);var K=0;if(180===this.K||0===this.K){if(180===this.K?A>=n.bounds.right: -A<=n.bounds.x)K=(0===this.K?-y:F)/2;b.l(q++,w+K,B)}else{if(270===this.K?B>=n.bounds.bottom:B<=n.bounds.y)K=(90===this.K?-y:F)/2;b.l(q++,A,z+K)}b.l(q++,A,B)}}else y=Math.max(10,this.Yd[v.layer]),F=Math.max(10,this.vd[v.layer]),r?180===this.K?(b.l(q++,A-y-u,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A+F+u,B)):90===this.K?(b.l(q++,A,B+F+u),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B-y-u)): -270===this.K?(b.l(q++,A,B-y-u),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B+F+u)):(b.l(q++,A+F+u,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A-y-u,B)):b.l(q++,A,B)}n=v}if(null===h||l!==rc||p)if(w=b.i(q-1).x,z=b.i(q-1).y,A=b.i(q).x,B=b.i(q).y,p)u=this.vd[m.layer],180===this.K||0===this.K?(p=z,p>=m.bounds.y&&p<=m.bounds.bottom&&(180===this.K?A>=m.bounds.x:A<=m.bounds.right)&&(n=m.centerX+(180=== -this.K?-u:u),p=m.bounds.x&&p<=m.bounds.right&&(270===this.K?B>=m.bounds.y:B<=m.bounds.bottom)&&(n=m.centerY+(270===this.K?-u:u),p=m.bounds.x?(n=m.bounds.x+ -m.bounds.width,b.L(q-2,n,z),b.L(q-1,n+F,z)):90===this.K&&B<=m.bounds.bottom?(n=m.bounds.y,b.L(q-2,w,n),b.L(q-1,w,n-y)):270===this.K&&B>=m.bounds.y?(n=m.bounds.y+m.bounds.height,b.L(q-2,w,n),b.L(q-1,w,n+F)):0===this.K&&A<=m.bounds.right&&(n=m.bounds.x,b.L(q-2,n,z),b.L(q-1,n-y,z));else{y=Math.max(10,this.Yd[m.layer]);F=Math.max(10,this.vd[m.layer]);p=0;if(180===this.K||0===this.K){if(180===this.K?A<=m.bounds.x:A>=m.bounds.right)p=(0===this.K?F:-y)/2;b.l(q++,A+p,z)}else{if(270===this.K?B<=m.bounds.y: -B>=m.bounds.bottom)p=(90===this.K?F:-y)/2;b.l(q++,w,B+p)}b.l(q++,A,B)}}else{for(;null!==m&&m!==n;){y=v=null;for(m=m.destinationEdges.iterator;m.next()&&(w=m.value,w.link!==c.link||(v=w.toVertex,y=w.fromVertex,null!==y.node&&(y=null),null!==v.node)););if(null===v)break;v!==n&&(w=b.i(q-1).x,z=b.i(q-1).y,A=v.centerX,B=v.centerY,p?180===this.K||0===this.K?(null!==y?y.centerY:z)!==B&&(y=this.Ka[v.layer]+this.Qc.x,q===b.firstPickIndex+1&&(y=0===this.K?Math.max(y,w):Math.min(y,w)),b.l(q++,y,z),b.l(q++,y, -B)):(null!==y?y.centerX:w)!==A&&(y=this.Ka[v.layer]+this.Qc.y,q===b.firstPickIndex+1&&(y=90===this.K?Math.max(y,z):Math.min(y,z)),b.l(q++,w,y),b.l(q++,A,y)):(y=Math.max(10,this.Yd[v.layer]),F=Math.max(10,this.vd[v.layer]),r?180===this.K?(b.l(q++,A+F+u,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A-y-u,B)):90===this.K?(b.l(q++,A,B-y-u),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B+F+u)):270=== +A<=n.bounds.x)K=(0===this.K?-y:F)/2;b.l(q++,w+K,B)}else{if(270===this.K?B>=n.bounds.bottom:B<=n.bounds.y)K=(90===this.K?-y:F)/2;b.l(q++,A,z+K)}b.l(q++,A,B)}}else y=Math.max(10,this.Yd[v.layer]),F=Math.max(10,this.wd[v.layer]),r?180===this.K?(b.l(q++,A-y-u,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A+F+u,B)):90===this.K?(b.l(q++,A,B+F+u),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B-y-u)): +270===this.K?(b.l(q++,A,B-y-u),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B+F+u)):(b.l(q++,A+F+u,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A-y-u,B)):b.l(q++,A,B)}n=v}if(null===h||l!==rc||p)if(w=b.i(q-1).x,z=b.i(q-1).y,A=b.i(q).x,B=b.i(q).y,p)u=this.wd[m.layer],180===this.K||0===this.K?(p=z,p>=m.bounds.y&&p<=m.bounds.bottom&&(180===this.K?A>=m.bounds.x:A<=m.bounds.right)&&(n=m.centerX+(180=== +this.K?-u:u),p=m.bounds.x&&p<=m.bounds.right&&(270===this.K?B>=m.bounds.y:B<=m.bounds.bottom)&&(n=m.centerY+(270===this.K?-u:u),p=m.bounds.x?(n=m.bounds.x+ +m.bounds.width,b.L(q-2,n,z),b.L(q-1,n+F,z)):90===this.K&&B<=m.bounds.bottom?(n=m.bounds.y,b.L(q-2,w,n),b.L(q-1,w,n-y)):270===this.K&&B>=m.bounds.y?(n=m.bounds.y+m.bounds.height,b.L(q-2,w,n),b.L(q-1,w,n+F)):0===this.K&&A<=m.bounds.right&&(n=m.bounds.x,b.L(q-2,n,z),b.L(q-1,n-y,z));else{y=Math.max(10,this.Yd[m.layer]);F=Math.max(10,this.wd[m.layer]);p=0;if(180===this.K||0===this.K){if(180===this.K?A<=m.bounds.x:A>=m.bounds.right)p=(0===this.K?F:-y)/2;b.l(q++,A+p,z)}else{if(270===this.K?B<=m.bounds.y: +B>=m.bounds.bottom)p=(90===this.K?F:-y)/2;b.l(q++,w,B+p)}b.l(q++,A,B)}}else{for(;null!==m&&m!==n;){y=v=null;for(m=m.destinationEdges.iterator;m.next()&&(w=m.value,w.link!==c.link||(v=w.toVertex,y=w.fromVertex,null!==y.node&&(y=null),null!==v.node)););if(null===v)break;v!==n&&(w=b.i(q-1).x,z=b.i(q-1).y,A=v.centerX,B=v.centerY,p?180===this.K||0===this.K?(null!==y?y.centerY:z)!==B&&(y=this.Ka[v.layer]+this.Rc.x,q===b.firstPickIndex+1&&(y=0===this.K?Math.max(y,w):Math.min(y,w)),b.l(q++,y,z),b.l(q++,y, +B)):(null!==y?y.centerX:w)!==A&&(y=this.Ka[v.layer]+this.Rc.y,q===b.firstPickIndex+1&&(y=90===this.K?Math.max(y,z):Math.min(y,z)),b.l(q++,w,y),b.l(q++,A,y)):(y=Math.max(10,this.Yd[v.layer]),F=Math.max(10,this.wd[v.layer]),r?180===this.K?(b.l(q++,A+F+u,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A-y-u,B)):90===this.K?(b.l(q++,A,B-y-u),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B+F+u)):270=== this.K?(b.l(q++,A,B+F+u),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B-y-u)):(b.l(q++,A-y-u,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A+F+u,B)):180===this.K?(b.l(q++,A+F,B),b.l(q++,A-y,B)):90===this.K?(b.l(q++,A,B-y),b.l(q++,A,B+F)):270===this.K?(b.l(q++,A,B+F),b.l(q++,A,B-y)):(b.l(q++,A-y,B),b.l(q++,A+F,B))));m=v}p&&(w=b.i(q-1).x,z=b.i(q-1).y,A=b.i(q).x,B=b.i(q).y,180===this.K||0===this.K? -z!==B&&(y=0===this.K?Math.min(Math.max((A+w)/2,this.Ka[n.layer]+this.Qc.x),A):Math.max(Math.min((A+w)/2,this.Ka[n.layer]+this.Qc.x),A),b.l(q++,y,z),b.l(q++,y,B)):w!==A&&(y=90===this.K?Math.min(Math.max((B+z)/2,this.Ka[n.layer]+this.Qc.y),B):Math.max(Math.min((B+z)/2,this.Ka[n.layer]+this.Qc.y),B),b.l(q++,w,y),b.l(q++,A,y)))}null!==d&&r&&(null!==g&&(l===rc&&(l=b.i(0),d=b.i(2),l.A(d)||b.L(1,(l.x+d.x)/2,(l.y+d.y)/2)),l=b.getLinkPoint(e,g,rc,!0,!1,f,h),l.u()||l.set(e.actualBounds.center),b.L(0,l.x,l.y)), +z!==B&&(y=0===this.K?Math.min(Math.max((A+w)/2,this.Ka[n.layer]+this.Rc.x),A):Math.max(Math.min((A+w)/2,this.Ka[n.layer]+this.Rc.x),A),b.l(q++,y,z),b.l(q++,y,B)):w!==A&&(y=90===this.K?Math.min(Math.max((B+z)/2,this.Ka[n.layer]+this.Rc.y),B):Math.max(Math.min((B+z)/2,this.Ka[n.layer]+this.Rc.y),B),b.l(q++,w,y),b.l(q++,A,y)))}null!==d&&r&&(null!==g&&(l===rc&&(l=b.i(0),d=b.i(2),l.A(d)||b.L(1,(l.x+d.x)/2,(l.y+d.y)/2)),l=b.getLinkPoint(e,g,rc,!0,!1,f,h),l.u()||l.set(e.actualBounds.center),b.L(0,l.x,l.y)), null!==h&&(k===rc&&(k=b.i(b.pointsCount-1),l=b.i(b.pointsCount-3),k.A(l)||b.L(b.pointsCount-2,(k.x+l.x)/2,(k.y+l.y)/2)),e=b.getLinkPoint(f,h,rc,!1,!1,e,g),e.u()||e.set(f.actualBounds.center),b.L(b.pointsCount-1,e.x,e.y)));b.rf();c.commit()}}}this.avoidOrthogonalOverlaps()}; os.prototype.avoidOrthogonalOverlaps=function(){if(!(0>=this.linkSpacing)){for(var a=new E,b=this.network.edges.iterator;b.next();){var c=b.value.link;null!==c&&c.isOrthogonal&&!a.contains(c)&&a.add(c)}if(0f.y&&(m=l.y>f.y?0:g.xf.y&&(m=l.y>f.y?0:g.xf.x&&(m=l.x>f.x?0:g.yb.layer?1:a.cdb.cd?1:a.scb.sc?1:0:0};t.Ay=function(a,b){return a instanceof it&&b instanceof it&&a!==b?a.firstb.first||a.jb.j||a.cdb.cd?1:a.scb.sc?1:0:0}; -t.ct=function(a,b){return a instanceof it&&b instanceof it&&a!==b?a.Xbb.Xb||a.jb.j||a.cdb.cd?1:a.scb.sc?1:0:0};t.w=function(a,b){a-=b;return-1a}; +2;ef.x&&(m=l.x>f.x?0:g.yb.layer?1:a.ddb.dd?1:a.scb.sc?1:0:0};t.Ay=function(a,b){return a instanceof it&&b instanceof it&&a!==b?a.firstb.first||a.jb.j||a.ddb.dd?1:a.scb.sc?1:0:0}; +t.ct=function(a,b){return a instanceof it&&b instanceof it&&a!==b?a.Xbb.Xb||a.jb.j||a.ddb.dd?1:a.scb.sc?1:0:0};t.w=function(a,b){a-=b;return-1a}; t.Wi=function(a,b,c,d){var e=a.length,f=d-c;if(!(1>=f))if((0>c||c>=e-1)&&C("not in range 0 <= from < length: "+c),2===f)d=a[c],e=a[c+1],0=e)a.sort(b);else for(c=a.slice(0,d),c.sort(b),b=0;b=e)for(d=a.slice(c),d.sort(b),b=c;b=a.ve.length){var d=[];for(var e=0;ea&&(this.Wf=a,this.B())}},setsPortSpots:{get:function(){return this.df},set:function(a){this.df!==a&&(this.df=a,this.B())}}, linkSpacing:{get:function(){return this.vo},set:function(a){this.vo!==a&&0<=a&&(this.vo=a,this.B())}},maxLayer:{get:function(){return this.ra}},maxIndex:{get:function(){return this.ji}},maxColumn:{get:function(){return this.Ca}},minIndexLayer:{get:function(){return this.Qg}},maxIndexLayer:{get:function(){return this.pc}}}); var ps=new D(os,"CycleDepthFirst",0),Is=new D(os,"CycleGreedy",1),us=new D(os,"CycleFromLayers",2),qs=new D(os,"LayerOptimalLinkLength",0),Ns=new D(os,"LayerLongestPathSink",1),Ps=new D(os,"LayerLongestPathSource",2),rs=new D(os,"InitDepthFirstOut",0),Vs=new D(os,"InitDepthFirstIn",1),Ts=new D(os,"InitNaive",2),Zs=new D(os,"AggressiveNone",0),ss=new D(os,"AggressiveLess",1),$s=new D(os,"AggressiveMore",2),at=8;os.className="LayeredDigraphLayout";os.CycleDepthFirst=ps;os.CycleGreedy=Is; -os.CycleFromLayers=us;os.LayerOptimalLinkLength=qs;os.LayerLongestPathSink=Ns;os.LayerLongestPathSource=Ps;os.InitDepthFirstOut=rs;os.InitDepthFirstIn=Vs;os.InitNaive=Ts;os.AggressiveNone=Zs;os.AggressiveLess=ss;os.AggressiveMore=$s;os.PackNone=0;os.PackExpand=1;os.PackStraighten=2;os.PackMedian=4;os.PackAll=15;function it(){this.index=this.sc=this.cd=this.Xb=this.first=this.layer=0;this.link=null;this.j=0}it.className="SegInfo";function ts(a){Sp.call(this,a)}ma(ts,Sp);ts.prototype.createVertex=function(){return new jt(this)}; -ts.prototype.createEdge=function(){return new kt(this)};ts.className="LayeredDigraphNetwork";function jt(a){fq.call(this,a);this.Qa=this.wg=this.ei=-1;this.C=NaN;this.M=null;this.valid=!1;this.finish=this.jg=NaN;this.qf=0;this.uk=this.vk=null}ma(jt,fq); +os.CycleFromLayers=us;os.LayerOptimalLinkLength=qs;os.LayerLongestPathSink=Ns;os.LayerLongestPathSource=Ps;os.InitDepthFirstOut=rs;os.InitDepthFirstIn=Vs;os.InitNaive=Ts;os.AggressiveNone=Zs;os.AggressiveLess=ss;os.AggressiveMore=$s;os.PackNone=0;os.PackExpand=1;os.PackStraighten=2;os.PackMedian=4;os.PackAll=15;function it(){this.index=this.sc=this.dd=this.Xb=this.first=this.layer=0;this.link=null;this.j=0}it.className="SegInfo";function ts(a){Sp.call(this,a)}ma(ts,Sp);ts.prototype.createVertex=function(){return new jt(this)}; +ts.prototype.createEdge=function(){return new kt(this)};ts.className="LayeredDigraphNetwork";function jt(a){fq.call(this,a);this.Pa=this.wg=this.ei=-1;this.C=NaN;this.M=null;this.valid=!1;this.finish=this.jg=NaN;this.qf=0;this.uk=this.vk=null}ma(jt,fq); jt.prototype.serializeVertexProperties=function(a,b){fq.prototype.serializeVertexProperties.call(this,a,b);a.layer=this.layer;a.column=this.column;a.index=this.index;a.component=this.component;a.near=this.near?gb(this.near):null;a.valid=this.valid;a.jg=this.jg;a.finish=this.finish;a.qf=this.qf;a.vk=this.vk;a.uk=this.uk}; jt.prototype.deserializeVertexProperties=function(a,b,c,d){fq.prototype.deserializeVertexProperties.call(this,a,b,c,d);this.layer=a.layer;this.column=a.column;this.index=a.index;this.component=a.component;if(b=b.get(a.near))this.near=b;this.valid=a.valid;this.jg=a.jg;this.finish=a.finish;this.qf=a.qf;this.vk=a.vk;this.uk=a.uk}; -na.Object.defineProperties(jt.prototype,{layer:{get:function(){return this.ei},set:function(a){this.ei!==a&&(this.ei=a)}},column:{get:function(){return this.wg},set:function(a){this.wg!==a&&(this.wg=a)}},index:{get:function(){return this.Qa},set:function(a){this.Qa!==a&&(this.Qa=a)}},component:{get:function(){return this.C},set:function(a){this.C!==a&&(this.C=a)}},near:{ +na.Object.defineProperties(jt.prototype,{layer:{get:function(){return this.ei},set:function(a){this.ei!==a&&(this.ei=a)}},column:{get:function(){return this.wg},set:function(a){this.wg!==a&&(this.wg=a)}},index:{get:function(){return this.Pa},set:function(a){this.Pa!==a&&(this.Pa=a)}},component:{get:function(){return this.C},set:function(a){this.C!==a&&(this.C=a)}},near:{ get:function(){return this.M},set:function(a){this.M!==a&&(this.M=a)}}});jt.className="LayeredDigraphVertex";function kt(a){gq.call(this,a);this.j=this.Ha=this.Wa=!1;this.Ga=this.C=NaN;this.M=this.o=0}ma(kt,gq); kt.prototype.serializeEdgeProperties=function(a,b){gq.prototype.serializeEdgeProperties.call(this,a,b);a.valid=this.valid;a.rev=this.rev;a.forest=this.forest;a.portFromPos=this.portFromPos;a.portToPos=this.portToPos;a.portFromColOffset=this.portFromColOffset;a.portToColOffset=this.portToColOffset}; kt.prototype.deserializeEdgeProperties=function(a,b,c,d){gq.prototype.deserializeEdgeProperties.call(this,a,b,c,d);this.valid=a.valid;this.rev=a.rev;this.forest=a.forest;this.portFromPos=a.portFromPos;this.portToPos=a.portToPos;this.portFromColOffset=a.portFromColOffset;this.portToColOffset=a.portToColOffset}; -na.Object.defineProperties(kt.prototype,{fromVertex:{get:function(){return this.Tc},set:function(a){this.Tc!==a&&(this.Tc=a)}},toVertex:{get:function(){return this.ad},set:function(a){this.ad!==a&&(this.ad=a)}},valid:{get:function(){return this.Wa},set:function(a){this.Wa!==a&&(this.Wa=a)}},rev:{get:function(){return this.Ha},set:function(a){this.Ha!==a&&(this.Ha=a)}},forest:{ +na.Object.defineProperties(kt.prototype,{fromVertex:{get:function(){return this.Uc},set:function(a){this.Uc!==a&&(this.Uc=a)}},toVertex:{get:function(){return this.bd},set:function(a){this.bd!==a&&(this.bd=a)}},valid:{get:function(){return this.Wa},set:function(a){this.Wa!==a&&(this.Wa=a)}},rev:{get:function(){return this.Ha},set:function(a){this.Ha!==a&&(this.Ha=a)}},forest:{ get:function(){return this.j},set:function(a){this.j!==a&&(this.j=a)}},portFromPos:{get:function(){return this.C},set:function(a){this.C!==a&&(this.C=a)}},portToPos:{get:function(){return this.Ga},set:function(a){this.Ga!==a&&(this.Ga=a)}},portFromColOffset:{get:function(){return this.o},set:function(a){this.o!==a&&(this.o=a)}},portToColOffset:{get:function(){return this.M}, -set:function(a){this.M!==a&&(this.M=a)}}});kt.className="LayeredDigraphEdge";function lt(a){li.call(this);this.Jb=new G;this.Yo=mt;this.jd=nt;this.Qp=ot;this.Gr=pt;this.Aw=[];this.gd=!0;this.Gb=qt;this.Nd=(new M(10,10)).freeze();var b=new rt(this);this.V=new st(b);this.W=new st(b);this.Qu=[];a&&Object.assign(this,a)}ma(lt,li); -lt.prototype.cloneProtected=function(a){li.prototype.cloneProtected.call(this,a);a.Yo=this.Yo;a.Qp=this.Qp;a.Gr=this.Gr;a.gd=this.gd;a.Gb=this.Gb;a.Nd.assign(this.Nd);a.V.copyInheritedPropertiesFrom(this.V);a.W.copyInheritedPropertiesFrom(this.W)}; +set:function(a){this.M!==a&&(this.M=a)}}});kt.className="LayeredDigraphEdge";function lt(a){li.call(this);this.Jb=new G;this.Yo=mt;this.kd=nt;this.Qp=ot;this.Gr=pt;this.Aw=[];this.hd=!0;this.Gb=qt;this.Nd=(new M(10,10)).freeze();var b=new rt(this);this.V=new st(b);this.W=new st(b);this.Qu=[];a&&Object.assign(this,a)}ma(lt,li); +lt.prototype.cloneProtected=function(a){li.prototype.cloneProtected.call(this,a);a.Yo=this.Yo;a.Qp=this.Qp;a.Gr=this.Gr;a.hd=this.hd;a.Gb=this.Gb;a.Nd.assign(this.Nd);a.V.copyInheritedPropertiesFrom(this.V);a.W.copyInheritedPropertiesFrom(this.W)}; lt.prototype.gb=function(a){a.classType===lt?0===a.name.indexOf("Alignment")?this.alignment=a:0===a.name.indexOf("Arrangement")?this.arrangement=a:0===a.name.indexOf("Compaction")?this.compaction=a:0===a.name.indexOf("Path")?this.path=a:0===a.name.indexOf("Sorting")?this.sorting=a:0===a.name.indexOf("Style")?this.treeStyle=a:C("Unknown enum value: "+a):li.prototype.gb.call(this,a)};lt.prototype.createNetwork=function(){return new rt(this)}; lt.prototype.makeNetwork=function(a){function b(a){if(a instanceof W)return!a.isLinkLabel&&"Comment"!==a.category;if(a instanceof U){var b=a.fromNode;if(null===b||b.isLinkLabel||"Comment"===b.category)return!1;a=a.toNode;return null===a||a.isLinkLabel||"Comment"===a.category?!1:!0}return!1}var c=this.createNetwork();a instanceof T?(c.hg(a.nodes,!0,b),c.hg(a.links,!0,b)):a instanceof hf?c.hg(a.memberParts,!1,b):c.hg(a.iterator,!1,b);return c}; -lt.prototype.doLayout=function(a){null===this.network&&(this.network=this.makeNetwork(a));this.arrangement!==tt&&(this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin));var b=this.diagram;null===b&&a instanceof T&&(b=a);this.path===mt&&null!==b?this.jd=b.isTreePathToChildren?nt:ut:this.jd=this.path===mt?nt:this.path;if(0b.level)return!1;a.removeChild(c.parent,c)}return!0}lt.prototype.removeChild=function(a,b){if(null!==a&&null!==b){for(var c=a.children,d=0,e=0;ee?du(a,g,ba,w,z):eu(a,g,ba,w,z);ba=z.x;w=z.width;z=z.height;break;case Pt:for(A=0;An&&(Sdb&&(ju(a,-db,0,da,ra-1),ku(A,-db,0),ku(B,-db,0),db=0)}Ca.U.h(db,R);w=Math.max(w,F);z=Math.max(z,y+(0===O?0:q)+cb.height);S=F}else{0n&&(Rdb&&(ju(a,0,-db,da,ra-1),ku(A,0,-db),ku(B,0,-db),db=0);Ca.U.h(S,db);z=Math.max(z,K);w=Math.max(w,y+(0===O?0:q)+cb.width);R=K}H++}0n&&(Seb&&(ju(a,-eb,0,da,ra-1),ku(A,-eb,0),ku(B,-eb,0),eb=0)}Ca.U.h(eb,R);w=Math.max(w,F);z=Math.max(z,y+(0===O?0:q)+db.height);S=F}else{0n&&(Reb&&(ju(a,0,-eb,da,ra-1),ku(A,0,-eb),ku(B,0,-eb),eb=0);Ca.U.h(S,eb);z=Math.max(z,K);w=Math.max(w,y+(0===O?0:q)+db.width);R=K}H++}0l&&(l=0),135u&&(u=0),k===Qt&&(h+=p/2+a.focus.y),g+=d+c):b?(null===a.comments?d>w&&(w=pu(k,d-w,0),g=w.x,h=w.y,w=d,l=0):w=nu(a,w,l),0>l&&(g-=l,l=0),135z&&(z=pu(k,0,v-z),g=z.x,h=z.y,z=v,u=0):z=ou(a,z,u),0>u&&(h-=u,u=0),g+=d+c);if(0b&&(b=c+a.width),0>c&&(b-=c),b;case cu:return a.width>b?a.width:b;case $t:return 2*a.focus.x>b?a.width:b+a.width-2*a.focus.x;case Ot:case Et:return Math.max(a.width,Math.max(b,c+a.width)-Math.min(0,c));case Pt:return a.width-a.focus.x+a.nodeSpacing/2+b;case Qt:return Math.max(a.width,a.focus.x+a.nodeSpacing/2+b);default:return b}} function ou(a,b,c){switch(a.alignment){case mu:case lu:return c+a.height>b&&(b=c+a.height),0>c&&(b-=c),b;case cu:return a.height>b?a.height:b;case $t:return 2*a.focus.y>b?a.height:b+a.height-2*a.focus.y;case Ot:case Et:return Math.max(a.height,Math.max(b,c+a.height)-Math.min(0,c));case Pt:return a.height-a.focus.y+a.nodeSpacing/2+b;case Qt:return Math.max(a.height,a.focus.y+a.nodeSpacing/2+b);default:return b}} function pu(a,b,c){switch(a){case lu:b/=2;c/=2;break;case mu:b/=2;c/=2;break;case cu:c=b=0;break;case $t:break;default:C("Unhandled alignment value "+a.toString())}return new J(b,c)}function gu(a,b,c,d,e,f){b=pu(b,c,d);ju(a,b.x,b.y,e,f)}function ju(a,b,c,d,e){if(0!==b||0!==c)for(a=a.children;d<=e;d++){var f=a[d].U;f.x+=b;f.y+=c}} -function hu(a,b,c,d){var e=b.parent;switch(a.jd){case nt:for(a=b.sourceEdges;a.next();)b=a.value,b.fromVertex===e&&b.relativePoint.h(c,d);break;case ut:for(a=b.destinationEdges;a.next();)b=a.value,b.toVertex===e&&b.relativePoint.h(c,d);break;default:C("Unhandled path value "+a.jd.toString())}}function ku(a,b,c){for(var d=0;dn.length||null===r||2>r.length))for(e=c=0;cl&&f.yf.y&&lb.length||null===c||2>c.length)d=null;else{m=fu(a,b.length+c.length);for(d=f=k=0;fk;)l=c[f++],m[d++].h(l.x+e,l.y);c=fu(a,d);for(k=0;kn.length||null===f||2>f.length)e=null;else{m=fu(a,n.length+f.length);for(e=l=c=0;cf;)k=n[c++],m[e++].h(k.x,k.y);f=fu(a,e);for(c=0;c=a?0:135>=a?90:225>=a?180:315>=a?270:0}function au(a){var b=Zt(a);b=90===b||270===b;var c=a.layerSpacing;if(0=a&&(this.V.nodeIndentPastParent=a,this.B())}},nodeSpacing:{get:function(){return this.V.nodeSpacing},set:function(a){this.V.nodeSpacing!==a&&(this.V.nodeSpacing=a,this.B())}},layerSpacing:{get:function(){return this.V.layerSpacing},set:function(a){this.V.layerSpacing!== @@ -2176,17 +2176,17 @@ var mt=new D(lt,"PathDefault",-1),nt=new D(lt,"PathDestination",0),ut=new D(lt," "AlignmentBottomRightBus",27),Tt=new D(lt,"CompactionNone",30),Vt=new D(lt,"CompactionBlock",31),ot=new D(lt,"StyleLayered",40),It=new D(lt,"StyleLastParents",41),Ht=new D(lt,"StyleAlternating",42),Gt=new D(lt,"StyleRootOnly",43),qt=new D(lt,"ArrangementVertical",50),uu=new D(lt,"ArrangementHorizontal",51),tt=new D(lt,"ArrangementFixedRoots",52),pt=new D(lt,"LayerIndividual",60),Ct=new D(lt,"LayerSiblings",61),Bt=new D(lt,"LayerUniform",62);lt.className="TreeLayout";lt.PathDefault=mt; lt.PathDestination=nt;lt.PathSource=ut;lt.SortingForwards=Jt;lt.SortingReverse=Kt;lt.SortingAscending=Lt;lt.SortingDescending=Mt;lt.AlignmentCenterSubtrees=lu;lt.AlignmentCenterChildren=mu;lt.AlignmentStart=cu;lt.AlignmentEnd=$t;lt.AlignmentBus=Ot;lt.AlignmentBusBranching=Et;lt.AlignmentTopLeftBus=Pt;lt.AlignmentBottomRightBus=Qt;lt.CompactionNone=Tt;lt.CompactionBlock=Vt;lt.StyleLayered=ot;lt.StyleLastParents=It;lt.StyleAlternating=Ht;lt.StyleRootOnly=Gt;lt.ArrangementVertical=qt; lt.ArrangementHorizontal=uu;lt.ArrangementFixedRoots=tt;lt.LayerIndividual=pt;lt.LayerSiblings=Ct;lt.LayerUniform=Bt;function rt(a){Sp.call(this,a)}ma(rt,Sp);rt.prototype.createVertex=function(){return new st(this)};rt.prototype.createEdge=function(){return new wu(this)};rt.className="TreeNetwork"; -function st(a){fq.call(this,a);this.Ga=!1;this.yc=null;this.C=[];this.Oc=this.Wa=this.M=this.Ha=0;this.gd=null;this.U=new J(0,0);this.va=new M(0,0);this.fa=new J(0,0);this.Cm=this.Bm=this.TA=!1;this.Eq=this.sq=null;this.Yc=Jt;this.Rc=mq;this.xb=0;this.wb=mu;this.Pr=this.Or=0;this.Qr=20;this.Zd=50;this.Fr=0;this.Yq=Vt;this.Rq=0;this.Zr=25;this.Xq=this.Yr=10;this.Wq=20;this.ds=!0;this.Vr=Vc;this.cs=!0;this.Uq=Vc}ma(st,fq); -st.prototype.copyInheritedPropertiesFrom=function(a){null!==a&&(this.Yc=a.sorting,this.Rc=a.comparer,this.xb=a.angle,this.wb=a.alignment,this.Or=a.nodeIndent,this.Pr=a.nodeIndentPastParent,this.Qr=a.nodeSpacing,this.Zd=a.layerSpacing,this.Fr=a.layerSpacingParentOverlap,this.Yq=a.compaction,this.Rq=a.breadthLimit,this.Zr=a.rowSpacing,this.Yr=a.rowIndent,this.Xq=a.commentSpacing,this.Wq=a.commentMargin,this.ds=a.setsPortSpot,this.Vr=a.portSpot,this.cs=a.setsChildPortSpot,this.Uq=a.childPortSpot)}; +function st(a){fq.call(this,a);this.Ga=!1;this.yc=null;this.C=[];this.Pc=this.Wa=this.M=this.Ha=0;this.hd=null;this.U=new J(0,0);this.va=new M(0,0);this.fa=new J(0,0);this.Cm=this.Bm=this.TA=!1;this.Eq=this.sq=null;this.Zc=Jt;this.Sc=mq;this.xb=0;this.wb=mu;this.Pr=this.Or=0;this.Qr=20;this.Zd=50;this.Fr=0;this.Yq=Vt;this.Rq=0;this.Zr=25;this.Xq=this.Yr=10;this.Wq=20;this.ds=!0;this.Vr=Vc;this.cs=!0;this.Uq=Vc}ma(st,fq); +st.prototype.copyInheritedPropertiesFrom=function(a){null!==a&&(this.Zc=a.sorting,this.Sc=a.comparer,this.xb=a.angle,this.wb=a.alignment,this.Or=a.nodeIndent,this.Pr=a.nodeIndentPastParent,this.Qr=a.nodeSpacing,this.Zd=a.layerSpacing,this.Fr=a.layerSpacingParentOverlap,this.Yq=a.compaction,this.Rq=a.breadthLimit,this.Zr=a.rowSpacing,this.Yr=a.rowIndent,this.Xq=a.commentSpacing,this.Wq=a.commentMargin,this.ds=a.setsPortSpot,this.Vr=a.portSpot,this.cs=a.setsChildPortSpot,this.Uq=a.childPortSpot)}; na.Object.defineProperties(st.prototype,{initialized:{get:function(){return this.Ga},set:function(a){this.Ga!==a&&(this.Ga=a)}},parent:{get:function(){return this.yc},set:function(a){this.yc!==a&&(this.yc=a)}},children:{get:function(){return this.C},set:function(a){if(this.C!==a){if(null!==a)for(var b=a.length,c=0;cp.y+c.rowIndent&&(e=Math.min(e,Math.max(m.y,e-bu(c))))):c.alignment===cu?(e=d.top+b.y,0===b.y&&m.yp.x+c.rowIndent&&(e=Math.min(e,Math.max(m.x,e-bu(c))))):c.alignment===cu?(e=d.left+b.x,0===b.x&&m.xp.y+c.rowIndent&&(e=Math.min(e,Math.max(m.y,e-bu(c))))):c.alignment===cu?(e=d.top+b.y,0===b.y&&m.yc;c++)b["0123456789abcdef".charAt(c>>4)+"0123456789abcdef".charAt(c&15)]=String.fromCharCode(c);a.length%2&&(a="0"+a);c=[];for(var d=0,e=0;ec;c++)b[c]=c;for(c=d=0;256>c;c++)d=(d+b[c]+119)%256,e=b[c],b[c]=b[d],b[d]=e;d=c=0;for(var f="",g=0;gthis.key)return!1;a=a.m;var b=a.length,c=++this.Qa,d=this.af;if(null!==d)for(;cthis.key)return!1;var b=--this.Qa;if(0<=b)return this.key=b,this.value=a.m[b],!0;this.Qd();return!1};fb.prototype.od=function(){return this.next()}; -fb.prototype.first=function(){var a=this.pb;this.ja=a.Ba;var b=a.m;this.Qa=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null};fb.prototype.any=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Qa=c;for(--c;0<=c;c--)if(a(b[c]))return!0;return!1};fb.prototype.all=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Qa=c;for(--c;0<=c;c--)if(!a(b[c]))return!1;return!0}; -fb.prototype.each=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Qa=c;for(--c;0<=c;c--)a(b[c]);return this};fb.prototype.map=function(a){var b=this.pb;b.Ng=null;var c=[];b=b.m;var d=b.length;this.Qa=d;for(--d;0<=d;d--)c.push(a(b[d]));a=new E;a.m=c;a.kb();return a.iterator};fb.prototype.filter=function(a){var b=this.pb;b.Ng=null;var c=[];b=b.m;var d=b.length;this.Qa=d;for(--d;0<=d;d--){var e=b[d];a(e)&&c.push(e)}a=new E;a.m=c;a.kb();return a.iterator}; -fb.prototype.Qd=function(){this.key=-1;this.value=null;this.ja=-1;this.pb.Ng=this};fb.prototype.toString=function(){return"ListIteratorBackwards("+this.Qa+"/"+this.pb.count+")"};na.Object.defineProperties(fb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.pb.m.length}}});fb.prototype.first=fb.prototype.first;fb.prototype.hasNext=fb.prototype.od;fb.prototype.next=fb.prototype.next;fb.prototype.reset=fb.prototype.reset; +b.sm[e.lk],{set:function(a,b){return function(){throw Error("Property "+a.sm[b.lk]+" of "+a.x+" is read-only.");}}(b,e)})}}}b={sm:b.sm,x:b.x}}}};function Ya(){}Ya.prototype.reset=function(){};Ya.prototype.next=function(){return!1};Ya.prototype.pd=function(){return!1};Ya.prototype.first=function(){return null};Ya.prototype.any=function(){return!1};Ya.prototype.all=function(){return!0};Ya.prototype.each=function(){return this};Ya.prototype.map=function(){return this};Ya.prototype.filter=function(){return this}; +Ya.prototype.Qd=function(){};Ya.prototype.toString=function(){return"EmptyIterator"};na.Object.defineProperties(Ya.prototype,{iterator:{get:function(){return this}},count:{get:function(){return 0}}});Ya.prototype.first=Ya.prototype.first;Ya.prototype.hasNext=Ya.prototype.pd;Ya.prototype.next=Ya.prototype.next;Ya.prototype.reset=Ya.prototype.reset;var Za=null;Ya.className="EmptyIterator";Za=new Ya;function $a(a){this.key=-1;this.value=a} +$a.prototype.reset=function(){this.key=-1};$a.prototype.next=function(){return-1===this.key?(this.key=0,!0):!1};$a.prototype.pd=function(){return this.next()};$a.prototype.first=function(){this.key=0;return this.value};$a.prototype.any=function(a){this.key=-1;return a(this.value)};$a.prototype.all=function(a){this.key=-1;return a(this.value)};$a.prototype.each=function(a){this.key=-1;a(this.value);return this};$a.prototype.map=function(a){return new $a(a(this.value))}; +$a.prototype.filter=function(a){return a(this.value)?new $a(this.value):Za};$a.prototype.Qd=function(){this.value=null};$a.prototype.toString=function(){return"SingletonIterator("+this.value+")"};na.Object.defineProperties($a.prototype,{iterator:{get:function(){return this}},count:{get:function(){return 1}}});$a.prototype.first=$a.prototype.first;$a.prototype.hasNext=$a.prototype.pd;$a.prototype.next=$a.prototype.next; +$a.prototype.reset=$a.prototype.reset;$a.className="SingletonIterator";function ab(a){this.pb=a;this.af=null;a.Ja=null;this.ja=a.Ba;this.Pa=-1}ab.prototype.reset=function(){var a=this.pb;a.Ja=null;this.ja=a.Ba;this.Pa=-1};ab.prototype.next=function(){var a=this.pb;if(a.Ba!==this.ja&&0>this.key)return!1;a=a.m;var b=a.length,c=++this.Pa,d=this.af;if(null!==d)for(;cthis.key)return!1;var b=--this.Pa;if(0<=b)return this.key=b,this.value=a.m[b],!0;this.Qd();return!1};fb.prototype.pd=function(){return this.next()}; +fb.prototype.first=function(){var a=this.pb;this.ja=a.Ba;var b=a.m;this.Pa=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null};fb.prototype.any=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Pa=c;for(--c;0<=c;c--)if(a(b[c]))return!0;return!1};fb.prototype.all=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Pa=c;for(--c;0<=c;c--)if(!a(b[c]))return!1;return!0}; +fb.prototype.each=function(a){var b=this.pb;b.Ng=null;b=b.m;var c=b.length;this.Pa=c;for(--c;0<=c;c--)a(b[c]);return this};fb.prototype.map=function(a){var b=this.pb;b.Ng=null;var c=[];b=b.m;var d=b.length;this.Pa=d;for(--d;0<=d;d--)c.push(a(b[d]));a=new E;a.m=c;a.kb();return a.iterator};fb.prototype.filter=function(a){var b=this.pb;b.Ng=null;var c=[];b=b.m;var d=b.length;this.Pa=d;for(--d;0<=d;d--){var e=b[d];a(e)&&c.push(e)}a=new E;a.m=c;a.kb();return a.iterator}; +fb.prototype.Qd=function(){this.key=-1;this.value=null;this.ja=-1;this.pb.Ng=this};fb.prototype.toString=function(){return"ListIteratorBackwards("+this.Pa+"/"+this.pb.count+")"};na.Object.defineProperties(fb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.pb.m.length}}});fb.prototype.first=fb.prototype.first;fb.prototype.hasNext=fb.prototype.pd;fb.prototype.next=fb.prototype.next;fb.prototype.reset=fb.prototype.reset; fb.className="ListIteratorBackwards";function E(a){Ta(this);this.v=!1;this.m=[];this.Ba=0;this.Ng=this.Ja=null;"string"===typeof a&&C("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=E.prototype;t.kb=function(){var a=this.Ba;a++;999999999a||a>=b.length)&&xa(a,"0 <= i < length",E,"elt:i");return b[a]};t.get=function(a){return this.J(a)};t.Lc=function(a,b){var c=this.m;(0>a||a>=c.length)&&xa(a,"0 <= i < length",E,"setElt:i");this.v&&wa(this,a);c[a]=b};t.set=function(a,b){this.Lc(a,b)};t.first=function(){var a=this.m;return 0===a.length?null:a[0]};t.Xb=function(){var a=this.m,b=a.length;return 0a||a>=b.length)&&xa(a,"0 <= i < length",E,"elt:i");return b[a]};t.get=function(a){return this.J(a)};t.Mc=function(a,b){var c=this.m;(0>a||a>=c.length)&&xa(a,"0 <= i < length",E,"setElt:i");this.v&&wa(this,a);c[a]=b};t.set=function(a,b){this.Mc(a,b)};t.first=function(){var a=this.m;return 0===a.length?null:a[0]};t.Xb=function(){var a=this.m,b=a.length;return 0a&&xa(a,">= 0",E,"insertAt:i");this.v&&wa(this,a);var c=this.m;a>=c.length?c.push(b):c.splice(a,0,b);this.kb()};t.remove=function(a){if(null===a)return!1;this.v&&wa(this,a);var b=this.m;a=b.indexOf(a);if(-1===a)return!1;a===b.length-1?b.pop():b.splice(a,1);this.kb();return!0};t.delete=function(a){return this.remove(a)}; t.eb=function(a){var b=this.m;(0>a||a>=b.length)&&xa(a,"0 <= i < length",E,"removeAt:i");this.v&&wa(this,a);a===b.length-1?b.pop():b.splice(a,1);this.kb()};t.removeRange=function(a,b){var c=this.m,d=c.length;if(0>a)a=0;else if(a>=d)return this;if(0>b)return this;b>=d&&(b=d-1);if(a>b)return this;this.v&&wa(this);for(var e=a,f=b+1;f=this.m.length)return Za;var a=this.Ja;return null!==a?(a.reset(),a):new ab(this)}},iteratorBackwards:{ get:function(){if(0>=this.m.length)return Za;var a=this.Ng;return null!==a?(a.reset(),a):new fb(this)}}});E.prototype.reverse=E.prototype.reverse;E.prototype.sortRange=E.prototype.Wi;E.prototype.sort=E.prototype.sort;E.prototype.toSet=E.prototype.ew;E.prototype.toArray=E.prototype.xa;E.prototype.removeRange=E.prototype.removeRange;E.prototype.removeAt=E.prototype.eb;E.prototype["delete"]=E.prototype.delete;E.prototype.remove=E.prototype.remove;E.prototype.insertAt=E.prototype.ub; -E.prototype.pop=E.prototype.pop;E.prototype.last=E.prototype.Xb;E.prototype.first=E.prototype.first;E.prototype.set=E.prototype.set;E.prototype.setElt=E.prototype.Lc;E.prototype.get=E.prototype.get;E.prototype.elt=E.prototype.J;E.prototype.indexOf=E.prototype.indexOf;E.prototype.has=E.prototype.has;E.prototype.contains=E.prototype.contains;E.prototype.clear=E.prototype.clear;E.prototype.addAll=E.prototype.addAll;E.prototype.push=E.prototype.push;E.prototype.add=E.prototype.add;E.prototype.thaw=E.prototype.ea; -E.prototype.freeze=E.prototype.freeze;E.className="List";function hb(a){this.ag=a;a.Ja=null;this.ja=a.Ba;this.la=null}hb.prototype.reset=function(){var a=this.ag;a.Ja=null;this.ja=a.Ba;this.la=null};hb.prototype.next=function(){var a=this.ag;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=b.value,this.key=b.key,!0;this.Qd();return!1};hb.prototype.od=function(){return this.next()}; +E.prototype.pop=E.prototype.pop;E.prototype.last=E.prototype.Xb;E.prototype.first=E.prototype.first;E.prototype.set=E.prototype.set;E.prototype.setElt=E.prototype.Mc;E.prototype.get=E.prototype.get;E.prototype.elt=E.prototype.J;E.prototype.indexOf=E.prototype.indexOf;E.prototype.has=E.prototype.has;E.prototype.contains=E.prototype.contains;E.prototype.clear=E.prototype.clear;E.prototype.addAll=E.prototype.addAll;E.prototype.push=E.prototype.push;E.prototype.add=E.prototype.add;E.prototype.thaw=E.prototype.ea; +E.prototype.freeze=E.prototype.freeze;E.className="List";function hb(a){this.ag=a;a.Ja=null;this.ja=a.Ba;this.la=null}hb.prototype.reset=function(){var a=this.ag;a.Ja=null;this.ja=a.Ba;this.la=null};hb.prototype.next=function(){var a=this.ag;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=b.value,this.key=b.key,!0;this.Qd();return!1};hb.prototype.pd=function(){return this.next()}; hb.prototype.first=function(){var a=this.ag;this.ja=a.Ba;a=a.ba;if(null!==a){this.la=a;var b=a.value;this.key=a.key;return this.value=b}return null};hb.prototype.any=function(a){var b=this.ag;this.la=b.Ja=null;for(b=b.ba;null!==b;){if(a(b.value))return!0;b=b.oa}return!1};hb.prototype.all=function(a){var b=this.ag;this.la=b.Ja=null;for(b=b.ba;null!==b;){if(!a(b.value))return!1;b=b.oa}return!0};hb.prototype.each=function(a){var b=this.ag;this.la=b.Ja=null;for(b=b.ba;null!==b;)a(b.value),b=b.oa;return this}; hb.prototype.map=function(a){var b=this.ag;b.Ja=null;var c=new E;for(b=b.ba;null!==b;)c.add(a(b.value)),b=b.oa;return c.iterator};hb.prototype.filter=function(a){var b=this.ag;b.Ja=null;var c=new E;for(b=b.ba;null!==b;){var d=b.value;a(d)&&c.add(d);b=b.oa}return c.iterator};hb.prototype.Qd=function(){this.value=this.key=null;this.ja=-1;this.ag.Ja=this};hb.prototype.toString=function(){return null!==this.la?"SetIterator@"+this.la.value:"SetIterator"}; -na.Object.defineProperties(hb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ag.Hb}}});hb.prototype.first=hb.prototype.first;hb.prototype.hasNext=hb.prototype.od;hb.prototype.next=hb.prototype.next;hb.prototype.reset=hb.prototype.reset;hb.className="SetIterator"; +na.Object.defineProperties(hb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ag.Hb}}});hb.prototype.first=hb.prototype.first;hb.prototype.hasNext=hb.prototype.pd;hb.prototype.next=hb.prototype.next;hb.prototype.reset=hb.prototype.reset;hb.className="SetIterator"; function G(a){Ta(this);this.v=!1;this.Ib={};this.Hb=0;this.Ja=null;this.Ba=0;this.We=this.ba=null;"string"===typeof a&&C("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=G.prototype;t.kb=function(){var a=this.Ba;a++;999999999=this.Hb)return Za;var a=this.Ja;return null!==a?(a.reset(),a):new hb(this)}}});G.prototype.toList=G.prototype.dw;G.prototype.toArray=G.prototype.xa;G.prototype.clear=G.prototype.clear;G.prototype.retainAll=G.prototype.SA;G.prototype.removeAll=G.prototype.Bq; G.prototype["delete"]=G.prototype.delete;G.prototype.remove=G.prototype.remove;G.prototype.first=G.prototype.first;G.prototype.containsAny=G.prototype.xz;G.prototype.containsAll=G.prototype.wz;G.prototype.has=G.prototype.has;G.prototype.contains=G.prototype.contains;G.prototype.addAll=G.prototype.addAll;G.prototype.add=G.prototype.add;G.prototype.thaw=G.prototype.ea;G.prototype.freeze=G.prototype.freeze;var kb=1;G.className="Set";G.uniqueHash=Ta;G.hashIdUnique=ib;G.hashId=gb; -function lb(a){this.ha=a;this.ja=a.Ba;this.la=null}lb.prototype.reset=function(){this.ja=this.ha.Ba;this.la=null};lb.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=this.key=a=b.key,!0;this.Qd();return!1};lb.prototype.od=function(){return this.next()};lb.prototype.first=function(){var a=this.ha;this.ja=a.Ba;a=a.ba;return null!==a?(this.la=a,this.value=this.key=a=a.key):null}; +function lb(a){this.ha=a;this.ja=a.Ba;this.la=null}lb.prototype.reset=function(){this.ja=this.ha.Ba;this.la=null};lb.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=this.key=a=b.key,!0;this.Qd();return!1};lb.prototype.pd=function(){return this.next()};lb.prototype.first=function(){var a=this.ha;this.ja=a.Ba;a=a.ba;return null!==a?(this.la=a,this.value=this.key=a=a.key):null}; lb.prototype.any=function(a){var b=this.ha;this.la=null;for(b=b.ba;null!==b;){if(a(b.key))return!0;b=b.oa}return!1};lb.prototype.all=function(a){var b=this.ha;this.la=null;for(b=b.ba;null!==b;){if(!a(b.key))return!1;b=b.oa}return!0};lb.prototype.each=function(a){var b=this.ha;this.la=null;for(b=b.ba;null!==b;)a(b.key),b=b.oa;return this};lb.prototype.map=function(a){var b=this.ha;this.la=null;var c=new E;for(b=b.ba;null!==b;)c.add(a(b.key)),b=b.oa;return c.iterator}; lb.prototype.filter=function(a){var b=this.ha;this.la=null;var c=new E;for(b=b.ba;null!==b;){var d=b.key;a(d)&&c.add(d);b=b.oa}return c.iterator};lb.prototype.Qd=function(){this.value=this.key=null;this.ja=-1};lb.prototype.toString=function(){return null!==this.la?"MapKeySetIterator@"+this.la.value:"MapKeySetIterator"};na.Object.defineProperties(lb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ha.Hb}}}); -lb.prototype.first=lb.prototype.first;lb.prototype.hasNext=lb.prototype.od;lb.prototype.next=lb.prototype.next;lb.prototype.reset=lb.prototype.reset;lb.className="MapKeySetIterator";function mb(a){G.call(this);Ta(this);this.v=!0;this.ha=a}ma(mb,G);t=mb.prototype;t.freeze=function(){return this};t.ea=function(){return this};t.toString=function(){return"MapKeySet("+this.ha.toString()+")"};t.add=function(){C("This Set is read-only: "+this.toString())};t.contains=function(a){return this.ha.contains(a)}; +lb.prototype.first=lb.prototype.first;lb.prototype.hasNext=lb.prototype.pd;lb.prototype.next=lb.prototype.next;lb.prototype.reset=lb.prototype.reset;lb.className="MapKeySetIterator";function mb(a){G.call(this);Ta(this);this.v=!0;this.ha=a}ma(mb,G);t=mb.prototype;t.freeze=function(){return this};t.ea=function(){return this};t.toString=function(){return"MapKeySet("+this.ha.toString()+")"};t.add=function(){C("This Set is read-only: "+this.toString())};t.contains=function(a){return this.ha.contains(a)}; t.has=function(a){return this.contains(a)};t.remove=function(){C("This Set is read-only: "+this.toString())};t.delete=function(a){return this.remove(a)};t.clear=function(){C("This Set is read-only: "+this.toString())};t.first=function(){var a=this.ha.ba;return null!==a?a.key:null};mb.prototype.any=function(a){for(var b=this.ha.ba;null!==b;){if(a(b.key))return!0;b=b.oa}return!1};mb.prototype.all=function(a){for(var b=this.ha.ba;null!==b;){if(!a(b.key))return!1;b=b.oa}return!0}; mb.prototype.each=function(a){for(var b=this.ha.ba;null!==b;)a(b.key),b=b.oa;return this};mb.prototype.map=function(a){for(var b=new G,c=this.ha.ba;null!==c;)b.add(a(c.key)),c=c.oa;return b};mb.prototype.filter=function(a){for(var b=new G,c=this.ha.ba;null!==c;){var d=c.key;a(d)&&b.add(d);c=c.oa}return b};mb.prototype.copy=function(){return new mb(this.ha)};mb.prototype.ew=function(){var a=new G,b=this.ha.Ib,c;for(c in b)a.add(b[c].key);return a}; mb.prototype.xa=function(){var a=this.ha.Ib,b=Array(this.ha.Hb),c=0,d;for(d in a)b[c]=a[d].key,c++;return b};mb.prototype.dw=function(){var a=new E,b=this.ha.Ib,c;for(c in b)a.add(b[c].key);return a};na.Object.defineProperties(mb.prototype,{count:{get:function(){return this.ha.Hb}},size:{get:function(){return this.ha.Hb}},iterator:{get:function(){return 0>=this.ha.Hb?Za:new lb(this.ha)}}}); mb.prototype.toList=mb.prototype.dw;mb.prototype.toArray=mb.prototype.xa;mb.prototype.toSet=mb.prototype.ew;mb.prototype.first=mb.prototype.first;mb.prototype.clear=mb.prototype.clear;mb.prototype["delete"]=mb.prototype.delete;mb.prototype.remove=mb.prototype.remove;mb.prototype.has=mb.prototype.has;mb.prototype.contains=mb.prototype.contains;mb.prototype.add=mb.prototype.add;mb.prototype.thaw=mb.prototype.ea;mb.prototype.freeze=mb.prototype.freeze;mb.className="MapKeySet"; -function nb(a){this.ha=a;a.Ve=null;this.ja=a.Ba;this.la=null}nb.prototype.reset=function(){var a=this.ha;a.Ve=null;this.ja=a.Ba;this.la=null};nb.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=b.value,this.key=b.key,!0;this.Qd();return!1};nb.prototype.od=function(){return this.next()}; +function nb(a){this.ha=a;a.Ve=null;this.ja=a.Ba;this.la=null}nb.prototype.reset=function(){var a=this.ha;a.Ve=null;this.ja=a.Ba;this.la=null};nb.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.value=b.value,this.key=b.key,!0;this.Qd();return!1};nb.prototype.pd=function(){return this.next()}; nb.prototype.first=function(){var a=this.ha;this.ja=a.Ba;a=a.ba;if(null!==a){this.la=a;var b=a.value;this.key=a.key;return this.value=b}return null};nb.prototype.any=function(a){var b=this.ha;this.la=b.Ve=null;for(b=b.ba;null!==b;){if(a(b.value))return!0;b=b.oa}return!1};nb.prototype.all=function(a){var b=this.ha;this.la=b.Ve=null;for(b=b.ba;null!==b;){if(!a(b.value))return!1;b=b.oa}return!0};nb.prototype.each=function(a){var b=this.ha;this.la=b.Ve=null;for(b=b.ba;null!==b;)a(b.value),b=b.oa;return this}; nb.prototype.map=function(a){var b=this.ha;this.la=b.Ve=null;var c=new E;for(b=b.ba;null!==b;)c.add(a(b.value)),b=b.oa;return c.iterator};nb.prototype.filter=function(a){var b=this.ha;this.la=b.Ve=null;var c=new E;for(b=b.ba;null!==b;){var d=b.value;a(d)&&c.add(d);b=b.oa}return c.iterator};nb.prototype.Qd=function(){this.value=this.key=null;this.ja=-1;this.ha.Ve=this};nb.prototype.toString=function(){return null!==this.la?"MapValueSetIterator@"+this.la.value:"MapValueSetIterator"}; -na.Object.defineProperties(nb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ha.Hb}}});nb.prototype.first=nb.prototype.first;nb.prototype.hasNext=nb.prototype.od;nb.prototype.next=nb.prototype.next;nb.prototype.reset=nb.prototype.reset;nb.className="MapValueSetIterator";function jb(a,b){this.key=a;this.value=b;this.Fl=this.oa=null}jb.prototype.toString=function(){return"{"+this.key+":"+this.value+"}"}; -jb.className="KeyValuePair";function ob(a){this.ha=a;a.Ja=null;this.ja=a.Ba;this.la=null}ob.prototype.reset=function(){var a=this.ha;a.Ja=null;this.ja=a.Ba;this.la=null};ob.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.key=b.key,this.value=b.value,!0;this.Qd();return!1};ob.prototype.od=function(){return this.next()}; +na.Object.defineProperties(nb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ha.Hb}}});nb.prototype.first=nb.prototype.first;nb.prototype.hasNext=nb.prototype.pd;nb.prototype.next=nb.prototype.next;nb.prototype.reset=nb.prototype.reset;nb.className="MapValueSetIterator";function jb(a,b){this.key=a;this.value=b;this.Fl=this.oa=null}jb.prototype.toString=function(){return"{"+this.key+":"+this.value+"}"}; +jb.className="KeyValuePair";function ob(a){this.ha=a;a.Ja=null;this.ja=a.Ba;this.la=null}ob.prototype.reset=function(){var a=this.ha;a.Ja=null;this.ja=a.Ba;this.la=null};ob.prototype.next=function(){var a=this.ha;if(a.Ba!==this.ja&&null===this.key)return!1;var b=this.la;b=null===b?a.ba:b.oa;if(null!==b)return this.la=b,this.key=b.key,this.value=b.value,!0;this.Qd();return!1};ob.prototype.pd=function(){return this.next()}; ob.prototype.first=function(){var a=this.ha;this.ja=a.Ba;a=a.ba;return null!==a?(this.la=a,this.key=a.key,this.value=a.value,a):null};ob.prototype.any=function(a){var b=this.ha;this.la=b.Ja=null;for(b=b.ba;null!==b;){if(a(b))return!0;b=b.oa}return!1};ob.prototype.all=function(a){var b=this.ha;this.la=b.Ja=null;for(b=b.ba;null!==b;){if(!a(b))return!1;b=b.oa}return!0};ob.prototype.each=function(a){var b=this.ha;this.la=b.Ja=null;for(b=b.ba;null!==b;)a(b),b=b.oa;return this}; ob.prototype.map=function(a){var b=this.ha;this.la=b.Ja=null;var c=new E;for(b=b.ba;null!==b;)c.add(a(b)),b=b.oa;return c.iterator};ob.prototype.filter=function(a){var b=this.ha;this.la=b.Ja=null;var c=new E;for(b=b.ba;null!==b;)a(b)&&c.add(b),b=b.oa;return c.iterator};ob.prototype.Qd=function(){this.value=this.key=null;this.ja=-1;this.ha.Ja=this};ob.prototype.toString=function(){return null!==this.la?"MapIterator@"+this.la:"MapIterator"}; -na.Object.defineProperties(ob.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ha.Hb}}});ob.prototype.first=ob.prototype.first;ob.prototype.hasNext=ob.prototype.od;ob.prototype.next=ob.prototype.next;ob.prototype.reset=ob.prototype.reset;ob.className="MapIterator"; +na.Object.defineProperties(ob.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ha.Hb}}});ob.prototype.first=ob.prototype.first;ob.prototype.hasNext=ob.prototype.pd;ob.prototype.next=ob.prototype.next;ob.prototype.reset=ob.prototype.reset;ob.className="MapIterator"; function I(a){Ta(this);this.v=!1;this.Ib={};this.Hb=0;this.Ve=this.Ja=null;this.Ba=0;this.We=this.ba=null;"string"===typeof a&&C("Error: Since 2.0 List/Map/Set constructors no longer take an argument that enforces type.");void 0!==a&&this.addAll(a)}t=I.prototype;t.kb=function(){var a=this.Ba;a++;999999999a&&(a+=360);if(90===a){a=0;var d=1}else 180===a?(a=-1,d=0):270===a?(a=0,d=-1):(d=a*Math.PI/180,a=Math.cos(d),d=Math.sin(d));this.x=a*b-d*c;this.y=d*b+a*c;return this};t=J.prototype; -t.scale=function(a,b){this.x*=a;this.y*=b;return this};t.tf=function(a){var b=a.x-this.x;a=a.y-this.y;return b*b+a*a};t.nd=function(a,b){a-=this.x;b-=this.y;return a*a+b*b};t.normalize=function(){var a=this.x,b=this.y,c=Math.sqrt(a*a+b*b);0b?270:0;if(0===b)return 0a?c=0>b?c+180:180-c:0>b&&(c=360-c);return c}t.vz=function(a,b){return L.em(a.x,a.y,b.x,b.y,this.x,this.y)};t.IA=function(a,b,c,d){L.Eh(a,b,c,d,this.x,this.y,this);return this};t.JA=function(a,b){L.Eh(a.x,a.y,b.x,b.y,this.x,this.y,this);return this};t.XA=function(a,b,c,d){L.jq(this.x,this.y,a,b,c,d,this);return this}; t.YA=function(a,b){L.jq(this.x,this.y,a.x,a.y,b.width,b.height,this);return this};t.Ui=function(a,b){this.x=a.x+b.x*a.width+b.offsetX;this.y=a.y+b.y*a.height+b.offsetY;return this};t.Vi=function(a,b,c,d,e){this.x=a+e.x*c+e.offsetX;this.y=b+e.y*d+e.offsetY;return this};t.transform=function(a){a.ya(this);return this};function Ab(a,b){b.Ed(a);return a} function Bb(a,b,c,d,e,f){var g=e-c,h=f-d,k=g*g+h*h;c-=a;d-=b;var l=-c*g-d*h;if(0>=l||l>=k)return g=e-a,h=f-b,Math.min(c*c+d*d,g*g+h*h);a=g*d-h*c;return a*a/k}function Cb(a,b,c,d){a=c-a;b=d-b;return a*a+b*b}function Gb(a,b,c,d){a=c-a;b=d-b;if(0===a)return 0b?270:0;if(0===b)return 0a?d=0>b?d+180:180-d:0>b&&(d=360-d);return d}t.u=function(){return isFinite(this.x)&&isFinite(this.y)}; J.alloc=function(){var a=Hb.pop();return void 0===a?new J:a};J.allocAt=function(a,b){var c=Hb.pop();if(void 0===c)return new J(a,b);c.x=a;c.y=b;return c};J.free=function(a){Hb.push(a)};J.prototype.isReal=J.prototype.u;J.prototype.setSpot=J.prototype.Vi;J.prototype.setRectSpot=J.prototype.Ui;J.prototype.snapToGridPoint=J.prototype.YA;J.prototype.snapToGrid=J.prototype.XA;J.prototype.projectOntoLineSegmentPoint=J.prototype.JA;J.prototype.projectOntoLineSegment=J.prototype.IA; -J.intersectingLineSegments=function(a,b,c,d,e,f,g,h){return L.lm(a,b,c,d,e,f,g,h)};J.prototype.compareWithLineSegmentPoint=J.prototype.vz;J.compareWithLineSegment=function(a,b,c,d,e,f){return L.em(a,b,c,d,e,f)};J.prototype.direction=J.prototype.direction;J.prototype.directionPoint=J.prototype.Oa;J.prototype.normalize=J.prototype.normalize;J.prototype.distanceSquared=J.prototype.nd;J.prototype.distanceSquaredPoint=J.prototype.tf;J.prototype.scale=J.prototype.scale;J.prototype.rotate=J.prototype.rotate; +J.intersectingLineSegments=function(a,b,c,d,e,f,g,h){return L.lm(a,b,c,d,e,f,g,h)};J.prototype.compareWithLineSegmentPoint=J.prototype.vz;J.compareWithLineSegment=function(a,b,c,d,e,f){return L.em(a,b,c,d,e,f)};J.prototype.direction=J.prototype.direction;J.prototype.directionPoint=J.prototype.Ra;J.prototype.normalize=J.prototype.normalize;J.prototype.distanceSquared=J.prototype.od;J.prototype.distanceSquaredPoint=J.prototype.tf;J.prototype.scale=J.prototype.scale;J.prototype.rotate=J.prototype.rotate; J.prototype.offset=J.prototype.offset;J.prototype.subtract=J.prototype.ge;J.prototype.add=J.prototype.add;J.prototype.equalsApprox=J.prototype.Ta;J.prototype.equalTo=J.prototype.Gi;J.prototype.equals=J.prototype.A;J.prototype.set=J.prototype.set;J.prototype.setTo=J.prototype.ng;var Hb=[];J.className="Point";J.parse=wb;J.stringify=xb;J.distanceLineSegmentSquared=Bb;J.distanceSquared=Cb;J.direction=Gb;J.Origin=pb=(new J(0,0)).ca();J.InfiniteTopLeft=rb=(new J(-Infinity,-Infinity)).ca(); J.InfiniteBottomRight=tb=(new J(Infinity,Infinity)).ca();J.SixPoint=ub=(new J(6,6)).ca();J.NoPoint=vb=(new J(NaN,NaN)).ca();J.parse=wb;J.stringify=xb;J.distanceLineSegmentSquared=Bb;J.distanceSquared=Cb;J.direction=Gb;function M(a,b){void 0===a?this.height=this.width=0:"number"===typeof a&&(0<=a||isNaN(a))&&"number"===typeof b&&(0<=b||isNaN(b))?(this.width=a,this.height=b):C("Invalid arguments to Size constructor: "+a+", "+b);this.v=!1}var Ib,Jb,Kb,Lb,Mb,Nb,Ob; M.prototype.assign=function(a){this.width=a.width;this.height=a.height;return this};M.prototype.h=function(a,b){this.width=a;this.height=b;return this};M.prototype.ng=function(a,b){this.width=a;this.height=b;return this};M.prototype.set=function(a){this.width=a.width;this.height=a.height;return this};M.prototype.copy=function(){var a=new M;a.width=this.width;a.height=this.height;return a};t=M.prototype;t.ca=function(){this.v=!0;Object.freeze(this);return this}; @@ -102,20 +102,20 @@ t.toString=function(){return"Size("+this.width+","+this.height+")"};t.A=function M.prototype.equalsApprox=M.prototype.Ta;M.prototype.equalTo=M.prototype.Gi;M.prototype.equals=M.prototype.A;M.prototype.set=M.prototype.set;M.prototype.setTo=M.prototype.ng;var Sb=[];M.className="Size";M.parse=Pb;M.stringify=Qb;M.ZeroSize=Ib=(new M(0,0)).ca();M.OneSize=Jb=(new M(1,1)).ca();M.SixSize=Kb=(new M(6,6)).ca();M.EightSize=Lb=(new M(8,8)).ca();M.TenSize=Mb=(new M(10,10)).ca();M.InfiniteSize=Nb=(new M(Infinity,Infinity)).ca();M.NoSize=Ob=(new M(NaN,NaN)).ca();M.parse=Pb;M.stringify=Qb; function N(a,b,c,d){void 0===a?this.height=this.width=this.y=this.x=0:"number"===typeof a&&"number"===typeof b&&"number"===typeof c&&(0<=c||isNaN(c))&&"number"===typeof d&&(0<=d||isNaN(d))?(this.x=a,this.y=b,this.width=c,this.height=d):a instanceof J?(c=a.x,a=a.y,b instanceof J?(d=b.x,b=b.y,this.x=Math.min(c,d),this.y=Math.min(a,b),this.width=Math.abs(c-d),this.height=Math.abs(a-b)):b instanceof M?(this.x=c,this.y=a,this.width=b.width,this.height=b.height):C("Incorrect second argument supplied to Rect constructor "+ b)):C("Invalid arguments to Rect constructor: "+a+", "+b+", "+c+", "+d);this.v=!1}t=N.prototype;t.assign=function(a){this.x=a.x;this.y=a.y;this.width=a.width;this.height=a.height;return this};t.h=function(a,b,c,d){this.x=a;this.y=b;this.width=c;this.height=d;return this};function Tb(a,b,c){a.width=b;a.height=c}t.ng=function(a,b,c,d){this.x=a;this.y=b;this.width=c;this.height=d;return this};t.set=function(a){this.x=a.x;this.y=a.y;this.width=a.width;this.height=a.height;return this}; -t.Mc=function(a){this.x=a.x;this.y=a.y;return this};t.WA=function(a){this.width=a.width;this.height=a.height;return this};N.prototype.copy=function(){var a=new N;a.x=this.x;a.y=this.y;a.width=this.width;a.height=this.height;return a};t=N.prototype;t.ca=function(){this.v=!0;Object.freeze(this);return this};t.I=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.v=!0;return this}; +t.Nc=function(a){this.x=a.x;this.y=a.y;return this};t.WA=function(a){this.width=a.width;this.height=a.height;return this};N.prototype.copy=function(){var a=new N;a.x=this.x;a.y=this.y;a.width=this.width;a.height=this.height;return a};t=N.prototype;t.ca=function(){this.v=!0;Object.freeze(this);return this};t.I=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.v=!0;return this}; t.ea=function(){Object.isFrozen(this)&&C("cannot thaw constant: "+this);this.v=!1;return this};function Ub(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));for(var f=0;""===a[b];)b++;(d=a[b++])&&(f=parseFloat(d));for(var g=0;""===a[b];)b++;(d=a[b++])&&(g=parseFloat(d));return new N(c,e,f,g)}return new N} function Vb(a){return a.x.toString()+" "+a.y.toString()+" "+a.width.toString()+" "+a.height.toString()}t.toString=function(){return"Rect("+this.x+","+this.y+","+this.width+","+this.height+")"};t.A=function(a){return a instanceof N?this.x===a.x&&this.y===a.y&&this.width===a.width&&this.height===a.height:!1};t.Gi=function(a,b,c,d){return this.x===a&&this.y===b&&this.width===c&&this.height===d};t.Ta=function(a){return L.w(this.x,a.x)&&L.w(this.y,a.y)&&L.w(this.width,a.width)&&L.w(this.height,a.height)}; function Wb(a,b){return L.aa(a.x,b.x)&&L.aa(a.y,b.y)&&L.aa(a.width,b.width)&&L.aa(a.height,b.height)}t.$=function(a){return this.x<=a.x&&this.x+this.width>=a.x&&this.y<=a.y&&this.y+this.height>=a.y};t.De=function(a){return this.x<=a.x&&a.x+a.width<=this.x+this.width&&this.y<=a.y&&a.y+a.height<=this.y+this.height};t.contains=function(a,b,c,d){void 0===c&&(c=0);void 0===d&&(d=0);return this.x<=a&&a+c<=this.x+this.width&&this.y<=b&&b+d<=this.y+this.height}; -t.offset=function(a,b){this.x+=a;this.y+=b;return this};t.Gc=function(a,b){return Xb(this,b,a,b,a)};t.Xp=function(a){return Xb(this,a.top,a.right,a.bottom,a.left)};t.cw=function(a){return Xb(this,-a.top,-a.right,-a.bottom,-a.left)};t.lA=function(a,b,c,d){return Xb(this,a,b,c,d)};function Xb(a,b,c,d,e){var f=a.width;c+e<=-f?(a.x+=f/2,a.width=0):(a.x-=e,a.width+=c+e);c=a.height;b+d<=-c?(a.y+=c/2,a.height=0):(a.y-=b,a.height+=b+d);return a}t.hy=function(a){return Yb(this,a.x,a.y,a.width,a.height)}; -t.zv=function(a,b,c,d){return Yb(this,a,b,c,d)};function Yb(a,b,c,d,e){var f=Math.max(a.x,b),g=Math.max(a.y,c);b=Math.min(a.x+a.width,b+d);c=Math.min(a.y+a.height,c+e);a.x=f;a.y=g;a.width=Math.max(0,b-f);a.height=Math.max(0,c-g);return a}t.Ic=function(a){return this.Av(a.x,a.y,a.width,a.height)}; -t.Av=function(a,b,c,d){var e=this.width,f=this.x;if(Infinity!==e&&Infinity!==c&&(e+=f,c+=a,isNaN(c)||isNaN(e)||f>c||a>e))return!1;a=this.height;c=this.y;return Infinity!==a&&Infinity!==d&&(a+=c,d+=b,isNaN(d)||isNaN(a)||c>d||b>a)?!1:!0};function Zb(a,b){var c=a.width,d=a.x,e=b.x-10;if(d>b.width+10+10+e||e>c+d)return!1;c=a.height;a=a.y;d=b.y-10;return a>b.height+10+10+d||d>c+a?!1:!0}t.Le=function(a){return $b(this,a.x,a.y,0,0)};t.Nc=function(a){return $b(this,a.x,a.y,a.width,a.height)}; +t.offset=function(a,b){this.x+=a;this.y+=b;return this};t.Hc=function(a,b){return Xb(this,b,a,b,a)};t.Xp=function(a){return Xb(this,a.top,a.right,a.bottom,a.left)};t.cw=function(a){return Xb(this,-a.top,-a.right,-a.bottom,-a.left)};t.lA=function(a,b,c,d){return Xb(this,a,b,c,d)};function Xb(a,b,c,d,e){var f=a.width;c+e<=-f?(a.x+=f/2,a.width=0):(a.x-=e,a.width+=c+e);c=a.height;b+d<=-c?(a.y+=c/2,a.height=0):(a.y-=b,a.height+=b+d);return a}t.hy=function(a){return Yb(this,a.x,a.y,a.width,a.height)}; +t.zv=function(a,b,c,d){return Yb(this,a,b,c,d)};function Yb(a,b,c,d,e){var f=Math.max(a.x,b),g=Math.max(a.y,c);b=Math.min(a.x+a.width,b+d);c=Math.min(a.y+a.height,c+e);a.x=f;a.y=g;a.width=Math.max(0,b-f);a.height=Math.max(0,c-g);return a}t.Jc=function(a){return this.Av(a.x,a.y,a.width,a.height)}; +t.Av=function(a,b,c,d){var e=this.width,f=this.x;if(Infinity!==e&&Infinity!==c&&(e+=f,c+=a,isNaN(c)||isNaN(e)||f>c||a>e))return!1;a=this.height;c=this.y;return Infinity!==a&&Infinity!==d&&(a+=c,d+=b,isNaN(d)||isNaN(a)||c>d||b>a)?!1:!0};function Zb(a,b){var c=a.width,d=a.x,e=b.x-10;if(d>b.width+10+10+e||e>c+d)return!1;c=a.height;a=a.y;d=b.y-10;return a>b.height+10+10+d||d>c+a?!1:!0}t.Le=function(a){return $b(this,a.x,a.y,0,0)};t.Oc=function(a){return $b(this,a.x,a.y,a.width,a.height)}; t.gw=function(a,b,c,d){void 0===c&&(c=0);void 0===d&&(d=0);return $b(this,a,b,c,d)};function $b(a,b,c,d,e){var f=Math.min(a.x,b),g=Math.min(a.y,c);b=Math.max(a.x+a.width,b+d);c=Math.max(a.y+a.height,c+e);a.x=f;a.y=g;a.width=b-f;a.height=c-g;return a}t.Vi=function(a,b,c){this.x=a-c.offsetX-c.x*this.width;this.y=b-c.offsetY-c.y*this.height;return this};function ac(a,b,c,d,e,f,g,h){void 0===g&&(g=0);void 0===h&&(h=0);return a<=e&&e+g<=a+c&&b<=f&&f+h<=b+d} function bc(a,b,c,d,e,f,g,h){return a>g+e||e>c+a?!1:b>h+f||f>d+b?!1:!0}t.u=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)};t.rA=function(){return 0===this.width&&0===this.height};N.alloc=function(){var a=cc.pop();return void 0===a?new N:a};N.allocAt=function(a,b,c,d){var e=cc.pop();return void 0===e?new N(a,b,c,d):e.h(a,b,c,d)};N.free=function(a){cc.push(a)}; na.Object.defineProperties(N.prototype,{left:{get:function(){return this.x},set:function(a){this.x=a}},top:{get:function(){return this.y},set:function(a){this.y=a}},right:{get:function(){return this.x+this.width},set:function(a){this.x+=a-(this.x+this.width)}},bottom:{get:function(){return this.y+this.height},set:function(a){this.y+=a-(this.y+this.height)}},position:{ get:function(){return new J(this.x,this.y)},set:function(a){this.x=a.x;this.y=a.y}},size:{get:function(){return new M(this.width,this.height)},set:function(a){this.width=a.width;this.height=a.height}},center:{get:function(){return new J(this.x+this.width/2,this.y+this.height/2)},set:function(a){this.x=a.x-this.width/2;this.y=a.y-this.height/2}},centerX:{get:function(){return this.x+this.width/2}, -set:function(a){this.x=a-this.width/2}},centerY:{get:function(){return this.y+this.height/2},set:function(a){this.y=a-this.height/2}}});N.prototype.isEmpty=N.prototype.rA;N.prototype.isReal=N.prototype.u;N.intersectsLineSegment=function(a,b,c,d,e,f,g,h){return L.iy(a,b,c,d,e,f,g,h)};N.prototype.setSpot=N.prototype.Vi;N.prototype.union=N.prototype.gw;N.prototype.unionRect=N.prototype.Nc;N.prototype.unionPoint=N.prototype.Le;N.prototype.intersects=N.prototype.Av; -N.prototype.intersectsRect=N.prototype.Ic;N.prototype.intersect=N.prototype.zv;N.prototype.intersectRect=N.prototype.hy;N.prototype.grow=N.prototype.lA;N.prototype.subtractMargin=N.prototype.cw;N.prototype.addMargin=N.prototype.Xp;N.prototype.inflate=N.prototype.Gc;N.prototype.offset=N.prototype.offset;N.prototype.contains=N.prototype.contains;N.prototype.containsRect=N.prototype.De;N.prototype.containsPoint=N.prototype.$;N.prototype.equalsApprox=N.prototype.Ta;N.prototype.equalTo=N.prototype.Gi; -N.prototype.equals=N.prototype.A;N.prototype.setSize=N.prototype.WA;N.prototype.setPoint=N.prototype.Mc;N.prototype.set=N.prototype.set;N.prototype.setTo=N.prototype.ng;var gc=null,hc=null,cc=[];N.className="Rect";N.parse=Ub;N.stringify=Vb;N.contains=ac;N.intersects=bc;N.ZeroRect=gc=(new N(0,0,0,0)).ca();N.NoRect=hc=(new N(NaN,NaN,NaN,NaN)).ca();N.parse=Ub;N.stringify=Vb;N.contains=ac;N.intersects=bc; +set:function(a){this.x=a-this.width/2}},centerY:{get:function(){return this.y+this.height/2},set:function(a){this.y=a-this.height/2}}});N.prototype.isEmpty=N.prototype.rA;N.prototype.isReal=N.prototype.u;N.intersectsLineSegment=function(a,b,c,d,e,f,g,h){return L.iy(a,b,c,d,e,f,g,h)};N.prototype.setSpot=N.prototype.Vi;N.prototype.union=N.prototype.gw;N.prototype.unionRect=N.prototype.Oc;N.prototype.unionPoint=N.prototype.Le;N.prototype.intersects=N.prototype.Av; +N.prototype.intersectsRect=N.prototype.Jc;N.prototype.intersect=N.prototype.zv;N.prototype.intersectRect=N.prototype.hy;N.prototype.grow=N.prototype.lA;N.prototype.subtractMargin=N.prototype.cw;N.prototype.addMargin=N.prototype.Xp;N.prototype.inflate=N.prototype.Hc;N.prototype.offset=N.prototype.offset;N.prototype.contains=N.prototype.contains;N.prototype.containsRect=N.prototype.De;N.prototype.containsPoint=N.prototype.$;N.prototype.equalsApprox=N.prototype.Ta;N.prototype.equalTo=N.prototype.Gi; +N.prototype.equals=N.prototype.A;N.prototype.setSize=N.prototype.WA;N.prototype.setPoint=N.prototype.Nc;N.prototype.set=N.prototype.set;N.prototype.setTo=N.prototype.ng;var gc=null,hc=null,cc=[];N.className="Rect";N.parse=Ub;N.stringify=Vb;N.contains=ac;N.intersects=bc;N.ZeroRect=gc=(new N(0,0,0,0)).ca();N.NoRect=hc=(new N(NaN,NaN,NaN,NaN)).ca();N.parse=Ub;N.stringify=Vb;N.contains=ac;N.intersects=bc; function ic(a,b,c,d){void 0===a?this.left=this.bottom=this.right=this.top=0:void 0===b?this.left=this.bottom=this.right=this.top=a:void 0===c?(this.top=a,this.right=b,this.bottom=a,this.left=b):void 0!==d?(this.top=a,this.right=b,this.bottom=c,this.left=d):C("Invalid arguments to Margin constructor: "+a+", "+b+", "+c+", "+d);this.v=!1}ic.prototype.assign=function(a){this.top=a.top;this.right=a.right;this.bottom=a.bottom;this.left=a.left;return this}; ic.prototype.ng=function(a,b,c,d){this.top=a;this.right=b;this.bottom=c;this.left=d;return this};ic.prototype.set=function(a){this.top=a.top;this.right=a.right;this.bottom=a.bottom;this.left=a.left;return this};ic.prototype.copy=function(){var a=new ic;a.top=this.top;a.right=this.right;a.bottom=this.bottom;a.left=this.left;return a};t=ic.prototype;t.ca=function(){this.v=!0;Object.freeze(this);return this};t.I=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()}; t.freeze=function(){this.v=!0;return this};t.ea=function(){Object.isFrozen(this)&&C("cannot thaw constant: "+this);this.v=!1;return this}; @@ -130,8 +130,8 @@ a)return Fc;if("RightSide"===a)return Gc;if("BottomSide"===a)return Hc;if("TopBo var d=a[b++];void 0!==d&&0c,f=0>d;if(al;++l){b=.5*(h+k);if(b===h||b===k)break;var m=a/(b+e),n=g/(b+f);m=m*m+n*n-1;if(0m)k=b;else break}c=e*c/(b+e)-c;d=f*d/(b+f)-d;c=Math.sqrt(c*c+d*d)}else c=Math.abs(d-b);else d=a*a-b*b,f=a*c,fg&&(g+=360),q.startAngle+=g);0>a&&(q.startAngle=180-q.startAngle,q.sweepAngle=-q.sweepAngle); 0>d&&(q.startAngle=-q.startAngle,q.sweepAngle=-q.sweepAngle);q.radiusX*=Math.sqrt(a*a+c*c);void 0!==q.radiusY&&(q.radiusY*=Math.sqrt(b*b+d*d));break;case Pd:g=q.endX;h=q.endY;q.endX=g*a+h*c+e;q.endY=g*b+h*d+f;if(0===q.radiusX||0===q.radiusY)break;0!==b&&(g=180*Math.atan2(b,a)/Math.PI,0>g&&(g+=360),q.xAxisRotation+=g);0>a&&(q.xAxisRotation=180-q.xAxisRotation,q.isClockwiseArc=!q.isClockwiseArc);0>d&&(q.xAxisRotation=-q.xAxisRotation,q.isClockwiseArc=!q.isClockwiseArc);q.radiusX*=Math.sqrt(a*a+c*c); q.radiusY*=Math.sqrt(b*b+d*d);break;default:C("Unknown Segment type: "+q.type)}}}}this.qa=!0;return this}; -t.$=function(a,b){void 0===b&&(b=0);var c=this.Zc,d=this.$c,e=this.fc,f=this.oc;switch(this.type){case Q.j:return L.Mb(c,d,e,f,b,a.x,a.y);case Q.C:var g=N.allocAt(Math.min(c,e)-b,Math.min(d,f)-b,Math.abs(e-c)+2*b,Math.abs(f-d)+2*b);a=g.$(a);N.free(g);return a;case Q.M:g=Math.min(c,e)-b;var h=Math.min(d,f)-b;c=(Math.abs(e-c)+2*b)/2;b=(Math.abs(f-d)+2*b)/2;if(0>=c||0>=b)return!1;g=a.x-(g+c);h=a.y-(h+b);return 1>=g*g/(c*c)+h*h/(b*b);case Q.o:return Sd(this,a,b,!0,!1);default:return!1}}; +t.$=function(a,b){void 0===b&&(b=0);var c=this.$c,d=this.ad,e=this.fc,f=this.oc;switch(this.type){case Q.j:return L.Mb(c,d,e,f,b,a.x,a.y);case Q.C:var g=N.allocAt(Math.min(c,e)-b,Math.min(d,f)-b,Math.abs(e-c)+2*b,Math.abs(f-d)+2*b);a=g.$(a);N.free(g);return a;case Q.M:g=Math.min(c,e)-b;var h=Math.min(d,f)-b;c=(Math.abs(e-c)+2*b)/2;b=(Math.abs(f-d)+2*b)/2;if(0>=c||0>=b)return!1;g=a.x-(g+c);h=a.y-(h+b);return 1>=g*g/(c*c)+h*h/(b*b);case Q.o:return Sd(this,a,b,!0,!1);default:return!1}}; function Sd(a,b,c,d,e){var f=b.x;b=b.y;for(var g=a.bounds.x-20,h=0,k,l,m,n,p=a.figures.m,r=p.length,q=0;qa?"M"+this.startX.toString()+" "+this.startY.toString():"M"+this.startX.toFixed(a)+" "+this.startY.toFixed(a);for(var c=this.segments.m,d=c.length,e=0;ea&&(a+=360),this.Ae=a,this.pi=0,this.ri=Math.max(d,0),this.ah=Math.max(e,0),this.rl="boolean"===typeof g?g:"number"===typeof g?!!g:!1,this.Nk=!!h):(this.Ae=d,this.pi=e,a===Od&&(f=Math.max(f,0)),this.ri=f,"number"===typeof g?(a===Od&&(g=Math.max(g,0)),this.ah=g):this.ah=0, this.Nk=this.rl=!1);this.yj=!1;this.qa=!0;this.Od=null}Xd.prototype.copy=function(){var a=new Xd;a.ia=this.ia;a.fc=this.fc;a.oc=this.oc;a.Ae=this.Ae;a.pi=this.pi;a.ri=this.ri;a.ah=this.ah;a.rl=this.rl;a.Nk=this.Nk;a.yj=this.yj;a.qa=this.qa;return a};t=Xd.prototype; t.Ta=function(a){if(!(a instanceof Xd)||this.type!==a.type||this.isClosed!==a.isClosed)return!1;switch(this.type){case Fd:case ud:return L.w(this.endX,a.endX)&&L.w(this.endY,a.endY);case Md:return L.w(this.endX,a.endX)&&L.w(this.endY,a.endY)&&L.w(this.point1X,a.point1X)&&L.w(this.point1Y,a.point1Y)&&L.w(this.point2X,a.point2X)&&L.w(this.point2Y,a.point2Y);case Nd:return L.w(this.endX,a.endX)&&L.w(this.endY,a.endY)&&L.w(this.point1X,a.point1X)&&L.w(this.point1Y,a.point1Y);case Od:return L.w(this.startAngle, @@ -234,15 +234,15 @@ wa(this,a);this.oc=a;this.qa=!0}},point1X:{get:function(){return this.Ae},set:fu wa(this,a);this.ah=a;this.qa=!0}},centerX:{get:function(){return this.Ae},set:function(a){this.v&&wa(this,a);this.Ae=a;this.qa=!0}},centerY:{get:function(){return this.pi},set:function(a){this.v&&wa(this,a);this.pi=a;this.qa=!0}},radiusX:{get:function(){return this.ri},set:function(a){0>a&&xa(a,">= zero",Xd,"radiusX");this.v&&wa(this,a);this.ri=a;this.qa=!0}},radiusY:{get:function(){return this.ah}, set:function(a){0>a&&xa(a,">= zero",Xd,"radiusY");this.v&&wa(this,a);this.ah=a;this.qa=!0}},startAngle:{get:function(){return this.fc},set:function(a){this.fc!==a&&(this.v&&wa(this,a),a%=360,0>a&&(a+=360),this.fc=a,this.qa=!0)}},sweepAngle:{get:function(){return this.oc},set:function(a){this.v&&wa(this,a);360a&&(a=-360);this.oc=a;this.qa=!0}},isClockwiseArc:{get:function(){return this.Nk},set:function(a){this.v&& wa(this,a);this.Nk=a;this.qa=!0}},isLargeArc:{get:function(){return this.rl},set:function(a){this.v&&wa(this,a);this.rl=a;this.qa=!0}},xAxisRotation:{get:function(){return this.Ae},set:function(a){a%=360;0>a&&(a+=360);this.v&&wa(this,a);this.Ae=a;this.qa=!0}}});Xd.prototype.equalsApprox=Xd.prototype.Ta; -var Fd=new D(Xd,"Move",0),ud=new D(Xd,"Line",1),Md=new D(Xd,"Bezier",2),Nd=new D(Xd,"QuadraticBezier",3),Od=new D(Xd,"Arc",4),Pd=new D(Xd,"SvgArc",4);Xd.className="PathSegment";Xd.Move=Fd;Xd.Line=ud;Xd.Bezier=Md;Xd.QuadraticBezier=Nd;Xd.Arc=Od;Xd.SvgArc=Pd;function Zd(){this.F=null;this.Wu=(new J(0,0)).freeze();this.Ht=(new J(0,0)).freeze();this.Sq=this.Lr=0;this.Tq=1;this.ci="";this.rs=this.hr=!1;this.fr=this.Vq=0;this.sg=this.ur=this.Ar=!1;this.lr=null;this.ps=0;this.md=this.os=null} -Zd.prototype.copy=function(){var a=new Zd;return this.clone(a)};Zd.prototype.clone=function(a){a.F=this.F;a.Wu.assign(this.viewPoint);a.Ht.assign(this.documentPoint);a.Lr=this.Lr;a.Sq=this.Sq;a.Tq=this.Tq;a.ci=this.ci;a.hr=this.hr;a.rs=this.rs;a.Vq=this.Vq;a.fr=this.fr;a.Ar=this.Ar;a.ur=this.ur;a.sg=this.sg;a.lr=this.lr;a.ps=this.ps;a.os=this.os;a.md=this.md;return a}; +var Fd=new D(Xd,"Move",0),ud=new D(Xd,"Line",1),Md=new D(Xd,"Bezier",2),Nd=new D(Xd,"QuadraticBezier",3),Od=new D(Xd,"Arc",4),Pd=new D(Xd,"SvgArc",4);Xd.className="PathSegment";Xd.Move=Fd;Xd.Line=ud;Xd.Bezier=Md;Xd.QuadraticBezier=Nd;Xd.Arc=Od;Xd.SvgArc=Pd;function Zd(){this.F=null;this.Wu=(new J(0,0)).freeze();this.Ht=(new J(0,0)).freeze();this.Sq=this.Lr=0;this.Tq=1;this.ci="";this.rs=this.hr=!1;this.fr=this.Vq=0;this.sg=this.ur=this.Ar=!1;this.lr=null;this.ps=0;this.nd=this.os=null} +Zd.prototype.copy=function(){var a=new Zd;return this.clone(a)};Zd.prototype.clone=function(a){a.F=this.F;a.Wu.assign(this.viewPoint);a.Ht.assign(this.documentPoint);a.Lr=this.Lr;a.Sq=this.Sq;a.Tq=this.Tq;a.ci=this.ci;a.hr=this.hr;a.rs=this.rs;a.Vq=this.Vq;a.fr=this.fr;a.Ar=this.Ar;a.ur=this.ur;a.sg=this.sg;a.lr=this.lr;a.ps=this.ps;a.os=this.os;a.nd=this.nd;return a}; Zd.prototype.toString=function(){var a="^";0!==this.modifiers&&(a+="M:"+this.modifiers);0!==this.button&&(a+="B:"+this.button);""!==this.key&&(a+="K:"+this.key);0!==this.clickCount&&(a+="C:"+this.clickCount);0!==this.delta&&(a+="D:"+this.delta);this.handled&&(a+="h");this.bubbles&&(a+="b");null!==this.documentPoint&&(a+="@"+this.documentPoint.toString());return a};Zd.prototype.mq=function(a,b){var c=this.diagram;if(null===c)return b;$d(c,this.event,a,b);return b}; Zd.prototype.fA=function(a,b){var c=this.diagram;if(null===c)return b;$d(c,this.event,a,b);b.assign(c.kt(b));return b}; na.Object.defineProperties(Zd.prototype,{diagram:{get:function(){return this.F},set:function(a){this.F=a}},viewPoint:{get:function(){return this.Wu},set:function(a){this.Wu.assign(a)}},documentPoint:{get:function(){return this.Ht},set:function(a){this.Ht.assign(a)}},modifiers:{get:function(){return this.Lr},set:function(a){this.Lr=a}},button:{get:function(){return this.Sq}, set:function(a){this.Sq=a;if(null===this.event)switch(a){case 0:this.buttons=1;break;case 1:this.buttons=4;break;case 2:this.buttons=2}}},buttons:{get:function(){return this.Tq},set:function(a){this.Tq=a}},key:{get:function(){return this.ci},set:function(a){this.ci=a}},down:{get:function(){return this.hr},set:function(a){this.hr=a}},up:{get:function(){return this.rs},set:function(a){this.rs= a}},clickCount:{get:function(){return this.Vq},set:function(a){this.Vq=a}},delta:{get:function(){return this.fr},set:function(a){this.fr=a}},isMultiTouch:{get:function(){return this.Ar},set:function(a){this.Ar=a}},handled:{get:function(){return this.ur},set:function(a){this.ur=a}},bubbles:{get:function(){return this.sg},set:function(a){this.sg=a}},event:{ get:function(){return this.lr},set:function(a){this.lr=a}},isTouchEvent:{get:function(){var a=x.TouchEvent,b=this.event;return a&&b instanceof a?!0:(a=x.PointerEvent)&&b instanceof a&&("touch"===b.pointerType||"pen"===b.pointerType)}},timestamp:{get:function(){return this.ps},set:function(a){this.ps=a}},targetDiagram:{get:function(){return this.os},set:function(a){this.os=a}},targetObject:{ -get:function(){return this.md},set:function(a){this.md=a}},control:{get:function(){return 0!==(this.modifiers&1)},set:function(a){this.modifiers=a?this.modifiers|1:this.modifiers&-2}},shift:{get:function(){return 0!==(this.modifiers&4)},set:function(a){this.modifiers=a?this.modifiers|4:this.modifiers&-5}},alt:{get:function(){return 0!==(this.modifiers&2)},set:function(a){this.modifiers=a?this.modifiers| +get:function(){return this.nd},set:function(a){this.nd=a}},control:{get:function(){return 0!==(this.modifiers&1)},set:function(a){this.modifiers=a?this.modifiers|1:this.modifiers&-2}},shift:{get:function(){return 0!==(this.modifiers&4)},set:function(a){this.modifiers=a?this.modifiers|4:this.modifiers&-5}},alt:{get:function(){return 0!==(this.modifiers&2)},set:function(a){this.modifiers=a?this.modifiers| 2:this.modifiers&-3}},meta:{get:function(){return 0!==(this.modifiers&8)},set:function(a){this.modifiers=a?this.modifiers|8:this.modifiers&-9}},left:{get:function(){var a=this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons&1):0===this.button},set:function(a){this.buttons=a?this.buttons|1:this.buttons&-2}},right:{get:function(){var a= this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons&2):2===this.button},set:function(a){this.buttons=a?this.buttons|2:this.buttons&-3}},middle:{get:function(){var a=this.event;return null===a||"mousedown"!==a.type&&"mouseup"!==a.type&&"pointerdown"!==a.type&&"pointerup"!==a.type?0!==(this.buttons&4):1===this.button},set:function(a){this.buttons=a?this.buttons|4:this.buttons&-5}}}); Zd.prototype.getMultiTouchDocumentPoint=Zd.prototype.fA;Zd.prototype.getMultiTouchViewPoint=Zd.prototype.mq;Zd.className="InputEvent";function ae(){this.F=null;this.na="";this.Tr=this.ks=null}ae.prototype.copy=function(){var a=new ae;a.F=this.F;a.na=this.na;a.ks=this.ks;a.Tr=this.Tr;return a};ae.prototype.toString=function(){var a="*"+this.name;null!==this.subject&&(a+=":"+this.subject.toString());null!==this.parameter&&(a+="("+this.parameter.toString()+")");return a}; @@ -258,9 +258,9 @@ newValue:{get:function(){return this.No},set:function(a){this.No=a}},newParam:{g var de=new D(be,"Transaction",-1),ce=new D(be,"Property",0),ee=new D(be,"Insert",1),fe=new D(be,"Remove",2);be.className="ChangedEvent";be.Transaction=de;be.Property=ce;be.Insert=ee;be.Remove=fe;function oe(){this.o=(new E).freeze();this.na="";this.j=!1}oe.prototype.toString=function(a){var b="Transaction: "+this.name+" "+this.changes.count.toString()+(this.isComplete?"":", incomplete");if(void 0!==a&&0b&&a.Lc(b,d),b++);for(;a.length>b;)a.pop();a.freeze()}}; +oe.prototype.Zs=function(){if(this.isComplete){var a=this.changes;a.ea();for(var b=new I,c=0;cb&&a.Mc(b,d),b++);for(;a.length>b;)a.pop();a.freeze()}}; na.Object.defineProperties(oe.prototype,{changes:{get:function(){return this.o}},name:{get:function(){return this.na},set:function(a){this.na=a}},isComplete:{get:function(){return this.j},set:function(a){this.j=a}}});oe.prototype.optimize=oe.prototype.Zs;oe.prototype.redo=oe.prototype.redo;oe.prototype.canRedo=oe.prototype.canRedo;oe.prototype.undo=oe.prototype.undo;oe.prototype.canUndo=oe.prototype.canUndo; -oe.prototype.clear=oe.prototype.clear;oe.className="Transaction";function pe(){this.nu=new G;this.td=!1;this.C=(new E).freeze();this.pe=-1;this.o=999;this.re=!1;this.cr=null;this.yi=0;this.j=!1;this.we=(new E).freeze();this.Al=new E;this.Pt=!0;this.Zt=this.yr=this.bu=this.au=!1} +oe.prototype.clear=oe.prototype.clear;oe.className="Transaction";function pe(){this.nu=new G;this.ud=!1;this.C=(new E).freeze();this.pe=-1;this.o=999;this.re=!1;this.cr=null;this.yi=0;this.j=!1;this.we=(new E).freeze();this.Al=new E;this.Pt=!0;this.Zt=this.yr=this.bu=this.au=!1} pe.prototype.toString=function(a){var b="UndoManager "+this.historyIndex+"<"+this.history.count+"<="+this.maxHistoryLength;b+="[";for(var c=this.nestedTransactionNames.count,d=0;d=this.transactionLevel&&!this.Pt&&(a=a.diagram,null!==a&&!1===a.Pi||ya("Change not within a transaction: "+c.toString()))}}; pe.prototype.skipsEvent=function(a){if(null===a||0>a.change.value)return!0;a=a.object;if(null===a)return!1;if(void 0!==a.layer){if(a=a.layer,null!==a&&a.isTemporary)return!0}else if(a.isTemporary)return!0;return!1}; -na.Object.defineProperties(pe.prototype,{models:{get:function(){return this.nu.iterator}},isEnabled:{get:function(){return this.td},set:function(a){this.td=a}},transactionToUndo:{get:function(){return 0<=this.historyIndex&&this.historyIndex<=this.history.count-1?this.history.J(this.historyIndex):null}},transactionToRedo:{get:function(){return this.historyIndexe&&(e=-3),0g&&(g=-3);if(void 0===h||void 0===e||void 0===g||0===e&&0===g||b.shift)!b.shift&&a.allowVerticalScroll?(f=3*f*a.scrollVerticalLineChange,0e||Math.abs(b.y-a.y)>d}; -na.Object.defineProperties(re.prototype,{diagram:{get:function(){return this.F},set:function(a){a instanceof T&&(this.F=a)}},name:{get:function(){return this.na},set:function(a){this.na=a}},isEnabled:{get:function(){return this.td},set:function(a){this.td=a}},isActive:{get:function(){return this.Oc},set:function(a){this.Oc=a}},transactionResult:{get:function(){return this.tw}, -set:function(a){this.tw=a}}});re.prototype.startTransaction=re.prototype.wa;re.className="Tool";function Oa(){re.call(this);this.name="ToolManager";this.yc=new E;this.Pc=new E;this.Kd=new E;this.M=this.Ga=850;this.o=(new M(2,2)).ca();this.Wa=5E3;this.Ha=ve;this.C=xe;this.br=this.j=null;this.Vj=-1}ma(Oa,re);Oa.prototype.initializeStandardTools=function(){}; +na.Object.defineProperties(re.prototype,{diagram:{get:function(){return this.F},set:function(a){a instanceof T&&(this.F=a)}},name:{get:function(){return this.na},set:function(a){this.na=a}},isEnabled:{get:function(){return this.ud},set:function(a){this.ud=a}},isActive:{get:function(){return this.Pc},set:function(a){this.Pc=a}},transactionResult:{get:function(){return this.tw}, +set:function(a){this.tw=a}}});re.prototype.startTransaction=re.prototype.wa;re.className="Tool";function Oa(){re.call(this);this.name="ToolManager";this.yc=new E;this.Qc=new E;this.Kd=new E;this.M=this.Ga=850;this.o=(new M(2,2)).ca();this.Wa=5E3;this.Ha=ve;this.C=xe;this.br=this.j=null;this.Vj=-1}ma(Oa,re);Oa.prototype.initializeStandardTools=function(){}; Oa.prototype.updateAdornments=function(a){var b=this.currentToolTip;if(b instanceof we&&this.br===a){var c=b.adornedObject;(null!==a?c.part===a:null===c)?this.showToolTip(b,c):this.hideToolTip()}}; Oa.prototype.doMouseDown=function(){var a=this.diagram,b=a.lastInput;b.isTouchEvent&&this.gestureBehavior===ye&&(b.bubbles=!1);if(b.isMultiTouch){this.cancelWaitAfter();if(this.gestureBehavior===ze){b.bubbles=!0;return}if(this.gestureBehavior===ye)return;if(a.currentTool.canStartMultiTouch()){a.currentTool.standardPinchZoomStart();return}}for(var c=this.mouseDownTools.length,d=0;dg&&(g=l),m>h&&(h=m))}}Infinity===d?f.h(0,0,0,0):f.h(d,e,g-d,h-e);d=f.x+f.width/2;e=f.y+f.height/2;N.free(f); -f=a.hs;g=new I;h=J.alloc();for(k=b.iterator;k.next();)l=k.value,l instanceof U&&l.canCopy()&&(m=c.H(l),null!==m&&(m.points=l.points,cf(m,f.x-d,f.y-e),m.suspendsRouting=!0,g.add(m,a.yd())));for(b=b.iterator;b.next();)l=b.value,l.Jc()&&l.canCopy()&&(k=c.H(l),null!==k&&(l=l.location,h.h(f.x-(d-l.x),f.y-(e-l.y)),k.location=h,k.Sa(),g.add(k,a.yd(h))));J.free(h);a.copiedParts=g;Je(a,g.Ef());null!==a.draggedLink&&(c=a.draggedLink,b=c.routeBounds,cf(c,a.startPoint.x-(b.x+b.width/2),a.startPoint.y-(b.y+b.height/ +f=a.hs;g=new I;h=J.alloc();for(k=b.iterator;k.next();)l=k.value,l instanceof U&&l.canCopy()&&(m=c.H(l),null!==m&&(m.points=l.points,cf(m,f.x-d,f.y-e),m.suspendsRouting=!0,g.add(m,a.zd())));for(b=b.iterator;b.next();)l=b.value,l.Kc()&&l.canCopy()&&(k=c.H(l),null!==k&&(l=l.location,h.h(f.x-(d-l.x),f.y-(e-l.y)),k.location=h,k.Sa(),g.add(k,a.zd(h))));J.free(h);a.copiedParts=g;Je(a,g.Ef());null!==a.draggedLink&&(c=a.draggedLink,b=c.routeBounds,cf(c,a.startPoint.x-(b.x+b.width/2),a.startPoint.y-(b.y+b.height/ 2)));a.doUpdateCursor(null,!0)}}}De.prototype.doSimulatedDragOut=function(){var a=this.diagram;a.ht=!1;this.mayCopy()||this.mayMove()?a.currentCursor="":a.currentCursor=this.nodropCursor;this.qo=null};De.prototype.computeMove=function(a,b,c,d){c=this.diagram;return null!==c?c.computeMove(a,b,this.dragOptions,d):new J}; -na.Object.defineProperties(De.prototype,{isCopyEnabled:{get:function(){return this.Pc},set:function(a){this.Pc=a}},copiesEffectiveCollection:{get:function(){return this.C},set:function(a){this.C=a}},dragOptions:{get:function(){return this.Ha},set:function(a){this.Ha=a}},isGridSnapEnabled:{get:function(){return this.dragOptions.isGridSnapEnabled},set:function(a){this.dragOptions.isGridSnapEnabled= +na.Object.defineProperties(De.prototype,{isCopyEnabled:{get:function(){return this.Qc},set:function(a){this.Qc=a}},copiesEffectiveCollection:{get:function(){return this.C},set:function(a){this.C=a}},dragOptions:{get:function(){return this.Ha},set:function(a){this.Ha=a}},isGridSnapEnabled:{get:function(){return this.dragOptions.isGridSnapEnabled},set:function(a){this.dragOptions.isGridSnapEnabled= a}},isComplexRoutingRealtime:{get:function(){return this.yc},set:function(a){this.yc=a}},isGridSnapRealtime:{get:function(){return this.dragOptions.isGridSnapRealtime},set:function(a){this.dragOptions.isGridSnapRealtime=a}},gridSnapCellSize:{get:function(){return this.dragOptions.gridSnapCellSize},set:function(a){this.dragOptions.gridSnapCellSize.A(a)||(a=a.I(),this.dragOptions.gridSnapCellSize=a)}},gridSnapCellSpot:{ get:function(){return this.dragOptions.gridSnapCellSpot},set:function(a){this.dragOptions.gridSnapCellSpot.A(a)||(a=a.I(),this.dragOptions.gridSnapCellSpot=a)}},gridSnapOrigin:{get:function(){return this.dragOptions.gridSnapOrigin},set:function(a){this.dragOptions.gridSnapOrigin.A(a)||(a=a.I(),this.dragOptions.gridSnapOrigin=a)}},dragsLink:{get:function(){return this.dragOptions.dragsLink},set:function(a){this.dragOptions.dragsLink= a}},dragsTree:{get:function(){return this.dragOptions.dragsTree},set:function(a){this.dragOptions.dragsTree=a}},copyCursor:{get:function(){return this.M},set:function(a){this.M=a}},moveCursor:{get:function(){return this.Ih},set:function(a){this.Ih=a}},nodropCursor:{get:function(){return this.Jh},set:function(a){this.Jh=a}},currentPart:{get:function(){return this.Ga}, @@ -361,7 +361,7 @@ set:function(a){this.Ga=a}},copiedParts:{get:function(){return this.o},set:funct a}},isDragOutStarted:{get:function(){return this.Kd},set:function(a){this.Kd=a}},startPoint:{get:function(){return this.hs},set:function(a){this.hs.A(a)||this.hs.assign(a)}},delay:{get:function(){return this.Zk},set:function(a){this.Zk=a}}});De.prototype.getDraggingSource=De.prototype.eA;var Ie=null,Me=null;De.className="DraggingTool";He=new E; Ma("draggingTool",function(){return this.findTool("Dragging")},function(a){this.Za("Dragging",a,this.mouseMoveTools)});Oa.prototype.doCancel=function(){null!==Ie&&Ie.doCancel();re.prototype.doCancel.call(this)}; function tf(){re.call(this);this.Jh=100;this.Ha=!1;this.Sh="pointer";var a=new U,b=new uf;b.isPanelMain=!0;b.stroke="blue";a.add(b);b=new uf;b.toArrow="Standard";b.fill="blue";b.stroke="blue";a.add(b);a.layerName="Tool";this.rw=a;a=new W;b=new uf;b.portId="";b.figure="Rectangle";b.fill=null;b.stroke="magenta";b.strokeWidth=2;b.desiredSize=Jb;a.add(b);a.selectable=!1;a.layerName="Tool";this.Tm=a;this.j=b;a=new W;b=new uf;b.portId="";b.figure="Rectangle";b.fill=null;b.stroke="magenta";b.strokeWidth= -2;b.desiredSize=Jb;a.add(b);a.selectable=!1;a.layerName="Tool";this.sw=a;this.o=b;this.Ih=this.Kd=this.yc=this.Wa=this.Pc=null;this.Ga=!0;this.My=new I;this.Zi=this.ii=this.Sm=null}ma(tf,re);tf.prototype.doStop=function(){this.diagram.og();this.originalToPort=this.originalToNode=this.originalFromPort=this.originalFromNode=this.originalLink=null;this.validPortsCache.clear();this.targetPort=null}; +2;b.desiredSize=Jb;a.add(b);a.selectable=!1;a.layerName="Tool";this.sw=a;this.o=b;this.Ih=this.Kd=this.yc=this.Wa=this.Qc=null;this.Ga=!0;this.My=new I;this.Zi=this.ii=this.Sm=null}ma(tf,re);tf.prototype.doStop=function(){this.diagram.og();this.originalToPort=this.originalToNode=this.originalFromPort=this.originalFromNode=this.originalLink=null;this.validPortsCache.clear();this.targetPort=null}; tf.prototype.copyPortProperties=function(a,b,c,d,e){if(null!==a&&null!==b&&null!==c&&null!==d){var f=b.wf(),g=M.alloc();g.width=b.naturalBounds.width*f;g.height=b.naturalBounds.height*f;d.desiredSize=g;M.free(g);e?(d.toSpot=b.toSpot,d.toEndSegmentLength=b.toEndSegmentLength):(d.fromSpot=b.fromSpot,d.fromEndSegmentLength=b.fromEndSegmentLength);c.locationSpot=yc;f=J.alloc();c.location=b.da(yc,f);J.free(f);d.angle=b.Li();null!==this.portTargeted&&this.portTargeted(a,b,c,d,e)}}; tf.prototype.setNoTargetPortProperties=function(a,b,c){null!==b&&(b.desiredSize=Jb,b.fromSpot=rc,b.toSpot=rc);null!==a&&(a.location=this.diagram.lastInput.documentPoint);null!==this.portTargeted&&this.portTargeted(null,null,a,b,c)};tf.prototype.doMouseDown=function(){this.isActive&&this.doMouseMove()}; tf.prototype.doMouseMove=function(){if(this.isActive){var a=this.diagram;this.targetPort=this.findTargetPort(this.isForwards);if(null!==this.targetPort&&this.targetPort.part instanceof W){var b=this.targetPort.part;this.isForwards?this.copyPortProperties(b,this.targetPort,this.temporaryToNode,this.temporaryToPort,!0):this.copyPortProperties(b,this.targetPort,this.temporaryFromNode,this.temporaryFromPort,!1)}else this.isForwards?this.setNoTargetPortProperties(this.temporaryToNode,this.temporaryToPort, @@ -379,7 +379,7 @@ a)return!1;return!If(this,a,b,c,!0)}if(d===Kf)return a===b?a=!0:(d=new G,d.add(b function Lf(a,b,c,d,e){if(c===d)return!0;if(null===c||null===d||b.contains(c))return!1;b.add(c);for(var f=c.linksConnected;f.next();){var g=f.value;if(g!==e&&g.toNode===c&&(g=g.fromNode,g!==c&&Lf(a,b,g,d,e)))return!0}return!1}function Of(a,b,c,d,e){if(c===d)return!0;if(null===c||null===d||b.contains(c))return!1;b.add(c);for(var f=c.linksConnected;f.next();){var g=f.value;if(g!==e){var h=g.fromNode;g=g.toNode;h=h===c?g:h;if(h!==c&&Of(a,b,h,d,e))return!0}}return!1} na.Object.defineProperties(tf.prototype,{portGravity:{get:function(){return this.Jh},set:function(a){0<=a&&(this.Jh=a)}},isUnconnectedLinkValid:{get:function(){return this.Ha},set:function(a){this.Ha=a}},linkingCursor:{get:function(){return this.Sh},set:function(a){this.Sh=a}},temporaryLink:{get:function(){return this.rw},set:function(a){this.rw=a}},temporaryFromNode:{ get:function(){return this.Tm},set:function(a){if(this.Tm=a)this.j=a.port}},temporaryFromPort:{get:function(){return this.j},set:function(a){if(null!==this.j){var b=this.j.panel;if(null!==b){var c=b.T.indexOf(this.j);b.eb(c);b.ub(c,a)}}this.j=a}},temporaryToNode:{get:function(){return this.sw},set:function(a){if(this.sw=a)this.o=a.port}},temporaryToPort:{get:function(){return this.o},set:function(a){if(null!== -this.o){var b=this.o.panel;if(null!==b){var c=b.T.indexOf(this.o);b.eb(c);b.ub(c,a)}}this.o=a}},originalLink:{get:function(){return this.Pc},set:function(a){this.Pc=a}},originalFromNode:{get:function(){return this.Wa},set:function(a){this.Wa=a}},originalFromPort:{get:function(){return this.yc},set:function(a){this.yc=a}},originalToNode:{get:function(){return this.Kd},set:function(a){this.Kd= +this.o){var b=this.o.panel;if(null!==b){var c=b.T.indexOf(this.o);b.eb(c);b.ub(c,a)}}this.o=a}},originalLink:{get:function(){return this.Qc},set:function(a){this.Qc=a}},originalFromNode:{get:function(){return this.Wa},set:function(a){this.Wa=a}},originalFromPort:{get:function(){return this.yc},set:function(a){this.yc=a}},originalToNode:{get:function(){return this.Kd},set:function(a){this.Kd= a}},originalToPort:{get:function(){return this.Ih},set:function(a){this.Ih=a}},isForwards:{get:function(){return this.Ga},set:function(a){this.Ga=a}},validPortsCache:{get:function(){return this.My}},targetPort:{get:function(){return this.Sm},set:function(a){this.Sm=a}},linkValidation:{get:function(){return this.ii},set:function(a){this.ii=a}},portTargeted:{ get:function(){return this.Zi},set:function(a){this.Zi=a}}});tf.className="LinkingBaseTool";function Pf(){tf.call(this);this.name="Linking";this.M={};this.C=null;this.K=Qf;this.Kh=null}ma(Pf,tf);Pf.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;return a.isReadOnly||a.isModelReadOnly||!a.allowLink||!a.model.Ps()||!a.lastInput.left||a.currentTool!==this&&!this.isBeyondDragSize()?!1:null!==this.findLinkablePort()}; Pf.prototype.findLinkablePort=function(){var a=this.diagram,b=this.startObject;null===b&&(b=a.Wb(a.firstInput.documentPoint,null,null));if(null===b)return null;a=b.part;if(!(a instanceof W))return null;var c=this.direction;if(c===Qf||c===Rf){var d=this.findValidLinkablePort(b,!1);if(null!==d||this.startObject===a&&(d=a.port,this.findValidLinkablePort(d,!1)))return this.isForwards=!0,d}if(c===Qf||c===Sf)if(b=this.findValidLinkablePort(b,!0),null!==b||this.startObject===a&&(b=a.port,this.findValidLinkablePort(b, @@ -419,8 +419,8 @@ Wf.prototype.doActivate=function(){var a=this.diagram;null===this.handle&&(this. this.handle=this.findToolHandleAt(a.firstInput.documentPoint,this.name);if(null===this.handle){this.doDeactivate();return}}this.ix=b.i(this.handle.segmentIndex);this.Sr=b.points.copy();this.isActive=!0}}};Wf.prototype.doDeactivate=function(){this.stopTransaction();this.ot=this.handle=null;this.isActive=this.diagram.isMouseCaptured=!1};Wf.prototype.doCancel=function(){var a=this.adornedLink;null!==a&&(a.points=this.Sr);this.stopTool()};Wf.prototype.getResegmentingPoint=function(){return this.handle.da(yc)}; Wf.prototype.doMouseMove=function(){var a=this.diagram;this.isActive&&(a=this.computeReshape(a.lastInput.documentPoint),this.reshape(a))}; Wf.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){var b=this.computeReshape(a.lastInput.documentPoint);this.reshape(b);b=this.adornedLink;if(null!==b&&b.resegmentable){var c=this.handle.segmentIndex,d=b.i(c-1),e=b.i(c),f=b.i(c+1);if(b.isOrthogonal){if(c>b.firstPickIndex+1&&c=n&&(n=1);0>=p&&(p=1);n=p/n}p=J.alloc();L.jq(a.x,a.y,h,k,e.width,e.height,p);a=g.copy();0>=b.x?0>=b.y?(a.x=Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=Math.max(l-a.x,c.width),a.y=Math.max(p.y,m-d.height),a.y=Math.min(a.y,m-c.height),a.height=Math.max(m-a.y,c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n* a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width),a.x=l-a.width,a.y=m-a.height)):1<=b.y?(a.x=Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=Math.max(l-a.x,c.width),a.height=Math.max(Math.min(p.y-k,d.height),c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width),a.x=l-a.width)):(a.x= Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=l-a.x,f||(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n,a.y=k+.5*(m-k-a.height))):1<=b.x?0>=b.y?(a.width=Math.max(Math.min(p.x-h,d.width),c.width),a.y=Math.max(p.y,m-d.height),a.y=Math.min(a.y,m-c.height),a.height=Math.max(m-a.y,c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width), @@ -458,9 +458,9 @@ rg.prototype.doActivate=function(){var a=this.diagram;if(null===this.adornedObje rg.prototype.computeRotationPoint=function(a){var b=a.part,c=b.locationObject;return b.rotationSpot.hb()?a.da(b.rotationSpot):a===b||a===c?c.da(b.locationSpot):a.da(yc)}; rg.prototype.computeAdornmentLocation=function(a){var b=this.rotationPoint;b.u()||(b=this.computeRotationPoint(a));b=a.Hs(b);var c=this.handleAngle;0>c?c+=360:360<=c&&(c-=360);c=Math.round(45*Math.round(c/45));var d=this.handleDistance;0===c?b.x=a.naturalBounds.width+d:45===c?(b.x=a.naturalBounds.width+d,b.y=a.naturalBounds.height+d):90===c?b.y=a.naturalBounds.height+d:135===c?(b.x=-d,b.y=a.naturalBounds.height+d):180===c?b.x=-d:225===c?(b.x=-d,b.y=-d):270===c?b.y=-d:315===c&&(b.x=a.naturalBounds.width+ d,b.y=-d);return a.da(b)};rg.prototype.doDeactivate=function(){var a=this.diagram;this.stopTransaction();this.ie=this.handle=null;this.Xr=new J(NaN,NaN);this.isActive=a.isMouseCaptured=!1};rg.prototype.doCancel=function(){this.diagram.delaysLayout=!1;this.rotate(this.originalAngle);this.stopTool()};rg.prototype.doMouseMove=function(){var a=this.diagram;this.isActive&&(a=this.computeRotate(a.lastInput.documentPoint),this.rotate(a))}; -rg.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){a.delaysLayout=!1;var b=this.computeRotate(a.lastInput.documentPoint);this.rotate(b);a.Pa();this.transactionResult=this.name;a.S("PartRotated",this.adornedObject,this.originalAngle)}this.stopTool()}; -rg.prototype.rotate=function(a){var b=this.adornedObject;if(null!==b){b.angle=a;b=b.part;b.Sa();var c=b.locationObject,d=b.rotateObject;if(c===d||c.mg(d))c=this.Uo.copy(),b.location=c.ge(this.rotationPoint).rotate(a-this.originalAngle).add(this.rotationPoint);this.diagram.ed()}}; -rg.prototype.computeRotate=function(a){a=this.rotationPoint.Oa(a)-this.handleAngle;var b=this.adornedObject.panel;null!==b&&(a-=b.Li());360<=a?a-=360:0>a&&(a+=360);b=Math.min(Math.abs(this.snapAngleMultiple),180);var c=Math.min(Math.abs(this.snapAngleEpsilon),b/2);!this.diagram.lastInput.shift&&0b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a}; +rg.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){a.delaysLayout=!1;var b=this.computeRotate(a.lastInput.documentPoint);this.rotate(b);a.Oa();this.transactionResult=this.name;a.S("PartRotated",this.adornedObject,this.originalAngle)}this.stopTool()}; +rg.prototype.rotate=function(a){var b=this.adornedObject;if(null!==b){b.angle=a;b=b.part;b.Sa();var c=b.locationObject,d=b.rotateObject;if(c===d||c.mg(d))c=this.Uo.copy(),b.location=c.ge(this.rotationPoint).rotate(a-this.originalAngle).add(this.rotationPoint);this.diagram.fd()}}; +rg.prototype.computeRotate=function(a){a=this.rotationPoint.Ra(a)-this.handleAngle;var b=this.adornedObject.panel;null!==b&&(a-=b.Li());360<=a?a-=360:0>a&&(a+=360);b=Math.min(Math.abs(this.snapAngleMultiple),180);var c=Math.min(Math.abs(this.snapAngleEpsilon),b/2);!this.diagram.lastInput.shift&&0b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a}; na.Object.defineProperties(rg.prototype,{handleArchetype:{get:function(){return this.o},set:function(a){this.o=a}},handle:{get:function(){return this.j},set:function(a){if(null!==a&&!(a.part instanceof we))throw Error("new handle is not in an Adornment: "+a);this.j=a}},adornedObject:{get:function(){return this.ie},set:function(a){if(null!==a&&a.part instanceof we)throw Error("new handle must not be in an Adornment: "+ a);this.ie=a}},snapAngleMultiple:{get:function(){return this.Ha},set:function(a){this.Ha=a}},snapAngleEpsilon:{get:function(){return this.Ga},set:function(a){this.Ga=a}},originalAngle:{get:function(){return this.ex}},rotationPoint:{get:function(){return this.Xr},set:function(a){this.Xr=a.copy()}},handleAngle:{get:function(){return this.C},set:function(a){this.C= a}},handleDistance:{get:function(){return this.M},set:function(a){this.M=a}}});rg.className="RotatingTool";Ma("rotatingTool",function(){return this.findTool("Rotating")},function(a){this.Za("Rotating",a,this.mouseDownTools)});function sg(){re.call(this);this.name="ClickSelecting"}ma(sg,re);sg.prototype.canStart=function(){return!this.isEnabled||this.isBeyondDragSize()?!1:!0}; @@ -470,7 +470,7 @@ tg.prototype.doMouseMove=function(){if(this.isActive){var a=this.diagram.lastInp tg.prototype.doCancel=function(){var a=this.diagram.lastInput,b=this.Dk;null!==b&&(a.targetObject=b,null!==b.actionCancel&&b.actionCancel(a,b),this.stopTool())};tg.prototype.doStop=function(){this.Dk=null};tg.className="ActionTool";function ug(){re.call(this);this.name="ClickCreating";this.mj=null;this.o=!0;this.j=!1;this.Nw=new J(0,0)}ma(ug,re); ug.prototype.canStart=function(){if(!this.isEnabled||null===this.archetypeNodeData)return!1;var a=this.diagram;if(a.isReadOnly||a.isModelReadOnly||!a.allowInsert||!a.lastInput.left||this.isBeyondDragSize())return!1;if(this.isDoubleClick){if(1===a.lastInput.clickCount&&(this.Nw=a.lastInput.viewPoint.copy()),2!==a.lastInput.clickCount||this.isBeyondDragSize(this.Nw))return!1}else if(1!==a.lastInput.clickCount)return!1;return a.currentTool!==this&&null!==a.im(a.lastInput.documentPoint,!0)?!1:!0}; ug.prototype.doMouseUp=function(){var a=this.diagram;this.isActive&&this.insertPart(a.lastInput.documentPoint);this.stopTool()}; -ug.prototype.insertPart=function(a){var b=this.diagram,c=this.archetypeNodeData;if(null===c)return null;var d=null;try{b.S("ChangingSelection",b.selection);this.wa(this.name);if(c instanceof V)c.Jc()&&(ng(c),d=c.copy(),null!==d&&b.add(d));else if(null!==c){var e=b.model.copyNodeData(c);za(e)&&(b.model.nf(e),d=b.vc(e))}if(null!==d){var f=J.allocAt(a.x,a.y);this.isGridSnapEnabled&&vg(this.diagram,d,a,f);d.location=f;b.allowSelect&&(b.clearSelection(!0),d.isSelected=!0);J.free(f)}b.Pa();this.transactionResult= +ug.prototype.insertPart=function(a){var b=this.diagram,c=this.archetypeNodeData;if(null===c)return null;var d=null;try{b.S("ChangingSelection",b.selection);this.wa(this.name);if(c instanceof V)c.Kc()&&(ng(c),d=c.copy(),null!==d&&b.add(d));else if(null!==c){var e=b.model.copyNodeData(c);za(e)&&(b.model.nf(e),d=b.vc(e))}if(null!==d){var f=J.allocAt(a.x,a.y);this.isGridSnapEnabled&&vg(this.diagram,d,a,f);d.location=f;b.allowSelect&&(b.clearSelection(!0),d.isSelected=!0);J.free(f)}b.Oa();this.transactionResult= this.name;b.S("PartCreated",d)}finally{this.stopTransaction(),b.S("ChangedSelection",b.selection)}return d};na.Object.defineProperties(ug.prototype,{archetypeNodeData:{get:function(){return this.mj},set:function(a){this.mj=a}},isDoubleClick:{get:function(){return this.o},set:function(a){this.o=a}},isGridSnapEnabled:{get:function(){return this.j},set:function(a){this.j=a}}});ug.className="ClickCreatingTool"; function wg(){re.call(this);this.name="DragSelecting";this.Zk=175;this.o=!1;var a=new V;a.layerName="Tool";a.selectable=!1;var b=new uf;b.name="SHAPE";b.figure="Rectangle";b.fill=null;b.stroke="magenta";a.add(b);this.j=a}ma(wg,re); wg.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;if(!a.allowSelect)return!1;var b=a.lastInput;return!b.left||a.currentTool!==this&&(!this.isBeyondDragSize()||b.timestamp-a.firstInput.timestampa&&xa(a,">= 1",bh,"duration");this.Fg=a}},isAnimating:{get:function(){return this.hc}}, +na.Object.defineProperties(bh.prototype,{animationReasons:{get:function(){return this.Md}},isEnabled:{get:function(){return this.ud},set:function(a){(this.ud=a)&&this.$i.each(function(a){a.isAnimating||Infinity!==a.runCount||a.start()})}},duration:{get:function(){return this.Fg},set:function(a){1>a&&xa(a,">= 1",bh,"duration");this.Fg=a}},isAnimating:{get:function(){return this.hc}}, isTicking:{get:function(){return this.Dr}},isInitial:{get:function(){return this.Zh},set:function(a){this.Zh=a}},defaultAnimation:{get:function(){return this.Pd}},activeAnimations:{get:function(){return this.$i}},initialAnimationStyle:{get:function(){return this.hl},set:function(a){this.hl=a}}});bh.prototype.stopAnimation=bh.prototype.nc; var Kh=null,ch=!1,eh=new D(bh,"Default",1),kh=new D(bh,"AnimateLocations",2),jh=new D(bh,"None",3);bh.className="AnimationManager";bh.defineAnimationEffect=function(a,b){ch||(dh(),ch=!0);Kh.add(a,b)};bh.Default=eh;bh.AnimateLocations=kh;bh.None=jh; -function fh(a){this.Uu=this.qx=this.Ld=this.F=null;this.ol=this.hc=this.j=!1;this.In=this.zd=0;this.ar=this.Kt=Lh;this.nl=this.jp=!1;this.Bu=1;this.zu=0;this.sd=this.Fg=NaN;this.Hw=0;this.Jn=null;this.o=pb;this.jc=new I;this.ru=new I;this.Zl=new G;this.su=new G;this.Ew=Mh;a&&Object.assign(this,a)}fh.prototype.suspend=function(){this.ol=!0};fh.prototype.advanceTo=function(a,b){b&&(this.ol=!1);this.jp&&a>=this.sd&&(this.nl=!0,a-=this.sd);this.Hw=a;Eh(this,!0);oh(this.Ld);rf(this.F);Ah(this.Ld);this.F.redraw()}; -function lh(a,b){a.ru.clear();a.nl=!1;a.zu=0;a.sd=NaN;0=this.td&&(this.nl=!0,a-=this.td);this.Hw=a;Eh(this,!0);oh(this.Ld);rf(this.F);Ah(this.Ld);this.F.redraw()}; +function lh(a,b){a.ru.clear();a.nl=!1;a.zu=0;a.td=NaN;0a.In?a.sd:d-a.zd;b&&(e=a.Hw,ea.In&&(a.jp&&!a.nl?(a.zd=+new Date,a.In=a.zd+a.sd,a.nl=!0):a.gm(!1))}}} -function zh(a,b){for(var c=a.sd,d=a.jc.iterator,e=a.nl;d.next();){var f=d.key;if(!(f instanceof Y&&null===f.diagram)){var g=d.value,h=e?g.end:g.start;g=e?g.start:g.end;var k=Kh,l;for(l in g)"position"===l&&(g["position:placeholder"]||g["position:nodeCollapse"])||null===k.get(l)||k.get(l)(f,h[l],g[l],a.ar,b,c,a)}}}t.stop=function(){if(!this.hc)return this;this.gm(!0);return this}; +function Eh(a,b){if(!a.ol||b){var c=a.Ld;if(!1!==a.hc){var d=+new Date,e=d>a.In?a.td:d-a.Ad;b&&(e=a.Hw,ea.In&&(a.jp&&!a.nl?(a.Ad=+new Date,a.In=a.Ad+a.td,a.nl=!0):a.gm(!1))}}} +function zh(a,b){for(var c=a.td,d=a.jc.iterator,e=a.nl;d.next();){var f=d.key;if(!(f instanceof Y&&null===f.diagram)){var g=d.value,h=e?g.end:g.start;g=e?g.start:g.end;var k=Kh,l;for(l in g)"position"===l&&(g["position:placeholder"]||g["position:nodeCollapse"])||null===k.get(l)||k.get(l)(f,h[l],g[l],a.ar,b,c,a)}}}t.stop=function(){if(!this.hc)return this;this.gm(!0);return this}; t.gm=function(a){null!==this.Uu&&this.Uu.qp.remove(this.qx);if(this.hc){var b=this.F,c=this.Ld;this.ol=this.hc=c.gl=!1;oh(c);for(var d=this.jc,e=this.Zl.iterator;e.next();)b.remove(e.value);for(e=this.su.iterator;e.next();)e.value.s();e=this.jp;d=d.iterator;for(var f=Kh;d.next();){var g=d.key,h=d.value,k=e?h.end:h.start,l=e?h.start:h.end,m=h.nv,n;for(n in l)if(null!==f.get(n)){var p=n;!h.hv||"position:nodeCollapse"!==p&&"position:placeholder"!==p||(p="position");f.get(p)(g,k[n],void 0!==m[n]?m[n]: -h.hv?k[n]:l[n],this.ar,this.sd,this.sd,this)}h.hv&&void 0!==m.location&&g instanceof V&&(g.location=m.location);h.Pv&&g instanceof V&&g.Nb(!1)}b.Ts.clear();Te(b,!1);b.Pa();b.N();rf(b,!0);if(c.defaultAnimation===this){for(n=c.Il.iterator;n.next();)e=n.value,null!==e.cf&&(e.points=e.cf,e.cf=null);c.Il.clear()}this.isViewportUnconstrained&&(b.scrollMode=this.Ew);Ah(c);this.zu++;!a&&this.Bu>this.zu?(this.nl=!1,this.start()):(this.Jn&&this.Jn(this),lh(this,null),c.gm(this),b.Fb())}}; +h.hv?k[n]:l[n],this.ar,this.td,this.td,this)}h.hv&&void 0!==m.location&&g instanceof V&&(g.location=m.location);h.Pv&&g instanceof V&&g.Nb(!1)}b.Ts.clear();Te(b,!1);b.Oa();b.N();rf(b,!0);if(c.defaultAnimation===this){for(n=c.Il.iterator;n.next();)e=n.value,null!==e.cf&&(e.points=e.cf,e.cf=null);c.Il.clear()}this.isViewportUnconstrained&&(b.scrollMode=this.Ew);Ah(c);this.zu++;!a&&this.Bu>this.zu?(this.nl=!1,this.start()):(this.Jn&&this.Jn(this),lh(this,null),c.gm(this),b.Fb())}}; t.Yj=function(a,b){var c=b.actualBounds,d=null;b instanceof hf&&(d=b.placeholder);null!==d?(c=d.da(sc),d=d.padding,c.x+=d.left,c.y+=d.top,this.add(a,"position",c,a.position,!1)):this.add(a,"position",new J(c.x+c.width/2,c.y+c.height/2),a.position,!1);this.add(a,"scale",.01,a.scale,!1);if(a instanceof hf)for(a=a.memberParts;a.next();)d=a.value,d instanceof W&&this.Yj(d,b)}; t.Wj=function(a,b){if(a.isVisible()){var c=null;b instanceof hf&&(c=b.placeholder);null!==c?this.add(a,"position:placeholder",a.position,c,!0):this.add(a,"position:nodeCollapse",a.position,b,!0);this.add(a,"scale",a.scale,.01,!0);c=this.jc;c.contains(a)&&(c.H(a).Pv=!0);if(a instanceof hf)for(a=a.memberParts;a.next();)c=a.value,c instanceof W&&this.Wj(c,b)}};t.iA=function(a){var b=this.ru.get(a);null===b&&(b={},this.ru.add(a,b));return b}; na.Object.defineProperties(fh.prototype,{duration:{get:function(){return this.Fg},set:function(a){1>a&&xa(a,">= 1",fh,"duration");this.Fg=a}},reversible:{get:function(){return this.jp},set:function(a){this.jp=a}},runCount:{get:function(){return this.Bu},set:function(a){0a?c/2*a*a+b:-c/2*(--a*(a-2)-1)+b}function Nh(a,b,c,d){return a===d?b+c:c*(-Math.pow(2,-10*a/d)+1)+b}fh.className="Animation";fh.EaseLinear=function(a,b,c,d){return c*a/d+b};fh.EaseInOutQuad=Lh;fh.EaseInQuad=function(a,b,c,d){return c*(a/=d)*a+b};fh.EaseOutQuad=function(a,b,c,d){return-c*(a/=d)*(a-2)+b};fh.EaseInExpo=function(a,b,c,d){return 0===a?b:c*Math.pow(2,10*(a/d-1))+b};fh.EaseOutExpo=Nh; -function Th(a,b,c){this.start=a;this.end=b;this.nv={};this.hv=c;this.Pv=!1}Th.className="AnimationState";function Uh(a,b,c){this.md=null;this.bf=a;this.Hp=c||Vh;this.Ik=null;void 0!==b&&(this.Ik=b,void 0===c&&(this.Hp=Wh))}Uh.prototype.copy=function(){var a=new Uh(this.bf);a.Hp=this.Hp;var b=this.Ik;if(null!==b){var c={};void 0!==b.duration&&(c.duration=b.duration);void 0!==b.finished&&(c.finished=b.finished);void 0!==b.easing&&(c.easing=b.easing);a.Ik=c}return a}; +function Th(a,b,c){this.start=a;this.end=b;this.nv={};this.hv=c;this.Pv=!1}Th.className="AnimationState";function Uh(a,b,c){this.nd=null;this.bf=a;this.Hp=c||Vh;this.Ik=null;void 0!==b&&(this.Ik=b,void 0===c&&(this.Hp=Wh))}Uh.prototype.copy=function(){var a=new Uh(this.bf);a.Hp=this.Hp;var b=this.Ik;if(null!==b){var c={};void 0!==b.duration&&(c.duration=b.duration);void 0!==b.finished&&(c.finished=b.finished);void 0!==b.easing&&(c.easing=b.easing);a.Ik=c}return a}; function Xh(a,b){a=a.Ik;null!==a&&(a.duration&&(b.duration=a.duration),a.finished&&(b.finished=a.finished),a.easing&&(b.easing=a.easing))}na.Object.defineProperties(Uh.prototype,{propertyName:{get:function(){return this.bf},set:function(a){this.bf=a}},animationSettings:{get:function(){return this.Ik},set:function(a){this.Ik=a}},startCondition:{get:function(){return this.Hp},set:function(a){this.Hp=a}}}); var Vh=new D(Uh,"Default",1),Wh=new D(Uh,"Immediate",2),Yh=new D(Uh,"Bundled",3);Uh.className="AnimationTrigger";Uh.Default=Vh;Uh.Immediate=Wh;Uh.Bundled=Yh;function Zh(a){Ta(this);this.F=null;this.Fa=new E;this.na="";this.lb=1;this.o=!1;this.j=this.oi=this.C=this.jj=this.ij=this.hj=this.gj=this.ej=this.fj=this.dj=this.lj=this.cj=this.kj=this.bj=this.aj=!0;this.Vo=[];a&&Object.assign(this,a)}t=Zh.prototype;t.clear=function(){this.Fa.clear();this.Vo.length=0};t.Ke=function(a){this.F=a}; t.toString=function(a){void 0===a&&(a=0);var b='Layer "'+this.name+'"';if(0>=a)return b;for(var c=0,d=0,e=0,f=0,g=0,h=this.Fa.iterator;h.next();){var k=h.value;k instanceof hf?e++:k instanceof W?d++:k instanceof U?f++:k instanceof we?g++:c++}h="";0c.Jr||h.height*e>c.Jr?b.lc(a,c):(e=b.actualBounds,f=b.naturalBounds,0===e.width||0===e.height||isNaN(e.x)|| +t.Ei=function(a,b,c,d,e,f,g){if(!g||lg(b)){if(null!==d&&b instanceof U&&(b.isOrthogonal&&d.push(b),!1===b.sd))return;g=!1;for(d=b.containingGroup;null!==d;)g?null!==d.$a&&f.hy(d.$a):null!==d.$a&&(g=!0,f.assign(d.$a)),d=d.containingGroup;var h=b.actualBounds;d=!1;if(g&&b.isVisible()){if(!f.Jc(h))return;d=!f.De(h)}d&&(a.save(),a.beginPath(),a.rect(f.x,f.y,f.width,f.height),a.clip());h.width*e>c.Jr||h.height*e>c.Jr?b.lc(a,c):(e=b.actualBounds,f=b.naturalBounds,0===e.width||0===e.height||isNaN(e.x)|| isNaN(e.y)||!b.isVisible()||(c=b.transform,null!==b.areaBackground&&(bi(b,a,b.areaBackground,!0,!0,f,e),a.fillRect(e.x,e.y,e.width,e.height)),null===b.areaBackground&&null===b.background&&(bi(b,a,"rgba(0,0,0,0.3)",!0,!1,f,e),a.fillRect(e.x,e.y,e.width,e.height)),null!==b.background&&(a.transform(c.m11,c.m12,c.m21,c.m22,c.dx,c.dy),bi(b,a,b.background,!0,!1,f,e),a.fillRect(0,0,f.width/2,f.height/2),c.Os()||(b=1/(c.m11*c.m22-c.m12*c.m21),a.transform(c.m22*b,-c.m12*b,-c.m21*b,c.m11*b,b*(c.m21*c.dy-c.m22* c.dx),b*(c.m12*c.dx-c.m11*c.dy))))));d&&(a.restore(),a.Ec(!0))}};t.g=function(a,b,c,d,e){var f=this.diagram;null!==f&&f.Va(ce,a,this,b,c,d,e)};t.Oi=function(a,b,c){var d=this.Fa;b.ei=this;if(a>=d.count)a=d.count;else if(d.J(a)===b)return-1;d.ub(a,b);b.pq(c);d=this.diagram;null!==d&&(c?d.N():d.Oi(b));ci(this,a,b);return a}; t.bc=function(a,b,c){if(!c&&b.layer!==this&&null!==b.layer)return b.layer.bc(a,b,c);var d=this.Fa;if(0>a||a>=d.length){if(a=d.indexOf(b),0>a)return-1}else if(d.J(a)!==b&&(a=d.indexOf(b),0>a))return-1;b.qq(c);d.eb(a);d=this.diagram;null!==d&&(c?d.N():d.bc(b));b.ei=null;return a}; @@ -573,19 +573,19 @@ e&&(k=a.J(h).zOrder,isNaN(k)););}return b} na.Object.defineProperties(Zh.prototype,{parts:{get:function(){return this.Fa.iterator}},partsBackwards:{get:function(){return this.Fa.iteratorBackwards}},diagram:{get:function(){return this.F}},name:{get:function(){return this.na},set:function(a){var b=this.na;if(b!==a){var c=this.diagram;if(null!==c)for(""===b&&C("Cannot rename default Layer to: "+a),c=c.layers;c.next();)c.value.name=== a&&C("Layer.name is already present in this diagram: "+a);this.na=a;this.g("name",b,a);for(a=this.Fa.iterator;a.next();)a.value.layerName=this.na}}},opacity:{get:function(){return this.lb},set:function(a){var b=this.lb;b!==a&&((0>a||1q&&(this.position=v.h(-(b.scrollWidth-this.ua)+w-this.ua/e+m,this.position.y))),a.$y&&this.allowVerticalScroll&&(hu&&(this.position= v.h(this.position.x,-(b.scrollHeight-this.ta)+a.scrollTop-this.ta/e+f))),J.free(v),Qi(this),this.wj=this.$r=!1,d=this.documentBounds,e=this.viewportBounds,m=d.right,q=e.right,f=d.bottom,u=e.bottom,g=d.x,n=e.x,h=d.y,d=e.y,p>=k&&g>=n&&m<=q&&(c.style.width="1px"),r>=l&&h>=d&&f<=u&&(c.style.height="1px"))}};T.prototype.computeBounds=function(a){void 0===a&&(a=new N);hh(this);return Ri(this,a)}; -function Ri(a,b){if(a.fixedBounds.u())return b.assign(a.fixedBounds),b.Xp(a.mb),b;for(var c=!0,d=a.Na.m,e=d.length,f=0;fc&&(b=c),ba.maxScale&&(b=a.maxScale),b):b===Yi?(b=k>h?(g-a.sb)/d:(f-a.sb)/e,b>c&&(b=c),ba.maxScale&&(b=a.maxScale),b):a.scale} @@ -630,61 +630,61 @@ T.prototype.vA=function(a){var b=this.F;if(!b.isEnabled)return!1;var c=bj(b,a,!1 T.prototype.Gz=function(a){var b=this.F;if(!b.isEnabled)return!1;var c=bj(b,a,!0);null!==b.mouseEnter&&b.mouseEnter(c);return fj(c,a)};T.prototype.Hz=function(a){var b=this.F;if(!b.isEnabled)return!1;var c=bj(b,a,!0);null!==b.mouseLeave&&b.mouseLeave(c);return fj(c,a)}; T.prototype.getMouse=function(a){var b=this.Aa;if(null===b)return new J(0,0);var c=b.getBoundingClientRect();b=a.clientX-this.ua/c.width*c.left;a=a.clientY-this.ta/c.height*c.top;return null!==this.tb?Ab(new J(b,a),this.tb):new J(b,a)}; function cj(a,b,c){var d=a.Aa,e=a.ua,f=a.ta,g=0,h=0;null!==d&&(d=d.getBoundingClientRect(),g=b.clientX-e/d.width*d.left,h=b.clientY-f/d.height*d.top);c.viewPoint.h(g,h);null!==a.tb?(b=J.allocAt(g,h),a.tb.Ed(b),c.documentPoint.assign(b),J.free(b)):c.documentPoint.h(g,h)} -function $d(a,b,c,d){if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;b=b.targetTouches[c]}else if(null!==a.El[0])b=a.El[c];else return;c=a.Aa;null!==c&&(c=c.getBoundingClientRect(),d.h(b.clientX-a.ua/c.width*c.left,b.clientY-a.ta/c.height*c.top))}T.prototype.Pa=function(){this.vj||(this.vj=!0,this.Fb(!0))};function gj(a){a.Vc||hh(a);a.Sa()}T.prototype.redraw=function(){this.ob||this.Vc||(this.N(),Vi(this),this.ed())};t=T.prototype;t.tA=function(){return this.eg}; -t.Bz=function(a){void 0===a&&(a=null);var b=this.animationManager,c=b.isEnabled;b.nc();b.isEnabled=!1;rf(this);this.Qf=!1;this.Cu=new J(NaN,NaN);b.isEnabled=c;this.Vc=!0;var d=this;null!==a&&ua(function(){d.Vc=!1;gh(b,"Model");a(d)},1)};t.Fb=function(a){void 0===a&&(a=!1);if(!0!==this.eg&&!(this.ob||!1===a&&this.Vc)){this.eg=!0;var b=this;x.requestAnimationFrame(function(){b.eg&&b.ed()})}};t.ed=function(){if(!this.Ln||this.eg)this.Ln&&(this.Ln=!1),rf(this)}; +function $d(a,b,c,d){if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;b=b.targetTouches[c]}else if(null!==a.El[0])b=a.El[c];else return;c=a.Aa;null!==c&&(c=c.getBoundingClientRect(),d.h(b.clientX-a.ua/c.width*c.left,b.clientY-a.ta/c.height*c.top))}T.prototype.Oa=function(){this.vj||(this.vj=!0,this.Fb(!0))};function gj(a){a.Wc||hh(a);a.Sa()}T.prototype.redraw=function(){this.ob||this.Wc||(this.N(),Vi(this),this.fd())};t=T.prototype;t.tA=function(){return this.eg}; +t.Bz=function(a){void 0===a&&(a=null);var b=this.animationManager,c=b.isEnabled;b.nc();b.isEnabled=!1;rf(this);this.Qf=!1;this.Cu=new J(NaN,NaN);b.isEnabled=c;this.Wc=!0;var d=this;null!==a&&ua(function(){d.Wc=!1;gh(b,"Model");a(d)},1)};t.Fb=function(a){void 0===a&&(a=!1);if(!0!==this.eg&&!(this.ob||!1===a&&this.Wc)){this.eg=!0;var b=this;x.requestAnimationFrame(function(){b.eg&&b.fd()})}};t.fd=function(){if(!this.Ln||this.eg)this.Ln&&(this.Ln=!1),rf(this)}; function Wi(a,b,c){a.animationManager.defaultAnimation.isAnimating||a.ob||!a.wj||Oi(a)||(b&&hh(a),c&&Si(a,!1))} -function rf(a,b){if(!a.Vc&&(a.eg=!1,null!==a.Ea||a.Rp.u())){a.Vc=!0;var c=a.animationManager,d=a.$o;if(!c.isAnimating&&0!==d.length){for(var e=d.m,f=e.length,g=0;gb;b++){var c=a.qe.iterator;if(null===c||0===a.qe.count)break;a.qe=new G;a.kw(c,a.qe)}a.nodes.each(function(a){a instanceof hf&&0!==(a.R&65536)!==!1&&(a.R=a.R^65536)})}} -t.kw=function(a,b){for(a.reset();a.next();){var c=a.value;!c.Jc()||c instanceof hf||(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}for(a.reset();a.next();)c=a.value,c instanceof hf&&c.isVisible()&&lj(this,c);for(a.reset();a.next();)c=a.value,c instanceof U&&c.isVisible()&&(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c));for(a.reset();a.next();)c=a.value,c instanceof we&&c.isVisible()&&(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}; +b||a.lc(a.Sb);e&&(a.skipsUndoManager=d);a.Wc=!1}}function kj(a){var b=a.sa;if(a.Lg!==mh)a.scale=Ti(a,a.Lg);else if(a.Oh!==mh)a.scale=Ti(a,a.Oh);else{var c=a.initialScale;isFinite(c)&&0b;b++){var c=a.qe.iterator;if(null===c||0===a.qe.count)break;a.qe=new G;a.kw(c,a.qe)}a.nodes.each(function(a){a instanceof hf&&0!==(a.R&65536)!==!1&&(a.R=a.R^65536)})}} +t.kw=function(a,b){for(a.reset();a.next();){var c=a.value;!c.Kc()||c instanceof hf||(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}for(a.reset();a.next();)c=a.value,c instanceof hf&&c.isVisible()&&lj(this,c);for(a.reset();a.next();)c=a.value,c instanceof U&&c.isVisible()&&(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c));for(a.reset();a.next();)c=a.value,c instanceof we&&c.isVisible()&&(c.Si()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}; function lj(a,b){for(var c=Fa(),d=Fa(),e=b.memberParts;e.next();){var f=e.value;f.isVisible()&&(f instanceof hf?(mj(f)||nj(f)||oj(f))&&lj(a,f):f instanceof U?f.fromNode===b||f.toNode===b?d.push(f):c.push(f):(f.measure(Infinity,Infinity),f.arrange()))}a=c.length;for(e=0;en&&(z=K.left,y= K.right),w.height>F&&(A=K.top,B=K.bottom)):(z=K.left,y=K.right,A=K.top,B=K.bottom);K=w.width+z+y;var S=w.height+A+B;z=w.x-z;var R=e.x;y=w.right+y;var O=e.right+r;A=w.y-A;var H=e.y;w=w.bottom+B;B=e.bottom+q;var da="1px",ba="1px";e=a.scale;u=K>u/e;v=S>v/e;a.scrollMode===Mh&&(u||v)&&(u&&a.hasHorizontalScrollbar&&a.allowHorizontalScroll&&(u=1,z+1O+1&&(u=Math.max((y-O)*e+a.ua,u)),n+r+1B+1&&(u=Math.max((w-B)*e+a.ta,u)),F+q+1O+1&&(r=Math.max((y-O)*e+a.ua,r)),n+1B+1&&(q=Math.max((w-B)*e+r,q)),F+1B+1&&(q=Math.max((w-B)*e+r,q)),F+1O+1&&(b=a.position.x*e));if(a.io)switch(a.Au){case "negative":b=-(l.scrollWidth-b-l.clientWidth);break;case "reverse":b=l.scrollWidth-b-l.clientWidth}l.scrollLeft=b;a.hasVerticalScrollbar&&a.allowVerticalScroll&&(F+1B+1&&(l.scrollTop=a.position.y*e));u=a.ua;v=a.ta;l.style.width=u+(a.Of?a.sb:0)+"px";l.style.height=v+(a.Ue?a.sb:0)+"px";return c!==u||d!==v||a.animationManager.rb?(c=N.allocAt(f,g,h,k),a.onViewportBoundsChanged(c,a.viewportBounds,e,p),N.free(c),!1):!0}t=T.prototype; -t.add=function(a){var b=a.diagram;if(b!==this&&(null!==b&&C("Cannot add part "+a.toString()+" to "+this.toString()+". It is already a part of "+b.toString()),b=this.ik(a.layerName),null===b&&(b=this.ik("")),null===b&&C('Cannot add a Part when unable find a Layer named "'+a.layerName+'" and there is no default Layer'),a.layer!==b)){var c=b.Oi(99999999,a,a.diagram===this);0<=c&&this.Va(ee,"parts",b,null,a,null,c);b.isTemporary||this.Pa();a.B(1);c=a.layerChanged;null!==c&&c(a,null,b)}}; -t.Oi=function(a){this.partManager.Oi(a);var b=this;zj(a,function(a){Aj(b,a)});(a instanceof we||a instanceof hf&&null!==a.placeholder)&&a.s();null!==a.data&&zj(a,function(a){Bj(b.partManager,a)});!0!==nj(a)&&!0!==oj(a)||this.qe.add(a);Cj(a,!0,this);Dj(a)?(a.actualBounds.u()&&this.N(xj(a,a.actualBounds)),this.Pa()):a.isVisible()&&a.actualBounds.u()&&this.N(xj(a,a.actualBounds));this.Fb()}; -t.bc=function(a){a.$j();this.partManager.bc(a);var b=this;null!==a.data&&zj(a,function(a){Ej(b.partManager,a,b)});this.qe.remove(a);Dj(a)?(a.actualBounds.u()&&this.N(xj(a,a.actualBounds)),this.Pa()):a.isVisible()&&a.actualBounds.u()&&this.N(xj(a,a.actualBounds));this.Fb()};t.remove=function(a){Fj(this,a,!0)}; +t.add=function(a){var b=a.diagram;if(b!==this&&(null!==b&&C("Cannot add part "+a.toString()+" to "+this.toString()+". It is already a part of "+b.toString()),b=this.ik(a.layerName),null===b&&(b=this.ik("")),null===b&&C('Cannot add a Part when unable find a Layer named "'+a.layerName+'" and there is no default Layer'),a.layer!==b)){var c=b.Oi(99999999,a,a.diagram===this);0<=c&&this.Va(ee,"parts",b,null,a,null,c);b.isTemporary||this.Oa();a.B(1);c=a.layerChanged;null!==c&&c(a,null,b)}}; +t.Oi=function(a){this.partManager.Oi(a);var b=this;zj(a,function(a){Aj(b,a)});(a instanceof we||a instanceof hf&&null!==a.placeholder)&&a.s();null!==a.data&&zj(a,function(a){Bj(b.partManager,a)});!0!==nj(a)&&!0!==oj(a)||this.qe.add(a);Cj(a,!0,this);Dj(a)?(a.actualBounds.u()&&this.N(xj(a,a.actualBounds)),this.Oa()):a.isVisible()&&a.actualBounds.u()&&this.N(xj(a,a.actualBounds));this.Fb()}; +t.bc=function(a){a.$j();this.partManager.bc(a);var b=this;null!==a.data&&zj(a,function(a){Ej(b.partManager,a,b)});this.qe.remove(a);Dj(a)?(a.actualBounds.u()&&this.N(xj(a,a.actualBounds)),this.Oa()):a.isVisible()&&a.actualBounds.u()&&this.N(xj(a,a.actualBounds));this.Fb()};t.remove=function(a){Fj(this,a,!0)}; function Fj(a,b,c){var d=b.layer;null!==d&&d.diagram===a&&(b.isSelected=!1,b.isHighlighted=!1,b.B(2),c&&b.fk(),c=d.bc(-1,b,!1),0<=c&&a.Va(fe,"parts",d,b,null,c,null),a=b.layerChanged,null!==a&&a(b,d,null))}t.bt=function(a,b){void 0===b&&(b=!1);if(Aa(a))for(var c=a.length,d=0;dd&&this.Pa();return this}; -t.fz=function(a,b){Lj(this,a,b);a.Ke(this);var c=this.Na,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Tb&&this.Va(fe,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Pa();return this}; -t.NA=function(a){a.diagram!==this&&C("Cannot remove a Layer from another Diagram: "+a+" of "+a.diagram);if(""!==a.name){var b=this.Na,c=b.indexOf(a);if(b.remove(a)){for(b=a.Fa.copy().iterator;b.next();){var d=b.value,e=d.layerName;e!==a.name?d.layerName=e:d.layerName=""}null!==this.Tb&&this.Va(fe,"layers",this,a,null,c,null);this.N();this.Pa()}}};t.ik=function(a){for(var b=this.layers;b.next();){var c=b.value;if(c.name===a)return c}return null}; +t.bm=function(a){Lj(this,a,null);a.Ke(this);var b=this.Na,c=b.count-1;if(!a.isTemporary)for(;0<=c&&b.J(c).isTemporary;)c--;b.ub(c+1,a);null!==this.Tb&&this.Va(ee,"layers",this,null,a,null,c+1);this.N();this.Oa();return this}; +t.zx=function(a,b){Lj(this,a,b);a.Ke(this);var c=this.Na,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Tb&&this.Va(fe,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Oa();return this}; +t.fz=function(a,b){Lj(this,a,b);a.Ke(this);var c=this.Na,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Tb&&this.Va(fe,"layers",this,a,null,d,null));var e=c.count,f;for(f=0;fd&&this.Oa();return this}; +t.NA=function(a){a.diagram!==this&&C("Cannot remove a Layer from another Diagram: "+a+" of "+a.diagram);if(""!==a.name){var b=this.Na,c=b.indexOf(a);if(b.remove(a)){for(b=a.Fa.copy().iterator;b.next();){var d=b.value,e=d.layerName;e!==a.name?d.layerName=e:d.layerName=""}null!==this.Tb&&this.Va(fe,"layers",this,a,null,c,null);this.N();this.Oa()}}};t.ik=function(a){for(var b=this.layers;b.next();){var c=b.value;if(c.name===a)return c}return null}; t.Bx=function(a){null===this.$e&&(this.$e=new E);this.$e.add(a);this.model.uh(a);return this};t.PA=function(a){null!==this.$e&&(this.$e.remove(a),0===this.$e.count&&(this.$e=null));this.model.Bk(a)};t.uh=function(a){null===this.ug&&(this.ug=new E);this.ug.add(a);return this};t.Bk=function(a){null!==this.ug&&(this.ug.remove(a),0===this.ug.count&&(this.ug=null))}; t.ws=function(a){this.skipsUndoManager||this.model.skipsUndoManager||this.model.undoManager.yv(a);a.change!==de&&(this.isModified=!0);if(null!==this.ug)for(var b=this.ug,c=b.length,d=0;dn.Fa.indexOf(r)&&n.Oi(p,r,q):(r.isSelected=!1,r.isHighlighted=!1,r.Kb(),n.bc(q?p:-1,r,q)))}else n instanceof T?"number"===typeof p&&r instanceof Zh&&(b?(r.Ke(this),this.Na.ub(p,r)):this.Na.eb(p)):C("unknown ChangedEvent.Remove object: "+a.toString());this.isModified=!0}else d!==de&&C("unknown ChangedEvent: "+a.toString())}finally{this.skipsModelSourceBindings= c}}};T.prototype.wa=function(a){return this.undoManager.wa(a)};T.prototype.Xa=function(a){return this.undoManager.Xa(a)};T.prototype.Df=function(){return this.undoManager.Df()};T.prototype.commit=function(a,b){void 0===b&&(b="");var c=this.skipsUndoManager;null===b&&(this.skipsUndoManager=!0,b="");this.undoManager.wa(b);var d=!1;try{a(this),d=!0}finally{d?this.undoManager.Xa(b):this.undoManager.Df(),this.skipsUndoManager=c}};T.prototype.updateAllTargetBindings=function(a){this.partManager.updateAllTargetBindings(a)}; T.prototype.Lq=function(){this.partManager.Lq()}; -function Qj(a,b,c){var d=a.animationManager;if(a.ob||a.Vc)a.sa=c,Ji(a),d.rb&&(Bh(d)||d.Pd.add(d.F,"scale",b,a.sa));else if(null===a.Aa)a.sa=c,Ji(a);else{a.ob=!0;var e=a.viewportBounds.copy(),f=a.ua,g=a.ta;e.width=a.ua/b;e.height=a.ta/b;var h=a.zoomPoint.x,k=a.zoomPoint.y,l=a.contentAlignment;isNaN(h)&&(l.Kc()?l.zf(Fc)?h=0:l.zf(Gc)&&(h=f-1):h=l.hb()?l.x*(f-1):f/2);isNaN(k)&&(l.Kc()?l.zf(Dc)?k=0:l.zf(Hc)&&(k=g-1):k=l.hb()?l.y*(g-1):g/2);null===a.scaleComputation||a.animationManager.defaultAnimation.isAnimating|| +function Qj(a,b,c){var d=a.animationManager;if(a.ob||a.Wc)a.sa=c,Ji(a),d.rb&&(Bh(d)||d.Pd.add(d.F,"scale",b,a.sa));else if(null===a.Aa)a.sa=c,Ji(a);else{a.ob=!0;var e=a.viewportBounds.copy(),f=a.ua,g=a.ta;e.width=a.ua/b;e.height=a.ta/b;var h=a.zoomPoint.x,k=a.zoomPoint.y,l=a.contentAlignment;isNaN(h)&&(l.Lc()?l.zf(Fc)?h=0:l.zf(Gc)&&(h=f-1):h=l.hb()?l.x*(f-1):f/2);isNaN(k)&&(l.Lc()?l.zf(Dc)?k=0:l.zf(Hc)&&(k=g-1):k=l.hb()?l.y*(g-1):g/2);null===a.scaleComputation||a.animationManager.defaultAnimation.isAnimating|| (c=a.scaleComputation(a,c));ca.maxScale&&(c=a.maxScale);f=J.allocAt(a.ka.x+h/b-h/c,a.ka.y+k/b-k/c);a.position=f;J.free(f);a.sa=c;Ji(a);a.onViewportBoundsChanged(e,a.viewportBounds,b,!1);a.ob=!1;Si(a,!1);d.rb&&(Bh(d)||d.Pd.add(d.F,"scale",b,a.sa));a.N();Vi(a)}} -T.prototype.onViewportBoundsChanged=function(a,b,c,d){if(!a.A(b)){void 0===d&&(d=!1);d||Vi(this);Qi(this);var e=this.layout;null===e||!e.isViewportSized||this.autoScale!==mh||d||a.width===b.width&&a.height===b.height||e.B();e=this.currentTool;!0===this.ml&&e instanceof Oa&&(this.lastInput.documentPoint=this.kt(this.lastInput.viewPoint),Ae(e,this));this.ob||this.invalidateViewport(a,b);ij(this);this.bd.scale=c;this.bd.position.x=a.x;this.bd.position.y=a.y;this.bd.bounds.assign(a);this.bd.Gx.width= -Math.round(a.width*c);this.bd.Gx.height=Math.round(a.height*c);this.bd.qy.width=this.ua;this.bd.qy.height=this.ta;this.bd.ky=d;this.S("ViewportBoundsChanged",this.bd,a);this.isVirtualized&&this.links.each(function(a){a.isAvoiding&&a.actualBounds.Ic(b)&&a.Ua()})}}; +T.prototype.onViewportBoundsChanged=function(a,b,c,d){if(!a.A(b)){void 0===d&&(d=!1);d||Vi(this);Qi(this);var e=this.layout;null===e||!e.isViewportSized||this.autoScale!==mh||d||a.width===b.width&&a.height===b.height||e.B();e=this.currentTool;!0===this.ml&&e instanceof Oa&&(this.lastInput.documentPoint=this.kt(this.lastInput.viewPoint),Ae(e,this));this.ob||this.invalidateViewport(a,b);ij(this);this.cd.scale=c;this.cd.position.x=a.x;this.cd.position.y=a.y;this.cd.bounds.assign(a);this.cd.Gx.width= +Math.round(a.width*c);this.cd.Gx.height=Math.round(a.height*c);this.cd.qy.width=this.ua;this.cd.qy.height=this.ta;this.cd.ky=d;this.S("ViewportBoundsChanged",this.cd,a);this.isVirtualized&&this.links.each(function(a){a.isAvoiding&&a.actualBounds.Jc(b)&&a.Ua()})}}; function ij(a,b){var c=a.Vd;if(null!==c&&c.visible){for(var d=M.alloc(),e=1,f=1,g=c.T.m,h=g.length,k=0;km||(Rj(l.figure)?f=f*m/L.Wx(f,m):e=e*m/L.Wx(e,m))}g=c.gridCellSize;d.h(f*g.width,e*g.height);if(void 0!==b)e=b.width,f=b.height,a=b.x,g=b.y;else{b=N.alloc();a=a.viewportBounds;b.h(a.x,a.y,a.width,a.height);if(!b.u()){N.free(b);return}e=b.width;f=b.height;a=b.x;g=b.y;N.free(b)}c.width=e+2*d.width;c.height=f+2*d.height;b=J.alloc();L.jq(a,g,0,0,d.width,d.height, b);b.offset(-d.width,-d.height);M.free(d);c.part.location=b;J.free(b)}}T.prototype.clearSelection=function(a){void 0===a&&(a=!1);var b=this.selection;if(0!==b.count){a||this.S("ChangingSelection",b);for(var c=b.xa(),d=c.length,e=0;e=d&&!f.defaultAnimation.isAnimating&&!f.rb&&(b||gh(f,"Layout"));a.Nh=!1;for(var g=a.xi.iterator;g.next();)ak(a,g.value,b,d);e.isValidLayout||(!b||e.isRealtime||null===e.isRealtime||0===d?(e.doLayout(a),hh(a),e.isValidLayout=!0):a.Nh=!0)}finally{b=a.undoManager.isInternalTransaction,0===d&&(a.Xa("Layout"),a.undoManager.isInternalTransaction= !1),!b||0!==d&&1!==d||ih(f),a.Z=c}}}function ak(a,b,c,d){if(null!==b){for(var e=b.zl.iterator;e.next();)ak(a,e.value,c,d);e=b.layout;null===e||e.isValidLayout||(!c||e.isRealtime||0===d?(b.Fh=!b.location.u(),e.doLayout(b),b.B(32),lj(a,b),e.isValidLayout=!0):a.Nh=!0)}}t.cA=function(){for(var a=new E,b=this.nodes;b.next();){var c=b.value;c.isTopLevel&&null===c.Ji()&&a.add(c)}return a.iterator}; @@ -723,11 +723,11 @@ b("LostFocus");b("Modified");b("ObjectSingleClicked");b("ObjectDoubleClicked");b function uj(a,b){var c=a.Iw.H(b);return null!==c?c:a.Iw.H(b.toLowerCase())}function jk(a,b){var c=a.Jw.H(b);if(null!==c)return c;c=a.Jw.H(b.toLowerCase());if(null!==c)return c;C("Unknown DiagramEvent name: "+b)}t.Xj=function(a,b){a=jk(this,a);null!==a&&a.add(b);return this};t.um=function(a,b){a=jk(this,a);null!==a&&a.remove(b)}; t.S=function(a,b,c){var d=jk(this,a),e=new ae;e.diagram=this;a=uj(this,a);null!==a&&(e.name=a);void 0!==b&&(e.subject=b);void 0!==c&&(e.parameter=c);b=d.length;if(1===b)d.J(0)(e);else if(0!==b)for(d=d.xa(),c=0;c=c.top&&0>=c.left&&0>=c.right&&0>=c.bottom)return b;var d=this.viewportBounds,e=this.scale;d=N.allocAt(0,0,d.width*e,d.height*e);var f=J.allocAt(0,0);if(a.x>=d.x&&a.xd.x+d.width-c.right&&this.allowHorizontalScroll&&(g=Math.max(this.scrollHorizontalLineChange, 1),g|=0,f.x+=g,a.x>d.x+d.width-c.right/2&&(f.x+=g),a.x>d.x+d.width-c.right/4&&(f.x+=4*g));a.y>=d.y&&a.yd.y+d.height-c.bottom&&this.allowVerticalScroll&&(g=Math.max(this.scrollVerticalLineChange,1),g|=0,f.y+=g,a.y>d.y+d.height-c.bottom/2&&(f.y+=g),a.y>d.y+d.height-c.bottom/4&&(f.y+=4*g));f.Ta(pb)||(b=new J(b.x+f.x/e,b.y+f.y/e)); N.free(d);J.free(f);return b};t=T.prototype;t.Vs=function(){return null};t.Gv=function(){return null};t.jz=function(a,b){this.Xy.add(a,b)};t.ev=function(a){(this.tx=a)||this.nodes.each(function(a){a instanceof hf&&(a.mr=null)})}; @@ -735,10 +735,10 @@ function xk(a,b,c){function d(){var a=+new Date;f=!0;for(g.reset();g.next();)if( t.ny=function(a){void 0===a&&(a={});return xk(this,this.AA,a)}; t.AA=function(a,b,c){var d=yk(c,a,"canvas",null);if(null===d)return null;c=d.Y.canvas;var e=null;if(null!==c)switch(e=a.returnType,void 0===e?e="string":e=e.toLowerCase(),e){case zk+"data":e=d.getImageData(0,0,c.width,c.height);break;case zk:d=(a.document||document).createElement("img");d.src=c.toDataURL(a.type,a.details);e=d;break;case "blob":"function"!==typeof b&&C('Error: Diagram.makeImageData called with "returnType: toBlob", but no required "callback" function property defined.');if("function"=== typeof c.toBlob)return c.toBlob(b,a.type,a.details),"toBlob";if("function"===typeof c.msToBlob)return b(c.msToBlob()),"msToBlob";b(null);return null;default:e=c.toDataURL(a.type,a.details)}return"function"===typeof b?(b(e),null):e}; -function yk(a,b,c,d){a.animationManager.nc();a.ed();if(null===a.Aa)return null;"object"!==typeof b&&C("properties argument must be an Object.");var e=b.size||null,f=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(f="NaN");var g=b.maxSize;void 0===b.maxSize&&(g="SVG"===c?new M(Infinity,Infinity):new M(2E3,2E3));var h=b.position||null,k=b.parts||null,l=void 0===b.padding?1:b.padding,m=b.background||null,n=b.omitTemporary;void 0===n&&(n=!0);var p=b.document||document,r=b.elementFinished||null,q=b.showTemporary; +function yk(a,b,c,d){a.animationManager.nc();a.fd();if(null===a.Aa)return null;"object"!==typeof b&&C("properties argument must be an Object.");var e=b.size||null,f=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(f="NaN");var g=b.maxSize;void 0===b.maxSize&&(g="SVG"===c?new M(Infinity,Infinity):new M(2E3,2E3));var h=b.position||null,k=b.parts||null,l=void 0===b.padding?1:b.padding,m=b.background||null,n=b.omitTemporary;void 0===n&&(n=!0);var p=b.document||document,r=b.elementFinished||null,q=b.showTemporary; void 0===q&&(q=!n);b=b.showGrid;void 0===b&&(b=q);null!==e&&isNaN(e.width)&&isNaN(e.height)&&(e=null);"number"===typeof l?l=new ic(l):l instanceof ic||C("MakeImage padding must be a Margin or a number.");l.left=Math.max(l.left,0);l.right=Math.max(l.right,0);l.top=Math.max(l.top,0);l.bottom=Math.max(l.bottom,0);a.Sb.Ec(!0);n=new Ak(null,p);var u=n.context;if(!(e||f||k||h)){n.width=a.ua+Math.ceil(l.left+l.right);n.height=a.ta+Math.ceil(l.top+l.bottom);if("SVG"===c){if(null===d)return null;d.resize(n.width, -n.height,n.width,n.height);d.ownerDocument=p;d.gq=r;sj(a,d.context,l,new M(n.width,n.height),a.sa,a.ka,k,m,q,b);return d.context}a.Bn=!1;sj(a,u,l,new M(n.width,n.height),a.sa,a.ka,k,m,q,b);a.Bn=!0;return n.context}var v=a.er,w=a.documentBounds.copy();w.cw(a.mb);if(q)for(var z=a.Na.m,y=z.length,A=0;Av?(f=v,e=w.width,w=w.height):(e=g.width,w=g.height)):(e=w.width*f,w=w.height*f):(f=v,e=w.width,w=w.height);null!==l?(e+=h,w+=y):l=new ic(0);null!==g&&(v=g.width,g=g.height,isNaN(v)&&(v=2E3),isNaN(g)&&(g=2E3),isFinite(v)&&(e=Math.min(e, v)),isFinite(g)&&(w=Math.min(w,g)));n.width=Math.ceil(e);n.height=Math.ceil(w);if("SVG"===c){if(null===d)return null;d.resize(n.width,n.height,n.width,n.height);d.ownerDocument=p;d.gq=r;sj(a,d.context,l,new M(Math.ceil(e),Math.ceil(w)),f,z,k,m,q,b);return d.context}a.Bn=!1;sj(a,u,l,new M(Math.ceil(e),Math.ceil(w)),f,z,k,m,q,b);a.Bn=!0;return n.context} na.Object.defineProperties(T.prototype,{div:{get:function(){return this.Ea},set:function(a){if(this.Ea!==a){var b=this.Ea;null!==b?(b.F=void 0,b.goDiagram=void 0,b.go=void 0,b.innerHTML="",null!==this.Aa&&(b=this.Aa.La,this.removeEventListener(b,"pointermove",this.xk,!1),this.removeEventListener(b,"pointerdown",this.wk,!1),this.removeEventListener(b,"pointerup",this.zk,!1),this.removeEventListener(b,"pointerout",this.yk,!1),this.Aa.Ox()),this.Hl&&(this.Hl.disconnect(), @@ -746,7 +746,7 @@ this.Hl=null),b=this.toolManager,null!==b&&(b.mouseDownTools.each(function(a){a. get:function(){return this.Mr}},Pi:{get:function(){return this.Qf}},draggedLink:{get:function(){return this.It},set:function(a){this.It!==a&&(this.It=a,null!==a&&(this.tu=a.fromPort,this.uu=a.toPort))}},sy:{get:function(){return this.tu},set:function(a){this.tu=a}},ty:{get:function(){return this.uu},set:function(a){this.uu=a}},animationManager:{get:function(){return this.Ld}}, undoManager:{get:function(){return this.Tb.undoManager}},skipsUndoManager:{get:function(){return this.gh},set:function(a){this.gh=a;this.Tb.skipsUndoManager=a}},delaysLayout:{get:function(){return this.Gt},set:function(a){this.Gt=a}},opacity:{get:function(){return this.lb},set:function(a){var b=this.lb;b!==a&&((0>a||1= 0",T,"maxSelectionCount")}},nodeSelectionAdornmentTemplate:{get:function(){return this.qu},set:function(a){var b=this.qu;b!==a&&(this.qu=a,this.g("nodeSelectionAdornmentTemplate",b,a))}},groupSelectionAdornmentTemplate:{get:function(){return this.St},set:function(a){var b=this.St;b!==a&&(this.St=a,this.g("groupSelectionAdornmentTemplate",b,a))}},linkSelectionAdornmentTemplate:{get:function(){return this.gu}, set:function(a){var b=this.gu;b!==a&&(this.gu=a,this.g("linkSelectionAdornmentTemplate",b,a))}},highlighteds:{get:function(){return this.Pw}},isModified:{get:function(){var a=this.undoManager;return a.isEnabled?null!==a.currentTransaction?!0:this.fo&&this.pe!==a.historyIndex:this.fo},set:function(a){if(this.fo!==a){this.fo=a;var b=this.undoManager;!a&&b.isEnabled&&(this.pe=b.historyIndex);a||Sj(this)}}},model:{ get:function(){return this.Tb},set:function(a){var b=this.Tb;if(b!==a){this.currentTool.doCancel();b&&b.undoManager!==a.undoManager&&b.undoManager.isInTransaction&&C("Do not replace a Diagram.model while a transaction is in progress.");this.animationManager.nc(!0);var c=Hi(this,!0);this.Qf=!1;this.Ln=!0;this.pe=-2;this.eg=!1;var d=this.ob;this.ob=!0;gh(this.animationManager,"Model");b&&(null!==this.$e&&this.$e.each(function(a){b.Bk(a)}),b.Bk(this.Ih));this.Tb=a;this.partManager=Tj(this.Tb.type);for(var e= -0;ethis.scale&&(this.scale=a)):xa(a,"> 0",T,"minScale"))}},maxScale:{get:function(){return this.iu},set:function(a){var b=this.iu;b!==a&&(0 0",T,"maxScale"))}},zoomPoint:{get:function(){return this.Yu},set:function(a){this.Yu.A(a)||(this.Yu=a=a.I())}},contentAlignment:{get:function(){return this.Qk}, -set:function(a){var b=this.Qk;b.A(a)||(this.Qk=a=a.I(),this.g("contentAlignment",b,a),Si(this,!1))}},initialContentAlignment:{get:function(){return this.vr},set:function(a){var b=this.vr;b.A(a)||(this.vr=a=a.I(),this.g("initialContentAlignment",b,a))}},padding:{get:function(){return this.mb},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.mb;b.A(a)||(this.mb=a=a.I(),this.Pa(),this.g("padding",b,a))}},partManager:{ +set:function(a){var b=this.Qk;b.A(a)||(this.Qk=a=a.I(),this.g("contentAlignment",b,a),Si(this,!1))}},initialContentAlignment:{get:function(){return this.vr},set:function(a){var b=this.vr;b.A(a)||(this.vr=a=a.I(),this.g("initialContentAlignment",b,a))}},padding:{get:function(){return this.mb},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.mb;b.A(a)||(this.mb=a=a.I(),this.Oa(),this.g("padding",b,a))}},partManager:{ get:function(){return this.Jh},set:function(a){var b=this.Jh;b!==a&&(null!==a.diagram&&C("Cannot share PartManagers between Diagrams: "+a.toString()),b&&b.Ke(null),this.Jh=a,a.Ke(this))}},nodes:{get:function(){return this.partManager.nodes.iterator}},links:{get:function(){return this.partManager.links.iterator}},parts:{get:function(){return this.partManager.parts.iterator}},layout:{ get:function(){return this.Ac},set:function(a){var b=this.Ac;b!==a&&(this.Ac=a,a.diagram=this,a.group=null,this.Nh=!0,this.g("layout",b,a),this.Fb())}},isTreePathToChildren:{get:function(){return this.du},set:function(a){var b=this.du;if(b!==a&&(this.du=a,this.g("isTreePathToChildren",b,a),!this.undoManager.isUndoingRedoing))for(a=this.nodes;a.next();)Bk(a.value)}},treeCollapsePolicy:{get:function(){return this.Tu},set:function(a){var b= this.Tu;b!==a&&(a!==qi&&a!==Ck&&a!==Dk&&C("Unknown Diagram.treeCollapsePolicy: "+a),this.Tu=a,this.g("treeCollapsePolicy",b,a))}},He:{get:function(){return this.Rw},set:function(a){this.Rw=a}},avoidanceCellSize:{get:function(){return this.Bw},set:function(a){this.si=null;this.Bw=new M(Math.max(1,a.width),Math.max(1,a.height))}},avoidanceLimit:{get:function(){return this.Cw},set:function(a){this.Cw=Math.max(1, -a)}},autoScrollInterval:{get:function(){return this.Oq},set:function(a){var b=this.Oq;b!==a&&(this.Oq=a,this.g("autoScrollInterval",b,a))}},autoScrollRegion:{get:function(){return this.Qq},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.Qq;b.A(a)||(this.Qq=a=a.I(),this.Pa(),this.g("autoScrollRegion",b,a))}}}); +a)}},autoScrollInterval:{get:function(){return this.Oq},set:function(a){var b=this.Oq;b!==a&&(this.Oq=a,this.g("autoScrollInterval",b,a))}},autoScrollRegion:{get:function(){return this.Qq},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.Qq;b.A(a)||(this.Qq=a=a.I(),this.Oa(),this.g("autoScrollRegion",b,a))}}}); na.Object.defineProperties(T,{licenseKey:{get:function(){return Ek.Xb()},set:function(a){Ek.add(a.replace(/\s/g,""))}},version:{get:function(){return Fk}}});T.prototype.makeImageData=T.prototype.ny;T.prototype.makeImage=T.prototype.zA;T.prototype.cacheGroupExternalLinks=T.prototype.ev;T.prototype.addRenderer=T.prototype.jz;T.prototype.makeSVG=T.prototype.Gv;T.prototype.makeSvg=T.prototype.Vs;T.prototype.stopAutoScroll=T.prototype.og; T.prototype.doAutoScroll=T.prototype.zs;T.prototype.isUnoccupied=T.prototype.qk;T.prototype.raiseDiagramEvent=T.prototype.S;T.prototype.removeDiagramListener=T.prototype.um;T.prototype.addDiagramListener=T.prototype.Xj;T.prototype.findTreeRoots=T.prototype.cA;T.prototype.layoutDiagram=T.prototype.xA;T.prototype.findTopLevelGroups=T.prototype.Wz;T.prototype.findTopLevelNodesAndLinks=T.prototype.Xz;T.prototype.ensureBounds=T.prototype.Sa;T.prototype.findLinksByExample=T.prototype.Cs; T.prototype.findNodesByExample=T.prototype.Ds;T.prototype.findLinkForData=T.prototype.uc;T.prototype.findNodeForData=T.prototype.Hi;T.prototype.findPartForData=T.prototype.vc;T.prototype.findLinkForKey=T.prototype.findLinkForKey;T.prototype.findNodeForKey=T.prototype.Eb;T.prototype.findPartForKey=T.prototype.findPartForKey;T.prototype.rebuildParts=T.prototype.Hd;T.prototype.transformViewToDoc=T.prototype.kt;T.prototype.transformRectDocToView=T.prototype.cB;T.prototype.transformDocToView=T.prototype.Iq; T.prototype.centerRect=T.prototype.xs;T.prototype.scrollToRect=T.prototype.Vv;T.prototype.scroll=T.prototype.scroll;T.prototype.highlightCollection=T.prototype.oA;T.prototype.highlight=T.prototype.nA;T.prototype.selectCollection=T.prototype.UA;T.prototype.select=T.prototype.select;T.prototype.updateAllRelationshipsFromData=T.prototype.Lq;T.prototype.updateAllTargetBindings=T.prototype.updateAllTargetBindings;T.prototype.commit=T.prototype.commit;T.prototype.rollbackTransaction=T.prototype.Df; T.prototype.commitTransaction=T.prototype.Xa;T.prototype.startTransaction=T.prototype.wa;T.prototype.raiseChanged=T.prototype.g;T.prototype.raiseChangedEvent=T.prototype.Va;T.prototype.removeChangedListener=T.prototype.Bk;T.prototype.addChangedListener=T.prototype.uh;T.prototype.removeModelChangedListener=T.prototype.PA;T.prototype.addModelChangedListener=T.prototype.Bx;T.prototype.findLayer=T.prototype.ik;T.prototype.removeLayer=T.prototype.NA;T.prototype.addLayerAfter=T.prototype.fz; T.prototype.addLayerBefore=T.prototype.zx;T.prototype.addLayer=T.prototype.bm;T.prototype.moveParts=T.prototype.moveParts;T.prototype.copyParts=T.prototype.ek;T.prototype.removeParts=T.prototype.bt;T.prototype.remove=T.prototype.remove;T.prototype.add=T.prototype.add;T.prototype.clearDelayedGeometries=T.prototype.fv;T.prototype.setProperties=T.prototype.Hm;T.prototype.attach=T.prototype.dv;T.prototype.set=T.prototype.set;T.prototype.resetInputOptions=T.prototype.yy;T.prototype.setInputOption=T.prototype.VA; -T.prototype.getInputOption=T.prototype.km;T.prototype.resetRenderingHints=T.prototype.zy;T.prototype.setRenderingHint=T.prototype.Dy;T.prototype.getRenderingHint=T.prototype.Fe;T.prototype.maybeUpdate=T.prototype.ed;T.prototype.requestUpdate=T.prototype.Fb;T.prototype.delayInitialization=T.prototype.Bz;T.prototype.isUpdateRequested=T.prototype.tA;T.prototype.invalidateDocumentBounds=T.prototype.Pa;T.prototype.findObjectsNear=T.prototype.kg;T.prototype.findPartsNear=T.prototype.Sz; +T.prototype.getInputOption=T.prototype.km;T.prototype.resetRenderingHints=T.prototype.zy;T.prototype.setRenderingHint=T.prototype.Dy;T.prototype.getRenderingHint=T.prototype.Fe;T.prototype.maybeUpdate=T.prototype.fd;T.prototype.requestUpdate=T.prototype.Fb;T.prototype.delayInitialization=T.prototype.Bz;T.prototype.isUpdateRequested=T.prototype.tA;T.prototype.invalidateDocumentBounds=T.prototype.Oa;T.prototype.findObjectsNear=T.prototype.kg;T.prototype.findPartsNear=T.prototype.Sz; T.prototype.findObjectsIn=T.prototype.vf;T.prototype.findPartsIn=T.prototype.Vx;T.prototype.findObjectsAt=T.prototype.Ii;T.prototype.findPartsAt=T.prototype.Rz;T.prototype.findObjectAt=T.prototype.Wb;T.prototype.findPartAt=T.prototype.im;T.prototype.focusObject=T.prototype.dA;T.prototype.alignDocument=T.prototype.lz;T.prototype.zoomToRect=T.prototype.gB;T.prototype.zoomToFit=T.prototype.zoomToFit;T.prototype.diagramScroll=T.prototype.Mx;T.prototype.focus=T.prototype.focus; var gi=new I,Ki=null,Jg=void 0!==x.document,Ei=null,Gi="",mh=new D(T,"None",0),Xi=new D(T,"Uniform",1),Yi=new D(T,"UniformToFill",2),wf=new D(T,"CycleAll",10),Kf=new D(T,"CycleNotDirected",11),Mf=new D(T,"CycleNotDirectedFast",12),Nf=new D(T,"CycleNotUndirected",13),Hf=new D(T,"CycleDestinationTree",14),Jf=new D(T,"CycleSourceTree",15),Mh=new D(T,"DocumentScroll",1),Oh=new D(T,"InfiniteScroll",2),qi=new D(T,"TreeParentCollapsed",21),Ck=new D(T,"AllParentsCollapsed",22),Dk=new D(T,"AnyParentsCollapsed", -23),Ek=new E,Fk="2.2.9",zk="image",Gk=null,ei=!1; +23),Ek=new E,Fk="2.2.10",zk="image",Gk=null,ei=!1; function fi(){if(Jg){var a=x.document.createElement("canvas"),b=a.getContext("2d"),c=Pa("7ca11abfd022028846");b[c]=Pa("398c3597c01238");for(var d=["5da73c80a36455d6038e4972187c3cae51fd22",sa.Dx+"4ae6247590da4bb21c324ba3a84e385776",qd.xF+"fb236cdfda5de14c134ba1a95a2d4c7cc6f93c1387",L.za],e=1;5>e;e++)b[Pa("7ca11abfd7330390")](Pa(d[e-1]),10,15*e);b[c]=Pa("39f046ebb36e4b");for(c=1;5>c;c++)b[Pa("7ca11abfd7330390")](Pa(d[c-1]),10,15*c);if(4!==d.length||"5"!==d[0][0]||"7"!==d[3][0])qd.prototype.Ed=qd.prototype.Fx; Gk=a}}T.className="Diagram";T.fromDiv=function(a){var b=a;"string"===typeof a&&(b=x.document.getElementById(a));return b instanceof HTMLDivElement&&b.F instanceof T?b.F:null};T.inherit=function(a,b){function c(){}if(Object.getPrototypeOf(a).prototype)throw Error("Used go.Diagram.inherit defining already defined class \n"+a);c.prototype=b.prototype;a.prototype=new c;a.prototype.constructor=a};T.useDOM=function(a){Jg=a?void 0!==x.document:!1};T.isUsingDOM=function(){return Jg};T.None=mh;T.Uniform=Xi; -T.UniformToFill=Yi;T.CycleAll=wf;T.CycleNotDirected=Kf;T.CycleNotDirectedFast=Mf;T.CycleNotUndirected=Nf;T.CycleDestinationTree=Hf;T.CycleSourceTree=Jf;T.DocumentScroll=Mh;T.InfiniteScroll=Oh;T.TreeParentCollapsed=qi;T.AllParentsCollapsed=Ck;T.AnyParentsCollapsed=Dk;function mi(){this.az=null;this.j="zz@orderNum";"63ad05bbe23a1786468a4c741b6d2"===this._tk?this.hd=this.j=!0:this.hd=null} -function rj(a,b){b.Sb.setTransform(b.ac,0,0,b.ac,0,0);b.Sb.Bd();if(null===a.hd)a:{b="f";var c=x[Pa("76a715b2f73f148a")][Pa("72ba13b5")];a.hd=!0;if(Jg){var d=T[Pa("76a115b6ed251eaf4692")];if(d)for(var e=Ek.iterator;e.next();){d=e.value;d=Pa(d).split(Pa("39e9"));if(6>d.length)break;var f=Pa(d[1]).split(".");if("7da71ca0"!==d[4])break;var g=Pa(sa[Pa("6cae19")]).split(".");if(f[0]>g[0]||f[0]===g[0]&&f[1]>=g[1]){var h=x[Pa("74a900bae4370f8b51")][Pa("6fbb13a1c2311e8a57")].toLowerCase();g=h[Pa("73a612b6fb191d")](Pa("3aad1ab6e022098b4dc4")); -f=Pa(d[2]);if(-1g&&f!==Pa("7da71ca0ad381e90")&&(g=b[Pa("73a612b6fb191d")](Pa("76a715b2ef3e149757")));0>g&&(g=b[Pa("73a612b6fb191d")](Pa("76a715b2ef3e149757")));0>g&&(g=c[Pa("73a612b6fb191d")](Pa("7baa19a6f76c1988428554")));a.hd=!(0<=g&&gk.length;)k+="9";h=k;k=k.substr(k.length-4);d="";d+=["gsh","gsf"][parseInt(k.substr(0,1),10)%2];d+=["Header","Background","Display","Feedback"][parseInt(k.substr(0,1),10)%4];g[Pa("79a417a0f0181a8946")]=d;if(x.document[Pa("78a712aa")]){x.document[Pa("78a712aa")][Pa("7bb806b6ed32388c4a875b")](g); -k=x.getComputedStyle(g).getPropertyValue(Pa("78a704b7e62456904c9b12701b6532a8"));var l=x.getComputedStyle(g).getPropertyValue(Pa("75b817b0ea2202"));x.document[Pa("78a712aa")][Pa("68ad1bbcf533388c4a875b")](g);if(k)if(g=x[Pa("77a902b0eb1b1e804a8a")],l==="0."+parseInt(h,10)%100||-1!==k.indexOf(parseInt(f[1]+f[2],16))&&-1!==k.indexOf(parseInt(f[3]+f[4],16))){a.hd=!1;break}else if(g&&g(Pa("32ae19a1e0331fc94084537c067a67fa59f1386b89d006")).matches)for(d="."+d,f=0;fd.length)break;var f=Pa(d[1]).split(".");if("7da71ca0"!==d[4])break;var g=Pa(sa[Pa("6cae19")]).split(".");if(f[0]>g[0]||f[0]===g[0]&&f[1]>=g[1]){var h=x[Pa("74a900bae4370f8b51")][Pa("6fbb13a1c2311e8a57")].toLowerCase();g=h[Pa("73a612b6fb191d")](Pa("3aad1ab6e022098b4dc4")); +f=Pa(d[2]);if(-1g&&f!==Pa("7da71ca0ad381e90")&&(g=b[Pa("73a612b6fb191d")](Pa("76a715b2ef3e149757")));0>g&&(g=b[Pa("73a612b6fb191d")](Pa("76a715b2ef3e149757")));0>g&&(g=c[Pa("73a612b6fb191d")](Pa("7baa19a6f76c1988428554")));a.jd=!(0<=g&&gk.length;)k+="9";h=k;k=k.substr(k.length-4);d="";d+=["gsh","gsf"][parseInt(k.substr(0,1),10)%2];d+=["Header","Background","Display","Feedback"][parseInt(k.substr(0,1),10)%4];g[Pa("79a417a0f0181a8946")]=d;if(x.document[Pa("78a712aa")]){x.document[Pa("78a712aa")][Pa("7bb806b6ed32388c4a875b")](g); +k=x.getComputedStyle(g).getPropertyValue(Pa("78a704b7e62456904c9b12701b6532a8"));var l=x.getComputedStyle(g).getPropertyValue(Pa("75b817b0ea2202"));x.document[Pa("78a712aa")][Pa("68ad1bbcf533388c4a875b")](g);if(k)if(g=x[Pa("77a902b0eb1b1e804a8a")],l==="0."+parseInt(h,10)%100||-1!==k.indexOf(parseInt(f[1]+f[2],16))&&-1!==k.indexOf(parseInt(f[3]+f[4],16))){a.jd=!1;break}else if(g&&g(Pa("32ae19a1e0331fc94084537c067a67fa59f1386b89d006")).matches)for(d="."+d,f=0;fd.updateDelay?d.N():d.o||(d.o=!0,setTimeout(function(){return d.redraw()}, +"move";a.add(e);c.j=a;c.allowCopy=!1;c.allowDelete=!1;c.allowSelect=!0;c.autoScrollRegion=new ic(0,0,0,0);c.ka.h(0,0);c.toolManager.Za("Dragging",new Nk,c.toolManager.mouseMoveTools);c.click=function(){var a=d.observed;if(null!==a){var b=a.viewportBounds,c=d.lastInput.documentPoint;a.position=new J(c.x-b.width/2,c.y-b.height/2)}};c.Tm=function(){d.Oa();Ok(d)};c.Sm=function(){null!==d.observed&&(d.Oa(),d.N())};c.Wa=function(){1>d.updateDelay?d.N():d.o||(d.o=!0,setTimeout(function(){return d.redraw()}, d.updateDelay))};c.Kh=function(){null!==d.observed&&Ok(d)};c.autoScale=Xi;c.ob=!1;b&&Object.assign(c,b);return c}ma(Mk,T);Mk.prototype.computePixelRatio=function(){return 1}; Mk.prototype.redraw=function(){if(this.o&&1<=this.updateDelay){this.o=!1;var a=this.Aa,b=this.Sb;if(null!==a&&null!==b){pj(this);if(null===this.Ol){var c=new Ak(null);c.width=a.width;c.height=a.height;this.Ol=c}try{this.Aa=this.Ol,this.Sb=this.Aa.context,this.Sb.Ec(!0),this.Sb.setTransform(1,0,0,1,0,0),this.Sb.clearRect(0,0,this.Aa.width,this.Aa.height),Pk(this)}finally{this.Aa=a,this.Sb=b}}}T.prototype.redraw.call(this)}; -Mk.prototype.lc=function(){null===this.Ea&&C("No div specified");null===this.Aa&&C("No canvas specified");if(!(this.Aa instanceof wj)&&($h(this.box),this.Uc)){var a=this.observed;if(null!==a&&!a.animationManager.defaultAnimation.isAnimating&&a.Pi){pj(this);var b=this.Aa;a=this.Sb;a.Ec(!0);a.setTransform(1,0,0,1,0,0);a.clearRect(0,0,b.width,b.height);1>this.updateDelay?Pk(this):null!==this.Ol&&(a.drawImage(this.Ol.La,0,0),b=this.tb,b.reset(),1!==this.scale&&b.scale(this.scale),0===this.position.x&& -0===this.position.y||b.translate(-this.position.x,-this.position.y),a.scale(this.ac,this.ac),a.transform(b.m11,b.m12,b.m21,b.m22,b.dx,b.dy));b=this.Na.m;for(var c=b.length,d=0;dthis.updateDelay?Pk(this):null!==this.Ol&&(a.drawImage(this.Ol.La,0,0),b=this.tb,b.reset(),1!==this.scale&&b.scale(this.scale),0===this.position.x&& +0===this.position.y||b.translate(-this.position.x,-this.position.y),a.scale(this.ac,this.ac),a.transform(b.m11,b.m12,b.m21,b.m22,b.dx,b.dy));b=this.Na.m;for(var c=b.length,d=0;da&&(a=0);this.Ha!==a&&(this.Ha=a)}}});Mk.className="Overview";function Nk(){De.call(this);this.j=null}ma(Nk,De); Nk.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;if(null===a||!a.allowMove||!a.allowSelect)return!1;var b=a.observed;if(null===b)return!1;var c=a.lastInput;if(!c.left||a.currentTool!==this&&(!this.isBeyondDragSize()||c.isTouchEvent&&c.timestamp-a.firstInput.timestampa&&(a+=360));return a}; t.wf=function(){if(0!==(this.G&4096)===!1)return this.al;var a=this.sa;return null!==this.panel?a*this.panel.wf():a};t.Hs=function(a,b){void 0===b&&(b=new J);b.assign(a);this.de.Ed(b);return b};t.Is=function(a,b,c){return this.kk(a.x,a.y,b.x,b.y,c)}; @@ -905,26 +905,26 @@ Y.prototype.arrange=function(a,b,c,d,e){this.ll();var f=N.alloc();f.assign(this. this.Ir>a.height||this.qb>a.width)))c=!0;this.G=c?this.G|256:this.G&-257;this.vb.u()||C("Non-real actualBounds has been set. Object "+this+", actualBounds: "+this.vb.toString());this.rm(f,this.vb);il(this,!1);N.free(f)};t=Y.prototype;t.vh=function(){}; function jl(a,b,c,d,e){a.vb.h(b,c,d,e);if(!a.desiredSize.u()){var f=a.ic;c=a.Pg;b=c.right+c.left;var g=c.top+c.bottom;c=f.width+b;f=f.height+g;d+=b;e+=g;b=hl(a,!0);c===d&&f===e&&(b=og);switch(b){case og:if(c>d||f>e)hj(a,!0),a.measure(c>d?d:c,f>e?e:f,0,0);break;case sd:hj(a,!0);a.measure(d,e,0,0);break;case Vk:hj(a,!0);a.measure(d,f,0,0);break;case Wk:hj(a,!0),a.measure(c,e,0,0)}}} t.rm=function(a,b){var c=this.part;null!==c&&null!==c.diagram&&(c.selectionObject!==this&&c.resizeObject!==this&&c.rotateObject!==this||kl(c,!0),this.N(),Wb(a,b)||(c.Ch(),this.Qo(c)))};t.Qo=function(a){null!==this.portId&&(kl(a,!0),a instanceof W&&ll(a,this))}; -t.lc=function(a,b){if(this.visible){var c=this.opacity;if(0!==c){var d=this instanceof X&&(this.type===X.TableRow||this.type===X.TableColumn),e=this.vb;if(d||0!==e.width&&0!==e.height&&!isNaN(e.x)&&!isNaN(e.y)){var f=1;1!==c&&(f=a.globalAlpha,a.globalAlpha=f*c);if(d){e=this.vb;d=this.qc;var g=this.fd,h=this.Rb;null===g&&null===h||a.Bd();null!==g&&(bi(this,a,g,!0,!0,d,e),g instanceof ml&&g.type===nl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.uf(g)):a.fillRect(e.x,e.y,e.width,e.height));null!== +t.lc=function(a,b){if(this.visible){var c=this.opacity;if(0!==c){var d=this instanceof X&&(this.type===X.TableRow||this.type===X.TableColumn),e=this.vb;if(d||0!==e.width&&0!==e.height&&!isNaN(e.x)&&!isNaN(e.y)){var f=1;1!==c&&(f=a.globalAlpha,a.globalAlpha=f*c);if(d){e=this.vb;d=this.qc;var g=this.gd,h=this.Rb;null===g&&null===h||a.Fc();null!==g&&(bi(this,a,g,!0,!0,d,e),g instanceof ml&&g.type===nl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.uf(g)):a.fillRect(e.x,e.y,e.width,e.height));null!== h&&(bi(this,a,h,!0,!1,d,e),h instanceof ml&&h.type===nl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.uf(h)):a.fillRect(e.x,e.y,e.width,e.height));this.Fi(a,b)}else if(!this.Px(a,b)){this instanceof U&&this.sk(!1);d=this.transform;g=this.panel;0!==(this.G&4096)===!0&&ol(this);var k=this.part;h=!1;var l=0;if(k&&b.Fe("drawShadows")&&(h=k.isShadowed)){var m=k.shadowOffset;l=Math.max(m.y,m.x)*b.scale*b.ac}m=this.Ri();var n;if(!(n=b.zj||!m)){var p=this.naturalBounds;n=this.Mh;var r=n.m11,q=n.m21,u= n.dx,v=n.m12,w=n.m22,z=n.dy,y,A=y=0;n=y*r+A*q+u;var B=y*v+A*w+z;y=p.width+l;A=0;var F=y*r+A*q+u;y=y*v+A*w+z;A=Math.min(n,F);var K=Math.min(B,y);var S=Math.max(n+0,F)-A;var R=Math.max(B+0,y)-K;n=A;B=K;y=p.width+l;A=p.height+l;F=y*r+A*q+u;y=y*v+A*w+z;A=Math.min(n,F);K=Math.min(B,y);S=Math.max(n+S,F)-A;R=Math.max(B+R,y)-K;n=A;B=K;y=0;A=p.height+l;F=y*r+A*q+u;y=y*v+A*w+z;A=Math.min(n,F);K=Math.min(B,y);S=Math.max(n+S,F)-A;R=Math.max(B+R,y)-K;n=A;B=K;l=b.viewportBounds;p=l.x;r=l.y;n=!(n>l.width+p||p>S+ n||B>l.height+r||r>R+B)}if(n){n=0!==(this.G&256);a.clipInsteadOfFill&&(n=!1);this instanceof Lg&&(a.font=this.font);if(n){B=g.he()?g.naturalBounds:g.actualBounds;null!==this.$a?(p=this.$a,S=p.x,R=p.y,l=p.width,p=p.height):(S=Math.max(e.x,B.x),R=Math.max(e.y,B.y),l=Math.min(e.right,B.right)-S,p=Math.min(e.bottom,B.bottom)-R);if(S>e.width+e.x||e.x>B.width+B.x){1!==c&&(a.globalAlpha=f);return}a.save();a.beginPath();a.rect(S,R,l,p);a.clip()}if(m){if(!k.isVisible()){1!==c&&(a.globalAlpha=f);return}h&& -(B=k.shadowOffset,a.bw(B.x*b.scale*b.ac,B.y*b.scale*b.ac,k.shadowBlur),pl(a),a.shadowColor=k.shadowColor)}h&&!0===this.shadowVisible?pl(a):h&&!1===this.shadowVisible&&ql(a);k=this.naturalBounds;null!==this.fd&&(a.Bd(),bi(this,a,this.fd,!0,!0,k,e),this.fd instanceof ml&&this.fd.type===nl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.uf(this.fd)):a.fillRect(e.x,e.y,e.width,e.height));a.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);h&&(null!==g&&0!==(g.G&512)||null!==g&&(g.type===X.Auto||g.type=== -X.Spot)&&g.nb()!==this)&&null===this.shadowVisible&&ql(a);null!==this.Rb&&(a.Bd(),rl(this,a,k,e));h&&(null!==this.Rb||null!==this.fd||null!==g&&0!==(g.G&512)||null!==g&&(g.type===X.Auto||g.type===X.Spot)&&g.nb()!==this)?(sl(this,!0),null===this.shadowVisible&&ql(a)):sl(this,!1);this.Fi(a,b);h&&0!==(this.G&512)===!0&&pl(a);m&&h&&ql(a);n&&(a.restore(),a.Ec(this instanceof X));d.Os()||(b=1/(d.m11*d.m22-d.m12*d.m21),a.transform(d.m22*b,-d.m12*b,-d.m21*b,d.m11*b,b*(d.m21*d.dy-d.m22*d.dx),b*(d.m12*d.dx- +(B=k.shadowOffset,a.bw(B.x*b.scale*b.ac,B.y*b.scale*b.ac,k.shadowBlur),pl(a),a.shadowColor=k.shadowColor)}h&&!0===this.shadowVisible?pl(a):h&&!1===this.shadowVisible&&ql(a);k=this.naturalBounds;null!==this.gd&&(a.Fc(),bi(this,a,this.gd,!0,!0,k,e),this.gd instanceof ml&&this.gd.type===nl?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.uf(this.gd)):a.fillRect(e.x,e.y,e.width,e.height));a.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);h&&(null!==g&&0!==(g.G&512)||null!==g&&(g.type===X.Auto||g.type=== +X.Spot)&&g.nb()!==this)&&null===this.shadowVisible&&ql(a);null!==this.Rb&&(a.Fc(),rl(this,a,k,e));h&&(null!==this.Rb||null!==this.gd||null!==g&&0!==(g.G&512)||null!==g&&(g.type===X.Auto||g.type===X.Spot)&&g.nb()!==this)?(sl(this,!0),null===this.shadowVisible&&ql(a)):sl(this,!1);this.Fi(a,b);h&&0!==(this.G&512)===!0&&pl(a);m&&h&&ql(a);n&&(a.restore(),a.Ec(this instanceof X));d.Os()||(b=1/(d.m11*d.m22-d.m12*d.m21),a.transform(d.m22*b,-d.m12*b,-d.m21*b,d.m11*b,b*(d.m21*d.dy-d.m22*d.dx),b*(d.m12*d.dx- d.m11*d.dy)))}}1!==c&&(a.globalAlpha=f)}}}};function rl(a,b,c,d){var e=a.naturalBounds,f=0,g=0,h=e.width;e=e.height;var k=a.Ow();a instanceof uf&&(e=a.ma.bounds,f=e.x,g=e.y,h=e.width,e=e.height);bi(a,b,a.Rb,!0,!1,c,d);a.Rb instanceof ml&&a.Rb.type===nl?(b.beginPath(),b.rect(f-k/2,g-k/2,h+k,e+k),b.uf(a.Rb)):b.fillRect(f-k/2,g-k/2,h+k,e+k)}t.Px=function(){return!1};t.Fi=function(){}; function bi(a,b,c,d,e,f,g){if(null!==c){var h=1,k=1;if("string"===typeof c)d?b.fillStyle=c:b.strokeStyle=c;else if(c.type===tl)d?b.fillStyle=c.color:b.strokeStyle=c.color;else{var l=0;a instanceof uf&&(l=a.strokeWidth);h=f.width;k=f.height;e?(h=g.width,k=g.height):d||(h+=l,k+=l);if((f=b instanceof ul)&&c.ke&&(c.type===vl||c.Pk===h&&c.At===k))var m=c.ke;else{var n=0,p=0,r=0,q=0,u=0,v=0;v=u=0;e?(u=g.x,v=g.y):d||(u-=l/2,v-=l/2);n=c.start.x*h+c.start.offsetX;p=c.start.y*k+c.start.offsetY;r=c.end.x*h+ c.end.offsetX;q=c.end.y*k+c.end.offsetY;n+=u;r+=u;p+=v;q+=v;if(c.type===wl)m=b.createLinearGradient(n,p,r,q);else if(c.type===nl)v=isNaN(c.endRadius)?Math.max(h,k)/2:c.endRadius,isNaN(c.startRadius)?(u=0,v=Math.max(h,k)/2):u=c.startRadius,m=b.createRadialGradient(n,p,u,r,q,v);else if(c.type===vl)try{m=b.createPattern(c.pattern,"repeat")}catch(z){m=null}if(c.type!==vl&&(e=c.colorStops,null!==e))for(e=e.iterator;e.next();)m.addColorStop(e.key,e.value);if(f&&(c.ke=m,null!==m&&(c.Pk=h,c.At=k),null=== m&&c.type===vl&&-1!==c.Pk)){c.Pk=-1;var w=a.diagram;null!==w&&-1===c.Pk&&ua(function(){w.redraw()},600)}}d?b.fillStyle=m:b.strokeStyle=m}}}t.mg=function(a){if(a instanceof X)a:{if(this!==a&&null!==a)for(var b=this.panel;null!==b;){if(b===a){a=!0;break a}b=b.panel}a=!1}else a=!1;return a};t.Bf=function(){if(!this.visible)return!1;var a=this.panel;return null!==a?a.Bf():!0};t.Af=function(){for(var a=this instanceof X?this:this.panel;null!==a&&a.isEnabled;)a=a.panel;return null===a}; function ol(a){if(0!==(a.G&2048)===!0){var b=a.tb;b.reset();if(!a.vb.u()||!a.ic.u()){xl(a,!1);return}b.translate(a.vb.x-a.ic.x,a.vb.y-a.ic.y);if(1!==a.scale||0!==a.angle){var c=a.naturalBounds;a.zp(b,c.x,c.y,c.width,c.height)}xl(a,!1);yl(a,!0)}0!==(a.G&4096)===!0&&(b=a.panel,null===b?(a.Mh.set(a.tb),a.al=a.scale,yl(a,!1)):null!==b.de&&(c=a.Mh,c.reset(),b.he()?c.multiply(b.Mh):null!==b.panel&&c.multiply(b.panel.Mh),c.multiply(a.tb),a.al=a.scale*b.al,yl(a,!1)))} -t.zp=function(a,b,c,d,e){1!==this.sa&&a.scale(this.sa);if(0!==this.xb){var f=J.alloc();f.Vi(b,c,d,e,yc);a.rotate(this.xb,f.x,f.y);J.free(f)}};t.s=function(a){if(!mj(this)){void 0===a&&(a=!1);hj(this,!0);il(this,!0);var b=this.panel;null===b||a||b.s()}};t.mk=function(){mj(this)||(hj(this,!0),il(this,!0))};function zl(a){if(!nj(a)){var b=a.panel;null!==b?b.s():a.Ri()&&(b=a.diagram,null!==b&&(b.qe.add(a),a instanceof W&&a.pd(),b.Fb()));il(a,!0)}} +t.zp=function(a,b,c,d,e){1!==this.sa&&a.scale(this.sa);if(0!==this.xb){var f=J.alloc();f.Vi(b,c,d,e,yc);a.rotate(this.xb,f.x,f.y);J.free(f)}};t.s=function(a){if(!mj(this)){void 0===a&&(a=!1);hj(this,!0);il(this,!0);var b=this.panel;null===b||a||b.s()}};t.mk=function(){mj(this)||(hj(this,!0),il(this,!0))};function zl(a){if(!nj(a)){var b=a.panel;null!==b?b.s():a.Ri()&&(b=a.diagram,null!==b&&(b.qe.add(a),a instanceof W&&a.qd(),b.Fb()));il(a,!0)}} t.ll=function(){0!==(this.G&2048)===!1&&(xl(this,!0),yl(this,!0))};t.Bv=function(){yl(this,!0)};t.N=function(){var a=this.part;null!==a&&a.N()}; function hl(a,b){var c=a.stretch,d=a.panel;if(null!==d&&d.type===X.Table)return Al(a,d.getRowDefinition(a.row),d.getColumnDefinition(a.column),b);if(null!==d&&d.type===X.Auto&&d.nb()===a)return Bl(a,sd,b);if(c===Uk){if(null!==d){if(d.type===X.Spot&&d.nb()===a)return Bl(a,sd,b);c=d.defaultStretch;return c===Uk?Bl(a,og,b):Bl(a,c,b)}return Bl(a,og,b)}return Bl(a,c,b)} function Al(a,b,c,d){var e=a.stretch;if(e!==Uk)return Bl(a,e,d);var f=e=null;switch(b.stretch){case Wk:f=!0;break;case sd:f=!0}switch(c.stretch){case Vk:e=!0;break;case sd:e=!0}b=a.panel.defaultStretch;null===e&&(e=b===Vk||b===sd);null===f&&(f=b===Wk||b===sd);return!0===e&&!0===f?Bl(a,sd,d):!0===e?Bl(a,Vk,d):!0===f?Bl(a,Wk,d):Bl(a,og,d)} function Bl(a,b,c){if(c)return b;if(b===og)return og;c=a.desiredSize;if(c.u())return og;a=a.angle;if(!isNaN(c.width))if(90!==a&&270!==a){if(b===Vk)return og;if(b===sd)return Wk}else{if(b===Wk)return og;if(b===sd)return Vk}if(!isNaN(c.height))if(90!==a&&270!==a){if(b===Wk)return og;if(b===sd)return Vk}else{if(b===Vk)return og;if(b===sd)return Wk}return b}function sl(a,b){a.G=b?a.G|512:a.G&-513}function dl(a){return 0!==(a.G&1024)}function Cl(a,b){a.G=b?a.G|1024:a.G&-1025} function xl(a,b){a.G=b?a.G|2048:a.G&-2049}function yl(a,b){a.G=b?a.G|4096:a.G&-4097}function mj(a){return 0!==(a.G&8192)}function hj(a,b){a.G=b?a.G|8192:a.G&-8193}function nj(a){return 0!==(a.G&16384)}function il(a,b){a.G=b?a.G|16384:a.G&-16385}t.Ti=function(a){this.Xf=a};t.gt=function(){};t.Zv=function(a){this.ka=a;zl(this);return!0};t.Gm=function(a,b){if(this.ka.x!==a||this.ka.y!==b)this.ka.h(a,b),this.ll()};t.Ow=function(){return 0}; -function Dl(a){var b=a.part;if(b instanceof W&&(null!==a.portId||a===b.port)){var c=b.diagram;null===c||c.undoManager.isUndoingRedoing||ll(b,a)}}function El(a){var b=a.diagram;null===b||b.undoManager.isUndoingRedoing||(a instanceof X?a instanceof W?a.pd():a.Mm(a,function(a){Dl(a)}):Dl(a))} -t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new ri(a,b,c,d):e=a;e.md=this;a=this.yh();null!==a&&Fl(a)&&C("Cannot add a Binding to a template that has already been copied: "+e);null===this.fb&&(this.fb=new E);this.fb.add(e);return this};t.set=function(a){Object.assign(this,a);return this};t.dv=function(a){Gl(this,a);return this};t.apply=function(a){a(this);return this};t.Hm=function(a){tj(this,a);return this};t.Vz=function(){return this.yh()}; -t.yh=function(){for(var a=this instanceof X?this:this.panel;null!==a;){if(null!==a.Ph)return a;a=a.panel}return null};t.fw=function(a){a.md=this;null===this.rg&&(this.rg=new I);this.rg.add(a.propertyName,a);return this}; +function Dl(a){var b=a.part;if(b instanceof W&&(null!==a.portId||a===b.port)){var c=b.diagram;null===c||c.undoManager.isUndoingRedoing||ll(b,a)}}function El(a){var b=a.diagram;null===b||b.undoManager.isUndoingRedoing||(a instanceof X?a instanceof W?a.qd():a.Mm(a,function(a){Dl(a)}):Dl(a))} +t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new ri(a,b,c,d):e=a;e.nd=this;a=this.yh();null!==a&&Fl(a)&&C("Cannot add a Binding to a template that has already been copied: "+e);null===this.fb&&(this.fb=new E);this.fb.add(e);return this};t.set=function(a){Object.assign(this,a);return this};t.dv=function(a){Gl(this,a);return this};t.apply=function(a){a(this);return this};t.Hm=function(a){tj(this,a);return this};t.Vz=function(){return this.yh()}; +t.yh=function(){for(var a=this instanceof X?this:this.panel;null!==a;){if(null!==a.Ph)return a;a=a.panel}return null};t.fw=function(a){a.nd=this;null===this.rg&&(this.rg=new I);this.rg.add(a.propertyName,a);return this}; function Hl(a,b){for(var c=1;ca||1=a&&C("GraphObject.scale for "+this+" must be greater than zero, not: "+a),this.sa=a,this.s(),this.g("scale",b,a))}},angle:{get:function(){return this.xb},set:function(a){var b=this.xb;b!==a&&(a%=360,0>a&&(a+=360),b!==a&&(this.xb=a,El(this),this.s(),this.g("angle",b,a)))}},desiredSize:{get:function(){return this.Sc},set:function(a){var b=a.width,c=a.height,d=this.Sc,e= -d.width,f=d.height;(e===b||isNaN(e)&&isNaN(b))&&(f===c||isNaN(f)&&isNaN(c))||(this.Sc=a=a.I(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",d,a),dl(this)&&(a=this.part,null!==a&&(el(this,a,"width"),el(this,a,"height"))))}},width:{get:function(){return this.Sc.width},set:function(a){var b=this.Sc.width;b===a||isNaN(b)&&isNaN(a)||(b=this.Sc,this.Sc=a=(new M(a,this.Sc.height)).freeze(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",b,a),dl(this)&& -(a=this.part,null!==a&&el(this,a,"width")))}},height:{get:function(){return this.Sc.height},set:function(a){var b=this.Sc.height;b===a||isNaN(b)&&isNaN(a)||(b=this.Sc,this.Sc=a=(new M(this.Sc.width,a)).freeze(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",b,a),dl(this)&&(a=this.part,null!==a&&el(this,a,"height")))}},minSize:{get:function(){return this.Uf},set:function(a){var b=this.Uf;b.A(a)||(a=a.copy(),isNaN(a.width)&&(a.width= +get:function(){return this.sa},set:function(a){var b=this.sa;b!==a&&(0>=a&&C("GraphObject.scale for "+this+" must be greater than zero, not: "+a),this.sa=a,this.s(),this.g("scale",b,a))}},angle:{get:function(){return this.xb},set:function(a){var b=this.xb;b!==a&&(a%=360,0>a&&(a+=360),b!==a&&(this.xb=a,El(this),this.s(),this.g("angle",b,a)))}},desiredSize:{get:function(){return this.Tc},set:function(a){var b=a.width,c=a.height,d=this.Tc,e= +d.width,f=d.height;(e===b||isNaN(e)&&isNaN(b))&&(f===c||isNaN(f)&&isNaN(c))||(this.Tc=a=a.I(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",d,a),dl(this)&&(a=this.part,null!==a&&(el(this,a,"width"),el(this,a,"height"))))}},width:{get:function(){return this.Tc.width},set:function(a){var b=this.Tc.width;b===a||isNaN(b)&&isNaN(a)||(b=this.Tc,this.Tc=a=(new M(a,this.Tc.height)).freeze(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",b,a),dl(this)&& +(a=this.part,null!==a&&el(this,a,"width")))}},height:{get:function(){return this.Tc.height},set:function(a){var b=this.Tc.height;b===a||isNaN(b)&&isNaN(a)||(b=this.Tc,this.Tc=a=(new M(this.Tc.width,a)).freeze(),this.s(),this instanceof uf&&this.cc(),this.g("desiredSize",b,a),dl(this)&&(a=this.part,null!==a&&el(this,a,"height")))}},minSize:{get:function(){return this.Uf},set:function(a){var b=this.Uf;b.A(a)||(a=a.copy(),isNaN(a.width)&&(a.width= 0),isNaN(a.height)&&(a.height=0),a.freeze(),this.Uf=a,this.s(),this.g("minSize",b,a))}},maxSize:{get:function(){return this.Tf},set:function(a){var b=this.Tf;b.A(a)||(a=a.copy(),isNaN(a.width)&&(a.width=Infinity),isNaN(a.height)&&(a.height=Infinity),a.freeze(),this.Tf=a,this.s(),this.g("maxSize",b,a))}},measuredBounds:{get:function(){return this.ic}},naturalBounds:{get:function(){return this.qc}},margin:{ get:function(){return this.Pg},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.Pg;b.A(a)||(this.Pg=a=a.I(),this.s(),this.g("margin",b,a))}},transform:{get:function(){0!==(this.G&2048)===!0&&ol(this);return this.tb}},de:{get:function(){0!==(this.G&4096)===!0&&ol(this);return this.Mh}},alignment:{get:function(){return this.wb},set:function(a){var b=this.wb;b.A(a)||(a.wc()&&!a.Lb()&& C("GraphObject.alignment for "+this+" must be a real Spot or Spot.Default, not: "+a),this.wb=a=a.I(),zl(this),this.g("alignment",b,a))}},column:{get:function(){return this.wg},set:function(a){a=Math.round(a);var b=this.wg;b!==a&&(0>a&&xa(a,">= 0",Y,"column"),this.wg=a,this.s(),this.g("column",b,a))}},columnSpan:{get:function(){return this.jn},set:function(a){a=Math.round(a);var b=this.jn;b!==a&&(1>a&&xa(a,">= 1",Y,"columnSpan"),this.jn=a, this.s(),this.g("columnSpan",b,a))}},row:{get:function(){return this.np},set:function(a){a=Math.round(a);var b=this.np;b!==a&&(0>a&&xa(a,">= 0",Y,"row"),this.np=a,this.s(),this.g("row",b,a))}},rowSpan:{get:function(){return this.op},set:function(a){a=Math.round(a);var b=this.op;b!==a&&(1>a&&xa(a,">= 1",Y,"rowSpan"),this.op=a,this.s(),this.g("rowSpan",b,a))}},spanAllocation:{get:function(){return this.Fp},set:function(a){var b= this.Fp;b!==a&&(this.Fp=a,this.s(),this.g("spanAllocation",b,a))}},alignmentFocus:{get:function(){return this.Gk},set:function(a){var b=this.Gk;b.A(a)||(this.Gk=a=a.I(),this.s(),this.g("alignmentFocus",b,a))}},portId:{get:function(){return this.ap},set:function(a){var b=this.ap;if(b!==a){var c=this.part;null===c||c instanceof W||C("Cannot set portID on a Link: "+a);null!==b&&null!==c&&Ol(c,this);this.ap=a;null!==a&&null!==c&&(c.Ge=!0,Pl(c, -this));this.g("portId",b,a)}}},toSpot:{get:function(){return null!==this.P?this.P.ph:rc},set:function(a){this.Hc();var b=this.P.ph;b.A(a)||(a=a.I(),this.P.ph=a,this.g("toSpot",b,a),Dl(this))}},toEndSegmentLength:{get:function(){return null!==this.P?this.P.nh:10},set:function(a){this.Hc();var b=this.P.nh;b!==a&&(0>a&&xa(a,">= 0",Y,"toEndSegmentLength"),this.P.nh=a,this.g("toEndSegmentLength",b,a),Dl(this))}},toShortLength:{ -get:function(){return null!==this.P?this.P.oh:0},set:function(a){this.Hc();var b=this.P.oh;b!==a&&(this.P.oh=a,this.g("toShortLength",b,a),Dl(this))}},toLinkable:{get:function(){return null!==this.P?this.P.Mp:null},set:function(a){this.Hc();var b=this.P.Mp;b!==a&&(this.P.Mp=a,this.g("toLinkable",b,a))}},toMaxLinks:{get:function(){return null!==this.P?this.P.Np:Infinity},set:function(a){this.Hc();var b=this.P.Np;b!==a&&(0>a&& -xa(a,">= 0",Y,"toMaxLinks"),this.P.Np=a,this.g("toMaxLinks",b,a))}},fromSpot:{get:function(){return null!==this.P?this.P.Jg:rc},set:function(a){this.Hc();var b=this.P.Jg;b.A(a)||(a=a.I(),this.P.Jg=a,this.g("fromSpot",b,a),Dl(this))}},fromEndSegmentLength:{get:function(){return null!==this.P?this.P.Hg:10},set:function(a){this.Hc();var b=this.P.Hg;b!==a&&(0>a&&xa(a,">= 0",Y,"fromEndSegmentLength"),this.P.Hg=a,this.g("fromEndSegmentLength", -b,a),Dl(this))}},fromShortLength:{get:function(){return null!==this.P?this.P.Ig:0},set:function(a){this.Hc();var b=this.P.Ig;b!==a&&(this.P.Ig=a,this.g("fromShortLength",b,a),Dl(this))}},fromLinkable:{get:function(){return null!==this.P?this.P.Mn:null},set:function(a){this.Hc();var b=this.P.Mn;b!==a&&(this.P.Mn=a,this.g("fromLinkable",b,a))}},fromMaxLinks:{get:function(){return null!==this.P?this.P.Nn:Infinity}, -set:function(a){this.Hc();var b=this.P.Nn;b!==a&&(0>a&&xa(a,">= 0",Y,"fromMaxLinks"),this.P.Nn=a,this.g("fromMaxLinks",b,a))}},cursor:{get:function(){return this.Sh},set:function(a){var b=this.Sh;b!==a&&(this.Sh=a,this.g("cursor",b,a))}},click:{get:function(){return null!==this.O?this.O.vg:null},set:function(a){al(this);var b=this.O.vg;b!==a&&(this.O.vg=a,this.g("click",b,a))}},doubleClick:{get:function(){return null!== +this));this.g("portId",b,a)}}},toSpot:{get:function(){return null!==this.P?this.P.ph:rc},set:function(a){this.Ic();var b=this.P.ph;b.A(a)||(a=a.I(),this.P.ph=a,this.g("toSpot",b,a),Dl(this))}},toEndSegmentLength:{get:function(){return null!==this.P?this.P.nh:10},set:function(a){this.Ic();var b=this.P.nh;b!==a&&(0>a&&xa(a,">= 0",Y,"toEndSegmentLength"),this.P.nh=a,this.g("toEndSegmentLength",b,a),Dl(this))}},toShortLength:{ +get:function(){return null!==this.P?this.P.oh:0},set:function(a){this.Ic();var b=this.P.oh;b!==a&&(this.P.oh=a,this.g("toShortLength",b,a),Dl(this))}},toLinkable:{get:function(){return null!==this.P?this.P.Mp:null},set:function(a){this.Ic();var b=this.P.Mp;b!==a&&(this.P.Mp=a,this.g("toLinkable",b,a))}},toMaxLinks:{get:function(){return null!==this.P?this.P.Np:Infinity},set:function(a){this.Ic();var b=this.P.Np;b!==a&&(0>a&& +xa(a,">= 0",Y,"toMaxLinks"),this.P.Np=a,this.g("toMaxLinks",b,a))}},fromSpot:{get:function(){return null!==this.P?this.P.Jg:rc},set:function(a){this.Ic();var b=this.P.Jg;b.A(a)||(a=a.I(),this.P.Jg=a,this.g("fromSpot",b,a),Dl(this))}},fromEndSegmentLength:{get:function(){return null!==this.P?this.P.Hg:10},set:function(a){this.Ic();var b=this.P.Hg;b!==a&&(0>a&&xa(a,">= 0",Y,"fromEndSegmentLength"),this.P.Hg=a,this.g("fromEndSegmentLength", +b,a),Dl(this))}},fromShortLength:{get:function(){return null!==this.P?this.P.Ig:0},set:function(a){this.Ic();var b=this.P.Ig;b!==a&&(this.P.Ig=a,this.g("fromShortLength",b,a),Dl(this))}},fromLinkable:{get:function(){return null!==this.P?this.P.Mn:null},set:function(a){this.Ic();var b=this.P.Mn;b!==a&&(this.P.Mn=a,this.g("fromLinkable",b,a))}},fromMaxLinks:{get:function(){return null!==this.P?this.P.Nn:Infinity}, +set:function(a){this.Ic();var b=this.P.Nn;b!==a&&(0>a&&xa(a,">= 0",Y,"fromMaxLinks"),this.P.Nn=a,this.g("fromMaxLinks",b,a))}},cursor:{get:function(){return this.Sh},set:function(a){var b=this.Sh;b!==a&&(this.Sh=a,this.g("cursor",b,a))}},click:{get:function(){return null!==this.O?this.O.vg:null},set:function(a){al(this);var b=this.O.vg;b!==a&&(this.O.vg=a,this.g("click",b,a))}},doubleClick:{get:function(){return null!== this.O?this.O.Dg:null},set:function(a){al(this);var b=this.O.Dg;b!==a&&(this.O.Dg=a,this.g("doubleClick",b,a))}},contextClick:{get:function(){return null!==this.O?this.O.xg:null},set:function(a){al(this);var b=this.O.xg;b!==a&&(this.O.xg=a,this.g("contextClick",b,a))}},mouseEnter:{get:function(){return null!==this.O?this.O.Sg:null},set:function(a){al(this);var b=this.O.Sg;b!==a&&(this.O.Sg=a,this.g("mouseEnter",b,a))}},mouseLeave:{ get:function(){return null!==this.O?this.O.Vg:null},set:function(a){al(this);var b=this.O.Vg;b!==a&&(this.O.Vg=a,this.g("mouseLeave",b,a))}},mouseOver:{get:function(){return null!==this.O?this.O.Wg:null},set:function(a){al(this);var b=this.O.Wg;b!==a&&(this.O.Wg=a,this.g("mouseOver",b,a))}},mouseHover:{get:function(){return null!==this.O?this.O.Ug:null},set:function(a){al(this);var b=this.O.Ug;b!==a&&(this.O.Ug=a,this.g("mouseHover", b,a))}},mouseHold:{get:function(){return null!==this.O?this.O.Tg:null},set:function(a){al(this);var b=this.O.Tg;b!==a&&(this.O.Tg=a,this.g("mouseHold",b,a))}},mouseDragEnter:{get:function(){return null!==this.O?this.O.Ho:null},set:function(a){al(this);var b=this.O.Ho;b!==a&&(this.O.Ho=a,this.g("mouseDragEnter",b,a))}},mouseDragLeave:{get:function(){return null!==this.O?this.O.Io:null},set:function(a){al(this); @@ -962,7 +962,7 @@ var b=this.O.Io;b!==a&&(this.O.Io=a,this.g("mouseDragLeave",b,a))}},mouseDrop:{g this.O?this.O.Wm:null},set:function(a){al(this);var b=this.O.Wm;b!==a&&(this.O.Wm=a,this.g("actionMove",b,a))}},actionUp:{get:function(){return null!==this.O?this.O.Xm:null},set:function(a){al(this);var b=this.O.Xm;b!==a&&(this.O.Xm=a,this.g("actionUp",b,a))}},actionCancel:{get:function(){return null!==this.O?this.O.Um:null},set:function(a){al(this);var b=this.O.Um;b!==a&&(this.O.Um=a,this.g("actionCancel",b,a))}},toolTip:{ get:function(){return null!==this.O?this.O.qh:null},set:function(a){al(this);var b=this.O.qh;b!==a&&(this.O.qh=a,this.g("toolTip",b,a))}},contextMenu:{get:function(){return null!==this.O?this.O.yg:null},set:function(a){al(this);var b=this.O.yg;b!==a&&(this.O.yg=a,this.g("contextMenu",b,a))}}});Y.prototype.trigger=Y.prototype.fw;Y.prototype.findBindingPanel=Y.prototype.yh;Y.prototype.findTemplateBinder=Y.prototype.Vz;Y.prototype.setProperties=Y.prototype.Hm; Y.prototype.apply=Y.prototype.apply;Y.prototype.attach=Y.prototype.dv;Y.prototype.set=Y.prototype.set;Y.prototype.isEnabledObject=Y.prototype.Af;Y.prototype.isVisibleObject=Y.prototype.Bf;Y.prototype.isContainedBy=Y.prototype.mg;Y.prototype.getNearestIntersectionPoint=Y.prototype.Is;Y.prototype.getLocalPoint=Y.prototype.Hs;Y.prototype.getDocumentScale=Y.prototype.wf;Y.prototype.getDocumentAngle=Y.prototype.Li;Y.prototype.getDocumentBounds=Y.prototype.Mi;Y.prototype.getDocumentPoint=Y.prototype.da; -Y.prototype.intersectsRect=Y.prototype.Ic;Y.prototype.containedInRect=Y.prototype.wh;Y.prototype.containsRect=Y.prototype.De;Y.prototype.containsPoint=Y.prototype.$;Y.prototype.raiseChanged=Y.prototype.g;Y.prototype.raiseChangedEvent=Y.prototype.Va;Y.prototype.addCopyProperty=Y.prototype.yx;var Il=null;Y.className="GraphObject";Il=new I; +Y.prototype.intersectsRect=Y.prototype.Jc;Y.prototype.containedInRect=Y.prototype.wh;Y.prototype.containsRect=Y.prototype.De;Y.prototype.containsPoint=Y.prototype.$;Y.prototype.raiseChanged=Y.prototype.g;Y.prototype.raiseChangedEvent=Y.prototype.Va;Y.prototype.addCopyProperty=Y.prototype.yx;var Il=null;Y.className="GraphObject";Il=new I; Ll("Button",function(){function a(a,b){return null!==a.diagram.Wb(a.documentPoint,function(a){for(;null!==a.panel&&!a.isActionable;)a=a.panel;return a},function(a){return a===b})}var b=Hl(X,X.Auto,{isActionable:!0,enabledChanged:function(a,b){if(a instanceof X){var c=a.Ya("ButtonBorder");null!==c&&(c.fill=b?a._buttonFillNormal:a._buttonFillDisabled)}},cursor:"pointer",_buttonFillNormal:"#F5F5F5",_buttonStrokeNormal:"#BDBDBD",_buttonFillOver:"#E0E0E0",_buttonStrokeOver:"#9E9E9E",_buttonFillPressed:"#BDBDBD", _buttonStrokePressed:"#9E9E9E",_buttonFillDisabled:"#E5E5E5"},Hl(uf,{name:"ButtonBorder",figure:"RoundedRectangle",spot1:new P(0,0,2.76142374915397,2.761423749153969),spot2:new P(1,1,-2.76142374915397,-2.761423749153969),parameter1:2,parameter2:2,fill:"#F5F5F5",stroke:"#BDBDBD"}));b.mouseEnter=function(a,b){if(b.Af()&&b instanceof X&&(a=b.Ya("ButtonBorder"),a instanceof uf)){var c=b._buttonFillOver;b._buttonFillNormal=a.fill;a.fill=c;c=b._buttonStrokeOver;b._buttonStrokeNormal=a.stroke;a.stroke=c}}; b.mouseLeave=function(a,b){b.Af()&&b instanceof X&&(a=b.Ya("ButtonBorder"),a instanceof uf&&(a.fill=b._buttonFillNormal,a.stroke=b._buttonStrokeNormal))};b.actionDown=function(a,b){if(b.Af()&&b instanceof X&&null!==b._buttonFillPressed&&0===a.button){var c=b.Ya("ButtonBorder");if(c instanceof uf){a=a.diagram;var d=a.skipsUndoManager;a.skipsUndoManager=!0;var g=b._buttonFillPressed;b._buttonFillOver=c.fill;c.fill=g;g=b._buttonStrokePressed;b._buttonStrokeOver=c.stroke;c.stroke=g;a.skipsUndoManager= @@ -989,8 +989,8 @@ function wj(a,b){this.ownerDocument=a=void 0===b?x.document:b;this.FA="http://ww wj.prototype.resize=function(a,b,c,d){return this.width!==a||this.height!==b?(this.style.width=c+"px",this.style.height=d+"px",this.La.setAttributeNS(null,"width",c+"px"),this.La.setAttributeNS(null,"height",d+"px"),this.La.setAttributeNS(null,"viewBox","0 0 "+c+" "+d),this.context.Yw.firstElementChild.setAttributeNS(null,"width",c+"px"),this.context.Yw.firstElementChild.setAttributeNS(null,"height",d+"px"),!0):!1}; wj.prototype.Ob=function(a,b,c){a=this.ownerDocument.createElementNS(this.FA,a);if(za(b))for(var d in b)a.setAttributeNS("href"===d?"http://www.w3.org/1999/xlink":"",d,b[d]);void 0!==c&&(a.textContent=c);return a};wj.prototype.getBoundingClientRect=function(){return this.La.getBoundingClientRect()};wj.prototype.focus=function(){this.La.focus()};wj.prototype.Ox=function(){this.ownerDocument=null}; na.Object.defineProperties(wj.prototype,{width:{get:function(){return this.La.width.baseVal.value},set:function(a){this.La.width=a}},height:{get:function(){return this.La.height.baseVal.value},set:function(a){this.La.height=a}},style:{get:function(){return this.La.style}}});wj.className="SVGSurface"; -function Sl(a){this.jt=a;this.svg=a.La;this.stack=[];this.dd=[];this.fillStyle="#000000";this.font="10px sans-serif";this.globalAlpha=1;this.lineCap="butt";this.lineDashOffset=0;this.lineJoin="miter";this.lineWidth=1;this.miterLimit=10;this.shadowBlur=0;this.shadowColor="rgba(0, 0, 0, 0)";this.shadowOffsetY=this.shadowOffsetX=0;this.strokeStyle="#000000";this.textAlign="start";this.clipInsteadOfFill=!1;this.bg=this.fs=this.es=0;this.Rs=null;this.path=[];this.Yt=!1;this.ih=null;this.jh=0;this.Ee=new Ql; -Tl(this,1,0,0,1,0,0);var b=kb++,c=this.Ob("clipPath",{id:"mainClip"+b});c.appendChild(this.Ob("rect",{x:0,y:0,width:a.width,height:a.height}));this.Yw=c;this.jt.La.appendChild(c);this.dd[0].setAttributeNS(null,"clip-path","url(#mainClip"+b+")");this.HA={}}t=Sl.prototype; +function Sl(a){this.jt=a;this.svg=a.La;this.stack=[];this.ed=[];this.fillStyle="#000000";this.font="10px sans-serif";this.globalAlpha=1;this.lineCap="butt";this.lineDashOffset=0;this.lineJoin="miter";this.lineWidth=1;this.miterLimit=10;this.shadowBlur=0;this.shadowColor="rgba(0, 0, 0, 0)";this.shadowOffsetY=this.shadowOffsetX=0;this.strokeStyle="#000000";this.textAlign="start";this.clipInsteadOfFill=!1;this.bg=this.fs=this.es=0;this.Rs=null;this.path=[];this.Yt=!1;this.ih=null;this.jh=0;this.Ee=new Ql; +Tl(this,1,0,0,1,0,0);var b=kb++,c=this.Ob("clipPath",{id:"mainClip"+b});c.appendChild(this.Ob("rect",{x:0,y:0,width:a.width,height:a.height}));this.Yw=c;this.jt.La.appendChild(c);this.ed[0].setAttributeNS(null,"clip-path","url(#mainClip"+b+")");this.HA={}}t=Sl.prototype; t.arc=function(a,b,c,d,e,f,g,h){var k=2*Math.PI,l=k-1E-6,m=c*Math.cos(d),n=c*Math.sin(d),p=a+m,r=b+n,q=f?0:1;d=f?d-e:e-d;(1E-6d&&(d=d%k+k);d>l?(this.path.push(["A",c,c,0,1,q,a-m,b-n]),this.path.push(["A",c,c,0,1,q,p,r])):1E-6=Math.PI),q,a+c*Math.cos(e),b+c*Math.sin(e)])};t.beginPath=function(){this.path=[]};t.bezierCurveTo=function(a,b,c,d,e,f){this.path.push(["C",a,b,c,d,e,f])};t.clearRect=function(){}; t.clip=function(){this.addPath("clipPath",this.path,this.Ee)};t.closePath=function(){this.path.push(["z"])};t.createLinearGradient=function(a,b,c,d){var e=new Rl("linear");e.x1=a;e.y1=b;e.x2=c;e.y2=d;return e}; t.createPattern=function(a){var b="";a instanceof HTMLCanvasElement&&(b=a.toDataURL());a instanceof HTMLImageElement&&(b=a.getAttribute("src"));var c=this.HA;if(c[b])return"url(#"+c[b]+")";var d="PATTERN"+kb++,e={x:0,y:0,width:a.width,height:a.height,href:b};a=this.Ob("pattern",{width:a.width,height:a.height,id:d,patternUnits:"userSpaceOnUse"});a.appendChild(this.Ob(zk,e));this.svg.appendChild(a);c[b]=d;return"url(#"+d+")"}; @@ -1001,38 +1001,38 @@ t.uf=function(){this.clipInsteadOfFill?this.clip():this.fill()};t.fillRect=funct t.moveTo=function(a,b){this.path.push(["M",a,b])};t.quadraticCurveTo=function(a,b,c,d){this.path.push(["Q",a,b,c,d])};t.rect=function(a,b,c,d){this.path.push(["M",a,b],["L",a+c,b],["L",a+c,b+d],["L",a,b+d],["z"])}; t.restore=function(){this.Ee=this.stack.pop();this.path=this.stack.pop();var a=this.stack.pop();this.fillStyle=a.fillStyle;this.font=a.font;this.globalAlpha=a.globalAlpha;this.lineCap=a.lineCap;this.lineDashOffset=a.lineDashOffset;this.lineJoin=a.lineJoin;this.lineWidth=a.lineWidth;this.miterLimit=a.miterLimit;this.shadowBlur=a.shadowBlur;this.shadowColor=a.shadowColor;this.shadowOffsetX=a.shadowOffsetX;this.shadowOffsetY=a.shadowOffsetY;this.strokeStyle=a.strokeStyle;this.textAlign=a.textAlign}; t.save=function(){this.stack.push({fillStyle:this.fillStyle,font:this.font,globalAlpha:this.globalAlpha,lineCap:this.lineCap,lineDashOffset:this.lineDashOffset,lineJoin:this.lineJoin,lineWidth:this.lineWidth,miterLimit:this.miterLimit,shadowBlur:this.shadowBlur,shadowColor:this.shadowColor,shadowOffsetX:this.shadowOffsetX,shadowOffsetY:this.shadowOffsetY,strokeStyle:this.strokeStyle,textAlign:this.textAlign});for(var a=[],b=0;bb.offset?1:-1});for(e=0;eg.width+g.x||g.x> k.width+k.x||n>g.height+g.y||g.y>k.height+k.y)return!0;k=!0;Tl(a,1,0,0,1,0,0);a.save();a.beginPath();a.rect(m,n,p,l);a.clip()}if(this.Ri()&&!this.isVisible())return!0;a.Ee.Ma=[1,0,0,1,0,0];(this instanceof Lg&&1b?(this.scale(b/a,1),this.translate((a-b)/2,0)):b>a&&(this.scale(1,a/b),this.translate(0,(b-a)/2));this.hn?this.clip():this.fill();a>b?(this.translate(-(a-b)/2,0),this.scale(1/(b/a),1)):b>a&&(this.translate(0,-(b-a)/2),this.scale(1,1/(a/b)))}else this.hn?this.clip():this.fill()};t.Xi=function(){this.hn||this.stroke()};t.bw=function(a,b,c){this.es=a;this.fs=b;this.bg=c}; t.As=function(a,b){var c=this.Y;void 0!==c.setLineDash&&(c.setLineDash(a),c.lineDashOffset=b)};t.ys=function(){var a=this.Y;void 0!==a.setLineDash&&(a.setLineDash(Wl),a.lineDashOffset=0)};t.Ec=function(a){a&&(this.yt="");this.xt=this.zt=""}; na.Object.defineProperties(ul.prototype,{fillStyle:{get:function(){return this.Y.fillStyle},set:function(a){this.xt!==a&&(this.xt=this.Y.fillStyle=a)}},font:{get:function(){return this.Y.font},set:function(a){this.yt!==a&&(this.yt=this.Y.font=a)}},globalAlpha:{get:function(){return this.Y.globalAlpha},set:function(a){this.Y.globalAlpha=a}},lineCap:{get:function(){return this.Y.lineCap}, set:function(a){this.Y.lineCap=a}},lineDashOffset:{get:function(){return this.Y.lineDashOffset},set:function(a){this.Y.lineDashOffset=a}},lineJoin:{get:function(){return this.Y.lineJoin},set:function(a){this.Y.lineJoin=a}},lineWidth:{get:function(){return this.Y.lineWidth},set:function(a){this.Y.lineWidth=a}},miterLimit:{get:function(){return this.Y.miterLimit},set:function(a){this.Y.miterLimit= a}},shadowBlur:{get:function(){return this.Y.shadowBlur},set:function(a){this.Y.shadowBlur=a}},shadowColor:{get:function(){return this.Y.shadowColor},set:function(a){this.Y.shadowColor=a}},shadowOffsetX:{get:function(){return this.Y.shadowOffsetX},set:function(a){this.Y.shadowOffsetX=a}},shadowOffsetY:{get:function(){return this.Y.shadowOffsetY},set:function(a){this.Y.shadowOffsetY= a}},strokeStyle:{get:function(){return this.Y.strokeStyle},set:function(a){this.zt!==a&&(this.zt=this.Y.strokeStyle=a)}},textAlign:{get:function(){return this.Y.textAlign},set:function(a){this.Y.textAlign=a}},imageSmoothingEnabled:{get:function(){return this.Y.imageSmoothingEnabled},set:function(a){this.Y.imageSmoothingEnabled=a}},clipInsteadOfFill:{get:function(){return this.hn}, -set:function(a){this.hn=a}}});var Wl=Object.freeze([]);ul.className="CanvasSurfaceContext";function Xl(){this.M=this.o=this.C=this.j=0}Xl.className="ColorNumbers";function ml(a,b){Yl||(Zl(),Yl=!0);Ta(this);this.v=!1;void 0===a?(this.ia=tl,this.Ok="black"):"string"===typeof a?(this.ia=tl,this.Ok=a):(this.ia=a,this.Ok="black");a=this.ia;a===wl?(this.zd=vc,this.bl=Bc):this.bl=a===nl?this.zd=yc:this.zd=rc;this.js=0;this.jr=NaN;this.ke=this.Ur=this.je=null;this.At=this.Pk=0;b&&Object.assign(this,b)} -ml.prototype.copy=function(){var a=new ml;a.ia=this.ia;a.Ok=this.Ok;a.zd=this.zd.I();a.bl=this.bl.I();a.js=this.js;a.jr=this.jr;null!==this.je&&(a.je=this.je.copy());a.Ur=this.Ur;return a};t=ml.prototype;t.freeze=function(){this.v=!0;null!==this.je&&this.je.freeze();return this};t.ea=function(){Object.isFrozen(this)&&C("cannot thaw constant: "+this);this.v=!1;null!==this.je&&this.je.ea();return this};t.gb=function(a){a.classType===ml&&(this.type=a)}; +set:function(a){this.hn=a}}});var Wl=Object.freeze([]);ul.className="CanvasSurfaceContext";function Xl(){this.M=this.o=this.C=this.j=0}Xl.className="ColorNumbers";function ml(a,b){Yl||(Zl(),Yl=!0);Ta(this);this.v=!1;void 0===a?(this.ia=tl,this.Ok="black"):"string"===typeof a?(this.ia=tl,this.Ok=a):(this.ia=a,this.Ok="black");a=this.ia;a===wl?(this.Ad=vc,this.bl=Bc):this.bl=a===nl?this.Ad=yc:this.Ad=rc;this.js=0;this.jr=NaN;this.ke=this.Ur=this.je=null;this.At=this.Pk=0;b&&Object.assign(this,b)} +ml.prototype.copy=function(){var a=new ml;a.ia=this.ia;a.Ok=this.Ok;a.Ad=this.Ad.I();a.bl=this.bl.I();a.js=this.js;a.jr=this.jr;null!==this.je&&(a.je=this.je.copy());a.Ur=this.Ur;return a};t=ml.prototype;t.freeze=function(){this.v=!0;null!==this.je&&this.je.freeze();return this};t.ea=function(){Object.isFrozen(this)&&C("cannot thaw constant: "+this);this.v=!1;null!==this.je&&this.je.ea();return this};t.gb=function(a){a.classType===ml&&(this.type=a)}; t.toString=function(){var a="Brush(";if(this.type===tl)a+=this.color;else if(a=this.type===wl?a+"Linear ":this.type===nl?a+"Radial ":this.type===vl?a+"Pattern ":a+"(unknown) ",a+=this.start+" "+this.end,null!==this.colorStops)for(var b=this.colorStops.iterator;b.next();)a+=" "+b.key+":"+b.value;return a+")"}; t.addColorStop=function(a,b){this.v&&wa(this);("number"!==typeof a||!isFinite(a)||1a)&&xa(a,"0 <= loc <= 1",ml,"addColorStop:loc");null===this.je&&(this.je=new I);this.je.add(a,b);this.ia===tl&&(this.type=wl);this.ke=null;return this}; t.yA=function(a,b){this.v&&wa(this);a=void 0===a||"number"!==typeof a?.2:a;b=void 0===b?$l:b;if(this.type===tl)Ph(this.color),this.color=am(a,b);else if((this.type===wl||this.type===nl)&&null!==this.colorStops)for(var c=this.colorStops.iterator;c.next();)Ph(c.value),this.addColorStop(c.key,am(a,b));return this};function bm(a,b,c){b=void 0===b||"number"!==typeof b?.2:b;c=void 0===c?$l:c;Ph(a);return am(b,c)} @@ -1045,8 +1045,8 @@ hm.C+.041556*hm.o;b=.0556434*hm.j+-.2040259*hm.C+1.0572252*hm.o;em.j=255*om((3.2 Rh.M+")";default:C("Unknown color space: "+b)}}function Ph(a){Yl||(Zl(),Yl=!0);var b=qm;if(null!==b){b.clearRect(0,0,1,1);b.fillStyle="#000000";var c=b.fillStyle;b.fillStyle=a;b.fillStyle!==c?(b.fillRect(0,0,1,1),a=b.getImageData(0,0,1,1).data,em.j=a[0],em.C=a[1],em.o=a[2],em.M=a[3]/255):(b.fillStyle="#FFFFFF",b.fillStyle=a,em.j=0,em.C=0,em.o=0,em.M=1)}} function Qh(){var a=em.j/255,b=em.C/255,c=em.o/255,d=Math.max(a,b,c),e=Math.min(a,b,c),f=d-e;e=(d+e)/2;if(0===f)var g=a=0;else{switch(d){case a:g=(b-c)/f%6;break;case b:g=(c-a)/f+2;break;case c:g=(a-b)/f+4}g*=60;0>g&&(g+=360);a=f/(1-Math.abs(2*e-1))}Rh.j=Math.round(g);Rh.C=Math.round(100*a);Rh.o=Math.round(100*e);Rh.M=em.M}function gm(a){a/=255;return.04045>=a?a/12.92:Math.pow((a+.055)/1.055,2.4)}function om(a){return.0031308>=a?12.92*a:1.055*Math.pow(a,1/2.4)-.055} function im(a){return a>nm?Math.pow(a,1/3):(mm*a+16)/116}function lm(a){var b=a*a*a;return b>nm?b:(116*a-16)/mm}function Nl(a,b){"string"!==typeof a&&(a instanceof ml||C("Value for "+b+" must be a color string or a Brush, not "+a))}function Zl(){qm=Jg?(new Ak(null)).context:null} -na.Object.defineProperties(ml.prototype,{type:{get:function(){return this.ia},set:function(a){this.v&&wa(this,a);this.ia=a;this.start.wc()&&(a===wl?this.start=vc:a===nl&&(this.start=yc));this.end.wc()&&(a===wl?this.end=Bc:a===nl&&(this.end=yc));this.ke=null}},color:{get:function(){return this.Ok},set:function(a){this.v&&wa(this,a);this.Ok=a;this.ke=null}},start:{get:function(){return this.zd},set:function(a){this.v&& -wa(this,a);this.zd=a.I();this.ke=null}},end:{get:function(){return this.bl},set:function(a){this.v&&wa(this,a);this.bl=a.I();this.ke=null}},startRadius:{get:function(){return this.js},set:function(a){this.v&&wa(this,a);0>a&&xa(a,">= zero",ml,"startRadius");this.js=a;this.ke=null}},endRadius:{get:function(){return this.jr},set:function(a){this.v&&wa(this,a);0>a&&xa(a,">= zero",ml,"endRadius");this.jr=a;this.ke= +na.Object.defineProperties(ml.prototype,{type:{get:function(){return this.ia},set:function(a){this.v&&wa(this,a);this.ia=a;this.start.wc()&&(a===wl?this.start=vc:a===nl&&(this.start=yc));this.end.wc()&&(a===wl?this.end=Bc:a===nl&&(this.end=yc));this.ke=null}},color:{get:function(){return this.Ok},set:function(a){this.v&&wa(this,a);this.Ok=a;this.ke=null}},start:{get:function(){return this.Ad},set:function(a){this.v&& +wa(this,a);this.Ad=a.I();this.ke=null}},end:{get:function(){return this.bl},set:function(a){this.v&&wa(this,a);this.bl=a.I();this.ke=null}},startRadius:{get:function(){return this.js},set:function(a){this.v&&wa(this,a);0>a&&xa(a,">= zero",ml,"startRadius");this.js=a;this.ke=null}},endRadius:{get:function(){return this.jr},set:function(a){this.v&&wa(this,a);0>a&&xa(a,">= zero",ml,"endRadius");this.jr=a;this.ke= null}},colorStops:{get:function(){return this.je},set:function(a){this.v&&wa(this,a);this.je=a;this.ke=null}},pattern:{get:function(){return this.Ur},set:function(a){this.v&&wa(this,a);this.Ur=a;this.ke=null}}});ml.prototype.isDark=ml.prototype.jy;ml.prototype.darkenBy=ml.prototype.Az;ml.prototype.lightenBy=ml.prototype.yA;ml.prototype.addColorStop=ml.prototype.addColorStop; var nm=216/24389,mm=24389/27,jm=[95.047,100,108.883],qm=null,em=new Xl,Rh=new Xl,hm=new Xl,km=new Xl,Yl=!1;ml.className="Brush";var tl;ml.Solid=tl=new D(ml,"Solid",0);var wl;ml.Linear=wl=new D(ml,"Linear",1);var nl;ml.Radial=nl=new D(ml,"Radial",2);var vl;ml.Pattern=vl=new D(ml,"Pattern",4);var $l;ml.Lab=$l=new D(ml,"Lab",5);var pm;ml.HSL=pm=new D(ml,"HSL",6); ml.randomColor=function(a,b){void 0===a&&(a=128);void 0===b&&(b=Math.max(a,255));var c=Math.abs(b-a);b=Math.floor(a+Math.random()*c).toString(16);var d=Math.floor(a+Math.random()*c).toString(16);a=Math.floor(a+Math.random()*c).toString(16);2>b.length&&(b="0"+b);2>d.length&&(d="0"+d);2>a.length&&(a="0"+a);return"#"+b+d+a}; @@ -1077,29 +1077,29 @@ Math.abs(y.offsetY)+q;u=k.stretch;u===Uk&&(u=hl(k,!1));switch(u){case og:g=f=0;b xm.prototype.arrange=function(a,b){var c=b.length,d=a.nb(),e=d.measuredBounds,f=N.alloc();f.h(0,0,1,1);var g=d.margin,h=g.left;g=g.top;var k=a.padding,l=k.left;k=k.top;d.arrange(l+h,k+g,e.width,e.height);var m=ym(d),n=zm(d),p=m.y*e.height+m.offsetY,r=n.x*e.width+n.offsetX;n=n.y*e.height+n.offsetY;f.x=m.x*e.width+m.offsetX;f.y=p;$b(f,r,n,0,0);f.x+=h+l;f.y+=g+k;for(e=0;eS&&(Ha=Math.max(S-tc,0));var fg=0===H.ga;H.$b=H.$b+Ha;H.actual=H.ga+Ha;S=Math.max(S-(Ha+(fg?tc:0)),0)}if(1===sb.columnSpan&&(eb===og|| -eb===Wk)){H=a.getColumnDefinition(Rb);var rh=H.Fc();Ha=Math.max(kc-H.actual,0);Ha+rh>K&&(Ha=Math.max(K-rh,0));var wn=0===H.ga;H.$b=H.$b+Ha;H.actual=H.ga+Ha;K=Math.max(K-(Ha+(wn?rh:0)),0)}he&&sb.mk()}}}}}Ia(z);var Gd=0,ie=0;f=a.columnCount;for(var gg=0;ggS&&(Ha=Math.max(S-tc,0));var fg=0===H.ga;H.$b=H.$b+Ha;H.actual=H.ga+Ha;S=Math.max(S-(Ha+(fg?tc:0)),0)}if(1===sb.columnSpan&&(bb===og|| +bb===Wk)){H=a.getColumnDefinition(Rb);var rh=H.Gc();Ha=Math.max(kc-H.actual,0);Ha+rh>K&&(Ha=Math.max(K-rh,0));var wn=0===H.ga;H.$b=H.$b+Ha;H.actual=H.ga+Ha;K=Math.max(K-(Ha+(wn?rh:0)),0)}he&&sb.mk()}}}}}Ia(z);var Gd=0,ie=0;f=a.columnCount;for(var gg=0;gg=a.rowCount);Cf++)H=a.getRowDefinition(Na.row+Cf),Ha=0,Ha=eb===sd||eb===Wk?Math.max(H.minimum,0===ke[Na.row+Cf]?H.maximum:Math.min(ke[Na.row+Cf],H.maximum)):Math.max(H.minimum,isNaN(H.rc)?H.maximum:Math.min(H.rc,H.maximum)),Qc.height+=Ha,Ld+=H.minimum;for(var nd=1;nd=a.columnCount);nd++)H=a.getColumnDefinition(Na.column+ -nd),Ha=0,Ha=eb===sd||eb===Vk?Math.max(H.minimum,0===md[Na.column+nd]?H.maximum:Math.min(md[Na.column+nd],H.maximum)):Math.max(H.minimum,isNaN(H.rc)?H.maximum:Math.min(H.rc,H.maximum)),Qc.width+=Ha,vh+=H.minimum;bb.width+=Qc.width;bb.height+=Qc.height;var Df=Na.margin,zi=Df.right+Df.left,me=Df.top+Df.bottom;Na.measure(bb.width,bb.height,vh,Ld);for(var ig=Na.measuredBounds,Ef=Math.max(ig.width+zi,0),Ai=Math.max(ig.height+me,0),Ze=0,Zc=0;Zc=a.rowCount);Zc++)H=a.getRowDefinition(Na.row+ +0;Bf=a.rowCount);Cf++)H=a.getRowDefinition(Na.row+Cf),Ha=0,Ha=bb===sd||bb===Wk?Math.max(H.minimum,0===ke[Na.row+Cf]?H.maximum:Math.min(ke[Na.row+Cf],H.maximum)):Math.max(H.minimum,isNaN(H.rc)?H.maximum:Math.min(H.rc,H.maximum)),Qc.height+=Ha,Ld+=H.minimum;for(var nd=1;nd=a.columnCount);nd++)H=a.getColumnDefinition(Na.column+ +nd),Ha=0,Ha=bb===sd||bb===Vk?Math.max(H.minimum,0===md[Na.column+nd]?H.maximum:Math.min(md[Na.column+nd],H.maximum)):Math.max(H.minimum,isNaN(H.rc)?H.maximum:Math.min(H.rc,H.maximum)),Qc.width+=Ha,vh+=H.minimum;cb.width+=Qc.width;cb.height+=Qc.height;var Df=Na.margin,zi=Df.right+Df.left,me=Df.top+Df.bottom;Na.measure(cb.width,cb.height,vh,Ld);for(var ig=Na.measuredBounds,Ef=Math.max(ig.width+zi,0),Ai=Math.max(ig.height+me,0),Ze=0,Zc=0;Zc=a.rowCount);Zc++)H=a.getRowDefinition(Na.row+ Zc),Ze+=H.total||0;if(Ze=od)&&!(Na.row+ne>=a.rowCount);ne++){H=a.getRowDefinition(Na.row+ne);var zd=H.ga||0,fk=Gf(Na,H,Ff);H.actual=Math.min(H.maximum,zd+fk);H.ga!==zd&&(od-=H.ga-zd)}for(;0Ge&&(H.actual=Math.min(H.maximum,Ge+od),H.ga!==Ge&&(od-=H.ga-Ge));if(0===H.index)break;H=a.getRowDefinition(H.index-1)}}for(var wh=0,xh=0;xh=a.columnCount);xh++)H=a.getColumnDefinition(Na.column+xh),wh+=H.total||0;if(wh=$c)&&!(Na.column+yh>=a.columnCount);yh++){H=a.getColumnDefinition(Na.column+yh);var yn=H.ga||0,Wt=xn(Na,H,Bi);H.actual=Math.min(H.maximum,yn+Wt);H.ga!==yn&&($c-=H.ga-yn)}for(;0<$c;){var gk=H.ga||0;isNaN(H.width)&&H.maximum>gk&&(H.actual=Math.min(H.maximum,gk+$c),H.ga!==gk&&($c-=H.ga-gk));if(0=== -H.index)break;H=a.getColumnDefinition(H.index-1)}}}}Ia(y);M.free(Qc);M.free(bb);void 0!==ke&&Ia(ke);void 0!==md&&Ia(md);var jg=0,kg=0,hk=a.desiredSize,fr=a.maxSize;eb=hl(a,!0);var Ci=ie=Gd=0,Di=0;f=a.columnCount;for(var ik=0;ik=a.rowCount);R++){var O=a.getRowDefinition(v+ -R);0!==O.ga&&(u.height+=O.total)}for(R=1;R=a.columnCount);R++)O=a.getColumnDefinition(z+R),0!==O.ga&&(u.width+=O.total);var H=y.ga+u.width,da=w.ga+u.height;R=h;O=k;var ba=H,ra=da,Ca=h,cb=k,db=H,Ha=da;h+H>c.width&&(db=Math.max(c.width-h,0));k+da>c.height&&(Ha=Math.max(c.height-k,0));var zb=K.alignment;if(zb.Lb()){zb=a.defaultAlignment;zb.hb()||(zb=yc);var Db=zb.x;var Yc=zb.y;var Rb=zb.offsetX;zb=zb.offsetY;var jc=y.alignment,Ec=w.alignment;jc.hb()&&(Db=jc.x,Rb=jc.offsetX);Ec.hb()&& +R);0!==O.ga&&(u.height+=O.total)}for(R=1;R=a.columnCount);R++)O=a.getColumnDefinition(z+R),0!==O.ga&&(u.width+=O.total);var H=y.ga+u.width,da=w.ga+u.height;R=h;O=k;var ba=H,ra=da,Ca=h,db=k,eb=H,Ha=da;h+H>c.width&&(eb=Math.max(c.width-h,0));k+da>c.height&&(Ha=Math.max(c.height-k,0));var zb=K.alignment;if(zb.Lb()){zb=a.defaultAlignment;zb.hb()||(zb=yc);var Db=zb.x;var Yc=zb.y;var Rb=zb.offsetX;zb=zb.offsetY;var jc=y.alignment,Ec=w.alignment;jc.hb()&&(Db=jc.x,Rb=jc.offsetX);Ec.hb()&& (Yc=Ec.y,zb=Ec.offsetY)}else Db=zb.x,Yc=zb.y,Rb=zb.offsetX,zb=zb.offsetY;if(isNaN(Db)||isNaN(Yc))Yc=Db=.5,zb=Rb=0;jc=S.width;Ec=S.height;var ge=K.margin,xf=ge.left+ge.right,sb=ge.top+ge.bottom,he=Al(K,w,y,!1);!isNaN(K.desiredSize.width)||he!==sd&&he!==Vk||(jc=Math.max(H-xf,0));!isNaN(K.desiredSize.height)||he!==sd&&he!==Wk||(Ec=Math.max(da-sb,0));H=K.maxSize;da=K.minSize;jc=Math.min(H.width,jc);Ec=Math.min(H.height,Ec);jc=Math.max(da.width,jc);Ec=Math.max(da.height,Ec);H=Ec+sb;R+=ba*Db-(jc+xf)*Db+ -Rb+ge.left;O+=ra*Yc-H*Yc+zb+ge.top;K.visible&&(ac(Ca,cb,db,Ha,R,O,S.width,S.height)?K.arrange(R,O,jc,Ec):K.arrange(R,O,jc,Ec,new N(Ca,cb,db,Ha)))}}M.free(u);for(a=0;ab)return a%b===c;if(a%b!==c)return!1;b=d.length;for(var e=0;en)z.measure(Infinity,Infinity,0,0),y=z.measuredBounds,b.Nc(y),q.push(y);else{var A=z.segmentIndex,B=z.segmentFraction,F=z.alignmentFocus;F.wc()&&(F=yc);var K=z.segmentOrientation,S=z.segmentOffset;if(isNaN(A)){var R=h.ma;y=Fa();R.vv(B,y);var O=J.allocAt(y[0],y[1]);O.add(h.i(0)); +k&&(Jm(a,p,r,k),g=k.measuredBounds,b.Oc(g),q.push(g));g=qd.alloc();for(var u=J.alloc(),v=J.alloc(),w=0;wn)z.measure(Infinity,Infinity,0,0),y=z.measuredBounds,b.Oc(y),q.push(y);else{var A=z.segmentIndex,B=z.segmentFraction,F=z.alignmentFocus;F.wc()&&(F=yc);var K=z.segmentOrientation,S=z.segmentOffset;if(isNaN(A)){var R=h.ma;y=Fa();R.vv(B,y);var O=J.allocAt(y[0],y[1]);O.add(h.i(0)); R.type===Q.j?O.offset(-R.startX,-R.startY):(R=R.figures.first(),null!==R&&O.offset(-R.startX,-R.startY));R=y[2];if(K!==Vf){var H=h.computeAngle(z,K,R);z.xb=H}H=O.x-l.x;var da=O.y-l.y;J.free(O);Ia(y)}else if(A<-n||A>=n)y=J.alloc(),h.pg(),h.computeMidPoint(y),R=h.midAngle,K!==Vf&&(H=h.computeAngle(z,K,R),z.xb=H),H=y.x-l.x,da=y.y-l.y,J.free(y);else{H=0;0<=A?(da=m.J(A),y=Aba+10?0<=A?R.Oa(da):da.Oa(R):ba>O+10?0<=A?y.Oa(H):H.Oa(y):0<=A?R.Oa(H):H.Oa(R)}else R=0<=A?da.Oa(y):y.Oa(da);K!==Vf&&(H=h.computeAngle(z,K,R),z.xb=H);H=da.x+(y.x-da.x)*B-l.x;da=da.y+(y.y-da.y)*B-l.y}z.measure(Infinity,Infinity,0,0);y=z.measuredBounds;O=z.naturalBounds;var ra=0;z instanceof uf&&(ra=z.strokeWidth);ba=O.width+ra;var Ca=O.height+ra;g.reset();g.translate(-y.x,-y.y);g.scale(z.scale,z.scale);g.rotate(K===Vf?z.angle:R,ba/2,Ca/2);K!==Km&&K!== -Lm||g.rotate(90,ba/2,Ca/2);K!==Mm&&K!==Nm||g.rotate(-90,ba/2,Ca/2);K===Om&&(45R||225R)&&g.rotate(-R,ba/2,Ca/2);O=new N(0,0,ba,Ca);u.Ui(O,F);g.ya(u);F=-u.x+ra/2*z.scale;z=-u.y+ra/2*z.scale;v.assign(S);ra=isNaN(S.x);var cb=isNaN(S.y);if(ra||cb){ba=ba/2+3;Ca=Ca/2+3;var db=45<=R&&135>=R,Ha=225<=R&&315>=R;K===Vf&&(db||Ha)?(v.x=cb?ba:S.y,v.y=ra?Ca:S.x,db?0<=A||isNaN(A)&&.5>B||!ra||(v.y=-Ca):Ha&&((0<=A||isNaN(A)&&.5>B)&&ra&&(v.y=-Ca),cb&&(v.x=-ba))):(ra&&(v.x=0<=A||isNaN(A)&&.5>B?ba:-ba), -cb&&(v.y=-Ca),v.rotate(R))}else v.rotate(R);H+=v.x;da+=v.y;O.set(y);O.h(H+F,da+z,y.width,y.height);q.push(O);b.Nc(O)}}if(null!==f)for(d=f.labelNodes;d.next();)d.value.measure(Infinity,Infinity);a.dg=b;a=a.location;a.h(a.x+b.x,a.y+b.y);Tb(e,b.width||0,b.height||0);qd.free(g);J.free(u);J.free(v)}}}}; +H=1ba+10?0<=A?R.Ra(da):da.Ra(R):ba>O+10?0<=A?y.Ra(H):H.Ra(y):0<=A?R.Ra(H):H.Ra(R)}else R=0<=A?da.Ra(y):y.Ra(da);K!==Vf&&(H=h.computeAngle(z,K,R),z.xb=H);H=da.x+(y.x-da.x)*B-l.x;da=da.y+(y.y-da.y)*B-l.y}z.measure(Infinity,Infinity,0,0);y=z.measuredBounds;O=z.naturalBounds;var ra=0;z instanceof uf&&(ra=z.strokeWidth);ba=O.width+ra;var Ca=O.height+ra;g.reset();g.translate(-y.x,-y.y);g.scale(z.scale,z.scale);g.rotate(K===Vf?z.angle:R,ba/2,Ca/2);K!==Km&&K!== +Lm||g.rotate(90,ba/2,Ca/2);K!==Mm&&K!==Nm||g.rotate(-90,ba/2,Ca/2);K===Om&&(45R||225R)&&g.rotate(-R,ba/2,Ca/2);O=new N(0,0,ba,Ca);u.Ui(O,F);g.ya(u);F=-u.x+ra/2*z.scale;z=-u.y+ra/2*z.scale;v.assign(S);ra=isNaN(S.x);var db=isNaN(S.y);if(ra||db){ba=ba/2+3;Ca=Ca/2+3;var eb=45<=R&&135>=R,Ha=225<=R&&315>=R;K===Vf&&(eb||Ha)?(v.x=db?ba:S.y,v.y=ra?Ca:S.x,eb?0<=A||isNaN(A)&&.5>B||!ra||(v.y=-Ca):Ha&&((0<=A||isNaN(A)&&.5>B)&&ra&&(v.y=-Ca),db&&(v.x=-ba))):(ra&&(v.x=0<=A||isNaN(A)&&.5>B?ba:-ba), +db&&(v.y=-Ca),v.rotate(R))}else v.rotate(R);H+=v.x;da+=v.y;O.set(y);O.h(H+F,da+z,y.width,y.height);q.push(O);b.Oc(O)}}if(null!==f)for(d=f.labelNodes;d.next();)d.value.measure(Infinity,Infinity);a.dg=b;a=a.location;a.h(a.x+b.x,a.y+b.y);Tb(e,b.width||0,b.height||0);qd.free(g);J.free(u);J.free(v)}}}}; Im.prototype.arrange=function(a,b){var c=b.length;if(a instanceof we||a instanceof U){var d=a,e=null;a instanceof we&&(e=a,d=e.adornedPart);var f=a instanceof we?null:d.path,g=a.j;if(0!==g.length){var h=0;if(null!==f&&h=c)q=J.alloc(),r=n,v=q,r.pg(),r.computeMidPoint(v),r=n.midAngle,l!==Vf&&(n=n.computeAngle(g,l,r),g.angle=n),n=q.x,v=q.y, -J.free(q);else{u=0;0<=h?(q=b.m[h],v=hz+10?0<=h?r.Oa(q):q.Oa(r):z>w+10?0<=h?v.Oa(u):u.Oa(v):0<=h?r.Oa(u):u.Oa(r)}else r=0<=h?q.Oa(v):v.Oa(q);l!==Vf&&(n=n.computeAngle(g,l,r),g.angle=n);n=q.x+(v.x-q.x)*k;v=q.y+(v.y-q.y)*k}if(p.Qs())g.location=new J(n,v);else{p.wc()&&(p=yc);q=qd.alloc();q.reset();q.scale(g.scale,g.scale);q.rotate(g.angle, +J.free(q);else{u=0;0<=h?(q=b.m[h],v=hz+10?0<=h?r.Ra(q):q.Ra(r):z>w+10?0<=h?v.Ra(u):u.Ra(v):0<=h?r.Ra(u):u.Ra(r)}else r=0<=h?q.Ra(v):v.Ra(q);l!==Vf&&(n=n.computeAngle(g,l,r),g.angle=n);n=q.x+(v.x-q.x)*k;v=q.y+(v.y-q.y)*k}if(p.Qs())g.location=new J(n,v);else{p.wc()&&(p=yc);q=qd.alloc();q.reset();q.scale(g.scale,g.scale);q.rotate(g.angle, 0,0);var y=g.naturalBounds;u=N.allocAt(0,0,y.width,y.height);w=J.alloc();w.Ui(u,p);q.ya(w);p=-w.x;z=-w.y;var A=y.width,B=y.height;y=J.alloc();y.assign(m);var F=isNaN(m.x),K=isNaN(m.y);if(F||K){A=A/2+3;B=B/2+3;var S=45<=r&&135>=r,R=225<=r&&315>=r;l===Vf&&(S||R)?(y.x=K?A:m.y,y.y=F?B:m.x,S?0<=h||isNaN(h)&&.5>k||!F||(y.y=-B):R&&((0<=h||isNaN(h)&&.5>k)&&F&&(y.y=-B),K&&(y.x=-A))):(F&&(y.x=0<=h||isNaN(h)&&.5>k?A:-A),K&&(y.y=-B),y.rotate(r))}else y.rotate(r);n+=y.x;v+=y.y;q.Jq(u);p+=u.x;z+=u.y;h=J.allocAt(n+ p,v+z);g.move(h);J.free(h);J.free(y);J.free(w);N.free(u);qd.free(q)}}null!==e?e.sk(!1):d.sk(!1)}}; function Jm(a,b,c,d){if(!1!==mj(d)){var e=d.strokeWidth;0===e&&a instanceof we&&a.type===X.Link&&a.adornedObject instanceof uf&&(e=a.adornedObject.strokeWidth);e*=d.sa;a instanceof U&&null!==a.ma?(a=a.ma.bounds,d.ue(a.x-e/2,a.y-e/2,a.width+e,a.height+e)):a instanceof we&&null!==a.adornedPart.ma?(a=a.adornedPart.ma.bounds,d.ue(a.x-e/2,a.y-e/2,a.width+e,a.height+e)):d.ue(-(e/2),-(e/2),b+e,c+e);hj(d,!1)}}function Pm(){this.na="Base"}ma(Pm,Kl); Pm.prototype.measure=function(a,b,c,d,e,f,g){var h=a.nb();a.Kg=[];var k=h.margin,l=k.right+k.left,m=k.top+k.bottom;h.measure(b,c,f,g);var n=h.measuredBounds,p=new N(-k.left,-k.top,Math.max(n.width+l,0),Math.max(n.height+m,0));a.Kg.push(p);e.assign(p);for(var r=h.geometry,q=h.strokeWidth,u=r.flattenedSegments,v=r.flattenedLengths,w=r.flattenedTotalLength,z=u.length,y=0,A=0,B=Fa(),F=0;Fba&&(ba+=360);S.push(ba)}y=H;A=da}B.push(S)}if(null===a.Nf){for(var ra=[],Ca=a.T.m,cb=Ca.length,db=0;dbDb))for(var Yc=0;YcDb&&zb.push(jc)}}}}a.Nf=ra}var Ec=a.Nf;var ge=a.T.m,xf=ge.length,sb=0,he=0,dg=w;a.tj=[];for(var ph,qh=0;qhbk*ti*w/a.graduatedRange)){var eg=v[0][0],ld=0,kc=0;he=w*eb.graduatedStart-1E-4;dg=w*eb.graduatedEnd+1E-4;var yf=bk*ti,tc=a.graduatedTickBase;if(tca.graduatedMin+yf&&(tc-=Math.floor((tc-a.graduatedMin)/yf)*yf);for(var rh=Ec[qh],wn=tc,Gd=1;tcw&&(sb=w),he<=sb&&sb<=dg)){for(var Hd=B[ld][kc],yd=v[ld][kc];ldeg&&kcec&&.4995ec?0ec||.9995vi){var ck=1-Math.abs(.5-ec);Hd=(je*ck+Pc*(1-ck))%360;break a}}}Hd=je}if(eb instanceof Lg){var Id="";null!== -eb.graduatedFunction?(Id=eb.graduatedFunction(tc),Id=null!==Id&&void 0!==Id?Id.toString():""):Id=(+tc.toFixed(2)).toString();""!==Id&&ph.push({tm:ui,angle:Hd,text:Id})}else ph.push({tm:ui,angle:Hd})}tc=wn+Gd*yf}}}a.tj.push(ph)}Ia(B);var uh=a.tj;if(null!==uh)for(var zf=d.length,bb=0;bbBf;Bf++){switch(Bf){case 0:fc.h(Xe,Ye);break;case 1:fc.h(Xe+wi,Ye);break;case 2:fc.h(Xe,Ye+xi);break;case 3:fc.h(Xe+wi,Ye+xi)}fc.rotate(ek+Eb.angle);fc.offset(dk,Af);0===md&&0===Bf?Qc.h(fc.x,fc.y,0,0):Qc.Le(fc);fc.offset(-dk,-Af);fc.rotate(-ek-Eb.angle)}J.free(fc);null!==lc.Kg&& -lc.Kg.push(Qc);$b(uc,Qc.x,Qc.y,Qc.width,Qc.height)}else if(Eb instanceof Lg){var Na=a,Kd=e;null===Na.mh&&(Na.mh=new Lg);var qb=Na.mh;Qm(qb,Eb);var vh=Eb.alignmentFocus;vh.wc()&&(vh=vc);for(var Ld=Eb.segmentOrientation,Cf=Eb.segmentOffset,nd=new N,Df=0,zi=0,me=0,ig=0,Ef=0,Ai=Fb.length,Ze=0;Zeme||225me)&&zd.rotate(-me,Gf/2,ne/2);var fk=N.allocAt(0,0,Gf,ne),Ge=J.alloc();Ge.Ui(fk,vh);zd.ya(Ge);var wh=-Ge.x,xh=-Ge.y,$c=J.alloc();$c.assign(Cf);isNaN($c.x)&&($c.x=Gf/2+3);isNaN($c.y)&&($c.y=-(ne/2+3));$c.rotate(me); -Df+=$c.x+wh;zi+=$c.y+xh;var Bi=new N(Df,zi,od.width,od.height),xn=new N(od.x,od.y,od.width,od.height),yh=new N(Ff.x,Ff.y,Ff.width,Ff.height);Zc.wA=ig;Zc.lineCount=qb.lineCount;Zc.lines=[qb.qb,qb.di,qb.oe,qb.ze,qb.zc,qb.Pb,qb.me];Zc.actualBounds=Bi;Zc.measuredBounds=xn;Zc.naturalBounds=yh;0===Ze?nd.assign(Bi):nd.Nc(Bi);J.free($c);J.free(Ge);N.free(fk);qd.free(zd)}null!==Na.Kg&&Na.Kg.push(nd);$b(Kd,nd.x,nd.y,nd.width,nd.height)}hj(Eb,!1)}}}; +A,H-y)/Math.PI;0>ba&&(ba+=360);S.push(ba)}y=H;A=da}B.push(S)}if(null===a.Nf){for(var ra=[],Ca=a.T.m,db=Ca.length,eb=0;ebDb))for(var Yc=0;YcDb&&zb.push(jc)}}}}a.Nf=ra}var Ec=a.Nf;var ge=a.T.m,xf=ge.length,sb=0,he=0,dg=w;a.tj=[];for(var ph,qh=0;qhbk*ti*w/a.graduatedRange&&null===bb.graduatedSkip)){var eg=v[0][0],ld=0,kc=0;he=w*bb.graduatedStart-1E-4;dg=w*bb.graduatedEnd+1E-4;var yf=bk*ti,tc=a.graduatedTickBase;if(tca.graduatedMin+yf&&(tc-=Math.floor((tc-a.graduatedMin)/yf)*yf);for(var rh=Ec[qh],wn=tc,Gd=1;tcw&&(sb=w),he<=sb&&sb<=dg)){for(var Hd=B[ld][kc],yd=v[ld][kc];ldeg&&kcec&&.4995ec?0ec||.9995vi){var ck=1-Math.abs(.5-ec);Hd=(je*ck+Pc*(1-ck))%360;break a}}}Hd=je}if(bb instanceof Lg){var Id= +"";null!==bb.graduatedFunction?(Id=bb.graduatedFunction(tc),Id=null!==Id&&void 0!==Id?Id.toString():""):Id=(+tc.toFixed(2)).toString();""!==Id&&ph.push({tm:ui,angle:Hd,text:Id})}else ph.push({tm:ui,angle:Hd})}tc=wn+Gd*yf}}}a.tj.push(ph)}Ia(B);var uh=a.tj;if(null!==uh)for(var zf=d.length,cb=0;cbBf;Bf++){switch(Bf){case 0:fc.h(Xe,Ye);break;case 1:fc.h(Xe+wi,Ye);break;case 2:fc.h(Xe,Ye+xi);break;case 3:fc.h(Xe+wi,Ye+xi)}fc.rotate(ek+Eb.angle);fc.offset(dk,Af);0===md&&0===Bf?Qc.h(fc.x,fc.y,0,0):Qc.Le(fc);fc.offset(-dk,-Af);fc.rotate(-ek-Eb.angle)}J.free(fc); +null!==lc.Kg&&lc.Kg.push(Qc);$b(uc,Qc.x,Qc.y,Qc.width,Qc.height)}else if(Eb instanceof Lg){var Na=a,Kd=e;null===Na.mh&&(Na.mh=new Lg);var qb=Na.mh;Qm(qb,Eb);var vh=Eb.alignmentFocus;vh.wc()&&(vh=vc);for(var Ld=Eb.segmentOrientation,Cf=Eb.segmentOffset,nd=new N,Df=0,zi=0,me=0,ig=0,Ef=0,Ai=Fb.length,Ze=0;Zeme||225me)&&zd.rotate(-me,Gf/2,ne/2);var fk=N.allocAt(0,0,Gf,ne),Ge=J.alloc();Ge.Ui(fk,vh);zd.ya(Ge);var wh=-Ge.x,xh=-Ge.y,$c=J.alloc();$c.assign(Cf);isNaN($c.x)&&($c.x=Gf/2+3);isNaN($c.y)&&($c.y=-(ne/2+3));$c.rotate(me); +Df+=$c.x+wh;zi+=$c.y+xh;var Bi=new N(Df,zi,od.width,od.height),xn=new N(od.x,od.y,od.width,od.height),yh=new N(Ff.x,Ff.y,Ff.width,Ff.height);Zc.wA=ig;Zc.lineCount=qb.lineCount;Zc.lines=[qb.qb,qb.di,qb.oe,qb.ze,qb.zc,qb.Pb,qb.me];Zc.actualBounds=Bi;Zc.measuredBounds=xn;Zc.naturalBounds=yh;0===Ze?nd.assign(Bi):nd.Oc(Bi);J.free($c);J.free(Ge);N.free(fk);qd.free(zd)}null!==Na.Kg&&Na.Kg.push(nd);$b(Kd,nd.x,nd.y,nd.width,nd.height)}hj(Eb,!1)}}}; Pm.prototype.arrange=function(a,b,c){if(null!==a.Kg){var d=a.nb(),e=a.tj;if(null!==e){var f=a.Kg,g=0,h=f[g];g++;null!==d&&d.arrange(h.x-c.x,h.y-c.y,h.width,h.height);for(var k=b.length,l=0;l=e&&(e=1);for(var g=f.actualBounds,h=a.T.m,k=a.tj,l=h.length,m=0;ma.graduatedTickUnit*n.interval*f.geometry.flattenedTotalLength/a.graduatedRange*e)){var q=n.measuredBounds,u=n.strokeWidth*n.scale,v=n.alignmentFocus;v.wc()&& -(v=vc);for(var w=0;w=e&&(e=1);for(var g=f.actualBounds,h=a.T.m,k=a.tj,l=h.length,m=0;ma.graduatedTickUnit*n.interval*f.geometry.flattenedTotalLength/a.graduatedRange*e&&null===n.graduatedSkip)){var q=n.measuredBounds,u=n.strokeWidth*n.scale, +v=n.alignmentFocus;v.wc()&&(v=vc);for(var w=0;wf.height)continue}else if(l.position>f.width)continue;var m=l.separatorStrokeWidth;isNaN(m)&&(m=c?a.Bg:a.Ag);var n=l.separatorStroke;null===n&&(n=c?a.Vh:a.zg);if(0!==m&&null!==n){bi(a,b,n,!1,!1,g,f);n=!1;var p=l.separatorDashArray;null===p&&(p=c?a.Uh:a.Th);null!==p&&(n=!0,b.As(p,0));b.beginPath();p=l.position+m;c?p>f.height&&(m-= p-f.height):p>f.width&&(m-=p-f.width);l=l.position+m/2;b.lineWidth=m;m=a.mb;c?(l+=m.top,p=f.width-m.right,b.moveTo(m.left,l),b.lineTo(p,l)):(l+=m.left,p=f.height-m.bottom,b.moveTo(l,m.top),b.lineTo(l,p));b.stroke();n&&b.ys()}}}} -function Vm(a,b,c,d,e){for(var f=d.length,g=a.actualBounds,h=a.naturalBounds,k=Xm(a,!0),l=Xm(a,!1),m=0;mp)){var r=n.Fc(),q=n.separatorStrokeWidth;isNaN(q)&&(q=c?a.Bg:a.Ag);var u=n.separatorStroke;null===u&&(u=c?a.Vh:a.zg);if(null===u||n.index===(c?k:l))q=0;r-=q;q=n.position+q;r+=n.actual;q+r>p&&(r=p-q);0>=r||(p=a.mb,bi(a,b,n.background,!0,!1,h,g),c?b.fillRect(p.left, +function Vm(a,b,c,d,e){for(var f=d.length,g=a.actualBounds,h=a.naturalBounds,k=Xm(a,!0),l=Xm(a,!1),m=0;mp)){var r=n.Gc(),q=n.separatorStrokeWidth;isNaN(q)&&(q=c?a.Bg:a.Ag);var u=n.separatorStroke;null===u&&(u=c?a.Vh:a.zg);if(null===u||n.index===(c?k:l))q=0;r-=q;q=n.position+q;r+=n.actual;q+r>p&&(r=p-q);0>=r||(p=a.mb,bi(a,b,n.background,!0,!1,h,g),c?b.fillRect(p.left, q+p.top,g.width-(p.left+p.right),r):b.fillRect(q+p.left,p.top,r,g.height-(p.top+p.bottom)))}}}}function Xm(a,b){for(var c=b?a.Db.length:a.yb.length,d=0;dd&&e.set(q),J.free(q));J.free(m);f&&e.transform(g);return l}; @@ -1153,7 +1153,7 @@ t.ll=function(){if(0!==(this.G&2048)===!1){xl(this,!0);yl(this,!0);for(var a=thi t.qm=function(a,b,c,d){var e=this.dg;e.h(0,0,0,0);var f=this.desiredSize,g=this.minSize;void 0===c&&(c=g.width,d=g.height);c=Math.max(c,g.width);d=Math.max(d,g.height);var h=this.maxSize;isNaN(f.width)||(a=Math.min(f.width,h.width));isNaN(f.height)||(b=Math.min(f.height,h.height));a=Math.max(c,a);b=Math.max(d,b);var k=this.mb;a=Math.max(a-k.left-k.right,0);b=Math.max(b-k.top-k.bottom,0);var l=this.T.m;0!==l.length&&this.ia.measure(this,a,b,l,e,c,d);a=e.width+k.left+k.right;k=e.height+k.top+k.bottom; isFinite(f.width)&&(a=f.width);isFinite(f.height)&&(k=f.height);a=Math.min(h.width,a);k=Math.min(h.height,k);a=Math.max(g.width,a);k=Math.max(g.height,k);a=Math.max(c,a);k=Math.max(d,k);Tb(e,a,k);Tb(this.naturalBounds,a,k);this.ue(0,0,a,k)};t.nb=function(){if(null===this.lh){var a=this.T.m,b=a.length;if(0===b)return null;for(var c=0;cc||f>d)this.s(),this.measure(b>c?c:b,f>d?d:f,0,0);break;case sd:this.s(!0);this.measure(c+h,d+g,0,0);break;case Vk:this.s(!0);this.measure(c+h,f+g,0,0);break;case Wk:this.s(!0),this.measure(b+h,d+g,0,0)}}this.ia.arrange(this,e,this.dg)}}; -t.xh=function(a){var b=this.naturalBounds,c=sm(this);if(ac(0,0,b.width,b.height,a.x,a.y)){b=this.T.m;for(var d=b.length,e=J.allocAt(0,0);d--;){var f=b[d];if(f.visible||f===c)if(Ab(e.set(a),f.transform),f.$(e))return J.free(e),!0}J.free(e);return null===this.Rb&&null===this.fd?!1:!0}return!1};t.Bs=function(a){if(this.Mk===a)return this;for(var b=this.T.m,c=b.length,d=0;dp.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof X?m:null;p=qd.alloc();p.set(g); +t.vf=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var g=f;void 0===f&&(g=qd.alloc(),g.reset());g.multiply(this.transform);if(this.wh(a,g))return dn(this,b,c,e),void 0===f&&qd.free(g),!0;if(this.Jc(a,g)){if(!this.isAtomic)for(var h=sm(this),k=this.T.m,l=k.length;l--;){var m=k[l];if(m.visible||m===h){var n=m.actualBounds,p=this.naturalBounds;if(!(n.x>p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof X?m:null;p=qd.alloc();p.set(g); if(null!==m?m.vf(a,b,c,d,e,p):gl(n,a,d,p))null!==b&&(n=b(n)),null===n||null!==c&&!c(n)||e.add(n);qd.free(p)}}}void 0===f&&qd.free(g);return d}void 0===f&&qd.free(g);return!1};function dn(a,b,c,d){for(var e=a.T.m,f=e.length;f--;){var g=e[f];if(g.visible){var h=g.actualBounds,k=a.naturalBounds;h.x>k.width||h.y>k.height||0>h.x+h.width||0>h.y+h.height||(g instanceof X&&dn(g,b,c,d),null!==b&&(g=b(g)),null===g||null!==c&&!c(g)||d.add(g))}}} -t.kg=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===c&&(c=null);void 0===d&&(d=null);var g=this.naturalBounds,h=this.he(),k=h?a:Ab(J.allocAt(a.x,a.y),this.transform),l=h?b:Ab(J.allocAt(b.x,b.y),this.transform),m=k.tf(l),n=0v.width||u.y>v.height||0>u.x+u.width||0>u.y+u.height))if(q.he()?(u=q.transform,Ab(k.set(a),u),Ab(l.set(b),u)):(k.set(a),l.set(b)),u=q,q=q instanceof X?q:null,null!==q?q.kg(k,l,c,d,e,f):u.Ux(k,l,e))null!==c&&(u=c(u)),null===u||null!==d&&!d(u)||f.add(u)}}J.free(k);J.free(l)}return e?n:g}return!1}; function ym(a){var b=null;a instanceof uf&&(b=a.spot1,b===Vc&&(b=null),a=a.geometry,null!==a&&null===b&&(b=a.spot1));null===b&&(b=sc);return b}function zm(a){var b=null;a instanceof uf&&(b=a.spot2,b===Vc&&(b=null),a=a.geometry,null!==a&&null===b&&(b=a.spot2));null===b&&(b=Cc);return b}t.add=function(a){for(var b=[],c=0;ca&&xa(a,">= 0",X,"removeColumnDefinition:idx");a=Math.round(a t.Tz=function(a){if(0>a||this.type!==X.Table)return-1;for(var b=0,c=this.Db,d=c.length,e=this.wi;ea||this.type!==X.Table)return-1;for(var b=0,c=this.yb,d=c.length,e=this.fi;ea;)this.bc(this.T.length-1,!1);jn(this,this.itemArray)}; function jn(a,b){var c=bn(a);if(null===b||0===b.length)for(;a.T.length>c;)a.bc(a.T.length-1,!1);else if(a.T.length<=c){c=b.length;for(var d=0;da&&xa(a,">= 0",Nj,"height"),this.rc=a,this.actual=this.ga,null!==this.panel&&this.panel.s(), +t.bind=function(a,b,c,d){var e=null;"string"===typeof a?e=new ri(a,b,c,d):e=a;e.nd=this;a=this.panel;null!==a&&(b=a.yh(),null!==b&&Fl(b)&&C("Cannot add a Binding to a RowColumnDefinition that is already frozen: "+e+" on "+a));null===this.fb&&(this.fb=new E);this.fb.add(e);return this}; +na.Object.defineProperties(Nj.prototype,{panel:{get:function(){return this.Xf}},isRow:{get:function(){return this.Br},set:function(a){this.Br=a}},index:{get:function(){return this.Pa},set:function(a){this.Pa=a}},height:{get:function(){return this.rc},set:function(a){var b=this.rc;b!==a&&(0>a&&xa(a,">= 0",Nj,"height"),this.rc=a,this.actual=this.ga,null!==this.panel&&this.panel.s(), this.Cb("height",b,a))}},width:{get:function(){return this.rc},set:function(a){var b=this.rc;b!==a&&(0>a&&xa(a,">= 0",Nj,"width"),this.rc=a,this.actual=this.ga,null!==this.panel&&this.panel.s(),this.Cb("width",b,a))}},minimum:{get:function(){return this.Ij},set:function(a){var b=this.Ij;b!==a&&((0>a||!isFinite(a))&&xa(a,">= 0",Nj,"minimum"),this.Ij=a,this.actual=this.ga,null!==this.panel&&this.panel.s(),this.Cb("minimum",b,a))}},maximum:{ get:function(){return this.Hj},set:function(a){var b=this.Hj;b!==a&&(0>a&&xa(a,">= 0",Nj,"maximum"),this.Hj=a,this.actual=this.ga,null!==this.panel&&this.panel.s(),this.Cb("maximum",b,a))}},alignment:{get:function(){return this.wb},set:function(a){var b=this.wb;b.A(a)||(this.wb=a.I(),null!==this.panel&&this.panel.s(),this.Cb("alignment",b,a))}},stretch:{get:function(){return this.Be},set:function(a){var b=this.Be;b!==a&&(this.Be= a,null!==this.panel&&this.panel.s(),this.Cb("stretch",b,a))}},separatorPadding:{get:function(){return this.$f},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.$f;null!==a&&null!==b&&b.A(a)||(null!==a&&(a=a.I()),this.$f=a,null!==this.panel&&this.panel.s(),this.Cb("separatorPadding",b,a))}},separatorStroke:{get:function(){return this.xp},set:function(a){var b=this.xp;b!==a&&(null!==a&&Nl(a,"RowColumnDefinition.separatorStroke"), a instanceof ml&&a.freeze(),this.xp=a,null!==this.panel&&this.panel.s(),this.Cb("separatorStroke",b,a))}},separatorStrokeWidth:{get:function(){return this.yp},set:function(a){var b=this.yp;b!==a&&(this.yp=a,null!==this.panel&&this.panel.s(),this.Cb("separatorStrokeWidth",b,a))}},separatorDashArray:{get:function(){return this.Tj},set:function(a){var b=this.Tj;if(b!==a){if(null!==a){for(var c=a.length,d=0,e=0;ee)){var f=d.measuredBounds,g=Math.max(1,f.width);f=f.height;for(var h=c[0],k=c[1],l,m,n,p,r,q,u=0,v=Fa(),w=2;wn&&(n=1);e=c=n;l=g/2;m=0===l?!1:!0;w=0;q=v[w];n=q[0];r=q[1];p=q[2];q=q[3];for(var z=0;.1<=u;){0===z&&(m?(e=c,e-=l,u-=l,m=!1):e=c,0===e&&(e=1)); if(e>u){Ia(v);return}e>q?(z=e-q,e=q):z=0;var y=Math.sqrt(e*e/(1+p*p));0>n&&(y=-y);h+=y;k+=p*y;a.translate(h,k);a.rotate(r);a.translate(-(g/2),-(f/2));0===z&&d.Fi(a,b);a.translate(g/2,f/2);a.rotate(-r);a.translate(-h,-k);u-=e;q-=e;if(0!==z){w++;if(w===v.length){Ia(v);return}q=v[w];n=q[0];r=q[1];p=q[2];q=q[3];e=z}}Ia(v)}} -t.Fi=function(a,b){var c=this.Dc,d=this.cl;if(null!==c||null!==d){var e=this.ma;if(null!==e){a.Bd();var f=this.actualBounds,g=this.naturalBounds;null!==d&&bi(this,a,d,!0,!1,g,f);var h=this.part,k=this.cg;null===c||0!==k||null===h||!this.isPanelMain&&h.nb()!==this||(k=h.type===X.Link&&h instanceof we&&"Selection"===h.category&&h.adornedObject instanceof uf&&h.adornedPart.nb()===h.adornedObject?h.adornedObject.strokeWidth:0);0===k&&(c=null);null!==c&&0!==k&&(bi(this,a,c,!1,!1,g,f),a.lineWidth=k,a.lineJoin= +t.Fi=function(a,b){var c=this.Dc,d=this.cl;if(null!==c||null!==d){var e=this.ma;if(null!==e){a.Fc();var f=this.actualBounds,g=this.naturalBounds;null!==d&&bi(this,a,d,!0,!1,g,f);var h=this.part,k=this.cg;null===c||0!==k||null===h||!this.isPanelMain&&h.nb()!==this||(k=h.type===X.Link&&h instanceof we&&"Selection"===h.category&&h.adornedObject instanceof uf&&h.adornedPart.nb()===h.adornedObject?h.adornedObject.strokeWidth:0);0===k&&(c=null);null!==c&&0!==k&&(bi(this,a,c,!1,!1,g,f),a.lineWidth=k,a.lineJoin= this.Ul,a.lineCap=this.Tl,a.miterLimit=this.Uj);f=!1;h&&b.Fe("drawShadows")&&(f=h.isShadowed);h=!0;null===c||null!==d&&"transparent"!==d||(h=!1);g=!1;k=this.strokeDashArray;null!==k&&(g=!0,a.As(k,this.jh));if(e.type===Q.j)a.beginPath(),a.moveTo(e.startX,e.startY),a.lineTo(e.endX,e.endY),null!==c&&a.Xi();else if(e.type===Q.C){var l=e.startX;k=e.startY;var m=e.endX,n=e.endY;e=Math.min(l,m);var p=Math.min(k,n);l=Math.abs(m-l);k=Math.abs(n-k);a.beginPath();a.rect(e,p,l,k);null!==d&&a.uf(d);if(null!== c){h&&f&&ql(a);if(0===l||0===k)a.beginPath(),a.rect(e,p,Math.max(l,.1),Math.max(k,.1));a.Xi();h&&f&&pl(a)}}else if(e.type===Q.M)l=e.startX,k=e.startY,m=e.endX,n=e.endY,e=Math.abs(m-l)/2,p=Math.abs(n-k)/2,l=Math.min(l,m)+e,k=Math.min(k,n)+p,a.beginPath(),a.moveTo(l,k-p),a.bezierCurveTo(l+L.qg*e,k-p,l+e,k-L.qg*p,l+e,k),a.bezierCurveTo(l+e,k+L.qg*p,l+L.qg*e,k+p,l,k+p),a.bezierCurveTo(l-L.qg*e,k+p,l-e,k+L.qg*p,l-e,k),a.bezierCurveTo(l-e,k-L.qg*p,l-L.qg*e,k-p,l,k-p),a.closePath(),null!==d&&a.uf(d),null!== c&&(h&&f?(ql(a),a.Xi(),pl(a)):a.Xi());else if(e.type===Q.o)for(e=e.figures,k=e.length,p=0;p(c.startX-c.endX)*(a.x-c.endX)+(c.startY-c.endY)*(a.y-c.endY)||0>d)return!1;N.free(f);return L.Mb(c.startX,c.startY,c.endX,c.endY,e,a.x,a.y)}if(c.type=== -Q.C){b=c.startX;var g=c.startY,h=c.endX;c=c.endY;f.x=Math.min(b,h);f.y=Math.min(g,c);f.width=Math.abs(h-b);f.height=Math.abs(c-g);if(null===this.fill){f.Gc(-d,-d);if(f.$(a))return N.free(f),!1;f.Gc(d,d)}null!==this.stroke&&f.Gc(e,e);a=f.$(a);N.free(f);return a}if(c.type===Q.M){g=c.startX;e=c.startY;h=c.endX;var k=c.endY;c=Math.min(g,h);b=Math.min(e,k);g=Math.abs(h-g)/2;e=Math.abs(k-e)/2;c=a.x-(c+g);b=a.y-(b+e);if(null===this.fill){g-=d;e-=d;if(0>=g||0>=e||1>=c*c/(g*g)+b*b/(e*e))return N.free(f),!1; +t.Mi=function(a){void 0===a&&(a=new N);var b=this.naturalBounds,c=this.de;b=N.allocAt(b.x,b.y,b.width,b.height);var d=this.strokeWidth;b.Hc(d/2,d/2);d=J.allocAt(b.x,b.y).transform(c);a.h(d.x,d.y,0,0);d.h(b.right,b.y).transform(c);$b(a,d.x,d.y,0,0);d.h(b.right,b.bottom).transform(c);$b(a,d.x,d.y,0,0);d.h(b.x,b.bottom).transform(c);$b(a,d.x,d.y,0,0);N.free(b);J.free(d);return a}; +t.xh=function(a,b){var c=this.geometry;if(null===c||null===this.fill&&null===this.stroke)return!1;var d=c.bounds,e=this.strokeWidth/2;c.type!==Q.j||b||(e+=2);var f=N.alloc();f.assign(d);f.Hc(e+2,e+2);if(!f.$(a))return N.free(f),!1;d=e+1E-4;if(c.type===Q.j){if(null===this.stroke)return!1;d=(c.endX-c.startX)*(a.x-c.startX)+(c.endY-c.startY)*(a.y-c.startY);if(0>(c.startX-c.endX)*(a.x-c.endX)+(c.startY-c.endY)*(a.y-c.endY)||0>d)return!1;N.free(f);return L.Mb(c.startX,c.startY,c.endX,c.endY,e,a.x,a.y)}if(c.type=== +Q.C){b=c.startX;var g=c.startY,h=c.endX;c=c.endY;f.x=Math.min(b,h);f.y=Math.min(g,c);f.width=Math.abs(h-b);f.height=Math.abs(c-g);if(null===this.fill){f.Hc(-d,-d);if(f.$(a))return N.free(f),!1;f.Hc(d,d)}null!==this.stroke&&f.Hc(e,e);a=f.$(a);N.free(f);return a}if(c.type===Q.M){g=c.startX;e=c.startY;h=c.endX;var k=c.endY;c=Math.min(g,h);b=Math.min(e,k);g=Math.abs(h-g)/2;e=Math.abs(k-e)/2;c=a.x-(c+g);b=a.y-(b+e);if(null===this.fill){g-=d;e-=d;if(0>=g||0>=e||1>=c*c/(g*g)+b*b/(e*e))return N.free(f),!1; g+=d;e+=d}null!==this.stroke&&(g+=d,e+=d);N.free(f);return 0>=g||0>=e?!1:1>=c*c/(g*g)+b*b/(e*e)}if(c.type===Q.o)return N.free(f),null===this.fill?Ud(c,a.x,a.y,e):Sd(c,a,e,1=this.strokeWidth)m=L.Ie(l.startX,l.startY,l.endX,l.endY,f,g,h,k,e);else{l.startX===l.endX?(d=n,m=0):(b=(l.endY-l.startY)/(l.endX-l.startX),m=n/Math.sqrt(1+b*b), d=m*b);b=Fa();a=new J;L.Ie(l.startX+d,l.startY+m,l.endX+d,l.endY+m,f,g,h,k,a)&&b.push(a);a=new J;L.Ie(l.startX-d,l.startY-m,l.endX-d,l.endY-m,f,g,h,k,a)&&b.push(a);a=new J;L.Ie(l.startX+d,l.startY+m,l.startX-d,l.startY-m,f,g,h,k,a)&&b.push(a);a=new J;L.Ie(l.endX+d,l.endY+m,l.endX-d,l.endY-m,f,g,h,k,a)&&b.push(a);h=b.length;if(0===h)return Ia(b),!1;m=!0;k=Infinity;for(d=0;dMath.abs(c)){k=g-m-c*(f-d);if(0>a*a*c*c+l*l-k*k){e.x=NaN;e.y=NaN;m=!1;break a}n=Math.sqrt(a*a*c*c+l*l-k*k);h=(-(a*a*c*k)+a*l*n)/(l*l+a*a*c*c)+d;a=(-(a*a*c*k)-a*l*n)/(l*l+a*a*c*c)+d;l=c*(h-d)+k+m;k=c* +n,r.y+r.height+n,f,g,h,k,e);else if(l.type===Q.M){b=N.allocAt(r.x,r.y,r.width,r.height).Hc(n,n);a:if(0===b.width)m=L.Ie(b.x,b.y,b.x,b.y+b.height,f,g,h,k,e);else if(0===b.height)m=L.Ie(b.x,b.y,b.x+b.width,b.y,f,g,h,k,e);else{a=b.width/2;l=b.height/2;d=b.x+a;m=b.y+l;c=9999;f!==h&&(c=(g-k)/(f-h));if(9999>Math.abs(c)){k=g-m-c*(f-d);if(0>a*a*c*c+l*l-k*k){e.x=NaN;e.y=NaN;m=!1;break a}n=Math.sqrt(a*a*c*c+l*l-k*k);h=(-(a*a*c*k)+a*l*n)/(l*l+a*a*c*c)+d;a=(-(a*a*c*k)-a*l*n)/(l*l+a*a*c*c)+d;l=c*(h-d)+k+m;k=c* (a-d)+k+m;Math.abs((f-h)*(f-h))+Math.abs((g-l)*(g-l))h){e.x=NaN;e.y=NaN;m=!1;break a}k=Math.sqrt(h);h=m+k;k=m-k;Math.abs(h-g)Math.abs(q)?(u*=.5/q,q=.5):0!==u&&.5>Math.abs(u)&&(q*=.5/u,u=.5),w-=q,z-= u;r.contains(w,z);)w-=q,z-=u;e.x=h;e.y=k;for(u=0;uc?a-c:c-a)<(b>d?b-d:d-b)?(a=ba||L.aa(k.y,a))&&(k.yb||L.aa(k.x,b))&&(k.x=a&&d<=b;a=d&&c<=a} -t.Ux=function(a,b,c){function d(a,b){for(var c=a.length,d=0;de)return!0;return!1}if(c&&null!==this.fill&&this.xh(a,!0))return!0;var e=a.tf(b),f=e;1.5e)return!0;return!1}if(c&&null!==this.fill&&this.xh(a,!0))return!0;var e=a.tf(b),f=e;1.5=e||Cb(b,f,0,-n)>=e||Cb(b, -f,0,n)>=e||Cb(b,f,m,0)>=e?!1:!0}else if(b.type===Q.o){l=b.bounds;f=l.x;h=l.y;k=l.x+l.width;l=l.y+l.height;if(a.x>k&&a.xl&&a.ye&&Bb(a.x,a.y,f,h,k,h)>e&&Bb(a.x,a.y,k,l,f,l)>e&&Bb(a.x,a.y,k,l,k,h)>e)return!1;f=Math.sqrt(e);if(c){if(null===this.fill?Ud(b,a.x,a.y,f):Sd(b,a,f,!0,!1))return!0}else{c=b.figures;for(b=0;be)return!1;h=f.segments.m;k=h.length;for(l=0;le)return!1;break;case Md:var p=Fa();L.Ce(g,m,n.point1X,n.point1Y,n.point2X,n.point2Y,n.endX,n.endY,.8,p);g=d(p,a);Ia(p);if(g)return!1;g=n.endX;m=n.endY;if(a.nd(g,m)>e)return!1;break;case Nd:p=Fa();L.xq(g,m,n.point1X,n.point1Y,n.endX,n.endY,.8,p);g=d(p,a);Ia(p);if(g)return!1;g=n.endX;m=n.endY;if(a.nd(g,m)>e)return!1;break;case Od:case Pd:p=n.type===Od?Qd(n,f):Rd(n,f,g,m);var r=p.length;if(0===r){g=n.type===Od?n.centerX:n.endX;m=n.type===Od?n.centerY:n.endY;if(a.nd(g,m)>e)return!1; +f,0,n)>=e||Cb(b,f,m,0)>=e?!1:!0}else if(b.type===Q.o){l=b.bounds;f=l.x;h=l.y;k=l.x+l.width;l=l.y+l.height;if(a.x>k&&a.xl&&a.ye&&Bb(a.x,a.y,f,h,k,h)>e&&Bb(a.x,a.y,k,l,f,l)>e&&Bb(a.x,a.y,k,l,k,h)>e)return!1;f=Math.sqrt(e);if(c){if(null===this.fill?Ud(b,a.x,a.y,f):Sd(b,a,f,!0,!1))return!0}else{c=b.figures;for(b=0;be)return!1;h=f.segments.m;k=h.length;for(l=0;le)return!1;break;case Md:var p=Fa();L.Ce(g,m,n.point1X,n.point1Y,n.point2X,n.point2Y,n.endX,n.endY,.8,p);g=d(p,a);Ia(p);if(g)return!1;g=n.endX;m=n.endY;if(a.od(g,m)>e)return!1;break;case Nd:p=Fa();L.xq(g,m,n.point1X,n.point1Y,n.endX,n.endY,.8,p);g=d(p,a);Ia(p);if(g)return!1;g=n.endX;m=n.endY;if(a.od(g,m)>e)return!1;break;case Od:case Pd:p=n.type===Od?Qd(n,f):Rd(n,f,g,m);var r=p.length;if(0===r){g=n.type===Od?n.centerX:n.endX;m=n.type===Od?n.centerY:n.endY;if(a.od(g,m)>e)return!1; break}n=null;for(var q=Fa(),u=0;u= 0",uf,"strokeWidth:value")}},strokeCap:{get:function(){return this.Tl}, set:function(a){var b=this.Tl;b!==a&&("string"!==typeof a||"butt"!==a&&"round"!==a&&"square"!==a?xa(a,'"butt", "round", or "square"',uf,"strokeCap"):(this.Tl=a,this.N(),this.g("strokeCap",b,a)))}},strokeJoin:{get:function(){return this.Ul},set:function(a){var b=this.Ul;b!==a&&("string"!==typeof a||"miter"!==a&&"bevel"!==a&&"round"!==a?xa(a,'"miter", "bevel", or "round"',uf,"strokeJoin"):(this.Ul=a,this.N(),this.g("strokeJoin",b,a)))}},strokeMiterLimit:{ get:function(){return this.Uj},set:function(a){var b=this.Uj;if(b!==a&&1<=a){this.Uj=a;this.N();var c=this.part;null!==c&&(c.Sf=NaN);this.g("strokeMiterLimit",b,a)}}},strokeDashArray:{get:function(){return this.ih},set:function(a){var b=this.ih;if(b!==a){if(null!==a){for(var c=a.length,d=0,e=0;ea?a=0:1a?a=0:1(n*n+m*m)*p*p&&(c=!0);b.Sb!==a&&(c=!1);!1===b.Fe("textGreeking")&&(c=!1);b=this.ff;n= -this.gf;switch(this.flip){case Zk:a.translate(e,0);a.scale(-1,1);break;case Yk:a.translate(0,f);a.scale(1,-1);break;case $k:a.translate(e,f),a.scale(-1,-1)}a.Bd();m=this.Wc;p=(b+g+n)*m;f>p&&(d=this.Bi,d=d.y*f-d.y*p+d.offsetY);if(1===m&&null!==this.me)n=this.qb,n>e&&(n=e),this.Ei(this.me,a,0,d+b,e,g,n,c,h,k,l);else if(null!==this.zc&&null!==this.Pb)for(p=0;pe&&(r=e);d+=b;this.Ei(this.Pb[p],a,0,d,e,g,r,c,h,k,l);d+=g+n}switch(this.flip){case Zk:a.scale(-1,1);a.translate(-e, +this.gf;switch(this.flip){case Zk:a.translate(e,0);a.scale(-1,1);break;case Yk:a.translate(0,f);a.scale(1,-1);break;case $k:a.translate(e,f),a.scale(-1,-1)}a.Fc();m=this.Xc;p=(b+g+n)*m;f>p&&(d=this.Bi,d=d.y*f-d.y*p+d.offsetY);if(1===m&&null!==this.me)n=this.qb,n>e&&(n=e),this.Ei(this.me,a,0,d+b,e,g,n,c,h,k,l);else if(null!==this.zc&&null!==this.Pb)for(p=0;pe&&(r=e);d+=b;this.Ei(this.Pb[p],a,0,d,e,g,r,c,h,k,l);d+=g+n}switch(this.flip){case Zk:a.scale(-1,1);a.translate(-e, 0);break;case Yk:a.scale(1,-1);a.translate(0,-f);break;case $k:a.scale(-1,-1),a.translate(-e,-f)}}}; t.Ei=function(a,b,c,d,e,f,g,h,k,l,m){var n=0;h?("left"===k?n=0:"right"===k?n=e-g:"center"===k&&(n=(e-g)/2),b.fillRect(c+n,d+.25*f,g,1)):("left"===k?n=0:"right"===k?n=e:"center"===k&&(n=e/2),e=null!==Nn?Nn(this,f):.75*f,b.fillText(a,c+n,d+e),a=f/20|0,0===a&&(a=1),"right"===k?n-=g:"center"===k&&(n-=g/2),l&&(k=null!==On?On(this,f):.8*f,b.beginPath(),b.lineWidth=a,b.moveTo(c+n,d+k),b.lineTo(c+n+g,d+k),b.stroke()),m&&(b.beginPath(),b.lineWidth=a,d=d+f-f/2.2|0,0!==a%2&&(d+=.5),b.moveTo(c+n,d),b.lineTo(c+ n+g,d),b.stroke()))}; t.qm=function(a,b,c,d){this.di=a;var e=this.ne;null!==In&&Pn!==e&&(Pn=In.font=e);this.qb=this.ze=0;this.me=this.Pb=this.zc=this.oe=null;var f;if(isNaN(this.desiredSize.width)){e=this.Ub.replace(/\r\n/g,"\n").replace(/\r/g,"\n");if(0===e.length)e=0;else if(this.isMultiline){for(var g=f=0,h=!1;!h;){var k=e.indexOf("\n",g);-1===k&&(k=e.length,h=!0);g=e.substr(g,k-g);this.Xh===Ln&&(g=g.trim());f=Math.max(f,Qn(g));g=k+1}e=f}else f=e.indexOf("\n",0),0<=f&&(e=e.substr(0,f)),e=Qn(e);e=Math.min(e,a/this.scale); e=Math.max(8,e)}else e=this.desiredSize.width;null!==this.panel&&(e=Math.min(e,this.panel.maxSize.width));f=Rn(this,e);isNaN(this.desiredSize.height)?f=Math.min(f,b/this.scale):f=this.desiredSize.height;h=f;if(0!==this.qb&&null!==this.zc&&null!==this.Pb&&this.Vf===Sn&&(b=this.ne,b=this.Vf===Sn?Tn(b):0,k=this.ff+this.gf,k=Math.max(0,Mn(this)+k),h=Math.min(this.maxLines-1,Math.max(Math.floor(h/k+.01)-1,0)),!(h+1>=this.Pb.length))){k=this.Pb[h];for(b=Math.max(1,a-b);Qn(k)>b&&1=a.te)null!==d&&d.h(0,h);else if(g=b,a.gg===Yn){a.ze=1;var l=Qn(b);if(0===k||l<=c)a.qb=Math.max(a.qb,l),Wn(a,b,a.qb),null!==d&&d.h(l,h);else{f=Zn(a,g);g=g.substr(f.length);b=Zn(a,g);for(l=Qn(f+b);0c&&1c;){var n=1;l=Qn(b.substr(0,n));for(m=0;l<=c;)n++,m=l,l=Qn(b.substr(0,n));if(1===n){var p=l;f=Math.max(f,l)}else p=m,f=Math.max(f,m);n--;1>n&&(n=1);Wn(a,b.substr(0,n),p);k++;b=b.substr(n);if(a.Wc+k>a.te)break}m=Zn(a,g);for(l=Qn(b+m);0a.te))break}a.ze=Math.min(a.te,k);a.qb=Math.max(a.qb,f);null!==d&&d.h(a.qb,h*a.ze)}}function Zn(a,b){if(a.gg===$n)return b.substr(0,1);for(var c=b.length,d=0,e=ao;d=b.length?b:b.substr(0,d)}function Qn(a){return null===In?8*a.length:In.measureText(a).width} +function Xn(a,b,c,d){var e=a.Xh===Ln;e&&(b=b.trim());var f=0,g=a.ne,h=a.ff+a.gf;h=Math.max(0,Mn(a)+h);var k=a.Vf===Sn?Tn(g):0;if(a.Xc>=a.te)null!==d&&d.h(0,h);else if(g=b,a.gg===Yn){a.ze=1;var l=Qn(b);if(0===k||l<=c)a.qb=Math.max(a.qb,l),Wn(a,b,a.qb),null!==d&&d.h(l,h);else{f=Zn(a,g);g=g.substr(f.length);b=Zn(a,g);for(l=Qn(f+b);0c&&1c;){var n=1;l=Qn(b.substr(0,n));for(m=0;l<=c;)n++,m=l,l=Qn(b.substr(0,n));if(1===n){var p=l;f=Math.max(f,l)}else p=m,f=Math.max(f,m);n--;1>n&&(n=1);Wn(a,b.substr(0,n),p);k++;b=b.substr(n);if(a.Xc+k>a.te)break}m=Zn(a,g);for(l=Qn(b+m);0a.te))break}a.ze=Math.min(a.te,k);a.qb=Math.max(a.qb,f);null!==d&&d.h(a.qb,h*a.ze)}}function Zn(a,b){if(a.gg===$n)return b.substr(0,1);for(var c=b.length,d=0,e=ao;d=b.length?b:b.substr(0,d)}function Qn(a){return null===In?8*a.length:In.measureText(a).width} function Mn(a){if(null!==a.oe)return a.oe;var b=a.ne;if(null===In){var c=16;return a.oe=c}void 0!==co[b]&&5E3>eo?c=co[b]:(c=1.3*In.measureText("M").width,co[b]=c,eo++);return a.oe=c}function Tn(a){if(null===In)return 6;if(void 0!==fo[a]&&5E3>go)var b=fo[a];else b=In.measureText(Un).width,fo[a]=b,go++;return b} -function Rn(a,b){var c=a.Ub.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),d=a.ff+a.gf;d=Math.max(0,Mn(a)+d);if(0===c.length)return a.qb=0,a.Wc=1,d;if(!a.isMultiline){var e=c.indexOf("\n",0);0<=e&&(c=c.substr(0,e))}e=0;for(var f=a.Wc=0,g,h=!1;!h;){g=c.indexOf("\n",f);-1===g&&(g=c.length,h=!0);if(f<=g){f=c.substr(f,g-f);if(a.gg!==Yn){a.ze=0;var k=M.alloc();Xn(a,f,b,k);e+=k.height;M.free(k);a.Wc+=a.ze}else Xn(a,f,b,null),e+=d,a.Wc++;a.Wc===a.te&&(h=!0)}f=g+1}return a.Ir=e} +function Rn(a,b){var c=a.Ub.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),d=a.ff+a.gf;d=Math.max(0,Mn(a)+d);if(0===c.length)return a.qb=0,a.Xc=1,d;if(!a.isMultiline){var e=c.indexOf("\n",0);0<=e&&(c=c.substr(0,e))}e=0;for(var f=a.Xc=0,g,h=!1;!h;){g=c.indexOf("\n",f);-1===g&&(g=c.length,h=!0);if(f<=g){f=c.substr(f,g-f);if(a.gg!==Yn){a.ze=0;var k=M.alloc();Xn(a,f,b,k);e+=k.height;M.free(k);a.Xc+=a.ze}else Xn(a,f,b,null),e+=d,a.Xc++;a.Xc===a.te&&(h=!0)}f=g+1}return a.Ir=e} na.Object.defineProperties(Lg.prototype,{font:{get:function(){return this.ne},set:function(a){var b=this.ne;b!==a&&(this.ne=a,this.oe=null,this.s(),this.g("font",b,a))}},text:{get:function(){return this.Ub},set:function(a){var b=this.Ub;null!==a&&void 0!==a?a=a.toString():a="";b!==a&&(this.Ub=a,this.s(),this.g("text",b,a))}},textAlign:{get:function(){return this.ui},set:function(a){var b=this.ui;b===a||"start"!== a&&"end"!==a&&"left"!==a&&"right"!==a&&"center"!==a||(this.ui=a,this.N(),this.g("textAlign",b,a))}},flip:{get:function(){return this.Rd},set:function(a){var b=this.Rd;b!==a&&(this.Rd=a,this.N(),this.g("flip",b,a))}},verticalAlignment:{get:function(){return this.Bi},set:function(a){var b=this.Bi;b.A(a)||(this.Bi=a=a.I(),zl(this),this.g("verticalAlignment",b,a))}},naturalBounds:{get:function(){if(!this.qc.u()){var a= M.alloc();Xn(this,this.Ub,999999,a);var b=a.width;M.free(a);a=Rn(this,b);var c=this.desiredSize;isNaN(c.width)||(b=c.width);isNaN(c.height)||(a=c.height);Tb(this.qc,b,a)}return this.qc}},isMultiline:{get:function(){return this.Aj},set:function(a){var b=this.Aj;b!==a&&(this.Aj=a,this.s(),this.g("isMultiline",b,a))}},isUnderline:{get:function(){return this.ai},set:function(a){var b=this.ai;b!==a&&(this.ai=a,this.N(),this.g("isUnderline",b, a))}},isStrikethrough:{get:function(){return this.$h},set:function(a){var b=this.$h;b!==a&&(this.$h=a,this.N(),this.g("isStrikethrough",b,a))}},wrap:{get:function(){return this.gg},set:function(a){var b=this.gg;b!==a&&(this.gg=a,this.s(),this.g("wrap",b,a))}},overflow:{get:function(){return this.Vf},set:function(a){var b=this.Vf;b!==a&&(this.Vf=a,this.s(),this.g("overflow",b,a))}},stroke:{ -get:function(){return this.Dc},set:function(a){var b=this.Dc;b!==a&&(null!==a&&Nl(a,"TextBlock.stroke"),a instanceof ml&&a.freeze(),this.Dc=a,this.N(),this.g("stroke",b,a))}},lineCount:{get:function(){return this.Wc}},lineHeight:{get:function(){return Mn(this)}},editable:{get:function(){return this.En},set:function(a){var b=this.En;b!==a&&(this.En=a,this.g("editable",b,a))}},textEditor:{ -get:function(){return this.Lp},set:function(a){var b=this.Lp;b!==a&&(this.Lp=a,this.g("textEditor",b,a))}},errorFunction:{get:function(){return this.kd},set:function(a){var b=this.kd;b!==a&&(this.kd=a,this.g("errorFunction",b,a))}},interval:{get:function(){return this.Wd},set:function(a){var b=this.Wd;a=Math.round(a);if(b!==a&&0!==a&&isFinite(a)){this.Wd=a;this.s();var c=this.panel;null!==c&&(c.Nf=null);this.g("interval",b,a)}}},graduatedStart:{ +get:function(){return this.Dc},set:function(a){var b=this.Dc;b!==a&&(null!==a&&Nl(a,"TextBlock.stroke"),a instanceof ml&&a.freeze(),this.Dc=a,this.N(),this.g("stroke",b,a))}},lineCount:{get:function(){return this.Xc}},lineHeight:{get:function(){return Mn(this)}},editable:{get:function(){return this.En},set:function(a){var b=this.En;b!==a&&(this.En=a,this.g("editable",b,a))}},textEditor:{ +get:function(){return this.Lp},set:function(a){var b=this.Lp;b!==a&&(this.Lp=a,this.g("textEditor",b,a))}},errorFunction:{get:function(){return this.ld},set:function(a){var b=this.ld;b!==a&&(this.ld=a,this.g("errorFunction",b,a))}},interval:{get:function(){return this.Wd},set:function(a){var b=this.Wd;a=Math.round(a);if(b!==a&&0!==a&&isFinite(a)){this.Wd=a;this.s();var c=this.panel;null!==c&&(c.Nf=null);this.g("interval",b,a)}}},graduatedStart:{ get:function(){return this.Ud},set:function(a){var b=this.Ud;b!==a&&(0>a?a=0:1a?a=0:1=a&&xa(a,"> 0",Lg,"maxLines"),this.te=a,this.s(),this.g("maxLines",b,a))}},metrics:{get:function(){return{arrSize:null!==this.zc?this.zc:[this.qb],arrText:null!==this.Pb?this.Pb:[this.me],maxLineWidth:this.qb,fontHeight:this.oe}}},choices:{get:function(){return this.gn},set:function(a){var b=this.gn;b!==a&&(this.gn=a,this.g("choices",b,a))}}}); var Nn=null,On=null,Yn=new D(Lg,"None",0),Vn=new D(Lg,"WrapFit",1),Kn=new D(Lg,"WrapDesiredSize",2),$n=new D(Lg,"WrapBreakAll",3),Jn=new D(Lg,"OverflowClip",0),Sn=new D(Lg,"OverflowEllipsis",1),Ln=new D(Lg,"FormatTrim",0),bo=new D(Lg,"FormatNone",0),ao=/[ \u200b\u00ad]/,co=new Wa,eo=0,fo=new Wa,go=0,Un="...",Pn="",In=null,Hn=!1;Lg.className="TextBlock";Lg.getEllipsis=function(){return Un};Lg.setEllipsis=function(a){Un=a;fo=new Wa;go=0};Lg.getBaseline=function(){return Nn}; Lg.setBaseline=function(a){Nn=a};Lg.getUnderline=function(){return On};Lg.setUnderline=function(a){On=a};Lg.isValidFont=function(a){Hn||(In=Jg?(new Ak(null)).context:null,Hn=!0);if(null===In)return!0;var b=In.font;if(a===b||"10px sans-serif"===a)return!0;In.font="10px sans-serif";In.font=a;var c=In.font;if("10px sans-serif"!==c)return In.font=b,!0;In.font="19px serif";var d=In.font;In.font=a;c=In.font;In.font=b;return c!==d};Lg.FormatNone=bo;Lg.FormatTrim=Ln;Lg.None=Yn;Lg.OverflowClip=Jn; -Lg.OverflowEllipsis=Sn;Lg.WrapBreakAll=$n;Lg.WrapDesiredSize=Kn;Lg.WrapFit=Vn;function Vj(a,b){Y.call(this);this.Gg=null;this.Ep="";this.hh=hc;this.fl=sd;this.kh=this.kd=null;this.el=yc;this.Rd=og;this.Wl=null;this.co=!1;this.Kn=!0;this.ul=!1;this.Pl=null;"string"===typeof a?this.source=a:a&&Object.assign(this,a);b&&Object.assign(this,b)}var ho;ma(Vj,Y); -Vj.prototype.cloneProtected=function(a){Y.prototype.cloneProtected.call(this,a);a.element=this.Gg;a.Ep=this.Ep;a.hh=this.hh.I();a.fl=this.fl;a.Rd=this.Rd;a.kd=this.kd;a.kh=this.kh;a.el=this.el.I();a.Kn=this.Kn;a.Pl=this.Pl};Vj.prototype.gb=function(a){a===og||a===qg||a===Xk?this.imageStretch=a:Y.prototype.gb.call(this,a)};Vj.prototype.toString=function(){return"Picture("+this.source+")#"+gb(this)};function Ii(a){void 0===a&&(a="");""!==a?ho[a]&&(delete ho[a],io--):(ho=new Wa,io=0)} +Lg.OverflowEllipsis=Sn;Lg.WrapBreakAll=$n;Lg.WrapDesiredSize=Kn;Lg.WrapFit=Vn;function Vj(a,b){Y.call(this);this.Gg=null;this.Ep="";this.hh=hc;this.fl=sd;this.kh=this.ld=null;this.el=yc;this.Rd=og;this.Wl=null;this.co=!1;this.Kn=!0;this.ul=!1;this.Pl=null;"string"===typeof a?this.source=a:a&&Object.assign(this,a);b&&Object.assign(this,b)}var ho;ma(Vj,Y); +Vj.prototype.cloneProtected=function(a){Y.prototype.cloneProtected.call(this,a);a.element=this.Gg;a.Ep=this.Ep;a.hh=this.hh.I();a.fl=this.fl;a.Rd=this.Rd;a.ld=this.ld;a.kh=this.kh;a.el=this.el.I();a.Kn=this.Kn;a.Pl=this.Pl};Vj.prototype.gb=function(a){a===og||a===qg||a===Xk?this.imageStretch=a:Y.prototype.gb.call(this,a)};Vj.prototype.toString=function(){return"Picture("+this.source+")#"+gb(this)};function Ii(a){void 0===a&&(a="");""!==a?ho[a]&&(delete ho[a],io--):(ho=new Wa,io=0)} function jo(a,b){b.Vy||(b.Hr=function(c){b.zr=!0;b.Xn=!1;var d=b.Cg.copy();if(null!==d&&void 0!==d){for(d=d.iterator;d.next();){var e=d.value;var f=b.getAttribute("src")||"";var g=e.$g.H(f);if(null!==g)for(var h=g.length,k=0;k=d.width&&(e=e+r.offsetX+(m*r.x-d.width*r.x));n>=d.height&&(f=f+r.offsetY+(n*r.y-d.height*r.y));h=Math.min(d.width,m);g=Math.min(d.height,n);break;case sd:m=d.width;n=d.height;break;case qg:case Xk:p===qg?(p=Math.min(d.height/n,d.width/m),m*=p,n*=p):p===Xk&&(p=Math.max(d.height/n,d.width/m),m*=p,n*=p,m>=d.width&&(e=(e+r.offsetX+(m*r.x-d.width*r.x)/m)*h),n>=d.height&&(f=(f+r.offsetY+(n*r.y-d.height*r.y)/n)*g),h*=1/(m/ d.width),g*=1/(n/d.height),m=d.width,n=d.height)}p=this.wf()*b.scale;var q=m*p*n*p,u=h*g/q,v=c.__goCache;p=null;var w=ko;if(c.zr&&void 0!==v&&4w*w)for(null===v.Di&&(lo(v,4,k,l,c),lo(v,16,k,l,c)),k=v.Di,l=k.length,q=0;qe.x&&a.y>e.y&&a.righte.x&&b.y>e.y&&b.righte.x&&a.y>e.y&&a.righte.x&&b.y>e.y&&b.right=c.maxSelectionCount)){this.D^=4096;var d=!1;if(null!==c){d=c.skipsUndoManager;c.skipsUndoManager=!0;var e=c.selection;e.ea();a?e.add(this):e.remove(this);e.freeze()}this.g("isSelected",b,a);this.Kb();a=this.selectionChanged;null!==a&&a(this);null!==c&&(c.Fb(),c.skipsUndoManager=d)}}}},isHighlighted:{get:function(){return 0!== (this.D&524288)},set:function(a){var b=0!==(this.D&524288);if(b!==a){this.D^=524288;var c=this.diagram;null!==c&&(c=c.highlighteds,c.ea(),a?c.add(this):c.remove(this),c.freeze());this.g("isHighlighted",b,a);this.N();a=this.highlightedChanged;null!==a&&a(this)}}},isShadowed:{get:function(){return 0!==(this.D&8192)},set:function(a){var b=0!==(this.D&8192);b!==a&&(this.D^=8192,this.g("isShadowed",b,a),this.N())}},isAnimated:{get:function(){return 0!== @@ -1410,19 +1410,19 @@ get:function(){return this.tp},set:function(a){var b=this.tp;b!==a&&(this.tp=a,t b!==a&&(this.vp=a,this.g("selectionChanged",b,a))}},resizeAdornmentTemplate:{get:function(){return this.gp},set:function(a){var b=this.gp;b!==a&&(this.gp=a,this.g("resizeAdornmentTemplate",b,a))}},resizeObjectName:{get:function(){return this.ip},set:function(a){var b=this.ip;b!==a&&(this.ip=a,this.g("resizeObjectName",b,a))}},resizeObject:{get:function(){var a=this.resizeObjectName;return""!==a&&(a=this.Ya(a), null!==a)?a:this}},resizeCellSize:{get:function(){return this.hp},set:function(a){var b=this.hp;b.A(a)||(this.hp=a=a.I(),this.g("resizeCellSize",b,a))}},rotateAdornmentTemplate:{get:function(){return this.kp},set:function(a){var b=this.kp;b!==a&&(this.kp=a,this.g("rotateAdornmentTemplate",b,a))}},rotateObjectName:{get:function(){return this.lp},set:function(a){var b=this.lp;b!==a&&(this.lp=a,this.g("rotateObjectName", b,a))}},rotateObject:{get:function(){var a=this.rotateObjectName;return""!==a&&(a=this.Ya(a),null!==a)?a:this}},rotationSpot:{get:function(){return this.mp},set:function(a){var b=this.mp;b.A(a)||(this.mp=a=a.I(),this.g("rotationSpot",b,a))}},text:{get:function(){return this.Ub},set:function(a){var b=this.Ub;b!==a&&(this.Ub=a,this.g("text",b,a))}},containingGroup:{get:function(){return this.Qh}, -set:function(a){if(this.Jc()){var b=this.Qh;if(b!==a){null===a||this!==a&&!a.Fd(this)||(this===a&&C("Cannot make a Group a member of itself: "+this.toString()),C("Cannot make a Group indirectly contain itself: "+this.toString()+" already contains "+a.toString()));this.B(2);var c=this.diagram;null!==b?Do(b,this):this instanceof hf&&null!==c&&c.xi.remove(this);this.Qh=a;null!==a?Co(a,this):this instanceof hf&&null!==c&&c.xi.add(this);this.B(1);if(null!==c&&c.Z){var d=this.data,e=c.model;if(null!==d&& +set:function(a){if(this.Kc()){var b=this.Qh;if(b!==a){null===a||this!==a&&!a.Fd(this)||(this===a&&C("Cannot make a Group a member of itself: "+this.toString()),C("Cannot make a Group indirectly contain itself: "+this.toString()+" already contains "+a.toString()));this.B(2);var c=this.diagram;null!==b?Do(b,this):this instanceof hf&&null!==c&&c.xi.remove(this);this.Qh=a;null!==a?Co(a,this):this instanceof hf&&null!==c&&c.xi.add(this);this.B(1);if(null!==c&&c.Z){var d=this.data,e=c.model;if(null!==d&& e.pk()){var f=e.pa(null!==a?a.data:null);e.Gq(d,f)}}d=this.containingGroupChanged;null!==d&&(e=!0,null!==c&&(e=c.Z,c.Z=!0),d(this,b,a),null!==c&&(c.Z=e));if(this instanceof hf)for(c=new G,Rk(c,this,!0,0,!0),c=c.iterator;c.next();)if(d=c.value,d instanceof W)for(d=d.linksConnected;d.next();)Io(d.value);if(this instanceof W){for(c=this.linksConnected;c.next();)Io(c.value);c=this.labeledLink;null!==c&&Io(c)}this.g("containingGroup",b,a);null!==a&&(b=a.layer,null!==b&&ci(b,-1,a))}}else C("cannot set the Part.containingGroup of a Link or Adornment")}}, containingGroupChanged:{get:function(){return this.kn},set:function(a){var b=this.kn;b!==a&&(this.kn=a,this.g("containingGroupChanged",b,a))}},isTopLevel:{get:function(){return null!==this.containingGroup||this instanceof W&&null!==this.labeledLink?!1:!0}},layoutConditions:{get:function(){return this.so},set:function(a){var b=this.so;b!==a&&(this.so=a,this.g("layoutConditions",b,a))}},dragComputation:{ get:function(){return this.An},set:function(a){var b=this.An;b!==a&&(this.An=a,this.g("dragComputation",b,a))}},shadowOffset:{get:function(){return this.Bp},set:function(a){var b=this.Bp;b.A(a)||(this.Bp=a=a.I(),this.N(),this.g("shadowOffset",b,a))}},shadowColor:{get:function(){return this.Ap},set:function(a){var b=this.Ap;b!==a&&(this.Ap=a,this.N(),this.g("shadowColor",b,a))}},shadowBlur:{get:function(){return this.bg}, set:function(a){var b=this.bg;b!==a&&(this.bg=a,this.N(),this.g("shadowBlur",b,a))}}});V.prototype.invalidateLayout=V.prototype.B;V.prototype.findCommonContainingGroup=V.prototype.Rx;V.prototype.isMemberOf=V.prototype.Fd;V.prototype.findTopLevelPart=V.prototype.Yz;V.prototype.findSubGraphLevel=V.prototype.Uz;V.prototype.ensureBounds=V.prototype.Sa;V.prototype.getDocumentBounds=V.prototype.Mi;V.prototype.findObject=V.prototype.Ya;V.prototype.moveTo=V.prototype.moveTo; V.prototype.invalidateAdornments=V.prototype.Kb;V.prototype.clearAdornments=V.prototype.$j;V.prototype.removeAdornment=V.prototype.Cf;V.prototype.addAdornment=V.prototype.th;V.prototype.findAdornment=V.prototype.hk;V.prototype.updateTargetBindings=V.prototype.Da;var Ao=!1;V.className="Part";V.LayoutNone=0;V.LayoutAdded=1;V.LayoutRemoved=2;V.LayoutShown=4;V.LayoutHidden=8;V.LayoutNodeSized=16;V.LayoutGroupLayout=32;V.LayoutNodeReplaced=64;V.LayoutStandard=127;V.LayoutAll=16777215; -function we(a,b){void 0===a||a instanceof Kl||"string"===typeof a?V.call(this,a):(V.call(this),a&&(b=a));this.D&=-257;this.Og="Adornment";this.ie=null;this.ax=0;this.xx=!1;this.j=this.Ra=null;b&&Object.assign(this,b)}ma(we,V);we.prototype.toString=function(){var a=this.adornedPart;return"Adornment("+this.category+")"+(null!==a?a.toString():"")};we.prototype.updateRelationshipsFromData=function(){}; -we.prototype.sk=function(a){var b=this.adornedObject,c=null===b||void 0===b?void 0:b.part;if(c instanceof U&&b instanceof uf){b=c.path;c.sk(a);a=b.geometry;c=this.T.m;b=c.length;for(var d=0;da&&(a=1);var b=this.diagram;if(null!==b&&!b.He){b.He=!0;var c=new G;c.add(this);To(this,c,b.isTreePathToChildren,a,b,this,b.treeCollapsePolicy===qi);b.He=!1}};function To(a,b,c,d,e,f,g){if(1a&&(a=2);var b=this.diagram;if(null!==b&&!b.He){b.He=!0;var c=new G;c.add(this);Vo(this,c,b.isTreePathToChildren,a,b,this,b.treeCollapsePolicy===qi);b.He=!1}}; -function Vo(a,b,c,d,e,f,g){for(var h=f===a?!1:a.isTreeExpanded,k=c?a.iq():a.Dd();k.next();){var l=k.value;l.isTreeLink&&(h||l.rd||l.Ua(),l=l.nq(a),null!==l&&l!==a&&!b.contains(l)&&(b.add(l),h||(l.Nb(!0),l.Ch(),g&&e.Yj(l,f)),2e&&(e=h.right);h.bottom>f&&(f=h.bottom)}}isFinite(c)&&isFinite(d)?a.h(c,d,e-c,f-d):(b=b.location, a.h(b.x,b.y,0,0));return a};na.Object.defineProperties(mg.prototype,{padding:{get:function(){return this.mb},set:function(a){"number"===typeof a&&(a=new ic(a));var b=this.mb;b.A(a)||(this.mb=a=a.I(),this.g("padding",b,a),this.s())}}});mg.className="Placeholder"; -function U(a){V.call(this,X.Link);this.Ia=8;this.Se=null;this.Te="";this.kf=this.On=null;this.lf="";this.Op=null;this.Ek=Vf;this.rn=0;this.tn=Vf;this.un=NaN;this.Oj=$o;this.Dp=.5;this.ld=null;this.Bb=(new E).freeze();this.cf=this.Zg=null;this.Gl=new N;this.ma=new Q;this.C=this.o=this.If=this.Mf=null;this.Ru=new J;this.qr=this.px=this.ox=null;this.Rt=NaN;this.P=null;this.j=[];a&&Object.assign(this,a)}ma(U,V); +function U(a){V.call(this,X.Link);this.Ia=8;this.Se=null;this.Te="";this.kf=this.On=null;this.lf="";this.Op=null;this.Ek=Vf;this.rn=0;this.tn=Vf;this.un=NaN;this.Oj=$o;this.Dp=.5;this.md=null;this.Bb=(new E).freeze();this.cf=this.Zg=null;this.Gl=new N;this.ma=new Q;this.C=this.o=this.If=this.Mf=null;this.Ru=new J;this.qr=this.px=this.ox=null;this.Rt=NaN;this.P=null;this.j=[];a&&Object.assign(this,a)}ma(U,V); U.prototype.cloneProtected=function(a){V.prototype.cloneProtected.call(this,a);a.Ia=this.Ia&-113;a.Te=this.Te;a.On=this.On;a.lf=this.lf;a.Op=this.Op;a.Ek=this.Ek;a.rn=this.rn;a.tn=this.tn;a.un=this.un;a.Oj=this.Oj;a.Dp=this.Dp;null!==this.P&&(a.P=this.P.copy())};t=U.prototype;t.sf=function(a){V.prototype.sf.call(this,a);this.Te=a.Te;this.lf=a.lf;a.Zg=null;a.Ua();a.If=this.If;var b=a.fromPort;null!==b&&Mo(b);a=a.toPort;null!==a&&Mo(a)}; -t.gb=function(a){a.classType===U?2===(a.value&2)?this.routing=a:a===Yf||a===Uf||a===Tf?this.curve=a:a===ap||a===bp||a===cp?this.adjusting=a:a!==$o&&a!==Vf&&C("Unknown Link enum value for a Link property: "+a):V.prototype.gb.call(this,a)};t.Hc=function(){null===this.P&&(this.P=new cl)};t.Si=function(){var a=this.fromNode;if(null!==a){var b=a.findVisibleNode();null!==b&&(a=b);if(nj(a)||oj(a))return!1}a=this.toNode;return null!==a&&(b=a.findVisibleNode(),null!==b&&(a=b),nj(a)||oj(a))?!1:!0};t.Zv=function(){return!1}; -t.gt=function(){};t.Jc=function(){return!1};U.prototype.computeAngle=function(a,b,c){return U.computeAngle(b,c)};U.computeAngle=function(a,b){switch(a){default:case Vf:a=0;break;case Rm:a=b;break;case Km:a=b+90;break;case Mm:a=b-90;break;case dp:a=b+180;break;case Sm:a=L.vq(b);90a&&(a-=180);break;case Lm:a=L.vq(b+90);90a&&(a-=180);break;case Nm:a=L.vq(b-90);90a&&(a-=180);break;case Om:a=L.vq(b);if(45a||225a)return 0;90a&&(a-=180)}return L.vq(a)}; -function Io(a){var b=a.fromNode,c=a.toNode,d=null;null!==b?d=null!==c?b.Rx(c):b.containingGroup:null!==c?d=c.containingGroup:d=null;b=d;c=a.Qh;if(c!==b){null!==c&&Do(c,a);a.Qh=b;null!==b&&Co(b,a);var e=a.containingGroupChanged;if(null!==e){var f=!0,g=a.diagram;null!==g&&(f=g.Z,g.Z=!0);e(a,c,b);null!==g&&(g.Z=f)}!a.rd||a.ox!==c&&a.px!==c||a.Ua()}if(a.isLabeledLink)for(a=a.labelNodes;a.next();)a.value.containingGroup=d}t=U.prototype; -t.Ch=function(){var a=this.containingGroup;null!==a&&this.fromNode!==a&&this.toNode!==a&&a.computesBoundsIncludingLinks&&V.prototype.Ch.call(this)};t.nq=function(a){var b=this.fromNode;return a===b?this.toNode:b};t.gA=function(a){var b=this.fromPort;return a===b?this.toPort:b};function Qo(a,b){null===a.ld&&(a.ld=new G);a.ld.add(b);a.s()} +t.gb=function(a){a.classType===U?2===(a.value&2)?this.routing=a:a===Yf||a===Uf||a===Tf?this.curve=a:a===ap||a===bp||a===cp?this.adjusting=a:a!==$o&&a!==Vf&&C("Unknown Link enum value for a Link property: "+a):V.prototype.gb.call(this,a)};t.Ic=function(){null===this.P&&(this.P=new cl)};t.Si=function(){var a=this.fromNode;if(null!==a){var b=a.findVisibleNode();null!==b&&(a=b);if(nj(a)||oj(a))return!1}a=this.toNode;return null!==a&&(b=a.findVisibleNode(),null!==b&&(a=b),nj(a)||oj(a))?!1:!0};t.Zv=function(){return!1}; +t.gt=function(){};t.Kc=function(){return!1};U.prototype.computeAngle=function(a,b,c){return U.computeAngle(b,c)};U.computeAngle=function(a,b){switch(a){default:case Vf:a=0;break;case Rm:a=b;break;case Km:a=b+90;break;case Mm:a=b-90;break;case dp:a=b+180;break;case Sm:a=L.vq(b);90a&&(a-=180);break;case Lm:a=L.vq(b+90);90a&&(a-=180);break;case Nm:a=L.vq(b-90);90a&&(a-=180);break;case Om:a=L.vq(b);if(45a||225a)return 0;90a&&(a-=180)}return L.vq(a)}; +function Io(a){var b=a.fromNode,c=a.toNode,d=null;null!==b?d=null!==c?b.Rx(c):b.containingGroup:null!==c?d=c.containingGroup:d=null;b=d;c=a.Qh;if(c!==b){null!==c&&Do(c,a);a.Qh=b;null!==b&&Co(b,a);var e=a.containingGroupChanged;if(null!==e){var f=!0,g=a.diagram;null!==g&&(f=g.Z,g.Z=!0);e(a,c,b);null!==g&&(g.Z=f)}!a.sd||a.ox!==c&&a.px!==c||a.Ua()}if(a.isLabeledLink)for(a=a.labelNodes;a.next();)a.value.containingGroup=d}t=U.prototype; +t.Ch=function(){var a=this.containingGroup;null!==a&&this.fromNode!==a&&this.toNode!==a&&a.computesBoundsIncludingLinks&&V.prototype.Ch.call(this)};t.nq=function(a){var b=this.fromNode;return a===b?this.toNode:b};t.gA=function(a){var b=this.fromPort;return a===b?this.toPort:b};function Qo(a,b){null===a.md&&(a.md=new G);a.md.add(b);a.s()} t.pq=function(a){V.prototype.pq.call(this,a);ep(this)&&this.rq(this.actualBounds);if(!a){a=this.Se;var b=null;null!==a&&(b=this.fromPort,Oo(a,this,b));var c=this.kf;if(null!==c){var d=this.toPort;c===a&&d===b||Oo(c,this,d)}fp(this)}};t.qq=function(a){V.prototype.qq.call(this,a);ep(this)&&this.rq(this.actualBounds);if(!a){a=this.Se;var b=null;null!==a&&(b=this.fromPort,Po(a,this,b));var c=this.kf;if(null!==c){var d=this.toPort;c===a&&d===b||Po(c,this,d)}gp(this)}}; -t.fk=function(){this.rd=!0;if(null!==this.ld){var a=this.diagram;if(null!==a)for(var b=this.ld.copy().iterator;b.next();)a.remove(b.value)}null!==this.data&&(a=this.diagram,null!==a&&a.partManager.removeDataForLink(this))};U.prototype.updateRelationshipsFromData=function(){if(null!==this.data){var a=this.diagram;null!==a&&a.partManager.updateRelationshipsFromData(this)}}; +t.fk=function(){this.sd=!0;if(null!==this.md){var a=this.diagram;if(null!==a)for(var b=this.md.copy().iterator;b.next();)a.remove(b.value)}null!==this.data&&(a=this.diagram,null!==a&&a.partManager.removeDataForLink(this))};U.prototype.updateRelationshipsFromData=function(){if(null!==this.data){var a=this.diagram;null!==a&&a.partManager.updateRelationshipsFromData(this)}}; U.prototype.move=function(a,b){var c=b?this.location:this.position,d=c.x;isNaN(d)&&(d=0);var e=c.y;isNaN(e)&&(e=0);d=a.x-d;e=a.y-e;!0===b?V.prototype.move.call(this,a,!1):(a=J.allocAt(c.x+d,c.y+e),V.prototype.move.call(this,a,!1),J.free(a));cf(this,d,e);for(a=this.labelNodes;a.next();)b=a.value,c=b.position,b.moveTo(c.x+d,c.y+e)}; U.prototype.canRelinkFrom=function(){if(!this.relinkableFrom)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowRelink)return!1;a=a.diagram;return null===a||a.allowRelink?!0:!1};U.prototype.canRelinkTo=function(){if(!this.relinkableTo)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowRelink)return!1;a=a.diagram;return null===a||a.allowRelink?!0:!1}; U.prototype.computeMidPoint=function(a){var b=this.pointsCount;if(0===b)return a.assign(vb),a;if(1===b)return a.assign(this.i(0)),a;if(2===b){var c=this.i(0),d=this.i(1);a.h((c.x+d.x)/2,(c.y+d.y)/2);return a}if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===Yf))return this.ma.uv(.5,a),a.add(this.i(0)),c=this.ma.figures.first(),a.offset(-c.startX,-c.startY),a;if(this.computeCurve()===Yf){if(3===b)return this.i(1);d=(b-1)/3|0;c=3*(d/2|0);if(1===d%2){d=this.i(c);var e=this.i(c+1), f=this.i(c+2);c=this.i(c+3);L.pz(d.x,d.y,e.x,e.y,f.x,f.y,c.x,c.y,a)}else a.assign(this.i(c));return a}var g=this.flattenedLengths;c=this.flattenedTotalLength;for(e=f=d=0;dc/2)break;d+=e;f++}b=this.i(f);f=this.i(f+1);1>Math.abs(b.x-f.x)?b.y>f.y?a.h(b.x,b.y-(c/2-d)):a.h(b.x,b.y+(c/2-d)):1>Math.abs(b.y-f.y)?b.x>f.x?a.h(b.x-(c/2-d),b.y):a.h(b.x+(c/2-d),b.y):(c=(c/2-d)/e,a.h(b.x+c*(f.x-b.x),b.y+c*(f.y-b.y)));return a}; -U.prototype.computeMidAngle=function(){var a=this.pointsCount;if(2>a)return NaN;if(2===a)return this.i(0).Oa(this.i(1));if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===Yf))return this.ma.Xx(.5);if(this.computeCurve()===Yf&&4<=a){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){c=Math.floor(c);a=this.i(c);b=this.i(c+1);var d=this.i(c+2);c=this.i(c+3);return L.oz(a.x,a.y,b.x,b.y,d.x,d.y,c.x,c.y)}if(0d/2)break;e+=f;c++}b=this.i(c);d=this.i(c+1);if(1>Math.abs(b.x-d.x)&&1>Math.abs(b.y-d.y)){if(0Math.abs(b.x-d.x))return b.y>d.y?270:90;if(1>Math.abs(b.y-d.y))return b.x>d.x?180:0}return b.Oa(d)};t=U.prototype;t.i=function(a){return this.Bb.m[a]};t.Mc=function(a,b){this.Bb.Lc(a,b)};t.L=function(a,b,c){this.Bb.Lc(a,new J(b,c))};t.pA=function(a,b){this.Bb.ub(a,b)}; +U.prototype.computeMidAngle=function(){var a=this.pointsCount;if(2>a)return NaN;if(2===a)return this.i(0).Ra(this.i(1));if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===Yf))return this.ma.Xx(.5);if(this.computeCurve()===Yf&&4<=a){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){c=Math.floor(c);a=this.i(c);b=this.i(c+1);var d=this.i(c+2);c=this.i(c+3);return L.oz(a.x,a.y,b.x,b.y,d.x,d.y,c.x,c.y)}if(0d/2)break;e+=f;c++}b=this.i(c);d=this.i(c+1);if(1>Math.abs(b.x-d.x)&&1>Math.abs(b.y-d.y)){if(0Math.abs(b.x-d.x))return b.y>d.y?270:90;if(1>Math.abs(b.y-d.y))return b.x>d.x?180:0}return b.Ra(d)};t=U.prototype;t.i=function(a){return this.Bb.m[a]};t.Nc=function(a,b){this.Bb.Mc(a,b)};t.L=function(a,b,c){this.Bb.Mc(a,new J(b,c))};t.pA=function(a,b){this.Bb.ub(a,b)}; t.l=function(a,b,c){this.Bb.ub(a,new J(b,c))};t.ce=function(a){this.Bb.add(a)};t.pf=function(a,b){this.Bb.add(new J(a,b))};t.Rv=function(a){this.Bb.eb(a)};t.ak=function(){this.Bb.clear()}; -function cf(a,b,c){if(0!==b||0!==c)if(0===a.pointsCount)a.defaultFromPoint&&a.defaultFromPoint.offset(b,c),a.defaultToPoint&&a.defaultToPoint.offset(b,c);else{for(var d=a.rd,e=new E,f=a.Bb.iterator;f.next();){var g=f.value;e.add((new J(g.x+b,g.y+c)).freeze())}e.freeze();f=a.Bb;a.Bb=e;g=a.diagram;isNaN(b)||isNaN(c)||null!==g&&g.animationManager.rb?a.s():(a.ae.h(a.ae.x+b,a.ae.y+c),a.ka.h(a.ka.x+b,a.ka.y+c),zl(a));d?hp(a):(a.defaultFromPoint&&(a.defaultFromPoint=a.i(0)),a.defaultToPoint&&(a.defaultToPoint= +function cf(a,b,c){if(0!==b||0!==c)if(0===a.pointsCount)a.defaultFromPoint&&a.defaultFromPoint.offset(b,c),a.defaultToPoint&&a.defaultToPoint.offset(b,c);else{for(var d=a.sd,e=new E,f=a.Bb.iterator;f.next();){var g=f.value;e.add((new J(g.x+b,g.y+c)).freeze())}e.freeze();f=a.Bb;a.Bb=e;g=a.diagram;isNaN(b)||isNaN(c)||null!==g&&g.animationManager.rb?a.s():(a.ae.h(a.ae.x+b,a.ae.y+c),a.ka.h(a.ka.x+b,a.ka.y+c),zl(a));d?hp(a):(a.defaultFromPoint&&(a.defaultFromPoint=a.i(0)),a.defaultToPoint&&(a.defaultToPoint= a.i(a.pointsCount-1)));null!==g&&g.animationManager.rb&&(b=g.animationManager,a.cf=e,b.Il.add(a));a.g("points",f,e)}}t.Hh=function(){null===this.Zg&&(this.Zg=this.Bb,this.Bb=this.Bb.copy())}; t.rf=function(){if(null!==this.Zg){for(var a=this.Zg,b=this.Bb,c=Infinity,d=Infinity,e=a.m,f=e.length,g=0;gl&&(n=-n),u= -(0>k?-1:1)*n+r,v=m*(u-r)+q);r=f.x+2*h/3;q=f.y+2*k/3;var w=r,z=q;L.w(k,0)?z=0k?-1:1)*n+r,z=m*(w-r)+q);this.ak();this.ce(f);this.pf(u,v);this.pf(w,z);this.ce(p);this.Mc(0,this.getLinkPoint(a,b,g,!0,!1,d,e));this.Mc(3,this.getLinkPoint(d,e,c,!1,!1,a,b))}else if(f=d,p=e,d=this.getLinkPoint(a,b,g,!0,!1,f,p),e=this.getLinkPoint(f,p,c,!1,!1,a,b),this.hasCurviness())p=e.x-d.x,c=e.y-d.y,g=this.computeCurviness(),a=d.x+p/2,b=d.y+c/2,f=a,h=b,L.w(c,0)?h=0g&&(f=-f),f=(0>c?-1:1)*f+a,h=p*(f-a)+b),this.ce(d),this.pf(f,h),this.ce(e);else{this.ce(d);this.ce(e);h=N.alloc();b.Mi(h);k=h.$(e);p.Mi(h);l=h.$(d);if(k||l)g=b.da(mp(g),new J),this.Mc(0,this.getLinkPointFromPoint(a,b,g,e,!0,g)),c=p.da(mp(c),new J),this.Mc(1,this.getLinkPointFromPoint(f,p,c,d,!1,c));N.free(h)}}else{n=this.isAvoiding;p&&(m&&n||l)&&this.ak();var y=l?this.computeCurviness():0;n=this.getLinkPoint(a,b,g,!0,m,d,e);r=u=q=0;if(m||!h||l)v=this.computeEndSegmentLength(a,b,g,!0),r=this.getLinkDirection(a, +(0>k?-1:1)*n+r,v=m*(u-r)+q);r=f.x+2*h/3;q=f.y+2*k/3;var w=r,z=q;L.w(k,0)?z=0k?-1:1)*n+r,z=m*(w-r)+q);this.ak();this.ce(f);this.pf(u,v);this.pf(w,z);this.ce(p);this.Nc(0,this.getLinkPoint(a,b,g,!0,!1,d,e));this.Nc(3,this.getLinkPoint(d,e,c,!1,!1,a,b))}else if(f=d,p=e,d=this.getLinkPoint(a,b,g,!0,!1,f,p),e=this.getLinkPoint(f,p,c,!1,!1,a,b),this.hasCurviness())p=e.x-d.x,c=e.y-d.y,g=this.computeCurviness(),a=d.x+p/2,b=d.y+c/2,f=a,h=b,L.w(c,0)?h=0g&&(f=-f),f=(0>c?-1:1)*f+a,h=p*(f-a)+b),this.ce(d),this.pf(f,h),this.ce(e);else{this.ce(d);this.ce(e);h=N.alloc();b.Mi(h);k=h.$(e);p.Mi(h);l=h.$(d);if(k||l)g=b.da(mp(g),new J),this.Nc(0,this.getLinkPointFromPoint(a,b,g,e,!0,g)),c=p.da(mp(c),new J),this.Nc(1,this.getLinkPointFromPoint(f,p,c,d,!1,c));N.free(h)}}else{n=this.isAvoiding;p&&(m&&n||l)&&this.ak();var y=l?this.computeCurviness():0;n=this.getLinkPoint(a,b,g,!0,m,d,e);r=u=q=0;if(m||!h||l)v=this.computeEndSegmentLength(a,b,g,!0),r=this.getLinkDirection(a, b,n,g,!0,m,d,e),l&&(h||g.A(c)||!m&&1===g.x+c.x&&1===g.y+c.y)&&(r-=m?90:30,0>y&&(r-=180)),0>r?r+=360:360<=r&&(r-=360),l&&(v+=Math.abs(y)*(m?1:2)),0===r?q=v:90===r?u=v:180===r?q=-v:270===r?u=-v:(q=v*Math.cos(r*Math.PI/180),u=v*Math.sin(r*Math.PI/180)),g.wc()&&l&&(v=b.da(yc,J.alloc()),w=J.allocAt(v.x+1E3*q,v.y+1E3*u),this.getLinkPointFromPoint(a,b,v,w,!0,n),J.free(v),J.free(w));v=this.getLinkPoint(d,e,c,!1,m,a,b);var A=z=w=0;if(m||!k||l){var B=this.computeEndSegmentLength(d,e,c,!1);A=this.getLinkDirection(d, -e,v,c,!1,m,a,b);l&&(k||g.A(c)||!m&&1===g.x+c.x&&1===g.y+c.y)&&(A+=m?0:30,0>y&&(A+=180));0>A?A+=360:360<=A&&(A-=360);l&&(B+=Math.abs(y)*(m?1:2));0===A?w=B:90===A?z=B:180===A?w=-B:270===A?z=-B:(w=B*Math.cos(A*Math.PI/180),z=B*Math.sin(A*Math.PI/180));c.wc()&&l&&(c=e.da(yc,J.alloc()),g=J.allocAt(c.x+1E3*w,c.y+1E3*z),this.getLinkPointFromPoint(d,e,c,g,!1,v),J.free(c),J.free(g))}c=n;if(m||!h||l)c=new J(n.x+q,n.y+u);g=v;if(m||!k||l)g=new J(v.x+w,v.y+z);!p&&!m&&h&&3Math.abs(b.y-a.y)?(b.x>=a.x?b.x=a.x+9E9:b.x=a.x-9E9,b.y=a.y):(b.y>=a.y?b.y=a.y+9E9:b.y=a.y-9E9,b.x=a.x);return b} +e,v,c,!1,m,a,b);l&&(k||g.A(c)||!m&&1===g.x+c.x&&1===g.y+c.y)&&(A+=m?0:30,0>y&&(A+=180));0>A?A+=360:360<=A&&(A-=360);l&&(B+=Math.abs(y)*(m?1:2));0===A?w=B:90===A?z=B:180===A?w=-B:270===A?z=-B:(w=B*Math.cos(A*Math.PI/180),z=B*Math.sin(A*Math.PI/180));c.wc()&&l&&(c=e.da(yc,J.alloc()),g=J.allocAt(c.x+1E3*w,c.y+1E3*z),this.getLinkPointFromPoint(d,e,c,g,!1,v),J.free(c),J.free(g))}c=n;if(m||!h||l)c=new J(n.x+q,n.y+u);g=v;if(m||!k||l)g=new J(v.x+w,v.y+z);!p&&!m&&h&&3Math.abs(b.y-a.y)?(b.x>=a.x?b.x=a.x+9E9:b.x=a.x-9E9,b.y=a.y):(b.y>=a.y?b.y=a.y+9E9:b.y=a.y-9E9,b.x=a.x);return b} U.prototype.getLinkPointFromPoint=function(a,b,c,d,e,f){void 0===f&&(f=new J);if(null===a||null===b)return f.assign(c),f;a.isVisible()||(e=a.findVisibleNode(),null!==e&&e!==a&&(b=e.port));a=null;e=b.panel;null===e||e.he()||(e=e.panel);if(null===e){e=d.x;d=d.y;var g=c.x;c=c.y}else{a=e.de;e=1/(a.m11*a.m22-a.m12*a.m21);g=a.m22*e;var h=-a.m12*e,k=-a.m21*e,l=a.m11*e,m=e*(a.m21*a.dy-a.m22*a.dx),n=e*(a.m12*a.dx-a.m11*a.dy);e=d.x*g+d.y*k+m;d=d.x*h+d.y*l+n;g=c.x*g+c.y*k+m;c=c.x*h+c.y*l+n}b.kk(e,d,g,c,f);null!== a&&f.transform(a);return f};function op(a,b){var c=b.bp;null===c&&(c=new pp,c.port=b,c.node=b.part,b.bp=c);return qp(c,a)} -U.prototype.getLinkPoint=function(a,b,c,d,e,f,g,h){void 0===h&&(h=new J);if(c.hb()&&!lp(c))return b.da(c,h),h;if(c.Kc()){var k=op(this,b);if(null!==k){h.assign(k.tq);if(e&&this.routing===rp){var l=op(this,g);if(null!==l&&k.fm=m.y&&a.y<=m.y+m.height?h.y=a.y:(c.zf(Dc)||c.zf(Hc))&&a.x>=m.x&&a.x<=m.x+m.width&&(h.x=a.x);J.free(k);J.free(l)}}return h}}c= +U.prototype.getLinkPoint=function(a,b,c,d,e,f,g,h){void 0===h&&(h=new J);if(c.hb()&&!lp(c))return b.da(c,h),h;if(c.Lc()){var k=op(this,b);if(null!==k){h.assign(k.tq);if(e&&this.routing===rp){var l=op(this,g);if(null!==l&&k.fm=m.y&&a.y<=m.y+m.height?h.y=a.y:(c.zf(Dc)||c.zf(Hc))&&a.x>=m.x&&a.x<=m.x+m.width&&(h.x=a.x);J.free(k);J.free(l)}}return h}}c= b.da(mp(c),J.alloc());this.pointsCount>(e?6:2)?(g=d?this.i(1):this.i(this.pointsCount-2),e&&(g=np(c,g.copy()))):(k=this.computeSpot(!d,g),f=J.alloc(),g=g.da(mp(k),f),e&&(g=np(c,g)),J.free(f));this.getLinkPointFromPoint(a,b,c,g,d,h);J.free(c);return h}; -U.prototype.getLinkDirection=function(a,b,c,d,e,f,g,h){a:if(d.hb())var k=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x1-d.y?90:d.x<1-d.y?180:135:.5>d.x?225:.5(f?6:2)?(h=e?this.i(1):this.i(this.pointsCount-2),h=f?np(k,h.copy()):c):(c=J.alloc(),h=h.da(yc,c),J.free(c));c=Math.abs(h.x-k.x)>Math.abs(h.y-k.y)?h.x>= -k.x?0:180:h.y>=k.y?90:270;J.free(k);k=c}d.wc()&&g.Fd(a)&&(k+=180,360<=k&&(k-=360));if(lp(d))return k;a=b.Li();if(0===a)return k;45<=a&&135>a?k+=90:135<=a&&225>a?k+=180:225<=a&&315>a&&(k+=270);360<=k&&(k-=360);return k};U.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.Kc()&&(a=op(this,b),null!==a))return a.mv;a=d?this.fromEndSegmentLength:this.toEndSegmentLength;null!==b&&isNaN(a)&&(a=d?b.fromEndSegmentLength:b.toEndSegmentLength);isNaN(a)&&(a=10);return a}; +U.prototype.getLinkDirection=function(a,b,c,d,e,f,g,h){a:if(d.hb())var k=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x1-d.y?90:d.x<1-d.y?180:135:.5>d.x?225:.5(f?6:2)?(h=e?this.i(1):this.i(this.pointsCount-2),h=f?np(k,h.copy()):c):(c=J.alloc(),h=h.da(yc,c),J.free(c));c=Math.abs(h.x-k.x)>Math.abs(h.y-k.y)?h.x>= +k.x?0:180:h.y>=k.y?90:270;J.free(k);k=c}d.wc()&&g.Fd(a)&&(k+=180,360<=k&&(k-=360));if(lp(d))return k;a=b.Li();if(0===a)return k;45<=a&&135>a?k+=90:135<=a&&225>a?k+=180:225<=a&&315>a&&(k+=270);360<=k&&(k-=360);return k};U.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.Lc()&&(a=op(this,b),null!==a))return a.mv;a=d?this.fromEndSegmentLength:this.toEndSegmentLength;null!==b&&isNaN(a)&&(a=d?b.fromEndSegmentLength:b.toEndSegmentLength);isNaN(a)&&(a=10);return a}; U.prototype.computeSpot=function(a,b){void 0===b&&(b=null);a?(a=b?b:this.fromPort,null===a?a=yc:(b=this.fromSpot,b.Lb()&&(b=a.fromSpot),a=b===Vc?rc:b)):(a=b?b:this.toPort,null===a?a=yc:(b=this.toSpot,b.Lb()&&(b=a.toSpot),a=b===Vc?rc:b));return a};function lp(a){return a===rc||.5===a.x&&.5===a.y}function mp(a){return.5===a.x&&.5===a.y?a:yc} U.prototype.computeOtherPoint=function(a,b){if(this.computeAdjusting()!==Vf&&4p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=qd.alloc();n.set(g); +U.prototype.vf=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var g=f;void 0===f&&(g=qd.alloc(),g.reset());g.multiply(this.transform);if(this.wh(a,g))return dn(this,b,c,e),void 0===f&&qd.free(g),!0;if(this.Jc(a,g)){var h=!1;if(!this.isAtomic)for(var k=this.T.m,l=k.length;l--;){var m=k[l];if(m.visible||m===this.locationObject){var n=m.actualBounds,p=this.naturalBounds;if(!(n.x>p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=qd.alloc();n.set(g); if(m instanceof X)h=m.vf(a,b,c,d,e,n);else if(this.path===m){if(m instanceof uf)if(h=a,p=d,!1===m.pickable)h=!1;else if(n.multiply(m.transform),p)b:{var r=h,q=n;if(m.wh(r,q))h=!0;else{if(void 0===q&&(q=m.transform,r.De(m.actualBounds))){h=!0;break b}h=r.left;p=r.right;var u=r.top;r=r.bottom;var v=J.alloc(),w=J.alloc(),z=J.alloc(),y=qd.alloc();y.set(q);y.Hv(m.transform);y.Ns();w.x=p;w.y=u;w.transform(y);v.x=h;v.y=u;v.transform(y);q=!1;Dn(m,v,w,z)?q=!0:(v.x=p,v.y=r,v.transform(y),Dn(m,v,w,z)?q=!0:(w.x= h,w.y=r,w.transform(y),Dn(m,v,w,z)?q=!0:(v.x=h,v.y=u,v.transform(y),Dn(m,v,w,z)&&(q=!0))));qd.free(y);J.free(v);J.free(w);J.free(z);h=q}}else h=m.wh(h,n)}else h=gl(m,a,d,n);h&&(p=m,null!==b&&(p=b(m)),p&&(null===c||c(p))&&e.add(p));qd.free(n)}}}void 0===f&&qd.free(g);return h||null!==this.background||null!==this.areaBackground}void 0===f&&qd.free(g);return!1}; U.prototype.computeCurve=function(){if(null===this.Mf){var a=this.fromPort,b=this.isOrthogonal;this.Mf=null!==a&&a===this.toPort&&!b}return this.Mf?Yf:this.curve};U.prototype.computeCorner=function(){if(this.curve===Yf)return 0;var a=this.corner;if(isNaN(a)||0>a)a=10;return a}; U.prototype.findMidLabel=function(){for(var a=this.path,b=this.T.m,c=b.length,d=0;dk?-Math.PI/2:Math.PI/2;else m=Math.atan(k/Math.abs(h)),0>h&&(m=Math.PI-m);g=b.x;var n=b.y;h=d.x-g;var p=d.y-n;k=Math.sqrt(h*h+p*p);L.aa(h,0)?p=0>p?-Math.PI/2:Math.PI/2:(p=Math.atan(p/Math.abs(h)),0>h&&(p=Math.PI-p)); -l=k/l;m=p-m;this.Mc(a,b);for(a+=1;ak?-Math.PI/2:Math.PI/2:(k=Math.atan(k/Math.abs(h)),0>h&&(k=Math.PI-k)),h=k+m,b*=l,this.L(a,g+b*Math.cos(h),n+b*Math.sin(h)));this.Mc(c,d)}}return!0;case cp:f=this.i(a);n=this.i(c);if(!f.Ta(b)||!n.Ta(d)){e=f.x;f=f.y;g=n.x;n=n.y;l=(g-e)*(g-e)+(n-f)*(n-f);h=b.x;m=b.y;k=d.x;p=d.y;var r=1;if(0!==k-h){var q=(p-m)/(k-h);r=Math.sqrt(1+1/(q*q))}else q=9E9;this.Mc(a,b);for(a+=1;ab?b+=360:360<=b&&(b-=360);0>d?d+=360:360<=d&&(d-=360);var g=d;b=315<=b||45>b?0:45<=b&&135>b?90:135<=b&&225>b?180:270;d=315<=d||45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.actualBounds.copy(),k=f.actualBounds.copy();if(h.u()&&k.u()){h.Gc(up,up);k.Gc(up,up);h.Le(a);k.Le(c);var l=J.alloc(),m=J.alloc();if(0===b)if(c.x>a.x||270===d&&c.ya.x||90===d&&c.y>a.y&&k.right>a.x)l.h(c.x,a.y),m.h(c.x,(a.y+c.y)/2),180===d?(l.x=this.computeMidOrthoPosition(a.x, +l=k/l;m=p-m;this.Nc(a,b);for(a+=1;ak?-Math.PI/2:Math.PI/2:(k=Math.atan(k/Math.abs(h)),0>h&&(k=Math.PI-k)),h=k+m,b*=l,this.L(a,g+b*Math.cos(h),n+b*Math.sin(h)));this.Nc(c,d)}}return!0;case cp:f=this.i(a);n=this.i(c);if(!f.Ta(b)||!n.Ta(d)){e=f.x;f=f.y;g=n.x;n=n.y;l=(g-e)*(g-e)+(n-f)*(n-f);h=b.x;m=b.y;k=d.x;p=d.y;var r=1;if(0!==k-h){var q=(p-m)/(k-h);r=Math.sqrt(1+1/(q*q))}else q=9E9;this.Nc(a,b);for(a+=1;ab?b+=360:360<=b&&(b-=360);0>d?d+=360:360<=d&&(d-=360);var g=d;b=315<=b||45>b?0:45<=b&&135>b?90:135<=b&&225>b?180:270;d=315<=d||45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.actualBounds.copy(),k=f.actualBounds.copy();if(h.u()&&k.u()){h.Hc(up,up);k.Hc(up,up);h.Le(a);k.Le(c);var l=J.alloc(),m=J.alloc();if(0===b)if(c.x>a.x||270===d&&c.ya.x||90===d&&c.y>a.y&&k.right>a.x)l.h(c.x,a.y),m.h(c.x,(a.y+c.y)/2),180===d?(l.x=this.computeMidOrthoPosition(a.x, a.y,c.x,c.y,!1),m.x=l.x,m.y=c.y):270===d&&c.ya.y?(l.x=a.xk.bottom)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):k.right,m.x=l.x,m.y=c.y):0===d&&a.xk.top&&a.yh.bottom)180===d&&(k.$(a)||h.$(c))?l.y= this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!0):c.ya.y&&(180===d||270===d)&&(l.y=this.computeMidOrthoPosition(a.x,h.bottom,c.x,Math.min(c.y,k.top),!0)),m.x=c.x,m.y=l.y;if(l.y>h.top&&l.y=h.left&&c.x<=a.x||a.x<=k.right&&a.x>=c.x){if(90===d||270===d)l.h(Math.max((a.x+c.x)/2,a.x),a.y),m.h(l.x,c.y)}else l.y=270===d||(0===d||180===d)&&c.ya.y&&k.lefta.y?(l.x=a.x>k.right?this.computeMidOrthoPosition(a.x,a.y,k.right,c.y,!1):a.x>k.left&&(270===d&&a.yk.bottom)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):k.left,m.x=l.x,m.y=c.y): @@ -1551,15 +1551,15 @@ a.y,c.x,c.y,!1):c.xa.x&&k.top=a.x?(l.y=a.y>k.bottom?this.computeMidOrthoPosition(a.x,a.y,c.x,k.bottom,!0):a.y>k.top&&(180===d&&a.xk.right)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!0):k.top,m.x=c.x,m.y=l.y):270===d&&a.y>k.bottom&&a.x>k.left&&a.xh.right)90===d&&(k.$(a)||h.$(c))?l.x=this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):c.xa.x&&(90===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right,a.y,Math.min(c.x,k.left),c.y,!1)),m.x=l.x,m.y=c.y;if(l.x>h.left&&l.x=a.y||a.y>=k.top&&a.y<=c.y){if(0===d||180===d)l.h(a.x,Math.min((a.y+c.y)/2,a.y)),m.h(c.x,l.y)}else l.x=180===d||(90===d||270===d)&&c.x=xp&&(sk(r),h.Gc(r.bq*r.ly,r.aq*r.my),vp(r,a,b,n,d,h,!1),k=wp(r, +Math.min(a.y,l.y),Math.abs(a.x-l.x),Math.abs(a.y-l.y))&&r.qk(Math.min(l.x,m.x),Math.min(l.y,m.y),Math.abs(l.x-m.x),Math.abs(l.y-m.y))&&r.qk(Math.min(m.x,n.x),Math.min(m.y,n.y),Math.abs(m.x-n.x),Math.abs(m.y-n.y)))b=!1;else{e=a;f=n;var q=c=null;if(p.isVirtualized){p=r.bounds.copy();p.Hc(-r.bq,-r.aq);var u=J.alloc();tk(r,a.x,a.y)||(L.yf(p.x,p.y,p.x+p.width,p.y+p.height,a.x,a.y,l.x,l.y,u)?(c=a=u.copy(),b=u.Ra(l)):L.yf(p.x,p.y,p.x+p.width,p.y+p.height,l.x,l.y,m.x,m.y,u)?(c=a=u.copy(),b=u.Ra(m)):L.yf(p.x, +p.y,p.x+p.width,p.y+p.height,m.x,m.y,n.x,n.y,u)&&(c=a=u.copy(),b=u.Ra(n)));tk(r,n.x,n.y)||(L.yf(p.x,p.y,p.x+p.width,p.y+p.height,n.x,n.y,m.x,m.y,u)?(q=n=u.copy(),d=m.Ra(u)):L.yf(p.x,p.y,p.x+p.width,p.y+p.height,m.x,m.y,l.x,l.y,u)?(q=n=u.copy(),d=l.Ra(u)):L.yf(p.x,p.y,p.x+p.width,p.y+p.height,l.x,l.y,a.x,a.y,u)&&(q=n=u.copy(),d=a.Ra(u)));J.free(u)}h=h.copy().Oc(k);h.Hc(r.bq*r.it,r.aq*r.it);vp(r,a,b,n,d,h,!0);k=wp(r,n.x,n.y);!r.abort&&k>=xp&&(sk(r),h.Hc(r.bq*r.ly,r.aq*r.my),vp(r,a,b,n,d,h,!1),k=wp(r, n.x,n.y));if(!r.abort&&kthis.pointsCount)0===b||180===b?(h.x=a.x,h.y=n.y):(h.x=n.x,h.y=a.y),this.L(2,h.x,h.y),this.l(3,h.x,h.y);else if(g=this.i(3),0===b||180===b)L.w(h.x,g.x)?(h=0===b?Math.max(h.x,a.x):Math.min(h.x,a.x),this.L(2,h,a.y),this.L(3,h,g.y)):L.w(h.y,g.y)?(Math.abs(a.y-h.y)<=r.aq/2&&(this.L(2,h.x,a.y),this.L(3,g.x,a.y)),this.l(2,h.x,a.y)):this.L(2,a.x,h.y);else if(90===b||270===b)L.w(h.y,g.y)?(h=90===b?Math.max(h.y,a.y): Math.min(h.y,a.y),this.L(2,a.x,h),this.L(3,g.x,h)):L.w(h.x,g.x)?(Math.abs(a.x-h.x)<=r.bq/2&&(this.L(2,a.x,h.y),this.L(3,a.x,g.y)),this.l(2,a.x,h.y)):this.L(2,h.x,a.y);null!==c&&(a=this.i(1),g=this.i(2),a.x!==g.x&&a.y!==g.y?0===b||180===b?this.l(2,a.x,g.y):this.l(2,g.x,a.y):0===b||180===b?this.l(2,e.x,c.y):this.l(2,c.x,e.y));null!==q&&(0===d||180===d?this.pf(f.x,q.y):this.pf(q.x,f.y));b=!0}else b=!1}}}else b=!1;b||(this.ce(l.copy()),this.ce(m.copy()));J.free(l);J.free(m)}}; -U.prototype.computeMidOrthoPosition=function(a,b,c,d,e){var f=0;!this.hasCurviness()||this.computeSpot(!0,this.fromPort).Kc()||this.computeSpot(!1,this.toPort).Kc()||(f=this.computeCurviness());return e?(b+d)/2+f:(a+c)/2+f}; +U.prototype.computeMidOrthoPosition=function(a,b,c,d,e){var f=0;!this.hasCurviness()||this.computeSpot(!0,this.fromPort).Lc()||this.computeSpot(!1,this.toPort).Lc()||(f=this.computeCurviness());return e?(b+d)/2+f:(a+c)/2+f}; function Kj(a){if(null===a.diagram||!a.isAvoiding||!nk(a.diagram))return!1;var b=a.points.m,c=b.length;if(4>c)return!1;a=ok(a.diagram,!0,a.containingGroup,null);for(var d=1;dzp&&wp(b,m,n)!==l-1&&(wp(b,c-h,d)===l-1?(e=180,m=c-h,n=d):wp(b,c+h,d)===l-1?(e=0,m=c+h,n=d):wp(b,c,d-k)===l-1?(e=270,m=c,n=d-k):wp(b,c,d+k)===l-1&&(e=90,m=c,n=d+k));for(;l>zp&&wp(b,m,n)===l-1;)c=m,d=n,0===e?m+=h:90===e?n+=k:180===e?m-=h:n-=k,--l;if(f){if(l>zp)if(180===e||0===e)c=Math.floor(c/h)*h+h/2;else if(90===e||270===e)d=Math.floor(d/k)*k+k/2}else c=Math.floor(c/h)*h+h/2,d=Math.floor(d/ k)*k+k/2;l>zp&&(f=e,g=c,m=d,0===e?(f=90,m+=k):90===e?(f=180,g-=h):180===e?(f=270,m-=k):270===e&&(f=0,g+=h),wp(b,g,m)===l-1?yp(a,b,g,m,f,!1,f):(g=c,m=d,0===e?(f=270,m-=k):90===e?(f=0,g+=h):180===e?(f=90,m+=k):270===e&&(f=180,g-=h),wp(b,g,m)===l-1&&yp(a,b,g,m,f,!1,f)));a.pf(c,d)}U.prototype.Kz=function(a){var b=a.x;a=a.y;for(var c=this.i(0),d=this.i(1),e=Bb(b,a,c.x,c.y,d.x,d.y),f=0,g=1;gb)return a.type=Q.j,this.Lm=!0,a;var c=!1,d=this.diagram;null!==d&&ep(this)&&d.Wh.contains(this)&&(0!==this.Gl.width||0!==this.Gl.height)&&(c=!0);var e=this.i(0).copy(),f=e.copy();d=this.Bb.m;var g=this.computeCurve();if(g===Yf&&3<=b&&!L.aa(this.smoothness,0))if(3===b){var h=this.i(1);d=Math.min(e.x,h.x);var k=Math.min(e.y,h.y);h=this.i(2);d=Math.min(d,h.x);k=Math.min(k,h.y)}else{if(this.isOrthogonal)for(k=0;k=b&&(d=b-1),k=this.i(d),f.x=Math.min(k.x,f.x),f.y=Math.min(k.y,f.y);d=f.x;k=f.y}else{for(k=0;kv?q>r?(f.x= @@ -1573,13 +1573,13 @@ function Bp(a,b,c,d){for(var e=a.pointsCount,f=b;L.aa(b.x,f.x)&&L.aa(b.y,f.y);){ function Dp(a,b,c,d,e,f,g){if(!g&&ep(a)){g=a.computeJumpLength();var h=g/2,k=[],l=0;a.isVisible()&&(l=Ep(a,e,f,k));if(0n-g)l--,n=Math.max(m-h,f.x);else break;m=f.y-g+d;n+=c;r=f.y+d;a.curve===Uf?wd(b,n,r,!1):xd(b,p,m,n,m,n,r)}else if(L.w(e.x,f.x))if(e.ym-g)l--,m=Math.max(n-h,f.y);else break;n=f.x-g+c;r=f.x+c;m+=d;a.curve===Uf?wd(b,r,m,!1):xd(b,n,p,n,m,r,m)}}b.lineTo(f.x+c,f.y+d)} -function Ep(a,b,c,d){var e=a.diagram;if(null===e||b.A(c))return 0;for(e=e.layers;e.next();){var f=e.value;if(null!==f&&f.visible){f=f.Fa.m;for(var g=f.length,h=0;hg.x&&m.x>=l.x||l.xg.y&&m.y>=l.y||l.yq&&Math.min(g,v)n&&!L.w(g,v)){h.x=q;h.y=n;m=!0;break a}}else if(!L.w(n,r)&& L.w(g,v)&&Math.min(n,r)g&&Math.min(q,u)m&&!L.w(q,u)){h.x=m;h.y=g;m=!0;break a}h.x=0;h.y=0;m=!1}m&&(e?c.push(h.x):c.push(h.y));g=l}J.free(h)}function ep(a){a=a.curve;return a===Tf||a===Uf}function ip(a,b){if(b||ep(a))b=a.diagram,null===b||b.animationManager.isTicking||b.Wh.contains(a)||0===a.Gl.width&&0===a.Gl.height||b.Wh.add(a,a.Gl.copy())} U.prototype.rq=function(a){var b=this.layer;if(null!==b&&b.visible&&!b.isTemporary){var c=b.diagram;if(null!==c&&!c.animationManager.isTicking){var d=!1;for(c=c.layers;c.next();){var e=c.value;if(e.visible)if(e===b){d=!0;var f=!1;e=e.Fa.m;for(var g=e.length,h=0;ha&&xa(a,">= 0",U,"fromEndSegmentLength"),this.P.Hg=a,this.g("fromEndSegmentLength",b,a),this.Ua())}}, -fromShortLength:{get:function(){return null!==this.P?this.P.Ig:NaN},set:function(a){this.Hc();var b=this.P.Ig;b!==a&&(this.P.Ig=a,this.cc(!0),this.g("fromShortLength",b,a))}},toSpot:{get:function(){return null!==this.P?this.P.ph:Vc},set:function(a){this.Hc();var b=this.P.ph;b.A(a)||(a=a.I(),this.P.ph=a,this.g("toSpot",b,a),(b.Kc()||a.Kc())&&null!==this.toNode&&Mo(this.toPort),this.Ua())}},toEndSegmentLength:{ -get:function(){return null!==this.P?this.P.nh:NaN},set:function(a){this.Hc();var b=this.P.nh;b!==a&&(0>a&&xa(a,">= 0",U,"toEndSegmentLength"),this.P.nh=a,this.g("toEndSegmentLength",b,a),this.Ua())}},toShortLength:{get:function(){return null!==this.P?this.P.oh:NaN},set:function(a){this.Hc();var b=this.P.oh;b!==a&&(this.P.oh=a,this.cc(!0),this.g("toShortLength",b,a))}},isLabeledLink:{get:function(){return null===this.ld?!1:0a&&xa(a,">= 0",U,"fromEndSegmentLength"),this.P.Hg=a,this.g("fromEndSegmentLength",b,a),this.Ua())}}, +fromShortLength:{get:function(){return null!==this.P?this.P.Ig:NaN},set:function(a){this.Ic();var b=this.P.Ig;b!==a&&(this.P.Ig=a,this.cc(!0),this.g("fromShortLength",b,a))}},toSpot:{get:function(){return null!==this.P?this.P.ph:Vc},set:function(a){this.Ic();var b=this.P.ph;b.A(a)||(a=a.I(),this.P.ph=a,this.g("toSpot",b,a),(b.Lc()||a.Lc())&&null!==this.toNode&&Mo(this.toPort),this.Ua())}},toEndSegmentLength:{ +get:function(){return null!==this.P?this.P.nh:NaN},set:function(a){this.Ic();var b=this.P.nh;b!==a&&(0>a&&xa(a,">= 0",U,"toEndSegmentLength"),this.P.nh=a,this.g("toEndSegmentLength",b,a),this.Ua())}},toShortLength:{get:function(){return null!==this.P?this.P.oh:NaN},set:function(a){this.Ic();var b=this.P.oh;b!==a&&(this.P.oh=a,this.cc(!0),this.g("toShortLength",b,a))}},isLabeledLink:{get:function(){return null===this.md?!1:0=d&&(f=d-1);var h=this.i(f-1),k=this.i(f);L.cm(e.x,e.y,g.x,g.y,h.x,h.y,k.x,k.y,.5,a);b=Math.min(k.x,b);c=Math.min(k.y,c);e=k}else for(e=this.i(0),f=this.i(1),b=Math.min(e.x,f.x),c=Math.min(e.y,f.y),a.h(e.x,e.y,0,0),a.Le(f),e=2;ed&&(d=-d)):L.aa(d.y,e.y)?(d=e.x-d.x,0>d&&(d=-d)):d=Math.sqrt(d.tf(e));a.push(d)}}return this.qr}},flattenedTotalLength:{get:function(){var a=this.Rt;if(isNaN(a)){for(var b= +midAngle:{get:function(){this.pg();return this.computeMidAngle()}},flattenedLengths:{get:function(){if(null===this.qr){this.sd||hp(this);for(var a=this.qr=[],b=this.pointsCount,c=0;cd&&(d=-d)):L.aa(d.y,e.y)?(d=e.x-d.x,0>d&&(d=-d)):d=Math.sqrt(d.tf(e));a.push(d)}}return this.qr}},flattenedTotalLength:{get:function(){var a=this.Rt;if(isNaN(a)){for(var b= this.flattenedLengths,c=b.length,d=a=0;d=this.pointsCount?0:this.isOrthogonal||!lp(this.computeSpot(!0))?1:0}},lastPickIndex:{get:function(){var a=this.pointsCount;return 0===a?0:2>=a?a-1:this.isOrthogonal||!lp(this.computeSpot(!1))?a-2:a-1}},adjusting:{get:function(){return this.Ek},set:function(a){var b=this.Ek;b!== a&&(this.Ek=a,this.g("adjusting",b,a))}},corner:{get:function(){return this.rn},set:function(a){var b=this.rn;b!==a&&(this.rn=a,this.cc(!0),this.g("corner",b,a))}},curve:{get:function(){return this.tn},set:function(a){var b=this.tn;b!==a&&(this.tn=a,this.Ua(),this.cc(!0),ip(this,b===Uf||b===Tf||a===Uf||a===Tf),this.g("curve",b,a))}},curviness:{get:function(){return this.un},set:function(a){var b=this.un;b!== a&&(this.un=a,this.Ua(),this.cc(!1),this.g("curviness",b,a))}},routing:{get:function(){return this.Oj},set:function(a){var b=this.Oj;b!==a&&(this.Oj=a,this.Mf=null,this.Ua(),ip(this,2===(b.value&2)||2===(a.value&2)),this.g("routing",b,a))}},smoothness:{get:function(){return this.Dp},set:function(a){var b=this.Dp;b!==a&&(this.Dp=a,this.cc(!0),this.g("smoothness",b,a))}},key:{get:function(){var a=this.diagram; if(null!==a&&a.model.Qi())return a.model.mc(this.data)}}});U.prototype.invalidateOtherJumpOvers=U.prototype.rq;U.prototype.findClosestSegment=U.prototype.Kz;U.prototype.updateRoute=U.prototype.pg;U.prototype.invalidateRoute=U.prototype.Ua;U.prototype.rollbackRoute=U.prototype.Tv;U.prototype.commitRoute=U.prototype.rf;U.prototype.startRoute=U.prototype.Hh;U.prototype.clearPoints=U.prototype.ak;U.prototype.removePoint=U.prototype.Rv;U.prototype.addPointAt=U.prototype.pf;U.prototype.addPoint=U.prototype.ce; -U.prototype.insertPointAt=U.prototype.l;U.prototype.insertPoint=U.prototype.pA;U.prototype.setPointAt=U.prototype.L;U.prototype.setPoint=U.prototype.Mc;U.prototype.getPoint=U.prototype.i;U.prototype.getOtherPort=U.prototype.gA;U.prototype.getOtherNode=U.prototype.nq; +U.prototype.insertPointAt=U.prototype.l;U.prototype.insertPoint=U.prototype.pA;U.prototype.setPointAt=U.prototype.L;U.prototype.setPoint=U.prototype.Nc;U.prototype.getPoint=U.prototype.i;U.prototype.getOtherPort=U.prototype.gA;U.prototype.getOtherNode=U.prototype.nq; var jp=null,kp=null,$o=new D(U,"Normal",1),Ip=new D(U,"Orthogonal",2),Jp=new D(U,"AvoidsNodes",6),rp=new D(U,"AvoidsNodesStraight",7),Vf=new D(U,"None",0),Yf=new D(U,"Bezier",9),Uf=new D(U,"JumpGap",10),Tf=new D(U,"JumpOver",11),ap=new D(U,"End",17),bp=new D(U,"Scale",18),cp=new D(U,"Stretch",19),Rm=new D(U,"OrientAlong",21),Km=new D(U,"OrientPlus90",22),Mm=new D(U,"OrientMinus90",23),dp=new D(U,"OrientOpposite",24),Sm=new D(U,"OrientUpright",25),Lm=new D(U,"OrientPlus90Upright",26),Nm=new D(U,"OrientMinus90Upright", 27),Om=new D(U,"OrientUpright45",28),tp=16,sp=14,up=8;U.className="Link";U.Normal=$o;U.Orthogonal=Ip;U.AvoidsNodes=Jp;U.AvoidsNodesStraight=rp;U.None=Vf;U.Bezier=Yf;U.JumpGap=Uf;U.JumpOver=Tf;U.End=ap;U.Scale=bp;U.Stretch=cp;U.OrientAlong=Rm;U.OrientPlus90=Km;U.OrientMinus90=Mm;U.OrientOpposite=dp;U.OrientUpright=Sm;U.OrientPlus90Upright=Lm;U.OrientMinus90Upright=Nm;U.OrientUpright45=Om;U.EndSegmentStep=8;U.CurvinessStart=tp;U.SpacingMin=sp;U.OrthoShortCut=up; function Hp(a,b,c,d){Ta(this);this.re=this.wr=!1;this.Ws=a;this.uy=b;this.Iv=c;this.vy=d;this.links=[]}Hp.prototype.mm=function(){if(!this.wr){var a=this.links;0=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.wd=Math.floor((a.x-this.dc)/this.dc)*this.dc;this.xd=Math.floor((b-this.ec)/this.ec)*this.ec;this.Ao=Math.ceil((c+2*this.dc)/this.dc)*this.dc;this.Bo=Math.ceil((d+2*this.ec)/this.ec)*this.ec;a=1+(Math.ceil((this.Ao-this.wd)/this.dc)|0);b=1+(Math.ceil((this.Bo-this.xd)/this.ec)|0);if(null===this.Qb||this.zi=zp&&(c[d]=Kp)} -pk.prototype.qk=function(a,b,c,d){if(a>this.Ao||a+cthis.Bo||b+da&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e)return!0;d=Math.min(a+c-1,this.zi)|0;for(c=Math.min(b+e-1,this.Ai)|0;a<=d;a++){e=this.Qb[a];for(var f=b;f<=c;f++)if(e[f]===uk)return!1}return!0}; +function pk(a){Ta(this);this.Fy=this.group=null;this.Ms=!0;this.abort=!1;this.yd=this.xd=1;this.Bo=this.Ao=-1;this.dc=a.width;this.ec=a.height;this.Qb=null;this.Ai=this.zi=0;this.it=11;this.my=this.ly=22} +pk.prototype.initialize=function(a){if(!(0>=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.xd=Math.floor((a.x-this.dc)/this.dc)*this.dc;this.yd=Math.floor((b-this.ec)/this.ec)*this.ec;this.Ao=Math.ceil((c+2*this.dc)/this.dc)*this.dc;this.Bo=Math.ceil((d+2*this.ec)/this.ec)*this.ec;a=1+(Math.ceil((this.Ao-this.xd)/this.dc)|0);b=1+(Math.ceil((this.Bo-this.yd)/this.ec)|0);if(null===this.Qb||this.zi=zp&&(c[d]=Kp)} +pk.prototype.qk=function(a,b,c,d){if(a>this.Ao||a+cthis.Bo||b+da&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e)return!0;d=Math.min(a+c-1,this.zi)|0;for(c=Math.min(b+e-1,this.Ai)|0;a<=d;a++){e=this.Qb[a];for(var f=b;f<=c;f++)if(e[f]===uk)return!1}return!0}; function Lp(a,b,c,d,e,f,g,h,k){if(!(bg||ck)){var l=b|0;var m=c|0;var n=a.Qb[l][m];if(n>=zp&&n=a.Qb[l][m]);)a.Qb[l][m]=n,n+=1,e?m+=d:l+=d;l=e?m:l;if(e)if(0l;c+=d)Lp(a,b,c,1,!e,f,g,h,k),Lp(a,b,c,-1,!e,f,g,h,k);else if(0l;b+=d)Lp(a,b,c,1,!e,f,g,h,k),Lp(a,b,c,-1,!e,f,g,h, k)}}function Mp(a,b,c,d,e,f,g,h,k){b|=0;c|=0;var l=uk,m=zp;for(a.Qb[b][c]=m;l===uk&&b>f&&bh&&cf&&bh&&c=Math.abs(h-l)&&1>=Math.abs(k-m))a.abort=!0;else{var n=f.x;d=f.y;b=f.x+f.width;var p=f.y+f.height;n-=a.wd;n/=a.dc;d-=a.xd;d/=a.ec;b-=a.wd;b/=a.dc;p-=a.xd;p/=a.ec;f=Math.max(0,Math.min(a.zi,n|0));b=Math.min(a.zi,Math.max(0,b|0));n=Math.max(0,Math.min(a.Ai,d|0));p=Math.min(a.Ai,Math.max(0,p|0));d=a.Qb;h|=0;k|=0;l|=0;m|= +function vp(a,b,c,d,e,f,g){if(null!==a.Qb){a.abort=!1;var h=b.x,k=b.y;if(tk(a,h,k)){h-=a.xd;h/=a.dc;k-=a.yd;k/=a.ec;var l=d.x,m=d.y;if(tk(a,l,m))if(l-=a.xd,l/=a.dc,m-=a.yd,m/=a.ec,1>=Math.abs(h-l)&&1>=Math.abs(k-m))a.abort=!0;else{var n=f.x;d=f.y;b=f.x+f.width;var p=f.y+f.height;n-=a.xd;n/=a.dc;d-=a.yd;d/=a.ec;b-=a.xd;b/=a.dc;p-=a.yd;p/=a.ec;f=Math.max(0,Math.min(a.zi,n|0));b=Math.min(a.zi,Math.max(0,b|0));n=Math.max(0,Math.min(a.Ai,d|0));p=Math.min(a.Ai,Math.max(0,p|0));d=a.Qb;h|=0;k|=0;l|=0;m|= 0;var r=0===c||90===c?1:-1;c=90===c||270===c;d[h][k]===uk?(Mp(a,h,k,r,c,f,b,n,p),Mp(a,h,k,1,!c,f,b,n,p),Mp(a,h,k,-1,!c,f,b,n,p)):Mp(a,h,k,r,c,h,k,h,k);d[l][m]===uk?(Np(a,l,m,0===e||90===e?1:-1,90===e||270===e,f,b,n,p),Np(a,l,m,1,!(90===e||270===e),f,b,n,p),Np(a,l,m,-1,!(90===e||270===e),f,b,n,p)):Np(a,l,m,r,c,l,m,l,m);c=Fa();if(g&&Op(a,l,m,e,h,k,c)){if(c[0]!==l||c[1]!==m)c.unshift(m),c.unshift(l);if(c[c.length-2]!==h||c[c.length-1]!==k)c.push(h),c.push(k);a=zp;e=c[c.length-2];g=c[c.length-1];d[e][g]= a++;for(f=c.length-4;0<=f;f-=2)for(e=c[f+2],g=c[f+3],b=c[f],l=c[f+1];b>e?e++:bg?g++:le)m--;else break;else if(n>f)n--;else break;var p=h[m][n];if(0===p||p===Pp)break;k=m;l=n}for(;;){m=d;n=k;p=l;0===d?pf&&(m=270,p--):90===d?ne&&(m=180,n--):180===d?pf&&(m=270,p--):ne&&(m=180,n--);n=h[n][p];if(m!==d&&0!==n&&n!==Pp){g.push(k);g.push(l);if(Op(a,k,l, m,e,f,g))return!0;g.pop();g.pop()}h[k][l]=Pp;if(0===d){if(k===b)return!1;k--}else if(90===d){if(l===c)return!1;l--}else if(180===d){if(k===b)return!1;k++}else{if(l===c)return!1;l++}}} -na.Object.defineProperties(pk.prototype,{bounds:{get:function(){return new N(this.wd,this.xd,this.Ao-this.wd,this.Bo-this.xd)}},bq:{get:function(){return this.dc},set:function(a){0=c?180:0}a=180*Math.atan2(a.height,a.width)/Math.PI;switch(b){case 3:return c>a&&c<=180+a?180:270;case 5:return c>180-a&&c<=360-a?270:0;case 12:return c>a&&c<=180+a?90:0;case 10:return c>180-a&&c<=360-a?180:90;case 7:return 90180+a&&c<=360-a?270:0;case 13:return 180a&&180>=c?90:0;case 14:return c> a&&c<=180-a?90:c>180-a&&270>=c?180:0;case 11:return c>180-a&&c<=180+a?180:c>180+a?270:90}d&&15!==b&&(c-=15,0>c&&(c+=360));return c>a&&c<180-a?90:c>=180-a&&c<=180+a?180:c>180+a&&c<360-a?270:0}pp.prototype.mm=function(){this.ee.length=0}; function qp(a,b){var c=a.ee;if(0===c.length){a:if(!a.uq){c=a.uq;a.uq=!0;var d=null,e=a.node,f=e instanceof hf?e:null;if(null===f||f.isSubGraphExpanded)var g=e.isTreeExpanded?e.findLinksConnected(a.port.portId):e.Sx();else{if(!f.actualBounds.u()){a.uq=c;break a}d=f;g=d.ov()}f=a.ee.length=0;var h=a.port.da(sc,J.alloc()),k=a.port.da(Cc,J.alloc());e=N.allocAt(h.x,h.y,0,0);e.Le(k);J.free(h);J.free(k);h=J.allocAt(e.x+e.width/2,e.y+e.height/2);k=a.port.Li();for(g=g.iterator;g.next();){var l=g.value;if(l.isVisible()&& -l.fromPort!==l.toPort){var m=l.fromPort===a.port||null!==l.fromNode&&l.fromNode.Fd(d),n=l.computeSpot(m,a.port);if(n.Kc()){var p=m?l.toPort:l.fromPort;if(null!==p&&(m=p.part,null!==m)){var r=m.findVisibleNode();null!==r&&r!==m&&(m=r,p=m.port);m=l.computeOtherPoint(m,p);p=h.Oa(p.da(yc));p+=(h.Oa(m)-p)/360;p-=k;0>p?p+=360:360<=p&&(p-=360);n=Qp(e,n,p,l.isOrthogonal);0===n?(n=4,180p&&(p+=360));r=a.ee[f];void 0===r?(r=new Rp(l,p,n),a.ee[f]= -r):(r.link=l,r.angle=p,r.xc=n);r.Kv.set(m);f++}}}}J.free(h);a.ee.sort(pp.prototype.j);k=a.ee.length;d=-1;for(f=h=0;fMath.abs(u)?(z=Math.abs(u)/p,p=Math.abs(u)):z=1;break;case 2:r>Math.abs(y)?(z=Math.abs(y)/r,r=Math.abs(y)):z=1;break;case 1:n>Math.abs(u)?(z=Math.abs(u)/n,n=Math.abs(u)):z=1;break;default:case 4:m> -Math.abs(y)?(z=Math.abs(y)/m,m=Math.abs(y)):z=1}w=0}var F=A.tq;if(d===Xo){A=A.link.computeThickness();A*=z;F.set(B);switch(q){case 8:F.x=B.x+u/2+p/2-w-A/2;break;case 2:F.y=B.y+y/2+r/2-w-A/2;break;case 1:F.x=B.x+u/2-n/2+w+A/2;break;default:case 4:F.y=B.y+y/2-m/2+w+A/2}w+=A}else{var K=.5;d===Jo&&(K=(A.oq+1)/(A.fm+1));F.x=B.x+u*K;F.y=B.y+y*K}}}J.free(h);J.free(k);J.free(g);J.free(l);B=a.ee;for(f=0;fb.xc?1:a.angleb.angle?1:0}; +l.fromPort!==l.toPort){var m=l.fromPort===a.port||null!==l.fromNode&&l.fromNode.Fd(d),n=l.computeSpot(m,a.port);if(n.Lc()&&(m=m?l.toPort:l.fromPort,null!==m)){var p=m.part;if(null!==p){var r=p.findVisibleNode();null!==r&&r!==p&&(p=r,m=p.port);m=l.computeOtherPoint(p,m);p=h.Ra(m);p-=k;0>p?p+=360:360<=p&&(p-=360);n=Qp(e,n,p,l.isOrthogonal);0===n?(n=4,180p&&(p+=360));r=a.ee[f];void 0===r?(r=new Rp(l,p,n),a.ee[f]=r):(r.link=l,r.angle=p,r.xc= +n);r.Kv.set(m);f++}}}}J.free(h);a.ee.sort(pp.prototype.j);k=a.ee.length;d=-1;for(f=h=0;fMath.abs(u)?(z=Math.abs(u)/p,p=Math.abs(u)):z=1;break;case 2:r>Math.abs(y)?(z=Math.abs(y)/r,r=Math.abs(y)):z=1;break;case 1:n>Math.abs(u)?(z=Math.abs(u)/n,n=Math.abs(u)):z=1;break;default:case 4:m>Math.abs(y)?(z=Math.abs(y)/ +m,m=Math.abs(y)):z=1}w=0}var F=A.tq;if(d===Xo){A=A.link.computeThickness();A*=z;F.set(B);switch(q){case 8:F.x=B.x+u/2+p/2-w-A/2;break;case 2:F.y=B.y+y/2+r/2-w-A/2;break;case 1:F.x=B.x+u/2-n/2+w+A/2;break;default:case 4:F.y=B.y+y/2-m/2+w+A/2}w+=A}else{var K=.5;d===Jo&&(K=(A.oq+1)/(A.fm+1));F.x=B.x+u*K;F.y=B.y+y*K}}}J.free(h);J.free(k);J.free(g);J.free(l);B=a.ee;for(f=0;fb.xc?1:a.angleb.angle?1:0}; pp.prototype.computeEndSegmentLength=function(a){var b=a.link,c=b.computeEndSegmentLength(this.node,this.port,rc,b.fromPort===this.port),d=a.oq;if(0>d)return c;var e=a.fm;if(1>=e||!b.isOrthogonal)return c;b=a.Kv;var f=a.tq;if(2===a.xc||8===a.xc)d=e-1-d;return((a=2===a.xc||4===a.xc)?b.y=b-1?(f=0,d=c,e+=g+20,g=0):f++}}; li.prototype.doMinimalNetworkLayout=function(){var a=Math.ceil(Math.sqrt(this.network.vertexes.count));this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin);for(var b=this.arrangementOrigin.x,c=b,d=this.arrangementOrigin.y,e=0,f=0,g=this.network.vertexes.iterator;g.next();){var h=g.value.node;if(!(null===h||h instanceof U)&&(Up(h),this.Fh(h))){var k=h.measuredBounds,l=k.width;k=k.height;h.moveTo(c,d);h instanceof hf&&(h.Fh=!1);c+=Math.max(l,50)+20;f=Math.max(f,Math.max(k,50));e>=a-1?(e= -0,c=b,d+=f+20,f=0):e++}}};li.prototype.Fh=function(a){return!a.location.u()||a instanceof hf&&a.Fh?!0:!1};function Tp(a,b,c,d,e,f,g,h){for(c=c.iterator;c.next();){var k=c.value;d&&!k.isTopLevel||null!==e&&!e(k)||!k.canLayout()||(f&&k instanceof W?k.isLinkLabel||(k instanceof hf?null===k.layout?Tp(a,b,k.memberParts,!1,e,f,g,h):(Up(k),b.add(k)):(Up(k),b.add(k))):g&&k instanceof U?b.add(k):!h||!k.Jc()||k instanceof W||(Up(k),b.add(k)))}} +0,c=b,d+=f+20,f=0):e++}}};li.prototype.Fh=function(a){return!a.location.u()||a instanceof hf&&a.Fh?!0:!1};function Tp(a,b,c,d,e,f,g,h){for(c=c.iterator;c.next();){var k=c.value;d&&!k.isTopLevel||null!==e&&!e(k)||!k.canLayout()||(f&&k instanceof W?k.isLinkLabel||(k instanceof hf?null===k.layout?Tp(a,b,k.memberParts,!1,e,f,g,h):(Up(k),b.add(k)):(Up(k),b.add(k))):g&&k instanceof U?b.add(k):!h||!k.Kc()||k instanceof W||(Up(k),b.add(k)))}} function Up(a){var b=a.actualBounds;(0===b.width||0===b.height||isNaN(b.width)||isNaN(b.height))&&a.Sa()}li.prototype.Ni=function(a,b){var c=this.boundsComputation;if(null!==c)return b||(b=new N),c(a,this,b);if(!b)return a.actualBounds;b.set(a.actualBounds);return b}; li.prototype.Hx=function(a){var b=new G;a instanceof T?(Tp(this,b,a.nodes,!0,null,!0,!0,!0),Tp(this,b,a.links,!0,null,!0,!0,!0),Tp(this,b,a.parts,!0,null,!0,!0,!0)):a instanceof hf?Tp(this,b,a.memberParts,!1,null,!0,!0,!0):Tp(this,b,a.iterator,!1,null,!0,!0,!0);return b}; li.prototype.initialOrigin=function(a){var b=this.group;if(null!==b){var c=b.position.copy();(isNaN(c.x)||isNaN(c.y))&&c.set(a);b=b.placeholder;null!==b&&(c=b.da(sc),(isNaN(c.x)||isNaN(c.y))&&c.set(a),a=b.padding,c.x+=a.left,c.y+=a.top);return c}return a};li.prototype.mayUseWorker=function(){return this.mayUseWorkerFunction?this.mayUseWorkerFunction(this):!1};li.prototype.workerLayout=function(){return!1}; @@ -1662,36 +1662,36 @@ Sp.prototype.clear=function(){if(this.mf)for(var a=this.mf.iterator;a.next();)a. Sp.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutNetwork"+(null!==this.layout?"("+this.layout.toString()+")":"");if(0>=a)return b;b+=" vertexes: "+this.mf.count+" edges: "+this.le.count;if(1b?1:0):1:null!==b?-1:0} -na.Object.defineProperties(fq.prototype,{sourceEdgesArrayAccess:{get:function(){return this.qd._dataArray}},destinationEdgesArrayAccess:{get:function(){return this.Cd._dataArray}},data:{get:function(){return this.ib},set:function(a){this.ib=a;if(null!==a&&a.bounds){var b=a.bounds;a=b.x;var c=b.y,d=b.width;b=b.height;this.o.h(d/2,b/2);this.j.h(a,c,d,b)}}},node:{get:function(){return this.mi}, +function fq(a){Ta(this);this.Qc=a;this.j=(new N(0,0,10,10)).freeze();this.o=(new J(5,5)).freeze();this.mi=this.ib=null;this.rd=new E;this.Cd=new E} +fq.prototype.serializeVertexProperties=function(a){a.id=gb(this);a.key=this.node?this.node.key:this.data?this.data.ci:void 0;void 0===a.key&&(a.key=null);a.x=this.bounds.x;a.y=this.bounds.y;a.eB=this.bounds.width;a.mA=this.bounds.height;a.fx=this.focus.x;a.fy=this.focus.y;var b=[];this.rd.each(function(a){b.push(gb(a))});a.Ey=b;var c=[];this.Cd.each(function(a){c.push(gb(a))});a.Nx=c}; +fq.prototype.deserializeVertexProperties=function(a,b,c){if(null!==a){this.x=a.x;this.y=a.y;this.width=a.eB;this.height=a.mA;this.focusX=a.fx;this.focusY=a.fy;var d=this;a.Ey&&a.Ey.forEach(function(a){(a=c.get(a))&&d.rd.add(a)});a.Nx&&a.Nx.forEach(function(a){(a=c.get(a))&&d.Cd.add(a)})}};fq.prototype.clear=function(){this.mi=this.ib=null;this.rd=new E;this.Cd=new E}; +fq.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutVertex#"+gb(this);if(0b?1:0):1:null!==b?-1:0} +na.Object.defineProperties(fq.prototype,{sourceEdgesArrayAccess:{get:function(){return this.rd._dataArray}},destinationEdgesArrayAccess:{get:function(){return this.Cd._dataArray}},data:{get:function(){return this.ib},set:function(a){this.ib=a;if(null!==a&&a.bounds){var b=a.bounds;a=b.x;var c=b.y,d=b.width;b=b.height;this.o.h(d/2,b/2);this.j.h(a,c,d,b)}}},node:{get:function(){return this.mi}, set:function(a){if(this.mi!==a){this.mi=a;a.Sa();var b=this.network.layout,c=N.alloc(),d=b.Ni(a,c);b=d.x;var e=d.y,f=d.width;d=d.height;isNaN(b)&&(b=0);isNaN(e)&&(e=0);this.j.h(b,e,f,d);N.free(c);if(!(a instanceof hf)&&(a=a.locationObject.da(yc),a.u())){this.o.h(a.x-b,a.y-e);return}this.o.h(f/2,d/2)}}},bounds:{get:function(){return this.j},set:function(a){this.j.A(a)||this.j.assign(a)}},focus:{get:function(){return this.o},set:function(a){this.o.A(a)|| this.o.assign(a)}},centerX:{get:function(){return this.j.x+this.o.x},set:function(a){var b=this.j;b.x+this.o.x!==a&&(b.ea(),b.x=a-this.o.x,b.freeze())}},centerY:{get:function(){return this.j.y+this.o.y},set:function(a){var b=this.j;b.y+this.o.y!==a&&(b.ea(),b.y=a-this.o.y,b.freeze())}},focusX:{get:function(){return this.o.x},set:function(a){var b=this.o;b.x!==a&&(b.ea(),b.x=a,b.freeze())}},focusY:{ get:function(){return this.o.y},set:function(a){var b=this.o;b.y!==a&&(b.ea(),b.y=a,b.freeze())}},x:{get:function(){return this.j.x},set:function(a){var b=this.j;b.x!==a&&(b.ea(),b.x=a,b.freeze())}},y:{get:function(){return this.j.y},set:function(a){var b=this.j;b.y!==a&&(b.ea(),b.y=a,b.freeze())}},width:{get:function(){return this.j.width},set:function(a){var b=this.j;b.width!==a&&(b.ea(),b.width= -a,b.freeze())}},height:{get:function(){return this.j.height},set:function(a){var b=this.j;b.height!==a&&(b.ea(),b.height=a,b.freeze())}},network:{get:function(){return this.Pc},set:function(a){this.Pc=a}},sourceVertexes:{get:function(){for(var a=new G,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);return a.iterator}},destinationVertexes:{get:function(){for(var a=new G,b= -this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},vertexes:{get:function(){for(var a=new G,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);for(b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},sourceEdges:{get:function(){return this.qd.iterator}},destinationEdges:{get:function(){return this.Cd.iterator}},edges:{get:function(){for(var a= -new E,b=this.sourceEdges;b.next();)a.add(b.value);for(b=this.destinationEdges;b.next();)a.add(b.value);return a.iterator}},edgesCount:{get:function(){return this.qd.count+this.Cd.count}}});fq.prototype.deleteDestinationEdge=fq.prototype.jv;fq.prototype.addDestinationEdge=fq.prototype.$u;fq.prototype.deleteSourceEdge=fq.prototype.kv;fq.prototype.addSourceEdge=fq.prototype.bv;fq.className="LayoutVertex";fq.standardComparer=mq; +a,b.freeze())}},height:{get:function(){return this.j.height},set:function(a){var b=this.j;b.height!==a&&(b.ea(),b.height=a,b.freeze())}},network:{get:function(){return this.Qc},set:function(a){this.Qc=a}},sourceVertexes:{get:function(){for(var a=new G,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);return a.iterator}},destinationVertexes:{get:function(){for(var a=new G,b= +this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},vertexes:{get:function(){for(var a=new G,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);for(b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},sourceEdges:{get:function(){return this.rd.iterator}},destinationEdges:{get:function(){return this.Cd.iterator}},edges:{get:function(){for(var a= +new E,b=this.sourceEdges;b.next();)a.add(b.value);for(b=this.destinationEdges;b.next();)a.add(b.value);return a.iterator}},edgesCount:{get:function(){return this.rd.count+this.Cd.count}}});fq.prototype.deleteDestinationEdge=fq.prototype.jv;fq.prototype.addDestinationEdge=fq.prototype.$u;fq.prototype.deleteSourceEdge=fq.prototype.kv;fq.prototype.addSourceEdge=fq.prototype.bv;fq.className="LayoutVertex";fq.standardComparer=mq; fq.smartComparer=function(a,b){if(null!==a){if(null!==b){a=a.mi;var c=b.mi;if(null!==a){if(null!==c){b=a.text.toLocaleLowerCase().split(/([+-]?[.]?\d+(?:\.\d*)?(?:e[+-]?\d+)?)/);a=c.text.toLocaleLowerCase().split(/([+-]?[.]?\d+(?:\.\d*)?(?:e[+-]?\d+)?)/);for(c=0;c=f&&0>=g&&(f=1);b=this.spacing.width;isFinite(b)||(b=0);c=this.spacing.height;isFinite(c)||(c=0);null!==a&&a.wa("Layout");d=[];switch(this.alignment){case vq:var h=b,k=c,l=N.alloc(),m=Math.max(this.cellSize.width,1);if(!isFinite(m))for(var n=m=0;nf-1||0g)d.push(new N(0,u,g+h,w)),v=0,q=r,u+=w,w=0;w=Math.max(w,F);switch(p){case uq:A=-A.width;break;default:A= @@ -1701,13 +1701,13 @@ m&&u>m-1||0k){d.push(new N(0,F?z-f:z,k+n,A+f+p));for(S=0;Sl&&(f.width+=f.x-l,f.x=l);N.free(g)}for(h=f=g=e=0;hb?1:0} na.Object.defineProperties(Lk.prototype,{wrappingWidth:{get:function(){return this.Vp},set:function(a){this.Vp!==a&&(0d.indexOf(a.newValue)&&d.splice(c,0,a.newValue));return}}else if(a.change===fe){c=a.oldParam;if("linkDataArray"===a.modelChange){a=a.oldValue;za(a)&&"number"===typeof c&&(d=this.mc(a),b?(this.Rf.add(a),this.Xc[c]!==a&&this.Xc.splice(c,0,a),void 0!==d&&this.jb.add(d,a)):(this.Rf.remove(a),this.Xc[c]=== -a&&this.Xc.splice(c,1),void 0!==d&&this.jb.remove(d)));return}if("linkLabelKeys"===a.modelChange){d=this.xf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue):(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)));return}}Z.prototype.changeState.call(this,a,b)}};t=nr.prototype;t.pm=function(a){if(void 0!==a){var b=this.mj;if(null!==b){var c=this.Vb(a);null===c&&(c=this.copyNodeData(b),Mj(c,this.nodeKeyProperty,a),this.nf(c))}return a}}; +nr.prototype.changeState=function(a,b){if(null!==a&&a.model===this){if(a.change===ce){var c=a.object,d=a.propertyName;if(d===this.linkKeyProperty&&this.tc(c)){var e=a.H(b);b=a.H(!b);void 0!==b&&this.jb.remove(b);void 0!==e&&this.jb.add(e,c);Mj(c,d,e);return}}else if(a.change===ee){c=a.newParam;if("linkDataArray"===a.modelChange){a=a.newValue;za(a)&&"number"===typeof c&&(d=this.mc(a),b?(this.Rf.remove(a),this.Yc[c]===a&&this.Yc.splice(c,1),void 0!==d&&this.jb.remove(d)):(this.Rf.add(a),this.Yc[c]!== +a&&this.Yc.splice(c,0,a),void 0!==d&&this.jb.add(d,a)));return}if("linkLabelKeys"===a.modelChange){d=this.xf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)):0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue));return}}else if(a.change===fe){c=a.oldParam;if("linkDataArray"===a.modelChange){a=a.oldValue;za(a)&&"number"===typeof c&&(d=this.mc(a),b?(this.Rf.add(a),this.Yc[c]!==a&&this.Yc.splice(c,0,a),void 0!==d&&this.jb.add(d,a)):(this.Rf.remove(a),this.Yc[c]=== +a&&this.Yc.splice(c,1),void 0!==d&&this.jb.remove(d)));return}if("linkLabelKeys"===a.modelChange){d=this.xf(a.object);Array.isArray(d)&&"number"===typeof c&&(b?0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue):(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)));return}}Z.prototype.changeState.call(this,a,b)}};t=nr.prototype;t.pm=function(a){if(void 0!==a){var b=this.mj;if(null!==b){var c=this.Vb(a);null===c&&(c=this.copyNodeData(b),Mj(c,this.nodeKeyProperty,a),this.nf(c))}return a}}; t.Zx=function(a){return Jq(this,a,!0)};t.Wv=function(a,b){Rq(this,a,b,!0)};t.by=function(a){return Jq(this,a,!1)};t.$v=function(a,b){Rq(this,a,b,!1)};function Jq(a,b,c){if(null!==b&&(a=c?a.Xe:a.Ye,""!==a&&(a=on(b,a),void 0!==a))){if(Lq(a))return a;C((c?"FromKey":"ToKey")+" value for link data "+b+" is not a number or a string: "+a)}} function Rq(a,b,c,d){null===c&&(c=void 0);if(null!==b){var e=d?a.Xe:a.Ye;if(""!==e)if(c=a.pm(c),a.tc(b)){var f=on(b,e);f!==c&&(Pq(a,f,b),Mj(b,e,c),null===a.Vb(c)&&Qq(a,c,b),ir(a,d?"linkFromKey":"linkToKey",ce,e,b,f,c),"string"===typeof e&&a.Da(b,e))}else Mj(b,e,c)}}t.$x=function(a){return Iq(this,a,!0)};t.Xv=function(a,b){Sq(this,a,b,!0)};t.ey=function(a){return Iq(this,a,!1)};t.aw=function(a,b){Sq(this,a,b,!1)}; function Iq(a,b,c){if(null===b)return"";a=c?a.Fj:a.Gj;if(""===a)return"";b=on(b,a);return void 0===b?"":b}function Sq(a,b,c,d){if(null!==b){var e=d?a.Fj:a.Gj;if(""!==e)if(a.tc(b)){var f=on(b,e);void 0===f&&(f="");f!==c&&(Mj(b,e,c),ir(a,d?"linkFromPortId":"linkToPortId",ce,e,b,f,c),"string"===typeof e&&a.Da(b,e))}else Mj(b,e,c)}}t.xf=function(a){if(null===a)return qr;var b=this.$d;if(""===b)return qr;a=on(a,b);return void 0===a?qr:a}; @@ -1863,8 +1863,8 @@ t.av=function(a,b){if(null!==b&&void 0!==b&&null!==a){var c=this.$d;if(""!==c){v t.wy=function(a,b){if(null!==b&&void 0!==b&&null!==a){var c=this.$d;if(""!==c){var d=on(a,c);if(Array.isArray(d)){var e=d.indexOf(b);0>e||(d.splice(e,1),this.tc(a)&&(Pq(this,b,a),ir(this,"linkLabelKeys",fe,c,a,b,null,e,null)))}else void 0!==d&&C(c+" property is not an Array; cannot removeLabelKeyforLinkData: "+a)}}};t.mc=function(a){if(null!==a){var b=this.gi;if(""!==b&&(b=on(a,b),void 0!==b)){if(Lq(b))return b;C("Key value for link data "+a+" is not a number or a string: "+b)}}}; t.dt=function(a,b){if(null!==a){var c=this.gi;if(""!==c)if(this.tc(a)){var d=on(a,c);d!==b&&null===this.zh(b)&&(Mj(a,c,b),void 0!==d&&this.jb.remove(d),this.jb.add(b,a),ir(this,"linkKey",ce,c,a,d,b),"string"===typeof c&&this.Da(a,c))}else Mj(a,c,b)}};t.zh=function(a){null===a&&C("GraphLinksModel.findLinkDataForKey:key must not be null");return void 0!==a&&Lq(a)?this.jb.H(a):null}; t.Us=function(a){if(null!==a){var b=this.gi;if(""!==b){var c=this.mc(a);if(void 0===c||this.jb.contains(c)){var d=this.wl;if(null!==d&&(c=d(this,a),void 0!==c&&null!==c&&!this.jb.contains(c))){Mj(a,b,c);return}if("string"===typeof c){for(d=2;this.jb.contains(c+d);)d++;Mj(a,b,c+d)}else if(void 0===c||"number"===typeof c){for(c=-this.jb.count-1;this.jb.contains(c);)c--;Mj(a,b,c)}}}}};t.tc=function(a){return null===a?!1:this.Rf.contains(a)};t.Ci=function(a){null!==a&&(ib(a),this.tc(a)||Nq(this,a,!0))}; -function Nq(a,b,c){if(""!==a.linkKeyProperty){var d=a.mc(b);if(void 0!==d&&a.jb.H(d)===b)return;a.Us(b);d=a.mc(b);void 0===d&&C("GraphLinksModel.makeLinkDataKeyUnique failed on "+b+". Data not added to model.");a.jb.add(d,b)}a.Rf.add(b);d=null;c&&(d=a.Xc.length,a.Xc.splice(d,0,b));ir(a,"linkDataArray",ee,"linkDataArray",a,null,b,null,d);rr(a,b)}t.hz=function(a){if(Array.isArray(a))for(var b=a.length,c=0;cd)return;a.Xc.splice(d,1)}ir(a,"linkDataArray",fe,"linkDataArray",a,b,null,d,null);c=Jq(a,b,!0);Pq(a,c,b);c=Jq(a,b,!1);Pq(a,c,b);d=a.xf(b);if(Array.isArray(d))for(var e=d.length,f=0;fd)return;a.Yc.splice(d,1)}ir(a,"linkDataArray",fe,"linkDataArray",a,b,null,d,null);c=Jq(a,b,!0);Pq(a,c,b);c=Jq(a,b,!1);Pq(a,c,b);d=a.xf(b);if(Array.isArray(d))for(var e=d.length,f=0;f=a.count)1===a.count&&(a=a.first(),a.centerX=0,a.centerY=0);else{var b=new E;b.addAll(a.iterator);a=new E;var c=new E;var d=this.sort(b);var e,f,g=this.$q;var h=this.arrangement;var k=this.nodeDiameterFormula;var l=this.radius;if(!isFinite(l)||0>=l)l=NaN;var m=this.aspectRatio;if(!isFinite(m)||0>=m)m=1;var n=this.startAngle; isFinite(n)||(n=0);var p=this.sweepAngle;if(!isFinite(p)||360p)p=360;b=this.spacing;isFinite(b)||(b=NaN);h===Ir&&k===Jr?h=ur:h===Ir&&k!==Jr&&(h=this.arrangement);if((this.direction===Dr||this.direction===Er)&&this.sorting!==xr){for(k=0;!(k>=d.length);k+=2){a.add(d.J(k));if(k+1>=d.length)break;c.add(d.J(k+1))}this.direction===Dr?(this.arrangement===Ir&&a.reverse(),d=new E,d.addAll(a),d.addAll(c)):(this.arrangement===Ir&&c.reverse(),d=new E,d.addAll(c),d.addAll(a))}k=d.length;for(var r=f=e=0;r< @@ -1926,8 +1926,8 @@ p=-1,r=[],q=0;qb[c[q]].indexOf(c[q===c.length-1?0:q+1])&&r.push( c.indexOf(b[l][z]),0<=B&&(B=Math.abs(u-(B>=u?B+1:B)),w+=B=u&&B++,y>=u&&y++,B>y&&(A=y,y=B,B=A),y-B<(c.length+2)/2===(Br||r===m||(q=r>m?r-m:m-r,n+=rg-q?1:-1);c.splice(0>n?m:m+1,0,k);d.splice(h,1);h--}else f=!1;if(f)break;else c.push(d[0]),d.splice(0,1)}for(b=0;b=a?this.Vl=a:this.Vl=360,this.B())}},arrangement:{get:function(){return this.Gb},set:function(a){this.Gb===a||a!==Ir&&a!==ur&&a!==Hr&&a!==Gr||(this.Gb=a,this.B())}},direction:{get:function(){return this.K},set:function(a){this.K===a||a!==wr&&a!==Fr&&a!==Dr&&a!==Er||(this.K=a,this.B())}},sorting:{get:function(){return this.Yc},set:function(a){this.Yc===a||a!==Br&&a!==Cr&& -a!==zr&&!Ar&&a!==xr||(this.Yc=a,this.B())}},comparer:{get:function(){return this.Rc},set:function(a){this.Rc!==a&&(this.Rc=a,this.B())}},spacing:{get:function(){return this.ef},set:function(a){this.ef!==a&&(this.ef=a,this.B())}},nodeDiameterFormula:{get:function(){return this.Oo},set:function(a){this.Oo===a||a!==yr&&a!==Jr||(this.Oo=a,this.B())}},actualXRadius:{get:function(){return this.Zb}}, +set:function(a){this.Vl!==a&&(0=a?this.Vl=a:this.Vl=360,this.B())}},arrangement:{get:function(){return this.Gb},set:function(a){this.Gb===a||a!==Ir&&a!==ur&&a!==Hr&&a!==Gr||(this.Gb=a,this.B())}},direction:{get:function(){return this.K},set:function(a){this.K===a||a!==wr&&a!==Fr&&a!==Dr&&a!==Er||(this.K=a,this.B())}},sorting:{get:function(){return this.Zc},set:function(a){this.Zc===a||a!==Br&&a!==Cr&& +a!==zr&&!Ar&&a!==xr||(this.Zc=a,this.B())}},comparer:{get:function(){return this.Sc},set:function(a){this.Sc!==a&&(this.Sc=a,this.B())}},spacing:{get:function(){return this.ef},set:function(a){this.ef!==a&&(this.ef=a,this.B())}},nodeDiameterFormula:{get:function(){return this.Oo},set:function(a){this.Oo===a||a!==yr&&a!==Jr||(this.Oo=a,this.B())}},actualXRadius:{get:function(){return this.Zb}}, actualYRadius:{get:function(){return this.be}},actualSpacing:{get:function(){return this.qj}},actualCenter:{get:function(){return this.zw}}}); var ur=new D(tr,"ConstantSpacing",0),Hr=new D(tr,"ConstantDistance",1),Gr=new D(tr,"ConstantAngle",2),Ir=new D(tr,"Packed",3),wr=new D(tr,"Clockwise",4),Fr=new D(tr,"Counterclockwise",5),Dr=new D(tr,"BidirectionalLeft",6),Er=new D(tr,"BidirectionalRight",7),Br=new D(tr,"Forwards",8),Cr=new D(tr,"Reverse",9),zr=new D(tr,"Ascending",10),Ar=new D(tr,"Descending",11),xr=new D(tr,"Optimized",12),yr=new D(tr,"Pythagorean",13),Jr=new D(tr,"Circular",14);tr.className="CircularLayout";tr.ConstantSpacing=ur; tr.ConstantDistance=Hr;tr.ConstantAngle=Gr;tr.Packed=Ir;tr.Clockwise=wr;tr.Counterclockwise=Fr;tr.BidirectionalLeft=Dr;tr.BidirectionalRight=Er;tr.Forwards=Br;tr.Reverse=Cr;tr.Ascending=zr;tr.Descending=Ar;tr.Optimized=xr;tr.Pythagorean=yr;tr.Circular=Jr;function vr(){this.jm=-Infinity;this.Pm=this.Ck=null} @@ -1935,8 +1935,8 @@ vr.prototype.compare=function(a,b){if(0this.jm||Math.abs(a)h?(e=p.x+p.width/2,f=p.y+p.height/2,l[0]=new J(p.x+p.width+d.width,p.y),l[1]=new J(p.x,p.y+p.height+d.height),h=2):(k=cs(l,h,e,f,p.width,p.height,d),n=l[k],r=new J(n.x+ p.width+d.width,n.y),p=new J(n.x,n.y+p.height+d.height),k+1this.network.vertexes.count)return!1;for(var a=0,b=0,c=this.network.vertexes.first().bounds,d=this.network.vertexes.iterator;d.next();){if(d.value.bounds.Ic(c)&&(a++,2this.network.vertexes.count)return!1;for(var a=0,b=0,c=this.network.vertexes.first().bounds,d=this.network.vertexes.iterator;d.next();){if(d.value.bounds.Jc(c)&&(a++,2a.network.vertexes.count)return!1;a.sh=a.network.vertexes.xa();a=a.sh;a.sort(function(a,b){return null===a||null===b||a===b?0:b.Gd-a.Gd});for(b=a.length-1;0<=b&&1>=a[b].Gd;)b--;return 1u&&0u&&0a[this.pc]&&(this.ji=a[c]-1,this.pc=c),a[c]c)for(g=a.Ca;0c)for(d.reset();d.next();)c=d.value,e[c.component]&&(c.column+=1)} os.prototype.commitLayout=function(){if(this.setsPortSpots)for(var a=vs(this,!0),b=vs(this,!1),c=this.network.edges.iterator;c.next();){var d=c.value.link;null!==d&&(d.fromSpot=a,d.toSpot=b)}this.commitNodes();this.gv();this.isRouting&&this.commitLinks()};function vs(a,b){return 270===a.K?b?cd:fd:90===a.K?b?fd:cd:180===a.K?b?dd:ed:b?ed:dd} -os.prototype.commitNodes=function(){this.Yd=[];this.vd=[];this.ud=[];this.Ka=[];for(var a=0;a<=this.ra;a++)this.Yd[a]=0,this.vd[a]=0,this.ud[a]=0,this.Ka[a]=0;for(a=this.network.vertexes.iterator;a.next();){var b=a.value,c=b.layer;this.Yd[c]=Math.max(this.Yd[c],this.nodeMinLayerSpace(b,!0));this.vd[c]=Math.max(this.vd[c],this.nodeMinLayerSpace(b,!1))}b=0;c=this.Zd;for(var d=0;d<=this.ra;d++){var e=c;0>=this.Yd[d]+this.vd[d]&&(e=0);0=this.Yd[d]+this.wd[d]&&(e=0);0=n.bounds.bottom?(n=n.bounds.y+n.bounds.height,b.l(q++,A,n+F),b.l(q++,A,n),b.l(q++,A,n-y)):(b.l(q++,A,B+F),b.l(q++,A,B),b.l(q++,A,B-y)):270===this.K?B<=n.bounds.y?(n=n.bounds.y,b.l(q++,A,n-y),b.l(q++,A,n),b.l(q++,A,n+F)):(b.l(q++,A,B-y),b.l(q++,A,B),b.l(q++,A,B+F)):0===this.K&&(A>=n.bounds.right?(n=n.bounds.x+n.bounds.width,b.l(q++,n+F,B),b.l(q++,n,B),b.l(q++,n-y,B)):(b.l(q++,A+F,B),b.l(q++,A,B),b.l(q++,A-y,B)));else{b.l(q++,w,z);var K=0;if(180===this.K||0===this.K){if(180===this.K?A>=n.bounds.right: -A<=n.bounds.x)K=(0===this.K?-y:F)/2;b.l(q++,w+K,B)}else{if(270===this.K?B>=n.bounds.bottom:B<=n.bounds.y)K=(90===this.K?-y:F)/2;b.l(q++,A,z+K)}b.l(q++,A,B)}}else y=Math.max(10,this.Yd[v.layer]),F=Math.max(10,this.vd[v.layer]),r?180===this.K?(b.l(q++,A-y-u,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A+F+u,B)):90===this.K?(b.l(q++,A,B+F+u),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B-y-u)): -270===this.K?(b.l(q++,A,B-y-u),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B+F+u)):(b.l(q++,A+F+u,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A-y-u,B)):b.l(q++,A,B)}n=v}if(null===h||l!==rc||p)if(w=b.i(q-1).x,z=b.i(q-1).y,A=b.i(q).x,B=b.i(q).y,p)u=this.vd[m.layer],180===this.K||0===this.K?(p=z,p>=m.bounds.y&&p<=m.bounds.bottom&&(180===this.K?A>=m.bounds.x:A<=m.bounds.right)&&(n=m.centerX+(180=== -this.K?-u:u),p=m.bounds.x&&p<=m.bounds.right&&(270===this.K?B>=m.bounds.y:B<=m.bounds.bottom)&&(n=m.centerY+(270===this.K?-u:u),p=m.bounds.x?(n=m.bounds.x+ -m.bounds.width,b.L(q-2,n,z),b.L(q-1,n+F,z)):90===this.K&&B<=m.bounds.bottom?(n=m.bounds.y,b.L(q-2,w,n),b.L(q-1,w,n-y)):270===this.K&&B>=m.bounds.y?(n=m.bounds.y+m.bounds.height,b.L(q-2,w,n),b.L(q-1,w,n+F)):0===this.K&&A<=m.bounds.right&&(n=m.bounds.x,b.L(q-2,n,z),b.L(q-1,n-y,z));else{y=Math.max(10,this.Yd[m.layer]);F=Math.max(10,this.vd[m.layer]);p=0;if(180===this.K||0===this.K){if(180===this.K?A<=m.bounds.x:A>=m.bounds.right)p=(0===this.K?F:-y)/2;b.l(q++,A+p,z)}else{if(270===this.K?B<=m.bounds.y: -B>=m.bounds.bottom)p=(90===this.K?F:-y)/2;b.l(q++,w,B+p)}b.l(q++,A,B)}}else{for(;null!==m&&m!==n;){y=v=null;for(m=m.destinationEdges.iterator;m.next()&&(w=m.value,w.link!==c.link||(v=w.toVertex,y=w.fromVertex,null!==y.node&&(y=null),null!==v.node)););if(null===v)break;v!==n&&(w=b.i(q-1).x,z=b.i(q-1).y,A=v.centerX,B=v.centerY,p?180===this.K||0===this.K?(null!==y?y.centerY:z)!==B&&(y=this.Ka[v.layer]+this.Qc.x,q===b.firstPickIndex+1&&(y=0===this.K?Math.max(y,w):Math.min(y,w)),b.l(q++,y,z),b.l(q++,y, -B)):(null!==y?y.centerX:w)!==A&&(y=this.Ka[v.layer]+this.Qc.y,q===b.firstPickIndex+1&&(y=90===this.K?Math.max(y,z):Math.min(y,z)),b.l(q++,w,y),b.l(q++,A,y)):(y=Math.max(10,this.Yd[v.layer]),F=Math.max(10,this.vd[v.layer]),r?180===this.K?(b.l(q++,A+F+u,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A-y-u,B)):90===this.K?(b.l(q++,A,B-y-u),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B+F+u)):270=== +A<=n.bounds.x)K=(0===this.K?-y:F)/2;b.l(q++,w+K,B)}else{if(270===this.K?B>=n.bounds.bottom:B<=n.bounds.y)K=(90===this.K?-y:F)/2;b.l(q++,A,z+K)}b.l(q++,A,B)}}else y=Math.max(10,this.Yd[v.layer]),F=Math.max(10,this.wd[v.layer]),r?180===this.K?(b.l(q++,A-y-u,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A+F+u,B)):90===this.K?(b.l(q++,A,B+F+u),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B-y-u)): +270===this.K?(b.l(q++,A,B-y-u),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B+F+u)):(b.l(q++,A+F+u,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A-y-u,B)):b.l(q++,A,B)}n=v}if(null===h||l!==rc||p)if(w=b.i(q-1).x,z=b.i(q-1).y,A=b.i(q).x,B=b.i(q).y,p)u=this.wd[m.layer],180===this.K||0===this.K?(p=z,p>=m.bounds.y&&p<=m.bounds.bottom&&(180===this.K?A>=m.bounds.x:A<=m.bounds.right)&&(n=m.centerX+(180=== +this.K?-u:u),p=m.bounds.x&&p<=m.bounds.right&&(270===this.K?B>=m.bounds.y:B<=m.bounds.bottom)&&(n=m.centerY+(270===this.K?-u:u),p=m.bounds.x?(n=m.bounds.x+ +m.bounds.width,b.L(q-2,n,z),b.L(q-1,n+F,z)):90===this.K&&B<=m.bounds.bottom?(n=m.bounds.y,b.L(q-2,w,n),b.L(q-1,w,n-y)):270===this.K&&B>=m.bounds.y?(n=m.bounds.y+m.bounds.height,b.L(q-2,w,n),b.L(q-1,w,n+F)):0===this.K&&A<=m.bounds.right&&(n=m.bounds.x,b.L(q-2,n,z),b.L(q-1,n-y,z));else{y=Math.max(10,this.Yd[m.layer]);F=Math.max(10,this.wd[m.layer]);p=0;if(180===this.K||0===this.K){if(180===this.K?A<=m.bounds.x:A>=m.bounds.right)p=(0===this.K?F:-y)/2;b.l(q++,A+p,z)}else{if(270===this.K?B<=m.bounds.y: +B>=m.bounds.bottom)p=(90===this.K?F:-y)/2;b.l(q++,w,B+p)}b.l(q++,A,B)}}else{for(;null!==m&&m!==n;){y=v=null;for(m=m.destinationEdges.iterator;m.next()&&(w=m.value,w.link!==c.link||(v=w.toVertex,y=w.fromVertex,null!==y.node&&(y=null),null!==v.node)););if(null===v)break;v!==n&&(w=b.i(q-1).x,z=b.i(q-1).y,A=v.centerX,B=v.centerY,p?180===this.K||0===this.K?(null!==y?y.centerY:z)!==B&&(y=this.Ka[v.layer]+this.Rc.x,q===b.firstPickIndex+1&&(y=0===this.K?Math.max(y,w):Math.min(y,w)),b.l(q++,y,z),b.l(q++,y, +B)):(null!==y?y.centerX:w)!==A&&(y=this.Ka[v.layer]+this.Rc.y,q===b.firstPickIndex+1&&(y=90===this.K?Math.max(y,z):Math.min(y,z)),b.l(q++,w,y),b.l(q++,A,y)):(y=Math.max(10,this.Yd[v.layer]),F=Math.max(10,this.wd[v.layer]),r?180===this.K?(b.l(q++,A+F+u,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A-y-u,B)):90===this.K?(b.l(q++,A,B-y-u),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B+F+u)):270=== this.K?(b.l(q++,A,B+F+u),b.l(q++,A,Math.max(B+F-u/2,B)),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,A,Math.min(B-y+u/2,B)),b.l(q++,A,B-y-u)):(b.l(q++,A-y-u,B),b.l(q++,Math.min(A-y+u/2,A),B),b.l(q++,A,B),b.l(q++,A,B),b.l(q++,Math.max(A+F-u/2,A),B),b.l(q++,A+F+u,B)):180===this.K?(b.l(q++,A+F,B),b.l(q++,A-y,B)):90===this.K?(b.l(q++,A,B-y),b.l(q++,A,B+F)):270===this.K?(b.l(q++,A,B+F),b.l(q++,A,B-y)):(b.l(q++,A-y,B),b.l(q++,A+F,B))));m=v}p&&(w=b.i(q-1).x,z=b.i(q-1).y,A=b.i(q).x,B=b.i(q).y,180===this.K||0===this.K? -z!==B&&(y=0===this.K?Math.min(Math.max((A+w)/2,this.Ka[n.layer]+this.Qc.x),A):Math.max(Math.min((A+w)/2,this.Ka[n.layer]+this.Qc.x),A),b.l(q++,y,z),b.l(q++,y,B)):w!==A&&(y=90===this.K?Math.min(Math.max((B+z)/2,this.Ka[n.layer]+this.Qc.y),B):Math.max(Math.min((B+z)/2,this.Ka[n.layer]+this.Qc.y),B),b.l(q++,w,y),b.l(q++,A,y)))}null!==d&&r&&(null!==g&&(l===rc&&(l=b.i(0),d=b.i(2),l.A(d)||b.L(1,(l.x+d.x)/2,(l.y+d.y)/2)),l=b.getLinkPoint(e,g,rc,!0,!1,f,h),l.u()||l.set(e.actualBounds.center),b.L(0,l.x,l.y)), +z!==B&&(y=0===this.K?Math.min(Math.max((A+w)/2,this.Ka[n.layer]+this.Rc.x),A):Math.max(Math.min((A+w)/2,this.Ka[n.layer]+this.Rc.x),A),b.l(q++,y,z),b.l(q++,y,B)):w!==A&&(y=90===this.K?Math.min(Math.max((B+z)/2,this.Ka[n.layer]+this.Rc.y),B):Math.max(Math.min((B+z)/2,this.Ka[n.layer]+this.Rc.y),B),b.l(q++,w,y),b.l(q++,A,y)))}null!==d&&r&&(null!==g&&(l===rc&&(l=b.i(0),d=b.i(2),l.A(d)||b.L(1,(l.x+d.x)/2,(l.y+d.y)/2)),l=b.getLinkPoint(e,g,rc,!0,!1,f,h),l.u()||l.set(e.actualBounds.center),b.L(0,l.x,l.y)), null!==h&&(k===rc&&(k=b.i(b.pointsCount-1),l=b.i(b.pointsCount-3),k.A(l)||b.L(b.pointsCount-2,(k.x+l.x)/2,(k.y+l.y)/2)),e=b.getLinkPoint(f,h,rc,!1,!1,e,g),e.u()||e.set(f.actualBounds.center),b.L(b.pointsCount-1,e.x,e.y)));b.rf();c.commit()}}}this.avoidOrthogonalOverlaps()}; os.prototype.avoidOrthogonalOverlaps=function(){if(!(0>=this.linkSpacing)){for(var a=new E,b=this.network.edges.iterator;b.next();){var c=b.value.link;null!==c&&c.isOrthogonal&&!a.contains(c)&&a.add(c)}if(0f.y&&(m=l.y>f.y?0:g.xf.y&&(m=l.y>f.y?0:g.xf.x&&(m=l.x>f.x?0:g.yb.layer?1:a.cdb.cd?1:a.scb.sc?1:0:0};t.Ay=function(a,b){return a instanceof it&&b instanceof it&&a!==b?a.firstb.first||a.jb.j||a.cdb.cd?1:a.scb.sc?1:0:0}; -t.ct=function(a,b){return a instanceof it&&b instanceof it&&a!==b?a.Xbb.Xb||a.jb.j||a.cdb.cd?1:a.scb.sc?1:0:0};t.w=function(a,b){a-=b;return-1a}; +2;ef.x&&(m=l.x>f.x?0:g.yb.layer?1:a.ddb.dd?1:a.scb.sc?1:0:0};t.Ay=function(a,b){return a instanceof it&&b instanceof it&&a!==b?a.firstb.first||a.jb.j||a.ddb.dd?1:a.scb.sc?1:0:0}; +t.ct=function(a,b){return a instanceof it&&b instanceof it&&a!==b?a.Xbb.Xb||a.jb.j||a.ddb.dd?1:a.scb.sc?1:0:0};t.w=function(a,b){a-=b;return-1a}; t.Wi=function(a,b,c,d){var e=a.length,f=d-c;if(!(1>=f))if((0>c||c>=e-1)&&C("not in range 0 <= from < length: "+c),2===f)d=a[c],e=a[c+1],0=e)a.sort(b);else for(c=a.slice(0,d),c.sort(b),b=0;b=e)for(d=a.slice(c),d.sort(b),b=c;b=a.ve.length){var d=[];for(var e=0;ea&&(this.Wf=a,this.B())}},setsPortSpots:{get:function(){return this.df},set:function(a){this.df!==a&&(this.df=a,this.B())}}, linkSpacing:{get:function(){return this.vo},set:function(a){this.vo!==a&&0<=a&&(this.vo=a,this.B())}},maxLayer:{get:function(){return this.ra}},maxIndex:{get:function(){return this.ji}},maxColumn:{get:function(){return this.Ca}},minIndexLayer:{get:function(){return this.Qg}},maxIndexLayer:{get:function(){return this.pc}}}); var ps=new D(os,"CycleDepthFirst",0),Is=new D(os,"CycleGreedy",1),us=new D(os,"CycleFromLayers",2),qs=new D(os,"LayerOptimalLinkLength",0),Ns=new D(os,"LayerLongestPathSink",1),Ps=new D(os,"LayerLongestPathSource",2),rs=new D(os,"InitDepthFirstOut",0),Vs=new D(os,"InitDepthFirstIn",1),Ts=new D(os,"InitNaive",2),Zs=new D(os,"AggressiveNone",0),ss=new D(os,"AggressiveLess",1),$s=new D(os,"AggressiveMore",2),at=8;os.className="LayeredDigraphLayout";os.CycleDepthFirst=ps;os.CycleGreedy=Is; -os.CycleFromLayers=us;os.LayerOptimalLinkLength=qs;os.LayerLongestPathSink=Ns;os.LayerLongestPathSource=Ps;os.InitDepthFirstOut=rs;os.InitDepthFirstIn=Vs;os.InitNaive=Ts;os.AggressiveNone=Zs;os.AggressiveLess=ss;os.AggressiveMore=$s;os.PackNone=0;os.PackExpand=1;os.PackStraighten=2;os.PackMedian=4;os.PackAll=15;function it(){this.index=this.sc=this.cd=this.Xb=this.first=this.layer=0;this.link=null;this.j=0}it.className="SegInfo";function ts(a){Sp.call(this,a)}ma(ts,Sp);ts.prototype.createVertex=function(){return new jt(this)}; -ts.prototype.createEdge=function(){return new kt(this)};ts.className="LayeredDigraphNetwork";function jt(a){fq.call(this,a);this.Qa=this.wg=this.ei=-1;this.C=NaN;this.M=null;this.valid=!1;this.finish=this.jg=NaN;this.qf=0;this.uk=this.vk=null}ma(jt,fq); +os.CycleFromLayers=us;os.LayerOptimalLinkLength=qs;os.LayerLongestPathSink=Ns;os.LayerLongestPathSource=Ps;os.InitDepthFirstOut=rs;os.InitDepthFirstIn=Vs;os.InitNaive=Ts;os.AggressiveNone=Zs;os.AggressiveLess=ss;os.AggressiveMore=$s;os.PackNone=0;os.PackExpand=1;os.PackStraighten=2;os.PackMedian=4;os.PackAll=15;function it(){this.index=this.sc=this.dd=this.Xb=this.first=this.layer=0;this.link=null;this.j=0}it.className="SegInfo";function ts(a){Sp.call(this,a)}ma(ts,Sp);ts.prototype.createVertex=function(){return new jt(this)}; +ts.prototype.createEdge=function(){return new kt(this)};ts.className="LayeredDigraphNetwork";function jt(a){fq.call(this,a);this.Pa=this.wg=this.ei=-1;this.C=NaN;this.M=null;this.valid=!1;this.finish=this.jg=NaN;this.qf=0;this.uk=this.vk=null}ma(jt,fq); jt.prototype.serializeVertexProperties=function(a,b){fq.prototype.serializeVertexProperties.call(this,a,b);a.layer=this.layer;a.column=this.column;a.index=this.index;a.component=this.component;a.near=this.near?gb(this.near):null;a.valid=this.valid;a.jg=this.jg;a.finish=this.finish;a.qf=this.qf;a.vk=this.vk;a.uk=this.uk}; jt.prototype.deserializeVertexProperties=function(a,b,c,d){fq.prototype.deserializeVertexProperties.call(this,a,b,c,d);this.layer=a.layer;this.column=a.column;this.index=a.index;this.component=a.component;if(b=b.get(a.near))this.near=b;this.valid=a.valid;this.jg=a.jg;this.finish=a.finish;this.qf=a.qf;this.vk=a.vk;this.uk=a.uk}; -na.Object.defineProperties(jt.prototype,{layer:{get:function(){return this.ei},set:function(a){this.ei!==a&&(this.ei=a)}},column:{get:function(){return this.wg},set:function(a){this.wg!==a&&(this.wg=a)}},index:{get:function(){return this.Qa},set:function(a){this.Qa!==a&&(this.Qa=a)}},component:{get:function(){return this.C},set:function(a){this.C!==a&&(this.C=a)}},near:{ +na.Object.defineProperties(jt.prototype,{layer:{get:function(){return this.ei},set:function(a){this.ei!==a&&(this.ei=a)}},column:{get:function(){return this.wg},set:function(a){this.wg!==a&&(this.wg=a)}},index:{get:function(){return this.Pa},set:function(a){this.Pa!==a&&(this.Pa=a)}},component:{get:function(){return this.C},set:function(a){this.C!==a&&(this.C=a)}},near:{ get:function(){return this.M},set:function(a){this.M!==a&&(this.M=a)}}});jt.className="LayeredDigraphVertex";function kt(a){gq.call(this,a);this.j=this.Ha=this.Wa=!1;this.Ga=this.C=NaN;this.M=this.o=0}ma(kt,gq); kt.prototype.serializeEdgeProperties=function(a,b){gq.prototype.serializeEdgeProperties.call(this,a,b);a.valid=this.valid;a.rev=this.rev;a.forest=this.forest;a.portFromPos=this.portFromPos;a.portToPos=this.portToPos;a.portFromColOffset=this.portFromColOffset;a.portToColOffset=this.portToColOffset}; kt.prototype.deserializeEdgeProperties=function(a,b,c,d){gq.prototype.deserializeEdgeProperties.call(this,a,b,c,d);this.valid=a.valid;this.rev=a.rev;this.forest=a.forest;this.portFromPos=a.portFromPos;this.portToPos=a.portToPos;this.portFromColOffset=a.portFromColOffset;this.portToColOffset=a.portToColOffset}; -na.Object.defineProperties(kt.prototype,{fromVertex:{get:function(){return this.Tc},set:function(a){this.Tc!==a&&(this.Tc=a)}},toVertex:{get:function(){return this.ad},set:function(a){this.ad!==a&&(this.ad=a)}},valid:{get:function(){return this.Wa},set:function(a){this.Wa!==a&&(this.Wa=a)}},rev:{get:function(){return this.Ha},set:function(a){this.Ha!==a&&(this.Ha=a)}},forest:{ +na.Object.defineProperties(kt.prototype,{fromVertex:{get:function(){return this.Uc},set:function(a){this.Uc!==a&&(this.Uc=a)}},toVertex:{get:function(){return this.bd},set:function(a){this.bd!==a&&(this.bd=a)}},valid:{get:function(){return this.Wa},set:function(a){this.Wa!==a&&(this.Wa=a)}},rev:{get:function(){return this.Ha},set:function(a){this.Ha!==a&&(this.Ha=a)}},forest:{ get:function(){return this.j},set:function(a){this.j!==a&&(this.j=a)}},portFromPos:{get:function(){return this.C},set:function(a){this.C!==a&&(this.C=a)}},portToPos:{get:function(){return this.Ga},set:function(a){this.Ga!==a&&(this.Ga=a)}},portFromColOffset:{get:function(){return this.o},set:function(a){this.o!==a&&(this.o=a)}},portToColOffset:{get:function(){return this.M}, -set:function(a){this.M!==a&&(this.M=a)}}});kt.className="LayeredDigraphEdge";function lt(a){li.call(this);this.Jb=new G;this.Yo=mt;this.jd=nt;this.Qp=ot;this.Gr=pt;this.Aw=[];this.gd=!0;this.Gb=qt;this.Nd=(new M(10,10)).freeze();var b=new rt(this);this.V=new st(b);this.W=new st(b);this.Qu=[];a&&Object.assign(this,a)}ma(lt,li); -lt.prototype.cloneProtected=function(a){li.prototype.cloneProtected.call(this,a);a.Yo=this.Yo;a.Qp=this.Qp;a.Gr=this.Gr;a.gd=this.gd;a.Gb=this.Gb;a.Nd.assign(this.Nd);a.V.copyInheritedPropertiesFrom(this.V);a.W.copyInheritedPropertiesFrom(this.W)}; +set:function(a){this.M!==a&&(this.M=a)}}});kt.className="LayeredDigraphEdge";function lt(a){li.call(this);this.Jb=new G;this.Yo=mt;this.kd=nt;this.Qp=ot;this.Gr=pt;this.Aw=[];this.hd=!0;this.Gb=qt;this.Nd=(new M(10,10)).freeze();var b=new rt(this);this.V=new st(b);this.W=new st(b);this.Qu=[];a&&Object.assign(this,a)}ma(lt,li); +lt.prototype.cloneProtected=function(a){li.prototype.cloneProtected.call(this,a);a.Yo=this.Yo;a.Qp=this.Qp;a.Gr=this.Gr;a.hd=this.hd;a.Gb=this.Gb;a.Nd.assign(this.Nd);a.V.copyInheritedPropertiesFrom(this.V);a.W.copyInheritedPropertiesFrom(this.W)}; lt.prototype.gb=function(a){a.classType===lt?0===a.name.indexOf("Alignment")?this.alignment=a:0===a.name.indexOf("Arrangement")?this.arrangement=a:0===a.name.indexOf("Compaction")?this.compaction=a:0===a.name.indexOf("Path")?this.path=a:0===a.name.indexOf("Sorting")?this.sorting=a:0===a.name.indexOf("Style")?this.treeStyle=a:C("Unknown enum value: "+a):li.prototype.gb.call(this,a)};lt.prototype.createNetwork=function(){return new rt(this)}; lt.prototype.makeNetwork=function(a){function b(a){if(a instanceof W)return!a.isLinkLabel&&"Comment"!==a.category;if(a instanceof U){var b=a.fromNode;if(null===b||b.isLinkLabel||"Comment"===b.category)return!1;a=a.toNode;return null===a||a.isLinkLabel||"Comment"===a.category?!1:!0}return!1}var c=this.createNetwork();a instanceof T?(c.hg(a.nodes,!0,b),c.hg(a.links,!0,b)):a instanceof hf?c.hg(a.memberParts,!1,b):c.hg(a.iterator,!1,b);return c}; -lt.prototype.doLayout=function(a){null===this.network&&(this.network=this.makeNetwork(a));this.arrangement!==tt&&(this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin));var b=this.diagram;null===b&&a instanceof T&&(b=a);this.path===mt&&null!==b?this.jd=b.isTreePathToChildren?nt:ut:this.jd=this.path===mt?nt:this.path;if(0b.level)return!1;a.removeChild(c.parent,c)}return!0}lt.prototype.removeChild=function(a,b){if(null!==a&&null!==b){for(var c=a.children,d=0,e=0;ee?du(a,g,ba,w,z):eu(a,g,ba,w,z);ba=z.x;w=z.width;z=z.height;break;case Pt:for(A=0;An&&(Sdb&&(ju(a,-db,0,da,ra-1),ku(A,-db,0),ku(B,-db,0),db=0)}Ca.U.h(db,R);w=Math.max(w,F);z=Math.max(z,y+(0===O?0:q)+cb.height);S=F}else{0n&&(Rdb&&(ju(a,0,-db,da,ra-1),ku(A,0,-db),ku(B,0,-db),db=0);Ca.U.h(S,db);z=Math.max(z,K);w=Math.max(w,y+(0===O?0:q)+cb.width);R=K}H++}0n&&(Seb&&(ju(a,-eb,0,da,ra-1),ku(A,-eb,0),ku(B,-eb,0),eb=0)}Ca.U.h(eb,R);w=Math.max(w,F);z=Math.max(z,y+(0===O?0:q)+db.height);S=F}else{0n&&(Reb&&(ju(a,0,-eb,da,ra-1),ku(A,0,-eb),ku(B,0,-eb),eb=0);Ca.U.h(S,eb);z=Math.max(z,K);w=Math.max(w,y+(0===O?0:q)+db.width);R=K}H++}0l&&(l=0),135u&&(u=0),k===Qt&&(h+=p/2+a.focus.y),g+=d+c):b?(null===a.comments?d>w&&(w=pu(k,d-w,0),g=w.x,h=w.y,w=d,l=0):w=nu(a,w,l),0>l&&(g-=l,l=0),135z&&(z=pu(k,0,v-z),g=z.x,h=z.y,z=v,u=0):z=ou(a,z,u),0>u&&(h-=u,u=0),g+=d+c);if(0b&&(b=c+a.width),0>c&&(b-=c),b;case cu:return a.width>b?a.width:b;case $t:return 2*a.focus.x>b?a.width:b+a.width-2*a.focus.x;case Ot:case Et:return Math.max(a.width,Math.max(b,c+a.width)-Math.min(0,c));case Pt:return a.width-a.focus.x+a.nodeSpacing/2+b;case Qt:return Math.max(a.width,a.focus.x+a.nodeSpacing/2+b);default:return b}} function ou(a,b,c){switch(a.alignment){case mu:case lu:return c+a.height>b&&(b=c+a.height),0>c&&(b-=c),b;case cu:return a.height>b?a.height:b;case $t:return 2*a.focus.y>b?a.height:b+a.height-2*a.focus.y;case Ot:case Et:return Math.max(a.height,Math.max(b,c+a.height)-Math.min(0,c));case Pt:return a.height-a.focus.y+a.nodeSpacing/2+b;case Qt:return Math.max(a.height,a.focus.y+a.nodeSpacing/2+b);default:return b}} function pu(a,b,c){switch(a){case lu:b/=2;c/=2;break;case mu:b/=2;c/=2;break;case cu:c=b=0;break;case $t:break;default:C("Unhandled alignment value "+a.toString())}return new J(b,c)}function gu(a,b,c,d,e,f){b=pu(b,c,d);ju(a,b.x,b.y,e,f)}function ju(a,b,c,d,e){if(0!==b||0!==c)for(a=a.children;d<=e;d++){var f=a[d].U;f.x+=b;f.y+=c}} -function hu(a,b,c,d){var e=b.parent;switch(a.jd){case nt:for(a=b.sourceEdges;a.next();)b=a.value,b.fromVertex===e&&b.relativePoint.h(c,d);break;case ut:for(a=b.destinationEdges;a.next();)b=a.value,b.toVertex===e&&b.relativePoint.h(c,d);break;default:C("Unhandled path value "+a.jd.toString())}}function ku(a,b,c){for(var d=0;dn.length||null===r||2>r.length))for(e=c=0;cl&&f.yf.y&&lb.length||null===c||2>c.length)d=null;else{m=fu(a,b.length+c.length);for(d=f=k=0;fk;)l=c[f++],m[d++].h(l.x+e,l.y);c=fu(a,d);for(k=0;kn.length||null===f||2>f.length)e=null;else{m=fu(a,n.length+f.length);for(e=l=c=0;cf;)k=n[c++],m[e++].h(k.x,k.y);f=fu(a,e);for(c=0;c=a?0:135>=a?90:225>=a?180:315>=a?270:0}function au(a){var b=Zt(a);b=90===b||270===b;var c=a.layerSpacing;if(0=a&&(this.V.nodeIndentPastParent=a,this.B())}},nodeSpacing:{get:function(){return this.V.nodeSpacing},set:function(a){this.V.nodeSpacing!==a&&(this.V.nodeSpacing=a,this.B())}},layerSpacing:{get:function(){return this.V.layerSpacing},set:function(a){this.V.layerSpacing!== @@ -2176,17 +2176,17 @@ var mt=new D(lt,"PathDefault",-1),nt=new D(lt,"PathDestination",0),ut=new D(lt," "AlignmentBottomRightBus",27),Tt=new D(lt,"CompactionNone",30),Vt=new D(lt,"CompactionBlock",31),ot=new D(lt,"StyleLayered",40),It=new D(lt,"StyleLastParents",41),Ht=new D(lt,"StyleAlternating",42),Gt=new D(lt,"StyleRootOnly",43),qt=new D(lt,"ArrangementVertical",50),uu=new D(lt,"ArrangementHorizontal",51),tt=new D(lt,"ArrangementFixedRoots",52),pt=new D(lt,"LayerIndividual",60),Ct=new D(lt,"LayerSiblings",61),Bt=new D(lt,"LayerUniform",62);lt.className="TreeLayout";lt.PathDefault=mt; lt.PathDestination=nt;lt.PathSource=ut;lt.SortingForwards=Jt;lt.SortingReverse=Kt;lt.SortingAscending=Lt;lt.SortingDescending=Mt;lt.AlignmentCenterSubtrees=lu;lt.AlignmentCenterChildren=mu;lt.AlignmentStart=cu;lt.AlignmentEnd=$t;lt.AlignmentBus=Ot;lt.AlignmentBusBranching=Et;lt.AlignmentTopLeftBus=Pt;lt.AlignmentBottomRightBus=Qt;lt.CompactionNone=Tt;lt.CompactionBlock=Vt;lt.StyleLayered=ot;lt.StyleLastParents=It;lt.StyleAlternating=Ht;lt.StyleRootOnly=Gt;lt.ArrangementVertical=qt; lt.ArrangementHorizontal=uu;lt.ArrangementFixedRoots=tt;lt.LayerIndividual=pt;lt.LayerSiblings=Ct;lt.LayerUniform=Bt;function rt(a){Sp.call(this,a)}ma(rt,Sp);rt.prototype.createVertex=function(){return new st(this)};rt.prototype.createEdge=function(){return new wu(this)};rt.className="TreeNetwork"; -function st(a){fq.call(this,a);this.Ga=!1;this.yc=null;this.C=[];this.Oc=this.Wa=this.M=this.Ha=0;this.gd=null;this.U=new J(0,0);this.va=new M(0,0);this.fa=new J(0,0);this.Cm=this.Bm=this.TA=!1;this.Eq=this.sq=null;this.Yc=Jt;this.Rc=mq;this.xb=0;this.wb=mu;this.Pr=this.Or=0;this.Qr=20;this.Zd=50;this.Fr=0;this.Yq=Vt;this.Rq=0;this.Zr=25;this.Xq=this.Yr=10;this.Wq=20;this.ds=!0;this.Vr=Vc;this.cs=!0;this.Uq=Vc}ma(st,fq); -st.prototype.copyInheritedPropertiesFrom=function(a){null!==a&&(this.Yc=a.sorting,this.Rc=a.comparer,this.xb=a.angle,this.wb=a.alignment,this.Or=a.nodeIndent,this.Pr=a.nodeIndentPastParent,this.Qr=a.nodeSpacing,this.Zd=a.layerSpacing,this.Fr=a.layerSpacingParentOverlap,this.Yq=a.compaction,this.Rq=a.breadthLimit,this.Zr=a.rowSpacing,this.Yr=a.rowIndent,this.Xq=a.commentSpacing,this.Wq=a.commentMargin,this.ds=a.setsPortSpot,this.Vr=a.portSpot,this.cs=a.setsChildPortSpot,this.Uq=a.childPortSpot)}; +function st(a){fq.call(this,a);this.Ga=!1;this.yc=null;this.C=[];this.Pc=this.Wa=this.M=this.Ha=0;this.hd=null;this.U=new J(0,0);this.va=new M(0,0);this.fa=new J(0,0);this.Cm=this.Bm=this.TA=!1;this.Eq=this.sq=null;this.Zc=Jt;this.Sc=mq;this.xb=0;this.wb=mu;this.Pr=this.Or=0;this.Qr=20;this.Zd=50;this.Fr=0;this.Yq=Vt;this.Rq=0;this.Zr=25;this.Xq=this.Yr=10;this.Wq=20;this.ds=!0;this.Vr=Vc;this.cs=!0;this.Uq=Vc}ma(st,fq); +st.prototype.copyInheritedPropertiesFrom=function(a){null!==a&&(this.Zc=a.sorting,this.Sc=a.comparer,this.xb=a.angle,this.wb=a.alignment,this.Or=a.nodeIndent,this.Pr=a.nodeIndentPastParent,this.Qr=a.nodeSpacing,this.Zd=a.layerSpacing,this.Fr=a.layerSpacingParentOverlap,this.Yq=a.compaction,this.Rq=a.breadthLimit,this.Zr=a.rowSpacing,this.Yr=a.rowIndent,this.Xq=a.commentSpacing,this.Wq=a.commentMargin,this.ds=a.setsPortSpot,this.Vr=a.portSpot,this.cs=a.setsChildPortSpot,this.Uq=a.childPortSpot)}; na.Object.defineProperties(st.prototype,{initialized:{get:function(){return this.Ga},set:function(a){this.Ga!==a&&(this.Ga=a)}},parent:{get:function(){return this.yc},set:function(a){this.yc!==a&&(this.yc=a)}},children:{get:function(){return this.C},set:function(a){if(this.C!==a){if(null!==a)for(var b=a.length,c=0;cp.y+c.rowIndent&&(e=Math.min(e,Math.max(m.y,e-bu(c))))):c.alignment===cu?(e=d.top+b.y,0===b.y&&m.yp.x+c.rowIndent&&(e=Math.min(e,Math.max(m.x,e-bu(c))))):c.alignment===cu?(e=d.left+b.x,0===b.x&&m.xp.y+c.rowIndent&&(e=Math.min(e,Math.max(m.y,e-bu(c))))):c.alignment===cu?(e=d.top+b.y,0===b.y&&m.yGoJS { angle: 90, setsPortSpot: false, - setsChildPortSpot: false + setsChildPortSpot: false, + arrangement: go.TreeLayout.ArrangementHorizontal }), "undoManager.isEnabled": true, // When a Node is deleted by the user, also delete all of its Comment Nodes. @@ -102,7 +103,7 @@

      GoJS

      new go.Binding("fill", "color")), $("TextBlock", { margin: 6 }, - new go.Binding("text", "key")) + new go.Binding("text")) ); myDiagram.linkTemplate = @@ -129,25 +130,24 @@

      GoJS

      { stroke: "brown", strokeWidth: 1, fill: "lightyellow" }) )); - myDiagram.model = - new go.GraphLinksModel( + myDiagram.model = new go.GraphLinksModel( { nodeDataArray: [ - { key: "Alpha", color: "orange" }, - { key: "Beta", color: "lightgreen" }, - { key: "Gamma", color: "lightgreen" }, - { key: "Delta", color: "pink" }, - { key: "A comment", text: "comment\nabout Alpha", category: "Comment" }, - { key: "B comment", text: "comment\nabout Beta", category: "Comment" }, - { key: "G comment", text: "comment about Gamma", category: "Comment" } + { key: 1, text: "Alpha", color: "orange" }, + { key: 2, text: "Beta", color: "lightgreen" }, + { key: 3, text: "Gamma", color: "lightgreen" }, + { key: 4, text: "Delta", color: "pink" }, + { key: -1, text: "comment\nabout Alpha", category: "Comment" }, + { key: -2, text: "comment\nabout Beta", category: "Comment" }, + { key: -3, text: "comment\nabout Gamma", category: "Comment" } ], linkDataArray: [ - { from: "Alpha", to: "Beta" }, - { from: "Alpha", to: "Gamma" }, - { from: "Alpha", to: "Delta" }, - { from: "A comment", to: "Alpha", category: "Comment" }, - { from: "B comment", to: "Beta", category: "Comment" }, - { from: "G comment", to: "Gamma", category: "Comment" } + { from: 1, to: 2 }, + { from: 1, to: 3 }, + { from: 1, to: 4 }, + { from: -1, to: 1, category: "Comment" }, + { from: -2, to: 2, category: "Comment" }, + { from: -3, to: 3, category: "Comment" } ] }); diff --git a/samples/shopFloorMonitor.html b/samples/shopFloorMonitor.html index 0496ec47d..7056015e1 100644 --- a/samples/shopFloorMonitor.html +++ b/samples/shopFloorMonitor.html @@ -50,7 +50,6 @@

      GoJS

      -