1. Anchor routing added with mutiport
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 262 KiB After Width: | Height: | Size: 538 KiB |
@@ -13,14 +13,31 @@ type: project
|
||||
version: "1.0.0"
|
||||
|
||||
# 1. External Ports (How this cell connects to the outside world)
|
||||
ports: []
|
||||
ports:
|
||||
- name: port
|
||||
layer: WG_CORE
|
||||
x: 50.0
|
||||
y: -150.0
|
||||
angle: 0.0
|
||||
width: 0.5
|
||||
|
||||
# 2. Instances (The sub-components dropped onto this canvas)
|
||||
instances:
|
||||
EC_1:
|
||||
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/edge_couplers/EC_SiN400_1310_1p0dB_L635_A0_QY_202604
|
||||
x: 0.0
|
||||
y: -2660.0
|
||||
rotation: 180.0
|
||||
flip: 0
|
||||
flop: 0
|
||||
mirror: false
|
||||
settings:
|
||||
length:
|
||||
|
||||
MMI_1:
|
||||
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2
|
||||
x: 476.0
|
||||
y: -2453.2
|
||||
x: 936.8
|
||||
y: -2358.5
|
||||
rotation: 0.0
|
||||
flip: 0
|
||||
flop: 0
|
||||
@@ -30,8 +47,8 @@ instances:
|
||||
|
||||
MMI_2:
|
||||
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2
|
||||
x: 723.1
|
||||
y: -2241.8
|
||||
x: 1089.2
|
||||
y: -2247.3
|
||||
rotation: 0.0
|
||||
flip: 0
|
||||
flop: 0
|
||||
@@ -41,8 +58,8 @@ instances:
|
||||
|
||||
MMI_3:
|
||||
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2
|
||||
x: 438.9
|
||||
y: -2230.2
|
||||
x: 1096.8
|
||||
y: -2598.0
|
||||
rotation: 0.0
|
||||
flip: 0
|
||||
flop: 0
|
||||
@@ -52,8 +69,63 @@ instances:
|
||||
|
||||
MMI_4:
|
||||
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2
|
||||
x: 750.9
|
||||
y: -2468.7
|
||||
x: 735.0
|
||||
y: -2541.1
|
||||
rotation: 90.0
|
||||
flip: 0
|
||||
flop: 0
|
||||
mirror: false
|
||||
settings:
|
||||
length:
|
||||
|
||||
MMI_5:
|
||||
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2
|
||||
x: 1086.5
|
||||
y: -2097.1
|
||||
rotation: 0.0
|
||||
flip: 0
|
||||
flop: 0
|
||||
mirror: false
|
||||
settings:
|
||||
length:
|
||||
|
||||
EC_2:
|
||||
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/edge_couplers/EC_SiN400_1310_1p0dB_L635_A0_QY_202604
|
||||
x: 0.0
|
||||
y: -2825.7
|
||||
rotation: 180.0
|
||||
flip: 0
|
||||
flop: 0
|
||||
mirror: false
|
||||
settings:
|
||||
length:
|
||||
|
||||
MMI_6:
|
||||
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2
|
||||
x: 913.7
|
||||
y: -2537.3
|
||||
rotation: 90.0
|
||||
flip: 0
|
||||
flop: 0
|
||||
mirror: false
|
||||
settings:
|
||||
length:
|
||||
|
||||
MMI_7:
|
||||
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2
|
||||
x: 1027.2
|
||||
y: -2736.7
|
||||
rotation: 0.0
|
||||
flip: 0
|
||||
flop: 0
|
||||
mirror: false
|
||||
settings:
|
||||
length:
|
||||
|
||||
MMI_8:
|
||||
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2
|
||||
x: 842.6
|
||||
y: -2941.6
|
||||
rotation: 0.0
|
||||
flip: 0
|
||||
flop: 0
|
||||
@@ -62,11 +134,23 @@ instances:
|
||||
length:
|
||||
|
||||
elements:
|
||||
port:
|
||||
type: port
|
||||
x: 50.0
|
||||
y: -150.0
|
||||
angle: 0.0
|
||||
port_number: 1
|
||||
pitch: 10
|
||||
layer: WG_CORE
|
||||
width: 0.5
|
||||
description: ""
|
||||
anchor_1:
|
||||
type: anchor
|
||||
x: 421.9
|
||||
y: -2624.7
|
||||
x: 732.7
|
||||
y: -2824.7
|
||||
angle: 0.0
|
||||
port_number: 5
|
||||
pitch: 10
|
||||
layer: WG_CORE
|
||||
width: 0.5
|
||||
description: ""
|
||||
@@ -76,24 +160,66 @@ bundles:
|
||||
output_bus:
|
||||
routing_type: euler_bend
|
||||
links:
|
||||
- from: MMI_2:a1
|
||||
to: MMI_1:b1
|
||||
- from: MMI_1:b1
|
||||
to: MMI_2:a1
|
||||
xsection: strip
|
||||
family: optical
|
||||
width: 0.45
|
||||
radius: 10
|
||||
routing_type: euler_bend
|
||||
- from: anchor_1:right
|
||||
to: MMI_4:a1
|
||||
xsection: strip
|
||||
family: optical
|
||||
width: 0.45
|
||||
radius: 10
|
||||
routing_type: euler_bend
|
||||
- from: anchor_1:left
|
||||
- from: MMI_1:b2
|
||||
to: MMI_3:a1
|
||||
xsection: strip
|
||||
family: optical
|
||||
width: 0.45
|
||||
radius: 10
|
||||
routing_type: euler_bend
|
||||
- from: EC_1:a1
|
||||
to: anchor_1:a1
|
||||
xsection: strip
|
||||
family: optical
|
||||
width: 0.45
|
||||
radius: 10
|
||||
routing_type: euler_bend
|
||||
- from: anchor_1:b1
|
||||
to: MMI_4:a1
|
||||
xsection: strip
|
||||
family: optical
|
||||
width: 0.45
|
||||
radius: 10
|
||||
routing_type: euler_bend
|
||||
- from: MMI_4:b2
|
||||
to: MMI_1:a1
|
||||
xsection: strip
|
||||
family: optical
|
||||
width: 0.45
|
||||
radius: 10
|
||||
routing_type: euler_bend
|
||||
- from: MMI_5:a1
|
||||
to: MMI_4:b1
|
||||
xsection: strip
|
||||
family: optical
|
||||
width: 0.45
|
||||
radius: 10
|
||||
routing_type: euler_bend
|
||||
- from: EC_2:a1
|
||||
to: anchor_1:a2
|
||||
xsection: strip
|
||||
family: optical
|
||||
width: 0.45
|
||||
radius: 10
|
||||
routing_type: euler_bend
|
||||
- from: anchor_1:b2
|
||||
to: MMI_6:a1
|
||||
xsection: strip
|
||||
family: optical
|
||||
width: 0.45
|
||||
radius: 10
|
||||
routing_type: euler_bend
|
||||
- from: MMI_8:b1
|
||||
to: MMI_7:a1
|
||||
xsection: strip
|
||||
family: optical
|
||||
width: 0.45
|
||||
radius: 10
|
||||
routing_type: euler_bend
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"name": "mxpic_project_1",
|
||||
"technology": "Silterra/EMO1_2ML_CU_Al_RDL"
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="3218.6" height="2963.6" viewBox="14680.2 22644.7 3218.6 2963.6">
|
||||
<defs>
|
||||
<style type="text/css">
|
||||
.l275d0 {stroke: #654522; fill: #654522; fill-opacity: 0.5;}
|
||||
.l1200d0 {stroke: #F38400; fill: #F38400; fill-opacity: 0.5;}
|
||||
.l101d251 {stroke: #848482; fill: #848482; fill-opacity: 0.5;}
|
||||
.l1205d0 {stroke: #008856; fill: #008856; fill-opacity: 0.5;}
|
||||
.l1001t0 {stroke: none; fill: #A1CAF1;}
|
||||
</style>
|
||||
<g id="1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2">
|
||||
<polygon id="000002B6365DCE60" class="l1200d0" points="-285,-147 585,-147 585,147 -285,147"/>
|
||||
<polygon id="000002B6365DCB50" class="l1205d0" points="-281.5,3.5 -288.5,3.5 -288.5,-3.5 -281.5,-3.5"/>
|
||||
<polygon id="000002B6365DD020" class="l1205d0" points="581.5,40 588.5,40 588.5,47 581.5,47"/>
|
||||
<polygon id="000002B6365DCCA0" class="l1205d0" points="581.5,-47 588.5,-47 588.5,-40 581.5,-40"/>
|
||||
<text id="000002B605621870" class="l1001t0" text-anchor="start" dominant-baseline="text-before-edge" transform="translate(-285 0) scale(1 -1)">a1</text>
|
||||
<text id="000002B605621240" class="l1001t0" text-anchor="start" dominant-baseline="text-before-edge" transform="translate(585 43.5) scale(1 -1)">b1</text>
|
||||
<text id="000002B605622830" class="l1001t0" text-anchor="start" dominant-baseline="text-before-edge" transform="translate(585 -43.5) scale(1 -1)">b2</text>
|
||||
<text id="000002B605621D80" class="l1001t0" text-anchor="start" dominant-baseline="text-before-edge" transform="translate(0 0) scale(1 -1)">a0</text>
|
||||
<text id="000002B605621750" class="l1001t0" text-anchor="start" dominant-baseline="text-before-edge" transform="translate(0 0) scale(1 -1)">b0</text>
|
||||
</g>
|
||||
<g id="1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2_405">
|
||||
<polygon id="000002B63618CA50" class="l1200d0" points="-285,-147 585,-147 585,147 -285,147"/>
|
||||
<polygon id="000002B605652430" class="l1205d0" points="-281.5,3.5 -288.5,3.5 -288.5,-3.5 -281.5,-3.5"/>
|
||||
<polygon id="000002B605651940" class="l1205d0" points="581.5,40 588.5,40 588.5,47 581.5,47"/>
|
||||
<polygon id="000002B605651BE0" class="l1205d0" points="581.5,-47 588.5,-47 588.5,-40 581.5,-40"/>
|
||||
<text id="000002B605620E50" class="l1001t0" text-anchor="start" dominant-baseline="text-before-edge" transform="translate(-285 0) scale(1 -1)">a1</text>
|
||||
<text id="000002B6056216C0" class="l1001t0" text-anchor="start" dominant-baseline="text-before-edge" transform="translate(585 43.5) scale(1 -1)">b1</text>
|
||||
<text id="000002B605622680" class="l1001t0" text-anchor="start" dominant-baseline="text-before-edge" transform="translate(585 -43.5) scale(1 -1)">b2</text>
|
||||
<text id="000002B605622B00" class="l1001t0" text-anchor="start" dominant-baseline="text-before-edge" transform="translate(0 0) scale(1 -1)">a0</text>
|
||||
<text id="000002B605621E10" class="l1001t0" text-anchor="start" dominant-baseline="text-before-edge" transform="translate(0 0) scale(1 -1)">b0</text>
|
||||
</g>
|
||||
</defs>
|
||||
<rect x="14680.2" y="22644.7" width="3218.6" height="2963.6" fill="#222222" stroke="none"/>
|
||||
<g id="mxpic_project_1" transform="scale(1 -1)">
|
||||
<polygon id="000002B6365DC8B0" class="l275d0" points="16679,-25360.75 15700,-25360.75 15700,-25356.25 16679,-25356.25"/>
|
||||
<polygon id="000002B6365DC610" class="l275d0" points="16679,-25360.75 15700,-25360.75 15700,-25356.25 16679,-25356.25"/>
|
||||
<polygon id="000002B6365DC290" class="l275d0" points="16679,-25360.75 15700,-25360.75 15700,-25356.25 16679,-25356.25"/>
|
||||
<polygon id="000002B6365DC370" class="l275d0" points="16679,-25360.75 15700,-25360.75 15700,-25356.25 16679,-25356.25"/>
|
||||
<polygon id="000002B6365DC300" class="l275d0" points="16679,-25360.75 15700,-25360.75 15700,-25356.25 16679,-25356.25"/>
|
||||
<polygon id="000002B6365DCAE0" class="l275d0" points="16679,-25360.75 15700,-25360.75 15700,-25356.25 16679,-25356.25"/>
|
||||
<polygon id="000002B6365DC680" class="l101d251" points="16719,-25400.75 15660,-25400.75 15660,-25316.25 16719,-25316.25"/>
|
||||
<polygon id="000002B6365DCF40" class="l101d251" points="16719,-25400.75 15660,-25400.75 15660,-25316.25 16719,-25316.25"/>
|
||||
<polygon id="000002B6365DC6F0" class="l101d251" points="16719,-25400.75 15660,-25400.75 15660,-25316.25 16719,-25316.25"/>
|
||||
<polygon id="000002B6365DCFB0" class="l101d251" points="16719,-25400.75 15660,-25400.75 15660,-25316.25 16719,-25316.25"/>
|
||||
<polygon id="000002B6365DC760" class="l101d251" points="16719,-25400.75 15660,-25400.75 15660,-25316.25 16719,-25316.25"/>
|
||||
<polygon id="000002B6365DC140" class="l101d251" points="16719,-25400.75 15660,-25400.75 15660,-25316.25 16719,-25316.25"/>
|
||||
<polygon id="000002B6365DC1B0" class="l275d0" points="16776.75,-25258.5 16781.25,-25258.5 16781.24,-25259.91 16781.17,-25262.73 16781.01,-25265.54 16780.78,-25268.35 16780.47,-25271.15 16780.08,-25273.94 16779.62,-25276.72 16779.08,-25279.48 16778.46,-25282.23 16777.77,-25284.97 16777,-25287.68 16776.16,-25290.37 16775.25,-25293.03 16774.26,-25295.67 16773.2,-25298.28 16772.07,-25300.86 16770.86,-25303.41 16769.59,-25305.92 16768.25,-25308.4 16766.84,-25310.84 16765.37,-25313.24 16763.82,-25315.6 16762.22,-25317.92 16760.55,-25320.19 16758.82,-25322.41 16757.03,-25324.59 16755.18,-25326.71 16753.27,-25328.78 16751.3,-25330.8 16749.28,-25332.77 16747.21,-25334.68 16745.09,-25336.53 16742.91,-25338.32 16740.69,-25340.05 16738.42,-25341.72 16736.1,-25343.32 16733.74,-25344.87 16731.34,-25346.34 16728.9,-25347.75 16726.42,-25349.09 16723.91,-25350.36 16721.36,-25351.57 16718.78,-25352.7 16716.17,-25353.76 16713.53,-25354.75 16710.87,-25355.66 16708.18,-25356.5 16705.47,-25357.27 16702.73,-25357.96 16699.98,-25358.58 16697.22,-25359.12 16694.44,-25359.58 16691.65,-25359.97 16688.85,-25360.28 16686.04,-25360.51 16683.23,-25360.67 16680.41,-25360.74 16679,-25360.75 16679,-25356.25 16680.35,-25356.24 16683.04,-25356.17 16685.73,-25356.02 16688.41,-25355.8 16691.09,-25355.5 16693.76,-25355.13 16696.42,-25354.69 16699.06,-25354.17 16701.69,-25353.58 16704.3,-25352.92 16706.89,-25352.19 16709.46,-25351.39 16712.01,-25350.51 16714.53,-25349.57 16717.03,-25348.55 16719.5,-25347.47 16721.93,-25346.32 16724.34,-25345.1 16726.71,-25343.82 16729.04,-25342.48 16731.33,-25341.06 16733.59,-25339.59 16735.8,-25338.06 16737.97,-25336.46 16740.1,-25334.81 16742.18,-25333.09 16744.21,-25331.32 16746.19,-25329.5 16748.12,-25327.62 16750,-25325.69 16751.82,-25323.71 16753.59,-25321.68 16755.31,-25319.6 16756.96,-25317.47 16758.56,-25315.3 16760.09,-25313.09 16761.56,-25310.83 16762.98,-25308.54 16764.32,-25306.21 16765.6,-25303.84 16766.82,-25301.43 16767.97,-25299 16769.05,-25296.53 16770.07,-25294.03 16771.01,-25291.51 16771.89,-25288.96 16772.69,-25286.39 16773.42,-25283.8 16774.08,-25281.19 16774.67,-25278.56 16775.19,-25275.92 16775.63,-25273.26 16776,-25270.59 16776.3,-25267.91 16776.52,-25265.23 16776.67,-25262.54 16776.74,-25259.85"/>
|
||||
<polygon id="000002B6365DC3E0" class="l275d0" points="16776.75,-25258.5 16781.25,-25258.5 16781.24,-25259.91 16781.17,-25262.73 16781.01,-25265.54 16780.78,-25268.35 16780.47,-25271.15 16780.08,-25273.94 16779.62,-25276.72 16779.08,-25279.48 16778.46,-25282.23 16777.77,-25284.97 16777,-25287.68 16776.16,-25290.37 16775.25,-25293.03 16774.26,-25295.67 16773.2,-25298.28 16772.07,-25300.86 16770.86,-25303.41 16769.59,-25305.92 16768.25,-25308.4 16766.84,-25310.84 16765.37,-25313.24 16763.82,-25315.6 16762.22,-25317.92 16760.55,-25320.19 16758.82,-25322.41 16757.03,-25324.59 16755.18,-25326.71 16753.27,-25328.78 16751.3,-25330.8 16749.28,-25332.77 16747.21,-25334.68 16745.09,-25336.53 16742.91,-25338.32 16740.69,-25340.05 16738.42,-25341.72 16736.1,-25343.32 16733.74,-25344.87 16731.34,-25346.34 16728.9,-25347.75 16726.42,-25349.09 16723.91,-25350.36 16721.36,-25351.57 16718.78,-25352.7 16716.17,-25353.76 16713.53,-25354.75 16710.87,-25355.66 16708.18,-25356.5 16705.47,-25357.27 16702.73,-25357.96 16699.98,-25358.58 16697.22,-25359.12 16694.44,-25359.58 16691.65,-25359.97 16688.85,-25360.28 16686.04,-25360.51 16683.23,-25360.67 16680.41,-25360.74 16679,-25360.75 16679,-25356.25 16680.35,-25356.24 16683.04,-25356.17 16685.73,-25356.02 16688.41,-25355.8 16691.09,-25355.5 16693.76,-25355.13 16696.42,-25354.69 16699.06,-25354.17 16701.69,-25353.58 16704.3,-25352.92 16706.89,-25352.19 16709.46,-25351.39 16712.01,-25350.51 16714.53,-25349.57 16717.03,-25348.55 16719.5,-25347.47 16721.93,-25346.32 16724.34,-25345.1 16726.71,-25343.82 16729.04,-25342.48 16731.33,-25341.06 16733.59,-25339.59 16735.8,-25338.06 16737.97,-25336.46 16740.1,-25334.81 16742.18,-25333.09 16744.21,-25331.32 16746.19,-25329.5 16748.12,-25327.62 16750,-25325.69 16751.82,-25323.71 16753.59,-25321.68 16755.31,-25319.6 16756.96,-25317.47 16758.56,-25315.3 16760.09,-25313.09 16761.56,-25310.83 16762.98,-25308.54 16764.32,-25306.21 16765.6,-25303.84 16766.82,-25301.43 16767.97,-25299 16769.05,-25296.53 16770.07,-25294.03 16771.01,-25291.51 16771.89,-25288.96 16772.69,-25286.39 16773.42,-25283.8 16774.08,-25281.19 16774.67,-25278.56 16775.19,-25275.92 16775.63,-25273.26 16776,-25270.59 16776.3,-25267.91 16776.52,-25265.23 16776.67,-25262.54 16776.74,-25259.85"/>
|
||||
<polygon id="000002B6365DC450" class="l275d0" points="16776.75,-25258.5 16781.25,-25258.5 16781.24,-25259.91 16781.17,-25262.73 16781.01,-25265.54 16780.78,-25268.35 16780.47,-25271.15 16780.08,-25273.94 16779.62,-25276.72 16779.08,-25279.48 16778.46,-25282.23 16777.77,-25284.97 16777,-25287.68 16776.16,-25290.37 16775.25,-25293.03 16774.26,-25295.67 16773.2,-25298.28 16772.07,-25300.86 16770.86,-25303.41 16769.59,-25305.92 16768.25,-25308.4 16766.84,-25310.84 16765.37,-25313.24 16763.82,-25315.6 16762.22,-25317.92 16760.55,-25320.19 16758.82,-25322.41 16757.03,-25324.59 16755.18,-25326.71 16753.27,-25328.78 16751.3,-25330.8 16749.28,-25332.77 16747.21,-25334.68 16745.09,-25336.53 16742.91,-25338.32 16740.69,-25340.05 16738.42,-25341.72 16736.1,-25343.32 16733.74,-25344.87 16731.34,-25346.34 16728.9,-25347.75 16726.42,-25349.09 16723.91,-25350.36 16721.36,-25351.57 16718.78,-25352.7 16716.17,-25353.76 16713.53,-25354.75 16710.87,-25355.66 16708.18,-25356.5 16705.47,-25357.27 16702.73,-25357.96 16699.98,-25358.58 16697.22,-25359.12 16694.44,-25359.58 16691.65,-25359.97 16688.85,-25360.28 16686.04,-25360.51 16683.23,-25360.67 16680.41,-25360.74 16679,-25360.75 16679,-25356.25 16680.35,-25356.24 16683.04,-25356.17 16685.73,-25356.02 16688.41,-25355.8 16691.09,-25355.5 16693.76,-25355.13 16696.42,-25354.69 16699.06,-25354.17 16701.69,-25353.58 16704.3,-25352.92 16706.89,-25352.19 16709.46,-25351.39 16712.01,-25350.51 16714.53,-25349.57 16717.03,-25348.55 16719.5,-25347.47 16721.93,-25346.32 16724.34,-25345.1 16726.71,-25343.82 16729.04,-25342.48 16731.33,-25341.06 16733.59,-25339.59 16735.8,-25338.06 16737.97,-25336.46 16740.1,-25334.81 16742.18,-25333.09 16744.21,-25331.32 16746.19,-25329.5 16748.12,-25327.62 16750,-25325.69 16751.82,-25323.71 16753.59,-25321.68 16755.31,-25319.6 16756.96,-25317.47 16758.56,-25315.3 16760.09,-25313.09 16761.56,-25310.83 16762.98,-25308.54 16764.32,-25306.21 16765.6,-25303.84 16766.82,-25301.43 16767.97,-25299 16769.05,-25296.53 16770.07,-25294.03 16771.01,-25291.51 16771.89,-25288.96 16772.69,-25286.39 16773.42,-25283.8 16774.08,-25281.19 16774.67,-25278.56 16775.19,-25275.92 16775.63,-25273.26 16776,-25270.59 16776.3,-25267.91 16776.52,-25265.23 16776.67,-25262.54 16776.74,-25259.85"/>
|
||||
<polygon id="000002B6365DC220" class="l275d0" points="16776.75,-25258.5 16781.25,-25258.5 16781.24,-25259.91 16781.17,-25262.73 16781.01,-25265.54 16780.78,-25268.35 16780.47,-25271.15 16780.08,-25273.94 16779.62,-25276.72 16779.08,-25279.48 16778.46,-25282.23 16777.77,-25284.97 16777,-25287.68 16776.16,-25290.37 16775.25,-25293.03 16774.26,-25295.67 16773.2,-25298.28 16772.07,-25300.86 16770.86,-25303.41 16769.59,-25305.92 16768.25,-25308.4 16766.84,-25310.84 16765.37,-25313.24 16763.82,-25315.6 16762.22,-25317.92 16760.55,-25320.19 16758.82,-25322.41 16757.03,-25324.59 16755.18,-25326.71 16753.27,-25328.78 16751.3,-25330.8 16749.28,-25332.77 16747.21,-25334.68 16745.09,-25336.53 16742.91,-25338.32 16740.69,-25340.05 16738.42,-25341.72 16736.1,-25343.32 16733.74,-25344.87 16731.34,-25346.34 16728.9,-25347.75 16726.42,-25349.09 16723.91,-25350.36 16721.36,-25351.57 16718.78,-25352.7 16716.17,-25353.76 16713.53,-25354.75 16710.87,-25355.66 16708.18,-25356.5 16705.47,-25357.27 16702.73,-25357.96 16699.98,-25358.58 16697.22,-25359.12 16694.44,-25359.58 16691.65,-25359.97 16688.85,-25360.28 16686.04,-25360.51 16683.23,-25360.67 16680.41,-25360.74 16679,-25360.75 16679,-25356.25 16680.35,-25356.24 16683.04,-25356.17 16685.73,-25356.02 16688.41,-25355.8 16691.09,-25355.5 16693.76,-25355.13 16696.42,-25354.69 16699.06,-25354.17 16701.69,-25353.58 16704.3,-25352.92 16706.89,-25352.19 16709.46,-25351.39 16712.01,-25350.51 16714.53,-25349.57 16717.03,-25348.55 16719.5,-25347.47 16721.93,-25346.32 16724.34,-25345.1 16726.71,-25343.82 16729.04,-25342.48 16731.33,-25341.06 16733.59,-25339.59 16735.8,-25338.06 16737.97,-25336.46 16740.1,-25334.81 16742.18,-25333.09 16744.21,-25331.32 16746.19,-25329.5 16748.12,-25327.62 16750,-25325.69 16751.82,-25323.71 16753.59,-25321.68 16755.31,-25319.6 16756.96,-25317.47 16758.56,-25315.3 16760.09,-25313.09 16761.56,-25310.83 16762.98,-25308.54 16764.32,-25306.21 16765.6,-25303.84 16766.82,-25301.43 16767.97,-25299 16769.05,-25296.53 16770.07,-25294.03 16771.01,-25291.51 16771.89,-25288.96 16772.69,-25286.39 16773.42,-25283.8 16774.08,-25281.19 16774.67,-25278.56 16775.19,-25275.92 16775.63,-25273.26 16776,-25270.59 16776.3,-25267.91 16776.52,-25265.23 16776.67,-25262.54 16776.74,-25259.85"/>
|
||||
<polygon id="000002B6365DC4C0" class="l275d0" points="16776.75,-25258.5 16781.25,-25258.5 16781.24,-25259.91 16781.17,-25262.73 16781.01,-25265.54 16780.78,-25268.35 16780.47,-25271.15 16780.08,-25273.94 16779.62,-25276.72 16779.08,-25279.48 16778.46,-25282.23 16777.77,-25284.97 16777,-25287.68 16776.16,-25290.37 16775.25,-25293.03 16774.26,-25295.67 16773.2,-25298.28 16772.07,-25300.86 16770.86,-25303.41 16769.59,-25305.92 16768.25,-25308.4 16766.84,-25310.84 16765.37,-25313.24 16763.82,-25315.6 16762.22,-25317.92 16760.55,-25320.19 16758.82,-25322.41 16757.03,-25324.59 16755.18,-25326.71 16753.27,-25328.78 16751.3,-25330.8 16749.28,-25332.77 16747.21,-25334.68 16745.09,-25336.53 16742.91,-25338.32 16740.69,-25340.05 16738.42,-25341.72 16736.1,-25343.32 16733.74,-25344.87 16731.34,-25346.34 16728.9,-25347.75 16726.42,-25349.09 16723.91,-25350.36 16721.36,-25351.57 16718.78,-25352.7 16716.17,-25353.76 16713.53,-25354.75 16710.87,-25355.66 16708.18,-25356.5 16705.47,-25357.27 16702.73,-25357.96 16699.98,-25358.58 16697.22,-25359.12 16694.44,-25359.58 16691.65,-25359.97 16688.85,-25360.28 16686.04,-25360.51 16683.23,-25360.67 16680.41,-25360.74 16679,-25360.75 16679,-25356.25 16680.35,-25356.24 16683.04,-25356.17 16685.73,-25356.02 16688.41,-25355.8 16691.09,-25355.5 16693.76,-25355.13 16696.42,-25354.69 16699.06,-25354.17 16701.69,-25353.58 16704.3,-25352.92 16706.89,-25352.19 16709.46,-25351.39 16712.01,-25350.51 16714.53,-25349.57 16717.03,-25348.55 16719.5,-25347.47 16721.93,-25346.32 16724.34,-25345.1 16726.71,-25343.82 16729.04,-25342.48 16731.33,-25341.06 16733.59,-25339.59 16735.8,-25338.06 16737.97,-25336.46 16740.1,-25334.81 16742.18,-25333.09 16744.21,-25331.32 16746.19,-25329.5 16748.12,-25327.62 16750,-25325.69 16751.82,-25323.71 16753.59,-25321.68 16755.31,-25319.6 16756.96,-25317.47 16758.56,-25315.3 16760.09,-25313.09 16761.56,-25310.83 16762.98,-25308.54 16764.32,-25306.21 16765.6,-25303.84 16766.82,-25301.43 16767.97,-25299 16769.05,-25296.53 16770.07,-25294.03 16771.01,-25291.51 16771.89,-25288.96 16772.69,-25286.39 16773.42,-25283.8 16774.08,-25281.19 16774.67,-25278.56 16775.19,-25275.92 16775.63,-25273.26 16776,-25270.59 16776.3,-25267.91 16776.52,-25265.23 16776.67,-25262.54 16776.74,-25259.85"/>
|
||||
<polygon id="000002B6365DCBC0" class="l275d0" points="16776.75,-25258.5 16781.25,-25258.5 16781.24,-25259.91 16781.17,-25262.73 16781.01,-25265.54 16780.78,-25268.35 16780.47,-25271.15 16780.08,-25273.94 16779.62,-25276.72 16779.08,-25279.48 16778.46,-25282.23 16777.77,-25284.97 16777,-25287.68 16776.16,-25290.37 16775.25,-25293.03 16774.26,-25295.67 16773.2,-25298.28 16772.07,-25300.86 16770.86,-25303.41 16769.59,-25305.92 16768.25,-25308.4 16766.84,-25310.84 16765.37,-25313.24 16763.82,-25315.6 16762.22,-25317.92 16760.55,-25320.19 16758.82,-25322.41 16757.03,-25324.59 16755.18,-25326.71 16753.27,-25328.78 16751.3,-25330.8 16749.28,-25332.77 16747.21,-25334.68 16745.09,-25336.53 16742.91,-25338.32 16740.69,-25340.05 16738.42,-25341.72 16736.1,-25343.32 16733.74,-25344.87 16731.34,-25346.34 16728.9,-25347.75 16726.42,-25349.09 16723.91,-25350.36 16721.36,-25351.57 16718.78,-25352.7 16716.17,-25353.76 16713.53,-25354.75 16710.87,-25355.66 16708.18,-25356.5 16705.47,-25357.27 16702.73,-25357.96 16699.98,-25358.58 16697.22,-25359.12 16694.44,-25359.58 16691.65,-25359.97 16688.85,-25360.28 16686.04,-25360.51 16683.23,-25360.67 16680.41,-25360.74 16679,-25360.75 16679,-25356.25 16680.35,-25356.24 16683.04,-25356.17 16685.73,-25356.02 16688.41,-25355.8 16691.09,-25355.5 16693.76,-25355.13 16696.42,-25354.69 16699.06,-25354.17 16701.69,-25353.58 16704.3,-25352.92 16706.89,-25352.19 16709.46,-25351.39 16712.01,-25350.51 16714.53,-25349.57 16717.03,-25348.55 16719.5,-25347.47 16721.93,-25346.32 16724.34,-25345.1 16726.71,-25343.82 16729.04,-25342.48 16731.33,-25341.06 16733.59,-25339.59 16735.8,-25338.06 16737.97,-25336.46 16740.1,-25334.81 16742.18,-25333.09 16744.21,-25331.32 16746.19,-25329.5 16748.12,-25327.62 16750,-25325.69 16751.82,-25323.71 16753.59,-25321.68 16755.31,-25319.6 16756.96,-25317.47 16758.56,-25315.3 16760.09,-25313.09 16761.56,-25310.83 16762.98,-25308.54 16764.32,-25306.21 16765.6,-25303.84 16766.82,-25301.43 16767.97,-25299 16769.05,-25296.53 16770.07,-25294.03 16771.01,-25291.51 16771.89,-25288.96 16772.69,-25286.39 16773.42,-25283.8 16774.08,-25281.19 16774.67,-25278.56 16775.19,-25275.92 16775.63,-25273.26 16776,-25270.59 16776.3,-25267.91 16776.52,-25265.23 16776.67,-25262.54 16776.74,-25259.85"/>
|
||||
<polygon id="000002B6365DCED0" class="l101d251" points="16736.75,-25258.5 16821.25,-25258.5 16821.24,-25260.17 16821.17,-25263.5 16821.01,-25266.83 16820.77,-25270.16 16820.46,-25273.48 16820.07,-25276.79 16819.6,-25280.09 16819.06,-25283.38 16818.44,-25286.66 16817.74,-25289.92 16816.96,-25293.17 16816.11,-25296.39 16815.19,-25299.59 16814.19,-25302.78 16813.11,-25305.93 16811.96,-25309.06 16810.74,-25312.17 16809.45,-25315.24 16808.08,-25318.28 16806.64,-25321.29 16805.14,-25324.27 16803.56,-25327.21 16801.92,-25330.11 16800.2,-25332.97 16798.42,-25335.79 16796.58,-25338.57 16794.67,-25341.3 16792.7,-25343.99 16790.66,-25346.63 16788.57,-25349.23 16786.41,-25351.77 16784.19,-25354.26 16781.92,-25356.7 16779.59,-25359.09 16777.2,-25361.42 16774.76,-25363.69 16772.27,-25365.91 16769.73,-25368.07 16767.13,-25370.16 16764.49,-25372.2 16761.8,-25374.17 16759.07,-25376.08 16756.29,-25377.92 16753.47,-25379.7 16750.61,-25381.42 16747.71,-25383.06 16744.77,-25384.64 16741.79,-25386.14 16738.78,-25387.58 16735.74,-25388.95 16732.67,-25390.24 16729.56,-25391.46 16726.43,-25392.61 16723.28,-25393.69 16720.09,-25394.69 16716.89,-25395.61 16713.67,-25396.46 16710.42,-25397.24 16707.16,-25397.94 16703.88,-25398.56 16700.59,-25399.1 16697.29,-25399.57 16693.98,-25399.96 16690.66,-25400.27 16687.33,-25400.51 16684,-25400.67 16680.67,-25400.74 16679,-25400.75 16679,-25316.25 16679.68,-25316.25 16681.03,-25316.22 16682.38,-25316.15 16683.73,-25316.06 16685.08,-25315.93 16686.43,-25315.77 16687.77,-25315.58 16689.1,-25315.36 16690.43,-25315.11 16691.76,-25314.82 16693.07,-25314.51 16694.38,-25314.16 16695.68,-25313.79 16696.97,-25313.38 16698.26,-25312.95 16699.53,-25312.48 16700.79,-25311.98 16702.04,-25311.46 16703.27,-25310.9 16704.49,-25310.32 16705.7,-25309.71 16706.89,-25309.07 16708.07,-25308.4 16709.23,-25307.71 16710.38,-25306.98 16711.51,-25306.23 16712.62,-25305.46 16713.71,-25304.66 16714.78,-25303.83 16715.83,-25302.98 16716.87,-25302.11 16717.88,-25301.21 16718.87,-25300.28 16719.84,-25299.34 16720.78,-25298.37 16721.71,-25297.38 16722.61,-25296.37 16723.48,-25295.33 16724.33,-25294.28 16725.16,-25293.21 16725.96,-25292.12 16726.73,-25291.01 16727.48,-25289.88 16728.21,-25288.73 16728.9,-25287.57 16729.57,-25286.39 16730.21,-25285.2 16730.82,-25283.99 16731.4,-25282.77 16731.96,-25281.54 16732.48,-25280.29 16732.98,-25279.03 16733.45,-25277.76 16733.88,-25276.47 16734.29,-25275.18 16734.66,-25273.88 16735.01,-25272.57 16735.32,-25271.26 16735.61,-25269.93 16735.86,-25268.6 16736.08,-25267.27 16736.27,-25265.93 16736.43,-25264.58 16736.56,-25263.23 16736.65,-25261.88 16736.72,-25260.53 16736.75,-25259.18"/>
|
||||
<polygon id="000002B6365DC920" class="l101d251" points="16736.75,-25258.5 16821.25,-25258.5 16821.24,-25260.17 16821.17,-25263.5 16821.01,-25266.83 16820.77,-25270.16 16820.46,-25273.48 16820.07,-25276.79 16819.6,-25280.09 16819.06,-25283.38 16818.44,-25286.66 16817.74,-25289.92 16816.96,-25293.17 16816.11,-25296.39 16815.19,-25299.59 16814.19,-25302.78 16813.11,-25305.93 16811.96,-25309.06 16810.74,-25312.17 16809.45,-25315.24 16808.08,-25318.28 16806.64,-25321.29 16805.14,-25324.27 16803.56,-25327.21 16801.92,-25330.11 16800.2,-25332.97 16798.42,-25335.79 16796.58,-25338.57 16794.67,-25341.3 16792.7,-25343.99 16790.66,-25346.63 16788.57,-25349.23 16786.41,-25351.77 16784.19,-25354.26 16781.92,-25356.7 16779.59,-25359.09 16777.2,-25361.42 16774.76,-25363.69 16772.27,-25365.91 16769.73,-25368.07 16767.13,-25370.16 16764.49,-25372.2 16761.8,-25374.17 16759.07,-25376.08 16756.29,-25377.92 16753.47,-25379.7 16750.61,-25381.42 16747.71,-25383.06 16744.77,-25384.64 16741.79,-25386.14 16738.78,-25387.58 16735.74,-25388.95 16732.67,-25390.24 16729.56,-25391.46 16726.43,-25392.61 16723.28,-25393.69 16720.09,-25394.69 16716.89,-25395.61 16713.67,-25396.46 16710.42,-25397.24 16707.16,-25397.94 16703.88,-25398.56 16700.59,-25399.1 16697.29,-25399.57 16693.98,-25399.96 16690.66,-25400.27 16687.33,-25400.51 16684,-25400.67 16680.67,-25400.74 16679,-25400.75 16679,-25316.25 16679.68,-25316.25 16681.03,-25316.22 16682.38,-25316.15 16683.73,-25316.06 16685.08,-25315.93 16686.43,-25315.77 16687.77,-25315.58 16689.1,-25315.36 16690.43,-25315.11 16691.76,-25314.82 16693.07,-25314.51 16694.38,-25314.16 16695.68,-25313.79 16696.97,-25313.38 16698.26,-25312.95 16699.53,-25312.48 16700.79,-25311.98 16702.04,-25311.46 16703.27,-25310.9 16704.49,-25310.32 16705.7,-25309.71 16706.89,-25309.07 16708.07,-25308.4 16709.23,-25307.71 16710.38,-25306.98 16711.51,-25306.23 16712.62,-25305.46 16713.71,-25304.66 16714.78,-25303.83 16715.83,-25302.98 16716.87,-25302.11 16717.88,-25301.21 16718.87,-25300.28 16719.84,-25299.34 16720.78,-25298.37 16721.71,-25297.38 16722.61,-25296.37 16723.48,-25295.33 16724.33,-25294.28 16725.16,-25293.21 16725.96,-25292.12 16726.73,-25291.01 16727.48,-25289.88 16728.21,-25288.73 16728.9,-25287.57 16729.57,-25286.39 16730.21,-25285.2 16730.82,-25283.99 16731.4,-25282.77 16731.96,-25281.54 16732.48,-25280.29 16732.98,-25279.03 16733.45,-25277.76 16733.88,-25276.47 16734.29,-25275.18 16734.66,-25273.88 16735.01,-25272.57 16735.32,-25271.26 16735.61,-25269.93 16735.86,-25268.6 16736.08,-25267.27 16736.27,-25265.93 16736.43,-25264.58 16736.56,-25263.23 16736.65,-25261.88 16736.72,-25260.53 16736.75,-25259.18"/>
|
||||
<polygon id="000002B6365DC840" class="l101d251" points="16736.75,-25258.5 16821.25,-25258.5 16821.24,-25260.17 16821.17,-25263.5 16821.01,-25266.83 16820.77,-25270.16 16820.46,-25273.48 16820.07,-25276.79 16819.6,-25280.09 16819.06,-25283.38 16818.44,-25286.66 16817.74,-25289.92 16816.96,-25293.17 16816.11,-25296.39 16815.19,-25299.59 16814.19,-25302.78 16813.11,-25305.93 16811.96,-25309.06 16810.74,-25312.17 16809.45,-25315.24 16808.08,-25318.28 16806.64,-25321.29 16805.14,-25324.27 16803.56,-25327.21 16801.92,-25330.11 16800.2,-25332.97 16798.42,-25335.79 16796.58,-25338.57 16794.67,-25341.3 16792.7,-25343.99 16790.66,-25346.63 16788.57,-25349.23 16786.41,-25351.77 16784.19,-25354.26 16781.92,-25356.7 16779.59,-25359.09 16777.2,-25361.42 16774.76,-25363.69 16772.27,-25365.91 16769.73,-25368.07 16767.13,-25370.16 16764.49,-25372.2 16761.8,-25374.17 16759.07,-25376.08 16756.29,-25377.92 16753.47,-25379.7 16750.61,-25381.42 16747.71,-25383.06 16744.77,-25384.64 16741.79,-25386.14 16738.78,-25387.58 16735.74,-25388.95 16732.67,-25390.24 16729.56,-25391.46 16726.43,-25392.61 16723.28,-25393.69 16720.09,-25394.69 16716.89,-25395.61 16713.67,-25396.46 16710.42,-25397.24 16707.16,-25397.94 16703.88,-25398.56 16700.59,-25399.1 16697.29,-25399.57 16693.98,-25399.96 16690.66,-25400.27 16687.33,-25400.51 16684,-25400.67 16680.67,-25400.74 16679,-25400.75 16679,-25316.25 16679.68,-25316.25 16681.03,-25316.22 16682.38,-25316.15 16683.73,-25316.06 16685.08,-25315.93 16686.43,-25315.77 16687.77,-25315.58 16689.1,-25315.36 16690.43,-25315.11 16691.76,-25314.82 16693.07,-25314.51 16694.38,-25314.16 16695.68,-25313.79 16696.97,-25313.38 16698.26,-25312.95 16699.53,-25312.48 16700.79,-25311.98 16702.04,-25311.46 16703.27,-25310.9 16704.49,-25310.32 16705.7,-25309.71 16706.89,-25309.07 16708.07,-25308.4 16709.23,-25307.71 16710.38,-25306.98 16711.51,-25306.23 16712.62,-25305.46 16713.71,-25304.66 16714.78,-25303.83 16715.83,-25302.98 16716.87,-25302.11 16717.88,-25301.21 16718.87,-25300.28 16719.84,-25299.34 16720.78,-25298.37 16721.71,-25297.38 16722.61,-25296.37 16723.48,-25295.33 16724.33,-25294.28 16725.16,-25293.21 16725.96,-25292.12 16726.73,-25291.01 16727.48,-25289.88 16728.21,-25288.73 16728.9,-25287.57 16729.57,-25286.39 16730.21,-25285.2 16730.82,-25283.99 16731.4,-25282.77 16731.96,-25281.54 16732.48,-25280.29 16732.98,-25279.03 16733.45,-25277.76 16733.88,-25276.47 16734.29,-25275.18 16734.66,-25273.88 16735.01,-25272.57 16735.32,-25271.26 16735.61,-25269.93 16735.86,-25268.6 16736.08,-25267.27 16736.27,-25265.93 16736.43,-25264.58 16736.56,-25263.23 16736.65,-25261.88 16736.72,-25260.53 16736.75,-25259.18"/>
|
||||
<polygon id="000002B6365DCC30" class="l101d251" points="16736.75,-25258.5 16821.25,-25258.5 16821.24,-25260.17 16821.17,-25263.5 16821.01,-25266.83 16820.77,-25270.16 16820.46,-25273.48 16820.07,-25276.79 16819.6,-25280.09 16819.06,-25283.38 16818.44,-25286.66 16817.74,-25289.92 16816.96,-25293.17 16816.11,-25296.39 16815.19,-25299.59 16814.19,-25302.78 16813.11,-25305.93 16811.96,-25309.06 16810.74,-25312.17 16809.45,-25315.24 16808.08,-25318.28 16806.64,-25321.29 16805.14,-25324.27 16803.56,-25327.21 16801.92,-25330.11 16800.2,-25332.97 16798.42,-25335.79 16796.58,-25338.57 16794.67,-25341.3 16792.7,-25343.99 16790.66,-25346.63 16788.57,-25349.23 16786.41,-25351.77 16784.19,-25354.26 16781.92,-25356.7 16779.59,-25359.09 16777.2,-25361.42 16774.76,-25363.69 16772.27,-25365.91 16769.73,-25368.07 16767.13,-25370.16 16764.49,-25372.2 16761.8,-25374.17 16759.07,-25376.08 16756.29,-25377.92 16753.47,-25379.7 16750.61,-25381.42 16747.71,-25383.06 16744.77,-25384.64 16741.79,-25386.14 16738.78,-25387.58 16735.74,-25388.95 16732.67,-25390.24 16729.56,-25391.46 16726.43,-25392.61 16723.28,-25393.69 16720.09,-25394.69 16716.89,-25395.61 16713.67,-25396.46 16710.42,-25397.24 16707.16,-25397.94 16703.88,-25398.56 16700.59,-25399.1 16697.29,-25399.57 16693.98,-25399.96 16690.66,-25400.27 16687.33,-25400.51 16684,-25400.67 16680.67,-25400.74 16679,-25400.75 16679,-25316.25 16679.68,-25316.25 16681.03,-25316.22 16682.38,-25316.15 16683.73,-25316.06 16685.08,-25315.93 16686.43,-25315.77 16687.77,-25315.58 16689.1,-25315.36 16690.43,-25315.11 16691.76,-25314.82 16693.07,-25314.51 16694.38,-25314.16 16695.68,-25313.79 16696.97,-25313.38 16698.26,-25312.95 16699.53,-25312.48 16700.79,-25311.98 16702.04,-25311.46 16703.27,-25310.9 16704.49,-25310.32 16705.7,-25309.71 16706.89,-25309.07 16708.07,-25308.4 16709.23,-25307.71 16710.38,-25306.98 16711.51,-25306.23 16712.62,-25305.46 16713.71,-25304.66 16714.78,-25303.83 16715.83,-25302.98 16716.87,-25302.11 16717.88,-25301.21 16718.87,-25300.28 16719.84,-25299.34 16720.78,-25298.37 16721.71,-25297.38 16722.61,-25296.37 16723.48,-25295.33 16724.33,-25294.28 16725.16,-25293.21 16725.96,-25292.12 16726.73,-25291.01 16727.48,-25289.88 16728.21,-25288.73 16728.9,-25287.57 16729.57,-25286.39 16730.21,-25285.2 16730.82,-25283.99 16731.4,-25282.77 16731.96,-25281.54 16732.48,-25280.29 16732.98,-25279.03 16733.45,-25277.76 16733.88,-25276.47 16734.29,-25275.18 16734.66,-25273.88 16735.01,-25272.57 16735.32,-25271.26 16735.61,-25269.93 16735.86,-25268.6 16736.08,-25267.27 16736.27,-25265.93 16736.43,-25264.58 16736.56,-25263.23 16736.65,-25261.88 16736.72,-25260.53 16736.75,-25259.18"/>
|
||||
<polygon id="000002B6365DCD10" class="l101d251" points="16736.75,-25258.5 16821.25,-25258.5 16821.24,-25260.17 16821.17,-25263.5 16821.01,-25266.83 16820.77,-25270.16 16820.46,-25273.48 16820.07,-25276.79 16819.6,-25280.09 16819.06,-25283.38 16818.44,-25286.66 16817.74,-25289.92 16816.96,-25293.17 16816.11,-25296.39 16815.19,-25299.59 16814.19,-25302.78 16813.11,-25305.93 16811.96,-25309.06 16810.74,-25312.17 16809.45,-25315.24 16808.08,-25318.28 16806.64,-25321.29 16805.14,-25324.27 16803.56,-25327.21 16801.92,-25330.11 16800.2,-25332.97 16798.42,-25335.79 16796.58,-25338.57 16794.67,-25341.3 16792.7,-25343.99 16790.66,-25346.63 16788.57,-25349.23 16786.41,-25351.77 16784.19,-25354.26 16781.92,-25356.7 16779.59,-25359.09 16777.2,-25361.42 16774.76,-25363.69 16772.27,-25365.91 16769.73,-25368.07 16767.13,-25370.16 16764.49,-25372.2 16761.8,-25374.17 16759.07,-25376.08 16756.29,-25377.92 16753.47,-25379.7 16750.61,-25381.42 16747.71,-25383.06 16744.77,-25384.64 16741.79,-25386.14 16738.78,-25387.58 16735.74,-25388.95 16732.67,-25390.24 16729.56,-25391.46 16726.43,-25392.61 16723.28,-25393.69 16720.09,-25394.69 16716.89,-25395.61 16713.67,-25396.46 16710.42,-25397.24 16707.16,-25397.94 16703.88,-25398.56 16700.59,-25399.1 16697.29,-25399.57 16693.98,-25399.96 16690.66,-25400.27 16687.33,-25400.51 16684,-25400.67 16680.67,-25400.74 16679,-25400.75 16679,-25316.25 16679.68,-25316.25 16681.03,-25316.22 16682.38,-25316.15 16683.73,-25316.06 16685.08,-25315.93 16686.43,-25315.77 16687.77,-25315.58 16689.1,-25315.36 16690.43,-25315.11 16691.76,-25314.82 16693.07,-25314.51 16694.38,-25314.16 16695.68,-25313.79 16696.97,-25313.38 16698.26,-25312.95 16699.53,-25312.48 16700.79,-25311.98 16702.04,-25311.46 16703.27,-25310.9 16704.49,-25310.32 16705.7,-25309.71 16706.89,-25309.07 16708.07,-25308.4 16709.23,-25307.71 16710.38,-25306.98 16711.51,-25306.23 16712.62,-25305.46 16713.71,-25304.66 16714.78,-25303.83 16715.83,-25302.98 16716.87,-25302.11 16717.88,-25301.21 16718.87,-25300.28 16719.84,-25299.34 16720.78,-25298.37 16721.71,-25297.38 16722.61,-25296.37 16723.48,-25295.33 16724.33,-25294.28 16725.16,-25293.21 16725.96,-25292.12 16726.73,-25291.01 16727.48,-25289.88 16728.21,-25288.73 16728.9,-25287.57 16729.57,-25286.39 16730.21,-25285.2 16730.82,-25283.99 16731.4,-25282.77 16731.96,-25281.54 16732.48,-25280.29 16732.98,-25279.03 16733.45,-25277.76 16733.88,-25276.47 16734.29,-25275.18 16734.66,-25273.88 16735.01,-25272.57 16735.32,-25271.26 16735.61,-25269.93 16735.86,-25268.6 16736.08,-25267.27 16736.27,-25265.93 16736.43,-25264.58 16736.56,-25263.23 16736.65,-25261.88 16736.72,-25260.53 16736.75,-25259.18"/>
|
||||
<polygon id="000002B6365DC530" class="l101d251" points="16736.75,-25258.5 16821.25,-25258.5 16821.24,-25260.17 16821.17,-25263.5 16821.01,-25266.83 16820.77,-25270.16 16820.46,-25273.48 16820.07,-25276.79 16819.6,-25280.09 16819.06,-25283.38 16818.44,-25286.66 16817.74,-25289.92 16816.96,-25293.17 16816.11,-25296.39 16815.19,-25299.59 16814.19,-25302.78 16813.11,-25305.93 16811.96,-25309.06 16810.74,-25312.17 16809.45,-25315.24 16808.08,-25318.28 16806.64,-25321.29 16805.14,-25324.27 16803.56,-25327.21 16801.92,-25330.11 16800.2,-25332.97 16798.42,-25335.79 16796.58,-25338.57 16794.67,-25341.3 16792.7,-25343.99 16790.66,-25346.63 16788.57,-25349.23 16786.41,-25351.77 16784.19,-25354.26 16781.92,-25356.7 16779.59,-25359.09 16777.2,-25361.42 16774.76,-25363.69 16772.27,-25365.91 16769.73,-25368.07 16767.13,-25370.16 16764.49,-25372.2 16761.8,-25374.17 16759.07,-25376.08 16756.29,-25377.92 16753.47,-25379.7 16750.61,-25381.42 16747.71,-25383.06 16744.77,-25384.64 16741.79,-25386.14 16738.78,-25387.58 16735.74,-25388.95 16732.67,-25390.24 16729.56,-25391.46 16726.43,-25392.61 16723.28,-25393.69 16720.09,-25394.69 16716.89,-25395.61 16713.67,-25396.46 16710.42,-25397.24 16707.16,-25397.94 16703.88,-25398.56 16700.59,-25399.1 16697.29,-25399.57 16693.98,-25399.96 16690.66,-25400.27 16687.33,-25400.51 16684,-25400.67 16680.67,-25400.74 16679,-25400.75 16679,-25316.25 16679.68,-25316.25 16681.03,-25316.22 16682.38,-25316.15 16683.73,-25316.06 16685.08,-25315.93 16686.43,-25315.77 16687.77,-25315.58 16689.1,-25315.36 16690.43,-25315.11 16691.76,-25314.82 16693.07,-25314.51 16694.38,-25314.16 16695.68,-25313.79 16696.97,-25313.38 16698.26,-25312.95 16699.53,-25312.48 16700.79,-25311.98 16702.04,-25311.46 16703.27,-25310.9 16704.49,-25310.32 16705.7,-25309.71 16706.89,-25309.07 16708.07,-25308.4 16709.23,-25307.71 16710.38,-25306.98 16711.51,-25306.23 16712.62,-25305.46 16713.71,-25304.66 16714.78,-25303.83 16715.83,-25302.98 16716.87,-25302.11 16717.88,-25301.21 16718.87,-25300.28 16719.84,-25299.34 16720.78,-25298.37 16721.71,-25297.38 16722.61,-25296.37 16723.48,-25295.33 16724.33,-25294.28 16725.16,-25293.21 16725.96,-25292.12 16726.73,-25291.01 16727.48,-25289.88 16728.21,-25288.73 16728.9,-25287.57 16729.57,-25286.39 16730.21,-25285.2 16730.82,-25283.99 16731.4,-25282.77 16731.96,-25281.54 16732.48,-25280.29 16732.98,-25279.03 16733.45,-25277.76 16733.88,-25276.47 16734.29,-25275.18 16734.66,-25273.88 16735.01,-25272.57 16735.32,-25271.26 16735.61,-25269.93 16735.86,-25268.6 16736.08,-25267.27 16736.27,-25265.93 16736.43,-25264.58 16736.56,-25263.23 16736.65,-25261.88 16736.72,-25260.53 16736.75,-25259.18"/>
|
||||
<polygon id="000002B6365DC5A0" class="l275d0" points="16781.25,-23038 16781.25,-25258.5 16776.75,-25258.5 16776.75,-23038"/>
|
||||
<polygon id="000002B6365DC990" class="l275d0" points="16781.25,-23038 16781.25,-25258.5 16776.75,-25258.5 16776.75,-23038"/>
|
||||
<polygon id="000002B6365DC7D0" class="l275d0" points="16781.25,-23038 16781.25,-25258.5 16776.75,-25258.5 16776.75,-23038"/>
|
||||
<polygon id="000002B6365DCA00" class="l275d0" points="16781.25,-23038 16781.25,-25258.5 16776.75,-25258.5 16776.75,-23038"/>
|
||||
<polygon id="000002B6365DCA70" class="l275d0" points="16781.25,-23038 16781.25,-25258.5 16776.75,-25258.5 16776.75,-23038"/>
|
||||
<polygon id="000002B6365DCD80" class="l275d0" points="16781.25,-23038 16781.25,-25258.5 16776.75,-25258.5 16776.75,-23038"/>
|
||||
<polygon id="000002B6365DCDF0" class="l101d251" points="16821.25,-22998 16821.25,-25298.5 16736.75,-25298.5 16736.75,-22998"/>
|
||||
<polygon id="000002B6361D9040" class="l101d251" points="16821.25,-22998 16821.25,-25298.5 16736.75,-25298.5 16736.75,-22998"/>
|
||||
<polygon id="000002B6361D92E0" class="l101d251" points="16821.25,-22998 16821.25,-25298.5 16736.75,-25298.5 16736.75,-22998"/>
|
||||
<polygon id="000002B6361D9740" class="l101d251" points="16821.25,-22998 16821.25,-25298.5 16736.75,-25298.5 16736.75,-22998"/>
|
||||
<polygon id="000002B6361D9190" class="l101d251" points="16821.25,-22998 16821.25,-25298.5 16736.75,-25298.5 16736.75,-22998"/>
|
||||
<polygon id="000002B6361D8D30" class="l101d251" points="16821.25,-22998 16821.25,-25298.5 16736.75,-25298.5 16736.75,-22998"/>
|
||||
<polygon id="000002B6361D8B00" class="l275d0" points="16879,-22935.75 16879,-22940.25 16877.65,-22940.26 16874.96,-22940.33 16872.27,-22940.48 16869.59,-22940.7 16866.91,-22941 16864.24,-22941.37 16861.58,-22941.81 16858.94,-22942.33 16856.31,-22942.92 16853.7,-22943.58 16851.11,-22944.31 16848.54,-22945.11 16845.99,-22945.99 16843.47,-22946.93 16840.97,-22947.95 16838.5,-22949.03 16836.07,-22950.18 16833.66,-22951.4 16831.29,-22952.68 16828.96,-22954.02 16826.67,-22955.44 16824.41,-22956.91 16822.2,-22958.44 16820.03,-22960.04 16817.9,-22961.69 16815.82,-22963.41 16813.79,-22965.18 16811.81,-22967 16809.88,-22968.88 16808,-22970.81 16806.18,-22972.79 16804.41,-22974.82 16802.69,-22976.9 16801.04,-22979.03 16799.44,-22981.2 16797.91,-22983.41 16796.44,-22985.67 16795.02,-22987.96 16793.68,-22990.29 16792.4,-22992.66 16791.18,-22995.07 16790.03,-22997.5 16788.95,-22999.97 16787.93,-23002.47 16786.99,-23004.99 16786.11,-23007.54 16785.31,-23010.11 16784.58,-23012.7 16783.92,-23015.31 16783.33,-23017.94 16782.81,-23020.58 16782.37,-23023.24 16782,-23025.91 16781.7,-23028.59 16781.48,-23031.27 16781.33,-23033.96 16781.26,-23036.65 16781.25,-23038 16776.75,-23038 16776.76,-23036.59 16776.83,-23033.77 16776.99,-23030.96 16777.22,-23028.15 16777.53,-23025.35 16777.92,-23022.56 16778.38,-23019.78 16778.92,-23017.02 16779.54,-23014.27 16780.23,-23011.53 16781,-23008.82 16781.84,-23006.13 16782.75,-23003.47 16783.74,-23000.83 16784.8,-22998.22 16785.93,-22995.64 16787.14,-22993.09 16788.41,-22990.58 16789.75,-22988.1 16791.16,-22985.66 16792.63,-22983.26 16794.18,-22980.9 16795.78,-22978.58 16797.45,-22976.31 16799.18,-22974.09 16800.97,-22971.91 16802.82,-22969.79 16804.73,-22967.72 16806.7,-22965.7 16808.72,-22963.73 16810.79,-22961.82 16812.91,-22959.97 16815.09,-22958.18 16817.31,-22956.45 16819.58,-22954.78 16821.9,-22953.18 16824.26,-22951.63 16826.66,-22950.16 16829.1,-22948.75 16831.58,-22947.41 16834.09,-22946.14 16836.64,-22944.93 16839.22,-22943.8 16841.83,-22942.74 16844.47,-22941.75 16847.13,-22940.84 16849.82,-22940 16852.53,-22939.23 16855.27,-22938.54 16858.02,-22937.92 16860.78,-22937.38 16863.56,-22936.92 16866.35,-22936.53 16869.15,-22936.22 16871.96,-22935.99 16874.77,-22935.83 16877.59,-22935.76"/>
|
||||
<polygon id="000002B6361D8B70" class="l275d0" points="16879,-22935.75 16879,-22940.25 16877.65,-22940.26 16874.96,-22940.33 16872.27,-22940.48 16869.59,-22940.7 16866.91,-22941 16864.24,-22941.37 16861.58,-22941.81 16858.94,-22942.33 16856.31,-22942.92 16853.7,-22943.58 16851.11,-22944.31 16848.54,-22945.11 16845.99,-22945.99 16843.47,-22946.93 16840.97,-22947.95 16838.5,-22949.03 16836.07,-22950.18 16833.66,-22951.4 16831.29,-22952.68 16828.96,-22954.02 16826.67,-22955.44 16824.41,-22956.91 16822.2,-22958.44 16820.03,-22960.04 16817.9,-22961.69 16815.82,-22963.41 16813.79,-22965.18 16811.81,-22967 16809.88,-22968.88 16808,-22970.81 16806.18,-22972.79 16804.41,-22974.82 16802.69,-22976.9 16801.04,-22979.03 16799.44,-22981.2 16797.91,-22983.41 16796.44,-22985.67 16795.02,-22987.96 16793.68,-22990.29 16792.4,-22992.66 16791.18,-22995.07 16790.03,-22997.5 16788.95,-22999.97 16787.93,-23002.47 16786.99,-23004.99 16786.11,-23007.54 16785.31,-23010.11 16784.58,-23012.7 16783.92,-23015.31 16783.33,-23017.94 16782.81,-23020.58 16782.37,-23023.24 16782,-23025.91 16781.7,-23028.59 16781.48,-23031.27 16781.33,-23033.96 16781.26,-23036.65 16781.25,-23038 16776.75,-23038 16776.76,-23036.59 16776.83,-23033.77 16776.99,-23030.96 16777.22,-23028.15 16777.53,-23025.35 16777.92,-23022.56 16778.38,-23019.78 16778.92,-23017.02 16779.54,-23014.27 16780.23,-23011.53 16781,-23008.82 16781.84,-23006.13 16782.75,-23003.47 16783.74,-23000.83 16784.8,-22998.22 16785.93,-22995.64 16787.14,-22993.09 16788.41,-22990.58 16789.75,-22988.1 16791.16,-22985.66 16792.63,-22983.26 16794.18,-22980.9 16795.78,-22978.58 16797.45,-22976.31 16799.18,-22974.09 16800.97,-22971.91 16802.82,-22969.79 16804.73,-22967.72 16806.7,-22965.7 16808.72,-22963.73 16810.79,-22961.82 16812.91,-22959.97 16815.09,-22958.18 16817.31,-22956.45 16819.58,-22954.78 16821.9,-22953.18 16824.26,-22951.63 16826.66,-22950.16 16829.1,-22948.75 16831.58,-22947.41 16834.09,-22946.14 16836.64,-22944.93 16839.22,-22943.8 16841.83,-22942.74 16844.47,-22941.75 16847.13,-22940.84 16849.82,-22940 16852.53,-22939.23 16855.27,-22938.54 16858.02,-22937.92 16860.78,-22937.38 16863.56,-22936.92 16866.35,-22936.53 16869.15,-22936.22 16871.96,-22935.99 16874.77,-22935.83 16877.59,-22935.76"/>
|
||||
<polygon id="000002B6361D97B0" class="l275d0" points="16879,-22935.75 16879,-22940.25 16877.65,-22940.26 16874.96,-22940.33 16872.27,-22940.48 16869.59,-22940.7 16866.91,-22941 16864.24,-22941.37 16861.58,-22941.81 16858.94,-22942.33 16856.31,-22942.92 16853.7,-22943.58 16851.11,-22944.31 16848.54,-22945.11 16845.99,-22945.99 16843.47,-22946.93 16840.97,-22947.95 16838.5,-22949.03 16836.07,-22950.18 16833.66,-22951.4 16831.29,-22952.68 16828.96,-22954.02 16826.67,-22955.44 16824.41,-22956.91 16822.2,-22958.44 16820.03,-22960.04 16817.9,-22961.69 16815.82,-22963.41 16813.79,-22965.18 16811.81,-22967 16809.88,-22968.88 16808,-22970.81 16806.18,-22972.79 16804.41,-22974.82 16802.69,-22976.9 16801.04,-22979.03 16799.44,-22981.2 16797.91,-22983.41 16796.44,-22985.67 16795.02,-22987.96 16793.68,-22990.29 16792.4,-22992.66 16791.18,-22995.07 16790.03,-22997.5 16788.95,-22999.97 16787.93,-23002.47 16786.99,-23004.99 16786.11,-23007.54 16785.31,-23010.11 16784.58,-23012.7 16783.92,-23015.31 16783.33,-23017.94 16782.81,-23020.58 16782.37,-23023.24 16782,-23025.91 16781.7,-23028.59 16781.48,-23031.27 16781.33,-23033.96 16781.26,-23036.65 16781.25,-23038 16776.75,-23038 16776.76,-23036.59 16776.83,-23033.77 16776.99,-23030.96 16777.22,-23028.15 16777.53,-23025.35 16777.92,-23022.56 16778.38,-23019.78 16778.92,-23017.02 16779.54,-23014.27 16780.23,-23011.53 16781,-23008.82 16781.84,-23006.13 16782.75,-23003.47 16783.74,-23000.83 16784.8,-22998.22 16785.93,-22995.64 16787.14,-22993.09 16788.41,-22990.58 16789.75,-22988.1 16791.16,-22985.66 16792.63,-22983.26 16794.18,-22980.9 16795.78,-22978.58 16797.45,-22976.31 16799.18,-22974.09 16800.97,-22971.91 16802.82,-22969.79 16804.73,-22967.72 16806.7,-22965.7 16808.72,-22963.73 16810.79,-22961.82 16812.91,-22959.97 16815.09,-22958.18 16817.31,-22956.45 16819.58,-22954.78 16821.9,-22953.18 16824.26,-22951.63 16826.66,-22950.16 16829.1,-22948.75 16831.58,-22947.41 16834.09,-22946.14 16836.64,-22944.93 16839.22,-22943.8 16841.83,-22942.74 16844.47,-22941.75 16847.13,-22940.84 16849.82,-22940 16852.53,-22939.23 16855.27,-22938.54 16858.02,-22937.92 16860.78,-22937.38 16863.56,-22936.92 16866.35,-22936.53 16869.15,-22936.22 16871.96,-22935.99 16874.77,-22935.83 16877.59,-22935.76"/>
|
||||
<polygon id="000002B6361D8BE0" class="l275d0" points="16879,-22935.75 16879,-22940.25 16877.65,-22940.26 16874.96,-22940.33 16872.27,-22940.48 16869.59,-22940.7 16866.91,-22941 16864.24,-22941.37 16861.58,-22941.81 16858.94,-22942.33 16856.31,-22942.92 16853.7,-22943.58 16851.11,-22944.31 16848.54,-22945.11 16845.99,-22945.99 16843.47,-22946.93 16840.97,-22947.95 16838.5,-22949.03 16836.07,-22950.18 16833.66,-22951.4 16831.29,-22952.68 16828.96,-22954.02 16826.67,-22955.44 16824.41,-22956.91 16822.2,-22958.44 16820.03,-22960.04 16817.9,-22961.69 16815.82,-22963.41 16813.79,-22965.18 16811.81,-22967 16809.88,-22968.88 16808,-22970.81 16806.18,-22972.79 16804.41,-22974.82 16802.69,-22976.9 16801.04,-22979.03 16799.44,-22981.2 16797.91,-22983.41 16796.44,-22985.67 16795.02,-22987.96 16793.68,-22990.29 16792.4,-22992.66 16791.18,-22995.07 16790.03,-22997.5 16788.95,-22999.97 16787.93,-23002.47 16786.99,-23004.99 16786.11,-23007.54 16785.31,-23010.11 16784.58,-23012.7 16783.92,-23015.31 16783.33,-23017.94 16782.81,-23020.58 16782.37,-23023.24 16782,-23025.91 16781.7,-23028.59 16781.48,-23031.27 16781.33,-23033.96 16781.26,-23036.65 16781.25,-23038 16776.75,-23038 16776.76,-23036.59 16776.83,-23033.77 16776.99,-23030.96 16777.22,-23028.15 16777.53,-23025.35 16777.92,-23022.56 16778.38,-23019.78 16778.92,-23017.02 16779.54,-23014.27 16780.23,-23011.53 16781,-23008.82 16781.84,-23006.13 16782.75,-23003.47 16783.74,-23000.83 16784.8,-22998.22 16785.93,-22995.64 16787.14,-22993.09 16788.41,-22990.58 16789.75,-22988.1 16791.16,-22985.66 16792.63,-22983.26 16794.18,-22980.9 16795.78,-22978.58 16797.45,-22976.31 16799.18,-22974.09 16800.97,-22971.91 16802.82,-22969.79 16804.73,-22967.72 16806.7,-22965.7 16808.72,-22963.73 16810.79,-22961.82 16812.91,-22959.97 16815.09,-22958.18 16817.31,-22956.45 16819.58,-22954.78 16821.9,-22953.18 16824.26,-22951.63 16826.66,-22950.16 16829.1,-22948.75 16831.58,-22947.41 16834.09,-22946.14 16836.64,-22944.93 16839.22,-22943.8 16841.83,-22942.74 16844.47,-22941.75 16847.13,-22940.84 16849.82,-22940 16852.53,-22939.23 16855.27,-22938.54 16858.02,-22937.92 16860.78,-22937.38 16863.56,-22936.92 16866.35,-22936.53 16869.15,-22936.22 16871.96,-22935.99 16874.77,-22935.83 16877.59,-22935.76"/>
|
||||
<polygon id="000002B6361D9820" class="l275d0" points="16879,-22935.75 16879,-22940.25 16877.65,-22940.26 16874.96,-22940.33 16872.27,-22940.48 16869.59,-22940.7 16866.91,-22941 16864.24,-22941.37 16861.58,-22941.81 16858.94,-22942.33 16856.31,-22942.92 16853.7,-22943.58 16851.11,-22944.31 16848.54,-22945.11 16845.99,-22945.99 16843.47,-22946.93 16840.97,-22947.95 16838.5,-22949.03 16836.07,-22950.18 16833.66,-22951.4 16831.29,-22952.68 16828.96,-22954.02 16826.67,-22955.44 16824.41,-22956.91 16822.2,-22958.44 16820.03,-22960.04 16817.9,-22961.69 16815.82,-22963.41 16813.79,-22965.18 16811.81,-22967 16809.88,-22968.88 16808,-22970.81 16806.18,-22972.79 16804.41,-22974.82 16802.69,-22976.9 16801.04,-22979.03 16799.44,-22981.2 16797.91,-22983.41 16796.44,-22985.67 16795.02,-22987.96 16793.68,-22990.29 16792.4,-22992.66 16791.18,-22995.07 16790.03,-22997.5 16788.95,-22999.97 16787.93,-23002.47 16786.99,-23004.99 16786.11,-23007.54 16785.31,-23010.11 16784.58,-23012.7 16783.92,-23015.31 16783.33,-23017.94 16782.81,-23020.58 16782.37,-23023.24 16782,-23025.91 16781.7,-23028.59 16781.48,-23031.27 16781.33,-23033.96 16781.26,-23036.65 16781.25,-23038 16776.75,-23038 16776.76,-23036.59 16776.83,-23033.77 16776.99,-23030.96 16777.22,-23028.15 16777.53,-23025.35 16777.92,-23022.56 16778.38,-23019.78 16778.92,-23017.02 16779.54,-23014.27 16780.23,-23011.53 16781,-23008.82 16781.84,-23006.13 16782.75,-23003.47 16783.74,-23000.83 16784.8,-22998.22 16785.93,-22995.64 16787.14,-22993.09 16788.41,-22990.58 16789.75,-22988.1 16791.16,-22985.66 16792.63,-22983.26 16794.18,-22980.9 16795.78,-22978.58 16797.45,-22976.31 16799.18,-22974.09 16800.97,-22971.91 16802.82,-22969.79 16804.73,-22967.72 16806.7,-22965.7 16808.72,-22963.73 16810.79,-22961.82 16812.91,-22959.97 16815.09,-22958.18 16817.31,-22956.45 16819.58,-22954.78 16821.9,-22953.18 16824.26,-22951.63 16826.66,-22950.16 16829.1,-22948.75 16831.58,-22947.41 16834.09,-22946.14 16836.64,-22944.93 16839.22,-22943.8 16841.83,-22942.74 16844.47,-22941.75 16847.13,-22940.84 16849.82,-22940 16852.53,-22939.23 16855.27,-22938.54 16858.02,-22937.92 16860.78,-22937.38 16863.56,-22936.92 16866.35,-22936.53 16869.15,-22936.22 16871.96,-22935.99 16874.77,-22935.83 16877.59,-22935.76"/>
|
||||
<polygon id="000002B6361D8C50" class="l275d0" points="16879,-22935.75 16879,-22940.25 16877.65,-22940.26 16874.96,-22940.33 16872.27,-22940.48 16869.59,-22940.7 16866.91,-22941 16864.24,-22941.37 16861.58,-22941.81 16858.94,-22942.33 16856.31,-22942.92 16853.7,-22943.58 16851.11,-22944.31 16848.54,-22945.11 16845.99,-22945.99 16843.47,-22946.93 16840.97,-22947.95 16838.5,-22949.03 16836.07,-22950.18 16833.66,-22951.4 16831.29,-22952.68 16828.96,-22954.02 16826.67,-22955.44 16824.41,-22956.91 16822.2,-22958.44 16820.03,-22960.04 16817.9,-22961.69 16815.82,-22963.41 16813.79,-22965.18 16811.81,-22967 16809.88,-22968.88 16808,-22970.81 16806.18,-22972.79 16804.41,-22974.82 16802.69,-22976.9 16801.04,-22979.03 16799.44,-22981.2 16797.91,-22983.41 16796.44,-22985.67 16795.02,-22987.96 16793.68,-22990.29 16792.4,-22992.66 16791.18,-22995.07 16790.03,-22997.5 16788.95,-22999.97 16787.93,-23002.47 16786.99,-23004.99 16786.11,-23007.54 16785.31,-23010.11 16784.58,-23012.7 16783.92,-23015.31 16783.33,-23017.94 16782.81,-23020.58 16782.37,-23023.24 16782,-23025.91 16781.7,-23028.59 16781.48,-23031.27 16781.33,-23033.96 16781.26,-23036.65 16781.25,-23038 16776.75,-23038 16776.76,-23036.59 16776.83,-23033.77 16776.99,-23030.96 16777.22,-23028.15 16777.53,-23025.35 16777.92,-23022.56 16778.38,-23019.78 16778.92,-23017.02 16779.54,-23014.27 16780.23,-23011.53 16781,-23008.82 16781.84,-23006.13 16782.75,-23003.47 16783.74,-23000.83 16784.8,-22998.22 16785.93,-22995.64 16787.14,-22993.09 16788.41,-22990.58 16789.75,-22988.1 16791.16,-22985.66 16792.63,-22983.26 16794.18,-22980.9 16795.78,-22978.58 16797.45,-22976.31 16799.18,-22974.09 16800.97,-22971.91 16802.82,-22969.79 16804.73,-22967.72 16806.7,-22965.7 16808.72,-22963.73 16810.79,-22961.82 16812.91,-22959.97 16815.09,-22958.18 16817.31,-22956.45 16819.58,-22954.78 16821.9,-22953.18 16824.26,-22951.63 16826.66,-22950.16 16829.1,-22948.75 16831.58,-22947.41 16834.09,-22946.14 16836.64,-22944.93 16839.22,-22943.8 16841.83,-22942.74 16844.47,-22941.75 16847.13,-22940.84 16849.82,-22940 16852.53,-22939.23 16855.27,-22938.54 16858.02,-22937.92 16860.78,-22937.38 16863.56,-22936.92 16866.35,-22936.53 16869.15,-22936.22 16871.96,-22935.99 16874.77,-22935.83 16877.59,-22935.76"/>
|
||||
<polygon id="000002B6361D9350" class="l101d251" points="16879,-22895.75 16879,-22980.25 16878.32,-22980.25 16876.97,-22980.28 16875.62,-22980.35 16874.27,-22980.44 16872.92,-22980.57 16871.57,-22980.73 16870.23,-22980.92 16868.9,-22981.14 16867.57,-22981.39 16866.24,-22981.68 16864.93,-22981.99 16863.62,-22982.34 16862.32,-22982.71 16861.03,-22983.12 16859.74,-22983.55 16858.47,-22984.02 16857.21,-22984.52 16855.96,-22985.04 16854.73,-22985.6 16853.51,-22986.18 16852.3,-22986.79 16851.11,-22987.43 16849.93,-22988.1 16848.77,-22988.79 16847.62,-22989.52 16846.49,-22990.27 16845.38,-22991.04 16844.29,-22991.84 16843.22,-22992.67 16842.17,-22993.52 16841.13,-22994.39 16840.12,-22995.29 16839.13,-22996.22 16838.16,-22997.16 16837.22,-22998.13 16836.29,-22999.12 16835.39,-23000.13 16834.52,-23001.17 16833.67,-23002.22 16832.84,-23003.29 16832.04,-23004.38 16831.27,-23005.49 16830.52,-23006.62 16829.79,-23007.77 16829.1,-23008.93 16828.43,-23010.11 16827.79,-23011.3 16827.18,-23012.51 16826.6,-23013.73 16826.04,-23014.96 16825.52,-23016.21 16825.02,-23017.47 16824.55,-23018.74 16824.12,-23020.03 16823.71,-23021.32 16823.34,-23022.62 16822.99,-23023.93 16822.68,-23025.24 16822.39,-23026.57 16822.14,-23027.9 16821.92,-23029.23 16821.73,-23030.57 16821.57,-23031.92 16821.44,-23033.27 16821.35,-23034.62 16821.28,-23035.97 16821.25,-23037.32 16821.25,-23038 16736.75,-23038 16736.76,-23036.33 16736.83,-23033 16736.99,-23029.67 16737.23,-23026.34 16737.54,-23023.02 16737.93,-23019.71 16738.4,-23016.41 16738.94,-23013.12 16739.56,-23009.84 16740.26,-23006.58 16741.04,-23003.33 16741.89,-23000.11 16742.81,-22996.91 16743.81,-22993.72 16744.89,-22990.57 16746.04,-22987.44 16747.26,-22984.33 16748.55,-22981.26 16749.92,-22978.22 16751.36,-22975.21 16752.86,-22972.23 16754.44,-22969.29 16756.08,-22966.39 16757.8,-22963.53 16759.58,-22960.71 16761.42,-22957.93 16763.33,-22955.2 16765.3,-22952.51 16767.34,-22949.87 16769.43,-22947.27 16771.59,-22944.73 16773.81,-22942.24 16776.08,-22939.8 16778.41,-22937.41 16780.8,-22935.08 16783.24,-22932.81 16785.73,-22930.59 16788.27,-22928.43 16790.87,-22926.34 16793.51,-22924.3 16796.2,-22922.33 16798.93,-22920.42 16801.71,-22918.58 16804.53,-22916.8 16807.39,-22915.08 16810.29,-22913.44 16813.23,-22911.86 16816.21,-22910.36 16819.22,-22908.92 16822.26,-22907.55 16825.33,-22906.26 16828.44,-22905.04 16831.57,-22903.89 16834.72,-22902.81 16837.91,-22901.81 16841.11,-22900.89 16844.33,-22900.04 16847.58,-22899.26 16850.84,-22898.56 16854.12,-22897.94 16857.41,-22897.4 16860.71,-22896.93 16864.02,-22896.54 16867.34,-22896.23 16870.67,-22895.99 16874,-22895.83 16877.33,-22895.76"/>
|
||||
<polygon id="000002B6361D8A20" class="l101d251" points="16879,-22895.75 16879,-22980.25 16878.32,-22980.25 16876.97,-22980.28 16875.62,-22980.35 16874.27,-22980.44 16872.92,-22980.57 16871.57,-22980.73 16870.23,-22980.92 16868.9,-22981.14 16867.57,-22981.39 16866.24,-22981.68 16864.93,-22981.99 16863.62,-22982.34 16862.32,-22982.71 16861.03,-22983.12 16859.74,-22983.55 16858.47,-22984.02 16857.21,-22984.52 16855.96,-22985.04 16854.73,-22985.6 16853.51,-22986.18 16852.3,-22986.79 16851.11,-22987.43 16849.93,-22988.1 16848.77,-22988.79 16847.62,-22989.52 16846.49,-22990.27 16845.38,-22991.04 16844.29,-22991.84 16843.22,-22992.67 16842.17,-22993.52 16841.13,-22994.39 16840.12,-22995.29 16839.13,-22996.22 16838.16,-22997.16 16837.22,-22998.13 16836.29,-22999.12 16835.39,-23000.13 16834.52,-23001.17 16833.67,-23002.22 16832.84,-23003.29 16832.04,-23004.38 16831.27,-23005.49 16830.52,-23006.62 16829.79,-23007.77 16829.1,-23008.93 16828.43,-23010.11 16827.79,-23011.3 16827.18,-23012.51 16826.6,-23013.73 16826.04,-23014.96 16825.52,-23016.21 16825.02,-23017.47 16824.55,-23018.74 16824.12,-23020.03 16823.71,-23021.32 16823.34,-23022.62 16822.99,-23023.93 16822.68,-23025.24 16822.39,-23026.57 16822.14,-23027.9 16821.92,-23029.23 16821.73,-23030.57 16821.57,-23031.92 16821.44,-23033.27 16821.35,-23034.62 16821.28,-23035.97 16821.25,-23037.32 16821.25,-23038 16736.75,-23038 16736.76,-23036.33 16736.83,-23033 16736.99,-23029.67 16737.23,-23026.34 16737.54,-23023.02 16737.93,-23019.71 16738.4,-23016.41 16738.94,-23013.12 16739.56,-23009.84 16740.26,-23006.58 16741.04,-23003.33 16741.89,-23000.11 16742.81,-22996.91 16743.81,-22993.72 16744.89,-22990.57 16746.04,-22987.44 16747.26,-22984.33 16748.55,-22981.26 16749.92,-22978.22 16751.36,-22975.21 16752.86,-22972.23 16754.44,-22969.29 16756.08,-22966.39 16757.8,-22963.53 16759.58,-22960.71 16761.42,-22957.93 16763.33,-22955.2 16765.3,-22952.51 16767.34,-22949.87 16769.43,-22947.27 16771.59,-22944.73 16773.81,-22942.24 16776.08,-22939.8 16778.41,-22937.41 16780.8,-22935.08 16783.24,-22932.81 16785.73,-22930.59 16788.27,-22928.43 16790.87,-22926.34 16793.51,-22924.3 16796.2,-22922.33 16798.93,-22920.42 16801.71,-22918.58 16804.53,-22916.8 16807.39,-22915.08 16810.29,-22913.44 16813.23,-22911.86 16816.21,-22910.36 16819.22,-22908.92 16822.26,-22907.55 16825.33,-22906.26 16828.44,-22905.04 16831.57,-22903.89 16834.72,-22902.81 16837.91,-22901.81 16841.11,-22900.89 16844.33,-22900.04 16847.58,-22899.26 16850.84,-22898.56 16854.12,-22897.94 16857.41,-22897.4 16860.71,-22896.93 16864.02,-22896.54 16867.34,-22896.23 16870.67,-22895.99 16874,-22895.83 16877.33,-22895.76"/>
|
||||
<polygon id="000002B6361D9660" class="l101d251" points="16879,-22895.75 16879,-22980.25 16878.32,-22980.25 16876.97,-22980.28 16875.62,-22980.35 16874.27,-22980.44 16872.92,-22980.57 16871.57,-22980.73 16870.23,-22980.92 16868.9,-22981.14 16867.57,-22981.39 16866.24,-22981.68 16864.93,-22981.99 16863.62,-22982.34 16862.32,-22982.71 16861.03,-22983.12 16859.74,-22983.55 16858.47,-22984.02 16857.21,-22984.52 16855.96,-22985.04 16854.73,-22985.6 16853.51,-22986.18 16852.3,-22986.79 16851.11,-22987.43 16849.93,-22988.1 16848.77,-22988.79 16847.62,-22989.52 16846.49,-22990.27 16845.38,-22991.04 16844.29,-22991.84 16843.22,-22992.67 16842.17,-22993.52 16841.13,-22994.39 16840.12,-22995.29 16839.13,-22996.22 16838.16,-22997.16 16837.22,-22998.13 16836.29,-22999.12 16835.39,-23000.13 16834.52,-23001.17 16833.67,-23002.22 16832.84,-23003.29 16832.04,-23004.38 16831.27,-23005.49 16830.52,-23006.62 16829.79,-23007.77 16829.1,-23008.93 16828.43,-23010.11 16827.79,-23011.3 16827.18,-23012.51 16826.6,-23013.73 16826.04,-23014.96 16825.52,-23016.21 16825.02,-23017.47 16824.55,-23018.74 16824.12,-23020.03 16823.71,-23021.32 16823.34,-23022.62 16822.99,-23023.93 16822.68,-23025.24 16822.39,-23026.57 16822.14,-23027.9 16821.92,-23029.23 16821.73,-23030.57 16821.57,-23031.92 16821.44,-23033.27 16821.35,-23034.62 16821.28,-23035.97 16821.25,-23037.32 16821.25,-23038 16736.75,-23038 16736.76,-23036.33 16736.83,-23033 16736.99,-23029.67 16737.23,-23026.34 16737.54,-23023.02 16737.93,-23019.71 16738.4,-23016.41 16738.94,-23013.12 16739.56,-23009.84 16740.26,-23006.58 16741.04,-23003.33 16741.89,-23000.11 16742.81,-22996.91 16743.81,-22993.72 16744.89,-22990.57 16746.04,-22987.44 16747.26,-22984.33 16748.55,-22981.26 16749.92,-22978.22 16751.36,-22975.21 16752.86,-22972.23 16754.44,-22969.29 16756.08,-22966.39 16757.8,-22963.53 16759.58,-22960.71 16761.42,-22957.93 16763.33,-22955.2 16765.3,-22952.51 16767.34,-22949.87 16769.43,-22947.27 16771.59,-22944.73 16773.81,-22942.24 16776.08,-22939.8 16778.41,-22937.41 16780.8,-22935.08 16783.24,-22932.81 16785.73,-22930.59 16788.27,-22928.43 16790.87,-22926.34 16793.51,-22924.3 16796.2,-22922.33 16798.93,-22920.42 16801.71,-22918.58 16804.53,-22916.8 16807.39,-22915.08 16810.29,-22913.44 16813.23,-22911.86 16816.21,-22910.36 16819.22,-22908.92 16822.26,-22907.55 16825.33,-22906.26 16828.44,-22905.04 16831.57,-22903.89 16834.72,-22902.81 16837.91,-22901.81 16841.11,-22900.89 16844.33,-22900.04 16847.58,-22899.26 16850.84,-22898.56 16854.12,-22897.94 16857.41,-22897.4 16860.71,-22896.93 16864.02,-22896.54 16867.34,-22896.23 16870.67,-22895.99 16874,-22895.83 16877.33,-22895.76"/>
|
||||
<polygon id="000002B6361D90B0" class="l101d251" points="16879,-22895.75 16879,-22980.25 16878.32,-22980.25 16876.97,-22980.28 16875.62,-22980.35 16874.27,-22980.44 16872.92,-22980.57 16871.57,-22980.73 16870.23,-22980.92 16868.9,-22981.14 16867.57,-22981.39 16866.24,-22981.68 16864.93,-22981.99 16863.62,-22982.34 16862.32,-22982.71 16861.03,-22983.12 16859.74,-22983.55 16858.47,-22984.02 16857.21,-22984.52 16855.96,-22985.04 16854.73,-22985.6 16853.51,-22986.18 16852.3,-22986.79 16851.11,-22987.43 16849.93,-22988.1 16848.77,-22988.79 16847.62,-22989.52 16846.49,-22990.27 16845.38,-22991.04 16844.29,-22991.84 16843.22,-22992.67 16842.17,-22993.52 16841.13,-22994.39 16840.12,-22995.29 16839.13,-22996.22 16838.16,-22997.16 16837.22,-22998.13 16836.29,-22999.12 16835.39,-23000.13 16834.52,-23001.17 16833.67,-23002.22 16832.84,-23003.29 16832.04,-23004.38 16831.27,-23005.49 16830.52,-23006.62 16829.79,-23007.77 16829.1,-23008.93 16828.43,-23010.11 16827.79,-23011.3 16827.18,-23012.51 16826.6,-23013.73 16826.04,-23014.96 16825.52,-23016.21 16825.02,-23017.47 16824.55,-23018.74 16824.12,-23020.03 16823.71,-23021.32 16823.34,-23022.62 16822.99,-23023.93 16822.68,-23025.24 16822.39,-23026.57 16822.14,-23027.9 16821.92,-23029.23 16821.73,-23030.57 16821.57,-23031.92 16821.44,-23033.27 16821.35,-23034.62 16821.28,-23035.97 16821.25,-23037.32 16821.25,-23038 16736.75,-23038 16736.76,-23036.33 16736.83,-23033 16736.99,-23029.67 16737.23,-23026.34 16737.54,-23023.02 16737.93,-23019.71 16738.4,-23016.41 16738.94,-23013.12 16739.56,-23009.84 16740.26,-23006.58 16741.04,-23003.33 16741.89,-23000.11 16742.81,-22996.91 16743.81,-22993.72 16744.89,-22990.57 16746.04,-22987.44 16747.26,-22984.33 16748.55,-22981.26 16749.92,-22978.22 16751.36,-22975.21 16752.86,-22972.23 16754.44,-22969.29 16756.08,-22966.39 16757.8,-22963.53 16759.58,-22960.71 16761.42,-22957.93 16763.33,-22955.2 16765.3,-22952.51 16767.34,-22949.87 16769.43,-22947.27 16771.59,-22944.73 16773.81,-22942.24 16776.08,-22939.8 16778.41,-22937.41 16780.8,-22935.08 16783.24,-22932.81 16785.73,-22930.59 16788.27,-22928.43 16790.87,-22926.34 16793.51,-22924.3 16796.2,-22922.33 16798.93,-22920.42 16801.71,-22918.58 16804.53,-22916.8 16807.39,-22915.08 16810.29,-22913.44 16813.23,-22911.86 16816.21,-22910.36 16819.22,-22908.92 16822.26,-22907.55 16825.33,-22906.26 16828.44,-22905.04 16831.57,-22903.89 16834.72,-22902.81 16837.91,-22901.81 16841.11,-22900.89 16844.33,-22900.04 16847.58,-22899.26 16850.84,-22898.56 16854.12,-22897.94 16857.41,-22897.4 16860.71,-22896.93 16864.02,-22896.54 16867.34,-22896.23 16870.67,-22895.99 16874,-22895.83 16877.33,-22895.76"/>
|
||||
<polygon id="000002B6361D9890" class="l101d251" points="16879,-22895.75 16879,-22980.25 16878.32,-22980.25 16876.97,-22980.28 16875.62,-22980.35 16874.27,-22980.44 16872.92,-22980.57 16871.57,-22980.73 16870.23,-22980.92 16868.9,-22981.14 16867.57,-22981.39 16866.24,-22981.68 16864.93,-22981.99 16863.62,-22982.34 16862.32,-22982.71 16861.03,-22983.12 16859.74,-22983.55 16858.47,-22984.02 16857.21,-22984.52 16855.96,-22985.04 16854.73,-22985.6 16853.51,-22986.18 16852.3,-22986.79 16851.11,-22987.43 16849.93,-22988.1 16848.77,-22988.79 16847.62,-22989.52 16846.49,-22990.27 16845.38,-22991.04 16844.29,-22991.84 16843.22,-22992.67 16842.17,-22993.52 16841.13,-22994.39 16840.12,-22995.29 16839.13,-22996.22 16838.16,-22997.16 16837.22,-22998.13 16836.29,-22999.12 16835.39,-23000.13 16834.52,-23001.17 16833.67,-23002.22 16832.84,-23003.29 16832.04,-23004.38 16831.27,-23005.49 16830.52,-23006.62 16829.79,-23007.77 16829.1,-23008.93 16828.43,-23010.11 16827.79,-23011.3 16827.18,-23012.51 16826.6,-23013.73 16826.04,-23014.96 16825.52,-23016.21 16825.02,-23017.47 16824.55,-23018.74 16824.12,-23020.03 16823.71,-23021.32 16823.34,-23022.62 16822.99,-23023.93 16822.68,-23025.24 16822.39,-23026.57 16822.14,-23027.9 16821.92,-23029.23 16821.73,-23030.57 16821.57,-23031.92 16821.44,-23033.27 16821.35,-23034.62 16821.28,-23035.97 16821.25,-23037.32 16821.25,-23038 16736.75,-23038 16736.76,-23036.33 16736.83,-23033 16736.99,-23029.67 16737.23,-23026.34 16737.54,-23023.02 16737.93,-23019.71 16738.4,-23016.41 16738.94,-23013.12 16739.56,-23009.84 16740.26,-23006.58 16741.04,-23003.33 16741.89,-23000.11 16742.81,-22996.91 16743.81,-22993.72 16744.89,-22990.57 16746.04,-22987.44 16747.26,-22984.33 16748.55,-22981.26 16749.92,-22978.22 16751.36,-22975.21 16752.86,-22972.23 16754.44,-22969.29 16756.08,-22966.39 16757.8,-22963.53 16759.58,-22960.71 16761.42,-22957.93 16763.33,-22955.2 16765.3,-22952.51 16767.34,-22949.87 16769.43,-22947.27 16771.59,-22944.73 16773.81,-22942.24 16776.08,-22939.8 16778.41,-22937.41 16780.8,-22935.08 16783.24,-22932.81 16785.73,-22930.59 16788.27,-22928.43 16790.87,-22926.34 16793.51,-22924.3 16796.2,-22922.33 16798.93,-22920.42 16801.71,-22918.58 16804.53,-22916.8 16807.39,-22915.08 16810.29,-22913.44 16813.23,-22911.86 16816.21,-22910.36 16819.22,-22908.92 16822.26,-22907.55 16825.33,-22906.26 16828.44,-22905.04 16831.57,-22903.89 16834.72,-22902.81 16837.91,-22901.81 16841.11,-22900.89 16844.33,-22900.04 16847.58,-22899.26 16850.84,-22898.56 16854.12,-22897.94 16857.41,-22897.4 16860.71,-22896.93 16864.02,-22896.54 16867.34,-22896.23 16870.67,-22895.99 16874,-22895.83 16877.33,-22895.76"/>
|
||||
<polygon id="000002B6361D9270" class="l101d251" points="16879,-22895.75 16879,-22980.25 16878.32,-22980.25 16876.97,-22980.28 16875.62,-22980.35 16874.27,-22980.44 16872.92,-22980.57 16871.57,-22980.73 16870.23,-22980.92 16868.9,-22981.14 16867.57,-22981.39 16866.24,-22981.68 16864.93,-22981.99 16863.62,-22982.34 16862.32,-22982.71 16861.03,-22983.12 16859.74,-22983.55 16858.47,-22984.02 16857.21,-22984.52 16855.96,-22985.04 16854.73,-22985.6 16853.51,-22986.18 16852.3,-22986.79 16851.11,-22987.43 16849.93,-22988.1 16848.77,-22988.79 16847.62,-22989.52 16846.49,-22990.27 16845.38,-22991.04 16844.29,-22991.84 16843.22,-22992.67 16842.17,-22993.52 16841.13,-22994.39 16840.12,-22995.29 16839.13,-22996.22 16838.16,-22997.16 16837.22,-22998.13 16836.29,-22999.12 16835.39,-23000.13 16834.52,-23001.17 16833.67,-23002.22 16832.84,-23003.29 16832.04,-23004.38 16831.27,-23005.49 16830.52,-23006.62 16829.79,-23007.77 16829.1,-23008.93 16828.43,-23010.11 16827.79,-23011.3 16827.18,-23012.51 16826.6,-23013.73 16826.04,-23014.96 16825.52,-23016.21 16825.02,-23017.47 16824.55,-23018.74 16824.12,-23020.03 16823.71,-23021.32 16823.34,-23022.62 16822.99,-23023.93 16822.68,-23025.24 16822.39,-23026.57 16822.14,-23027.9 16821.92,-23029.23 16821.73,-23030.57 16821.57,-23031.92 16821.44,-23033.27 16821.35,-23034.62 16821.28,-23035.97 16821.25,-23037.32 16821.25,-23038 16736.75,-23038 16736.76,-23036.33 16736.83,-23033 16736.99,-23029.67 16737.23,-23026.34 16737.54,-23023.02 16737.93,-23019.71 16738.4,-23016.41 16738.94,-23013.12 16739.56,-23009.84 16740.26,-23006.58 16741.04,-23003.33 16741.89,-23000.11 16742.81,-22996.91 16743.81,-22993.72 16744.89,-22990.57 16746.04,-22987.44 16747.26,-22984.33 16748.55,-22981.26 16749.92,-22978.22 16751.36,-22975.21 16752.86,-22972.23 16754.44,-22969.29 16756.08,-22966.39 16757.8,-22963.53 16759.58,-22960.71 16761.42,-22957.93 16763.33,-22955.2 16765.3,-22952.51 16767.34,-22949.87 16769.43,-22947.27 16771.59,-22944.73 16773.81,-22942.24 16776.08,-22939.8 16778.41,-22937.41 16780.8,-22935.08 16783.24,-22932.81 16785.73,-22930.59 16788.27,-22928.43 16790.87,-22926.34 16793.51,-22924.3 16796.2,-22922.33 16798.93,-22920.42 16801.71,-22918.58 16804.53,-22916.8 16807.39,-22915.08 16810.29,-22913.44 16813.23,-22911.86 16816.21,-22910.36 16819.22,-22908.92 16822.26,-22907.55 16825.33,-22906.26 16828.44,-22905.04 16831.57,-22903.89 16834.72,-22902.81 16837.91,-22901.81 16841.11,-22900.89 16844.33,-22900.04 16847.58,-22899.26 16850.84,-22898.56 16854.12,-22897.94 16857.41,-22897.4 16860.71,-22896.93 16864.02,-22896.54 16867.34,-22896.23 16870.67,-22895.99 16874,-22895.83 16877.33,-22895.76"/>
|
||||
<use transform="translate(15115 -25315)" xlink:href="#1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2"/>
|
||||
<use transform="translate(17164 -22938)" xlink:href="#1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2_405"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 64 KiB |
@@ -0,0 +1,55 @@
|
||||
# =============================================
|
||||
# mxPIC Cell/Project Definition File
|
||||
# =============================================
|
||||
schema_version: "2.0.0"
|
||||
kind: cell
|
||||
coordinate_system: gds_y_up
|
||||
canvas_size:
|
||||
width: 5000
|
||||
height: 5000
|
||||
project: mxpic_project_1
|
||||
name: mxpic_project_1
|
||||
type: project
|
||||
version: "1.0.0"
|
||||
|
||||
# 1. External Ports (How this cell connects to the outside world)
|
||||
ports: []
|
||||
|
||||
# 2. Instances (The sub-components dropped onto this canvas)
|
||||
instances:
|
||||
MMI_1:
|
||||
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2
|
||||
x: 1511.5
|
||||
y: -2531.5
|
||||
rotation: 0.0
|
||||
flip: 0
|
||||
flop: 0
|
||||
mirror: false
|
||||
settings:
|
||||
length:
|
||||
|
||||
MMI_2:
|
||||
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2
|
||||
x: 1716.4
|
||||
y: -2293.8
|
||||
rotation: 0.0
|
||||
flip: 0
|
||||
flop: 0
|
||||
mirror: false
|
||||
settings:
|
||||
length:
|
||||
|
||||
elements: {}
|
||||
|
||||
# 3. Bundles (Grouped links for multi-bus/parallel routing)
|
||||
bundles:
|
||||
output_bus:
|
||||
routing_type: euler_bend
|
||||
links:
|
||||
- from: MMI_2:a1
|
||||
to: MMI_1:b2
|
||||
xsection: strip
|
||||
family: optical
|
||||
width: 0.45
|
||||
radius: 10
|
||||
routing_type: euler_bend
|
||||
Binary file not shown.
+107
-10
@@ -10,6 +10,8 @@
|
||||
const DEFAULT_COMPONENT_BOX_SIZE = { width: 132, height: 82 };
|
||||
const DEFAULT_CANVAS_SIZE = { width: 5000, height: 5000 };
|
||||
const PORT_NODE_SIZE = 30;
|
||||
const ANCHOR_NODE_WIDTH = 8;
|
||||
const DEFAULT_ELEMENT_PITCH = 10;
|
||||
const ELEMENT_COMPONENTS = {
|
||||
Port: {
|
||||
name: 'Port',
|
||||
@@ -22,8 +24,8 @@
|
||||
name: 'Anchor',
|
||||
elementType: 'anchor',
|
||||
ports: {
|
||||
left: { x: 0, y: -PORT_NODE_SIZE / 2, a: 180, width: 0.5 },
|
||||
right: { x: PORT_NODE_SIZE, y: -PORT_NODE_SIZE / 2, a: 0, width: 0.5 }
|
||||
a1: { x: 0, y: -PORT_NODE_SIZE / 2, a: 180, width: 0.5 },
|
||||
b1: { x: 0, y: -PORT_NODE_SIZE / 2, a: 0, width: 0.5 }
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -514,19 +516,64 @@
|
||||
const isPortElementNode = (node) => node && (node.data && node.data.elementType === 'port' || node.id === 'page-port' || node.type === 'portNode');
|
||||
const isElementNode = (node) => node && node.data && (node.data.elementType === 'port' || node.data.elementType === 'anchor');
|
||||
|
||||
const normalizePortNumber = (value) => {
|
||||
const number = Math.floor(Number(value));
|
||||
return Number.isFinite(number) ? Math.max(1, number) : 1;
|
||||
};
|
||||
|
||||
const normalizePitch = (value) => {
|
||||
const number = Number(value);
|
||||
return Number.isFinite(number) ? Math.max(0, number) : DEFAULT_ELEMENT_PITCH;
|
||||
};
|
||||
|
||||
const elementPortOffset = (index, count, pitch) => ((count - 1) / 2 - index) * pitch;
|
||||
|
||||
const buildElementBoxSize = (data) => {
|
||||
const portNumber = normalizePortNumber(data && data.portNumber);
|
||||
const pitch = normalizePitch(data && data.pitch);
|
||||
const handleClearance = Math.max(pitch, 14);
|
||||
return {
|
||||
width: data && data.elementType === 'anchor' ? ANCHOR_NODE_WIDTH : PORT_NODE_SIZE,
|
||||
height: Math.max(PORT_NODE_SIZE, PORT_NODE_SIZE + Math.max(0, portNumber - 1) * handleClearance)
|
||||
};
|
||||
};
|
||||
|
||||
const buildElementPorts = (elementType, data) => {
|
||||
const element = ELEMENT_COMPONENTS[elementType === 'anchor' ? 'Anchor' : 'Port'];
|
||||
if (!element) return {};
|
||||
const portNumber = normalizePortNumber(data && data.portNumber);
|
||||
const pitch = normalizePitch(data && data.pitch);
|
||||
const width = Number((data && data.width) || 0.5);
|
||||
if (element.elementType === 'port') {
|
||||
if (portNumber > 1) {
|
||||
return Object.fromEntries(Array.from({ length: portNumber }, (_, index) => [
|
||||
`port_${index + 1}`,
|
||||
{
|
||||
x: 0,
|
||||
y: elementPortOffset(index, portNumber, pitch),
|
||||
a: Number((data && (data.angle ?? data.a)) ?? 0),
|
||||
width
|
||||
}
|
||||
]));
|
||||
}
|
||||
return {
|
||||
port: {
|
||||
x: 0,
|
||||
y: 0,
|
||||
a: Number((data && (data.angle ?? data.a)) ?? 0),
|
||||
width: Number((data && data.width) || 0.5)
|
||||
width
|
||||
}
|
||||
};
|
||||
}
|
||||
if (portNumber > 1) {
|
||||
const entries = [];
|
||||
Array.from({ length: portNumber }, (_, index) => {
|
||||
const y = -PORT_NODE_SIZE / 2 + elementPortOffset(index, portNumber, pitch);
|
||||
entries.push([`a${index + 1}`, { x: 0, y, a: 180, width }]);
|
||||
entries.push([`b${index + 1}`, { x: 0, y, a: 0, width }]);
|
||||
});
|
||||
return Object.fromEntries(entries);
|
||||
}
|
||||
return JSON.parse(JSON.stringify(element.ports));
|
||||
};
|
||||
|
||||
@@ -598,12 +645,24 @@
|
||||
if (portNodes.length > 0) {
|
||||
return portNodes.reduce((ports, node) => {
|
||||
const data = node.data || {};
|
||||
ports[getNodePortName(node)] = {
|
||||
const baseName = getNodePortName(node);
|
||||
const elementPorts = buildElementPorts('port', data);
|
||||
const entries = Object.entries(elementPorts);
|
||||
entries.forEach(([portName, portInfo]) => {
|
||||
const exportName = entries.length === 1
|
||||
? baseName
|
||||
: `${baseName}_${portName.replace(/^port_/, '')}`;
|
||||
const point = getNodePortCanvasPoint(node, portName) || {
|
||||
x: Number((node.position && node.position.x) || 0),
|
||||
y: Number((node.position && node.position.y) || 0),
|
||||
a: Number(data.angle ?? data.a ?? 0),
|
||||
width: Number(data.width || 0.5)
|
||||
y: Number((node.position && node.position.y) || 0)
|
||||
};
|
||||
ports[exportName] = {
|
||||
x: Number(point.x || 0),
|
||||
y: Number(point.y || 0),
|
||||
a: Number(portInfo.a ?? data.angle ?? data.a ?? 0),
|
||||
width: Number(portInfo.width || data.width || 0.5)
|
||||
};
|
||||
});
|
||||
return ports;
|
||||
}, {});
|
||||
}
|
||||
@@ -645,11 +704,15 @@
|
||||
const data = node.data || {};
|
||||
const name = data.componentDisplayName || data.portName || node.id;
|
||||
const angle = data.elementType === 'port' ? data.angle : data.rotation;
|
||||
const portNumber = normalizePortNumber(data.portNumber);
|
||||
const pitch = normalizePitch(data.pitch);
|
||||
return ` ${name}:
|
||||
type: ${data.elementType}
|
||||
x: ${Number((node.position && node.position.x) || 0).toFixed(1)}
|
||||
y: ${canvasToLayoutY((node.position && node.position.y) || 0).toFixed(1)}
|
||||
angle: ${Number(angle || 0).toFixed(1)}
|
||||
port_number: ${portNumber}
|
||||
pitch: ${Number(pitch)}
|
||||
layer: ${data.layer || 'WG_CORE'}
|
||||
width: ${Number(data.width || 0.5)}
|
||||
description: ${toYamlScalar(data.description || '')}`;
|
||||
@@ -718,7 +781,28 @@ ${linksYaml}`;
|
||||
const x = Number((node.position && node.position.x) || 0);
|
||||
const y = Number((node.position && node.position.y) || 0);
|
||||
if (node.type === 'portNode' || (node.data && node.data.elementType === 'port')) {
|
||||
return { x: roundMeasureValue(x), y: roundMeasureValue(y) };
|
||||
const ports = buildElementPorts('port', node.data);
|
||||
const portInfo = ports && portName ? ports[portName] : ports.port;
|
||||
if (!portInfo) return { x: roundMeasureValue(x), y: roundMeasureValue(y) };
|
||||
const transformedInfo = transformPortInfo(portInfo, { rotation: 0 });
|
||||
return {
|
||||
x: roundMeasureValue(x + Number(transformedInfo.x || 0)),
|
||||
y: roundMeasureValue(y - Number(transformedInfo.y || 0))
|
||||
};
|
||||
}
|
||||
if (node.type === 'anchorNode' || (node.data && node.data.elementType === 'anchor')) {
|
||||
const ports = buildElementPorts('anchor', node.data);
|
||||
const portInfo = ports && portName ? ports[portName] : null;
|
||||
if (!portInfo) return null;
|
||||
const transformedInfo = transformPortInfo(portInfo, {
|
||||
rotation: (node.data && node.data.rotation) || 0,
|
||||
flip: Boolean(node.data && node.data.flip),
|
||||
flop: Boolean(node.data && node.data.flop)
|
||||
});
|
||||
return {
|
||||
x: roundMeasureValue(x + Number(transformedInfo.x || 0)),
|
||||
y: roundMeasureValue(y - Number(transformedInfo.y || 0))
|
||||
};
|
||||
}
|
||||
const ports = node.data && node.data.ports;
|
||||
const portInfo = ports && portName ? ports[portName] : null;
|
||||
@@ -758,7 +842,9 @@ ${linksYaml}`;
|
||||
});
|
||||
const handle = handles.find(item => item.name === handleId);
|
||||
if (handle) {
|
||||
const componentSize = normalizeBoxSize({ box_size: node.data && node.data.boxSize }, DEFAULT_COMPONENT_BOX_SIZE);
|
||||
const componentSize = node.data && node.data.elementType
|
||||
? buildElementBoxSize(node.data)
|
||||
: normalizeBoxSize({ box_size: node.data && node.data.boxSize }, DEFAULT_COMPONENT_BOX_SIZE);
|
||||
let x = Number((node.position && node.position.x) || 0);
|
||||
let y = Number((node.position && node.position.y) || 0);
|
||||
if (handle.position === 'left') {
|
||||
@@ -825,14 +911,23 @@ ${linksYaml}`;
|
||||
return o1 !== o2 && o3 !== o4;
|
||||
};
|
||||
|
||||
const routeTypeKey = (route) => {
|
||||
const xsection = String((route && route.xsection) || '').trim().toLowerCase();
|
||||
if (xsection === 'metal1') return 'metal_1';
|
||||
if (xsection === 'metal2') return 'metal_2';
|
||||
if (xsection === 'rib') return 'rib_low';
|
||||
return xsection;
|
||||
};
|
||||
|
||||
const findSameTypeRouteCrossing = (candidateEdge, existingEdges, nodeMap, manifest) => {
|
||||
const candidateRoute = createRouteSettings(manifest, candidateEdge.data && candidateEdge.data.route);
|
||||
const candidateType = routeTypeKey(candidateRoute);
|
||||
const candidatePoints = getEdgeRoutePoints(candidateEdge, nodeMap);
|
||||
for (const edge of existingEdges || []) {
|
||||
if (!edge || edge.id === candidateEdge.id) continue;
|
||||
if (edge.source === candidateEdge.source || edge.source === candidateEdge.target || edge.target === candidateEdge.source || edge.target === candidateEdge.target) continue;
|
||||
const route = createRouteSettings(manifest, edge.data && edge.data.route);
|
||||
if (route.xsection !== candidateRoute.xsection) continue;
|
||||
if (routeTypeKey(route) !== candidateType) continue;
|
||||
const points = getEdgeRoutePoints(edge, nodeMap);
|
||||
if (routeSegmentsIntersect(candidatePoints, points)) {
|
||||
return { conflictEdge: edge, xsection: route.xsection };
|
||||
@@ -849,6 +944,7 @@ ${linksYaml}`;
|
||||
DEFAULT_COMPONENT_BOX_SIZE,
|
||||
DEFAULT_CANVAS_SIZE,
|
||||
PORT_NODE_SIZE,
|
||||
DEFAULT_ELEMENT_PITCH,
|
||||
ELEMENT_COMPONENTS,
|
||||
BASIC_COMPONENTS,
|
||||
DEFAULT_FORGE_ARGUMENTS,
|
||||
@@ -878,6 +974,7 @@ ${linksYaml}`;
|
||||
getNodePortCanvasPoint,
|
||||
buildPortHandles,
|
||||
buildElementPorts,
|
||||
buildElementBoxSize,
|
||||
buildBasicComponentPorts,
|
||||
getBasicComponentMetadata,
|
||||
buildInstanceYaml,
|
||||
|
||||
+303
-38
@@ -1433,6 +1433,7 @@
|
||||
DEFAULT_COMPONENT_BOX_SIZE,
|
||||
DEFAULT_CANVAS_SIZE,
|
||||
PORT_NODE_SIZE,
|
||||
DEFAULT_ELEMENT_PITCH,
|
||||
ELEMENT_COMPONENTS,
|
||||
BASIC_COMPONENTS,
|
||||
createForgeArguments,
|
||||
@@ -1446,6 +1447,7 @@
|
||||
calculateLayoutBounds,
|
||||
buildPortHandles,
|
||||
buildElementPorts,
|
||||
buildElementBoxSize,
|
||||
getBasicComponentMetadata,
|
||||
buildInstancesYaml,
|
||||
buildPageComponentPorts,
|
||||
@@ -1703,10 +1705,29 @@
|
||||
|
||||
const PortNode = ({ id, data, selected }) => {
|
||||
const angle = data.angle ?? 0;
|
||||
const handleId = data.portName || data.componentDisplayName || 'port';
|
||||
const ports = buildElementPorts('port', data);
|
||||
const elementSize = buildElementBoxSize(data);
|
||||
const localHandlePorts = Object.fromEntries(
|
||||
Object.entries(ports).map(([name, info]) => [name, { ...info, a: 0 }])
|
||||
);
|
||||
const portHandles = useMemo(
|
||||
() => buildPortHandles(localHandlePorts, { rotation: 0 }),
|
||||
[localHandlePorts]
|
||||
);
|
||||
const handlePositionMap = {
|
||||
left: Position.Left,
|
||||
right: Position.Right,
|
||||
top: Position.Top,
|
||||
bottom: Position.Bottom
|
||||
};
|
||||
const baseHandleStyle = {
|
||||
background: 'var(--accent)',
|
||||
width: 8,
|
||||
height: 8
|
||||
};
|
||||
return (
|
||||
<div style={{
|
||||
width: PORT_NODE_SIZE, height: PORT_NODE_SIZE, borderRadius: '50%',
|
||||
width: elementSize.width, height: elementSize.height, borderRadius: 999,
|
||||
background: selected ? 'var(--accent)' : 'var(--bg-card)',
|
||||
border: selected ? '2px solid white' : '2px solid var(--accent)',
|
||||
display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center',
|
||||
@@ -1716,18 +1737,32 @@
|
||||
transform: `rotate(${angle}deg)`,
|
||||
}}>
|
||||
<span>P</span>
|
||||
<Handle type="source" position={Position.Right} id={handleId} style={{ background: 'var(--accent)', width: 8, height: 8 }} />
|
||||
<Handle type="target" position={Position.Right} id={handleId} style={{ background: 'var(--accent)', width: 8, height: 8 }} />
|
||||
{portHandles.map((portHandle) => (
|
||||
<React.Fragment key={portHandle.name}>
|
||||
<Handle type="source" position={handlePositionMap[portHandle.position]} id={portHandle.name} style={{ ...baseHandleStyle, ...portHandle.style }} />
|
||||
<Handle type="target" position={handlePositionMap[portHandle.position]} id={portHandle.name} style={{ ...baseHandleStyle, ...portHandle.style }} />
|
||||
</React.Fragment>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
const AnchorNode = memo(({ id, data, selected }) => {
|
||||
const updateNodeInternals = useUpdateNodeInternals();
|
||||
const ports = data.ports || buildElementPorts('anchor');
|
||||
const anchorRotation = data.rotation || 0;
|
||||
const anchorVisualRotation = -Number(anchorRotation || 0);
|
||||
const ports = buildElementPorts('anchor', data);
|
||||
const elementSize = buildElementBoxSize(data);
|
||||
const localAnchorHandlePorts = Object.fromEntries(
|
||||
Object.entries(ports).map(([name, info]) => [name, { ...info, a: name.startsWith('a') || name.startsWith('left') ? 180 : 0 }])
|
||||
);
|
||||
const portHandles = useMemo(
|
||||
() => buildPortHandles(ports, { rotation: data.rotation || 0, flip: Boolean(data.flip), flop: Boolean(data.flop) }),
|
||||
[ports, data.rotation, data.flip, data.flop]
|
||||
() => buildPortHandles(localAnchorHandlePorts, { rotation: 0, flip: Boolean(data.flip), flop: Boolean(data.flop) }),
|
||||
[localAnchorHandlePorts, data.flip, data.flop]
|
||||
);
|
||||
const anchorDirectionHandles = useMemo(
|
||||
() => new Map(buildPortHandles(localAnchorHandlePorts, { rotation: Number(anchorRotation || 0), flip: Boolean(data.flip), flop: Boolean(data.flop) }).map(handle => [handle.name, handle.position])),
|
||||
[localAnchorHandlePorts, anchorRotation, data.flip, data.flop]
|
||||
);
|
||||
const handlePositionMap = {
|
||||
left: Position.Left,
|
||||
@@ -1742,6 +1777,32 @@
|
||||
border: '1px solid var(--bg-main)',
|
||||
borderRadius: '50%'
|
||||
};
|
||||
const anchorPortVisualSide = (portName) => {
|
||||
const name = String(portName || '');
|
||||
return name.startsWith('a') || name.startsWith('left') ? 'left' : 'right';
|
||||
};
|
||||
const anchorPortVisualTop = (portName) => {
|
||||
const match = String(portName || '').match(/(\d+)$/);
|
||||
const index = match ? Math.max(1, Number(match[1])) : 1;
|
||||
const portCount = Math.max(1, Math.floor(Number(data.portNumber || 1)));
|
||||
if (portCount <= 1) return elementSize.height / 2;
|
||||
const travel = Math.max(0, elementSize.height - baseHandleStyle.height);
|
||||
return baseHandleStyle.height / 2 + ((index - 1) / (portCount - 1)) * travel;
|
||||
};
|
||||
const anchorHandleVisualStyle = (portHandle, zIndex) => {
|
||||
const visualSide = anchorPortVisualSide(portHandle.name);
|
||||
const localLeft = visualSide === 'left' ? 0 : elementSize.width;
|
||||
const localTop = anchorPortVisualTop(portHandle.name);
|
||||
return {
|
||||
...baseHandleStyle,
|
||||
zIndex,
|
||||
left: localLeft,
|
||||
top: localTop,
|
||||
right: 'auto',
|
||||
bottom: 'auto',
|
||||
transform: 'translate(-50%, -50%)'
|
||||
};
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
updateNodeInternals(id);
|
||||
@@ -1750,9 +1811,9 @@
|
||||
return (
|
||||
<div style={{
|
||||
position: 'relative',
|
||||
width: PORT_NODE_SIZE,
|
||||
height: PORT_NODE_SIZE,
|
||||
borderRadius: '50%',
|
||||
width: elementSize.width,
|
||||
height: elementSize.height,
|
||||
borderRadius: 999,
|
||||
background: selected ? 'var(--accent)' : 'var(--bg-card)',
|
||||
border: selected ? '2px solid white' : '2px solid var(--accent)',
|
||||
display: 'flex',
|
||||
@@ -1762,23 +1823,24 @@
|
||||
fontSize: 10,
|
||||
fontWeight: 800,
|
||||
boxShadow: selected ? '0 0 10px rgba(56,189,248,0.4)' : 'none',
|
||||
transform: `rotate(${anchorVisualRotation}deg)`,
|
||||
}}>
|
||||
<span>A</span>
|
||||
{portHandles.map((portHandle) => (
|
||||
<React.Fragment key={portHandle.name}>
|
||||
<Handle
|
||||
type="source"
|
||||
position={handlePositionMap[portHandle.position]}
|
||||
position={handlePositionMap[anchorDirectionHandles.get(portHandle.name) || portHandle.position]}
|
||||
id={portHandle.name}
|
||||
title={portHandle.name}
|
||||
style={{ ...baseHandleStyle, ...portHandle.style, zIndex: 10 }}
|
||||
style={anchorHandleVisualStyle(portHandle, 10)}
|
||||
/>
|
||||
<Handle
|
||||
type="target"
|
||||
position={handlePositionMap[portHandle.position]}
|
||||
position={handlePositionMap[anchorDirectionHandles.get(portHandle.name) || portHandle.position]}
|
||||
id={portHandle.name}
|
||||
title={portHandle.name}
|
||||
style={{ ...baseHandleStyle, ...portHandle.style, zIndex: 5 }}
|
||||
style={anchorHandleVisualStyle(portHandle, 5)}
|
||||
/>
|
||||
</React.Fragment>
|
||||
))}
|
||||
@@ -1814,9 +1876,25 @@
|
||||
</div>
|
||||
));
|
||||
|
||||
const routeDirectionVector = (direction) => {
|
||||
if (direction === 'left') return { x: -1, y: 0 };
|
||||
if (direction === 'right') return { x: 1, y: 0 };
|
||||
if (direction === 'top') return { x: 0, y: -1 };
|
||||
if (direction === 'bottom') return { x: 0, y: 1 };
|
||||
return null;
|
||||
};
|
||||
const directionToReactFlowPosition = (direction) => {
|
||||
if (direction === 'left') return Position.Left;
|
||||
if (direction === 'right') return Position.Right;
|
||||
if (direction === 'top') return Position.Top;
|
||||
if (direction === 'bottom') return Position.Bottom;
|
||||
return undefined;
|
||||
};
|
||||
|
||||
const ParallelRouteEdge = memo(({ id, sourceX, sourceY, targetX, targetY, markerEnd, style, selected, data }) => {
|
||||
const offset = Number(data?.parallelOffset || 0);
|
||||
let rawPoints = Array.isArray(data?.points) && data.points.length >= 2
|
||||
const hasExplicitPoints = Array.isArray(data?.points) && data.points.length >= 2;
|
||||
let rawPoints = hasExplicitPoints
|
||||
? data.points.map(point => ({ x: Number(point.x), y: Number(point.y) })).filter(point => Number.isFinite(point.x) && Number.isFinite(point.y))
|
||||
: [{ x: sourceX, y: sourceY }, { x: targetX, y: targetY }];
|
||||
if (!data?.freeRoute && rawPoints.length >= 2) {
|
||||
@@ -1828,6 +1906,20 @@
|
||||
{ x: Number(targetPoint.x), y: Number(targetPoint.y) }
|
||||
];
|
||||
}
|
||||
const sourceVector = routeDirectionVector(data?.sourceDirection);
|
||||
const targetVector = routeDirectionVector(data?.targetDirection);
|
||||
if (!hasExplicitPoints && (sourceVector || targetVector) && rawPoints.length >= 2) {
|
||||
const stubLength = Math.min(48, Math.max(18, Math.hypot(targetX - sourceX, targetY - sourceY) / 4));
|
||||
const directedPoints = [rawPoints[0]];
|
||||
if (sourceVector) {
|
||||
directedPoints.push({ x: rawPoints[0].x + sourceVector.x * stubLength, y: rawPoints[0].y + sourceVector.y * stubLength });
|
||||
}
|
||||
if (targetVector) {
|
||||
directedPoints.push({ x: rawPoints[1].x + targetVector.x * stubLength, y: rawPoints[1].y + targetVector.y * stubLength });
|
||||
}
|
||||
directedPoints.push(rawPoints[1]);
|
||||
rawPoints = directedPoints;
|
||||
}
|
||||
const firstPoint = rawPoints[0] || { x: sourceX, y: sourceY };
|
||||
const lastPoint = rawPoints[rawPoints.length - 1] || { x: targetX, y: targetY };
|
||||
const dx = lastPoint.x - firstPoint.x;
|
||||
@@ -2543,7 +2635,7 @@
|
||||
if (selectedNode) {
|
||||
setLocalX(selectedNode.position.x.toFixed(3));
|
||||
setLocalY(selectedNode.position.y.toFixed(3));
|
||||
const rot = selectedNode.id === 'page-port'
|
||||
const rot = selectedNode.id === 'page-port' || selectedNode.type === 'portNode' || selectedNode.data?.elementType === 'port'
|
||||
? (selectedNode.data?.angle ?? 0)
|
||||
: (selectedNode.data?.rotation ?? 0);
|
||||
setLocalRotation(rot.toFixed(3));
|
||||
@@ -2722,12 +2814,19 @@
|
||||
|
||||
const updatePortField = (key, value, type = 'text') => {
|
||||
if (!selectedNode) return;
|
||||
const nextValue = type === 'number' ? Number(value || 0) : value;
|
||||
let nextValue = type === 'number' ? Number(value || 0) : value;
|
||||
if (key === 'portNumber') nextValue = Math.max(1, Math.floor(nextValue || 1));
|
||||
if (key === 'pitch') nextValue = Math.max(0, Number(nextValue || 0));
|
||||
const dataUpdate = { [key]: nextValue };
|
||||
if (key === 'portName') {
|
||||
dataUpdate.componentDisplayName = value || selectedNode.data?.componentDisplayName;
|
||||
dataUpdate.label = value || selectedNode.data?.label;
|
||||
}
|
||||
if (key === 'portNumber' || key === 'pitch' || key === 'width') {
|
||||
const nextData = { ...selectedNode.data, ...dataUpdate };
|
||||
dataUpdate.ports = buildElementPorts(selectedNode.data?.elementType === 'anchor' ? 'anchor' : 'port', nextData);
|
||||
dataUpdate.boxSize = buildElementBoxSize(nextData);
|
||||
}
|
||||
onUpdateNode(selectedNode.id, { data: dataUpdate });
|
||||
};
|
||||
|
||||
@@ -2819,7 +2918,7 @@
|
||||
updateRotation(selectedNode.id, val, selectedNode.type === 'portNode' || selectedNode.data?.elementType === 'port');
|
||||
setLocalRotation(val.toFixed(3));
|
||||
} else if (selectedNode) {
|
||||
const rot = selectedNode.id === 'page-port'
|
||||
const rot = selectedNode.id === 'page-port' || selectedNode.type === 'portNode' || selectedNode.data?.elementType === 'port'
|
||||
? (selectedNode.data?.angle ?? 0)
|
||||
: (selectedNode.data?.rotation ?? 0);
|
||||
setLocalRotation(rot.toFixed(3));
|
||||
@@ -2893,6 +2992,24 @@
|
||||
value={selectedNode.data?.width ?? 0.5}
|
||||
onChange={(event) => updatePortField('width', event.target.value, 'number')}
|
||||
/>
|
||||
<br /><br />
|
||||
<label>Port Number</label>
|
||||
<input
|
||||
type="number"
|
||||
min="1"
|
||||
step="1"
|
||||
value={selectedNode.data?.portNumber ?? 1}
|
||||
onChange={(event) => updatePortField('portNumber', event.target.value, 'number')}
|
||||
/>
|
||||
<br /><br />
|
||||
<label>Pitch</label>
|
||||
<input
|
||||
type="number"
|
||||
min="0"
|
||||
step="1"
|
||||
value={selectedNode.data?.pitch ?? DEFAULT_ELEMENT_PITCH}
|
||||
onChange={(event) => updatePortField('pitch', event.target.value, 'number')}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -2914,6 +3031,24 @@
|
||||
value={selectedNode.data?.description || ''}
|
||||
onChange={(event) => onUpdateNode(selectedNode.id, { data: { description: event.target.value } })}
|
||||
/>
|
||||
<br /><br />
|
||||
<label>Port Number</label>
|
||||
<input
|
||||
type="number"
|
||||
min="1"
|
||||
step="1"
|
||||
value={selectedNode.data?.portNumber ?? 1}
|
||||
onChange={(event) => updatePortField('portNumber', event.target.value, 'number')}
|
||||
/>
|
||||
<br /><br />
|
||||
<label>Pitch</label>
|
||||
<input
|
||||
type="number"
|
||||
min="0"
|
||||
step="1"
|
||||
value={selectedNode.data?.pitch ?? DEFAULT_ELEMENT_PITCH}
|
||||
onChange={(event) => updatePortField('pitch', event.target.value, 'number')}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -3473,8 +3608,18 @@
|
||||
style: { width: activeCanvasSize.width, height: activeCanvasSize.height, zIndex: -1, pointerEvents: 'none' }
|
||||
}, ...currentNodes, ...freeRouteEndpointNodes, ...rulerNodes];
|
||||
}, [activePage, currentNodes, activeCanvasSize, freeRouteEndpointNodes, rulerNodes]);
|
||||
const getAnchorHandleRouteDirection = useCallback((node, handleId) => {
|
||||
if (!node || !handleId || !(node.type === 'anchorNode' || node.data?.elementType === 'anchor')) return null;
|
||||
const handles = buildPortHandles(buildElementPorts('anchor', node.data), {
|
||||
rotation: Number(node.data?.rotation || 0),
|
||||
flip: Boolean(node.data?.flip),
|
||||
flop: Boolean(node.data?.flop)
|
||||
});
|
||||
return handles.find(handle => handle.name === handleId)?.position || null;
|
||||
}, []);
|
||||
const renderEdges = useMemo(() => {
|
||||
const groups = new Map();
|
||||
const nodeMap = Object.fromEntries(currentNodes.map(node => [node.id, node]));
|
||||
currentEdges.forEach(edge => {
|
||||
const sourceEndpoint = `${edge.source}:${edge.sourceHandle || ''}`;
|
||||
const targetEndpoint = `${edge.target}:${edge.targetHandle || ''}`;
|
||||
@@ -3487,11 +3632,22 @@
|
||||
const targetEndpoint = `${edge.target}:${edge.targetHandle || ''}`;
|
||||
const key = [sourceEndpoint, targetEndpoint].sort().join('<>');
|
||||
const group = groups.get(key) || [];
|
||||
if (group.length <= 1 && !(edge.data && Array.isArray(edge.data.points) && edge.data.points.length >= 2)) return edge;
|
||||
const sourceDirection = getAnchorHandleRouteDirection(nodeMap[edge.source], edge.sourceHandle);
|
||||
const targetDirection = getAnchorHandleRouteDirection(nodeMap[edge.target], edge.targetHandle);
|
||||
const usesAnchorDirection = Boolean(sourceDirection || targetDirection);
|
||||
const hasRoutePoints = edge.data && Array.isArray(edge.data.points) && edge.data.points.length >= 2;
|
||||
const directionalEdge = usesAnchorDirection
|
||||
? {
|
||||
...edge,
|
||||
sourcePosition: directionToReactFlowPosition(sourceDirection),
|
||||
targetPosition: directionToReactFlowPosition(targetDirection)
|
||||
}
|
||||
: edge;
|
||||
if (group.length <= 1 && !hasRoutePoints) return directionalEdge;
|
||||
const index = group.indexOf(edge.id);
|
||||
const offset = (index - (group.length - 1) / 2) * 18;
|
||||
return {
|
||||
...edge,
|
||||
...directionalEdge,
|
||||
type: 'parallelRoute',
|
||||
data: {
|
||||
...(edge.data || {}),
|
||||
@@ -3500,7 +3656,7 @@
|
||||
};
|
||||
});
|
||||
return [...separatedEdges, ...rulerEdges];
|
||||
}, [currentEdges, rulerEdges]);
|
||||
}, [currentEdges, currentNodes, getAnchorHandleRouteDirection, rulerEdges]);
|
||||
|
||||
const [projectCompositeMap, setProjectCompositeMap] = useState({});
|
||||
const [standaloneComposites, setStandaloneComposites] = useState([]);
|
||||
@@ -3748,7 +3904,15 @@
|
||||
return {
|
||||
...p,
|
||||
nodes: p.nodes.map(node => {
|
||||
if (node.id !== nodeId || node.type !== 'rotatableNode' || node.data?.elementType) return node;
|
||||
if (node.id !== nodeId) return node;
|
||||
if (node.type === 'portNode' || node.data?.elementType === 'port') {
|
||||
return { ...node, data: { ...node.data, angle: normalizeAngle(Number(node.data?.angle || 0) + 90) } };
|
||||
}
|
||||
if (node.type === 'anchorNode' || node.data?.elementType === 'anchor') {
|
||||
const rotation = normalizeAngle(Number(node.data?.rotation || 0) + 90);
|
||||
return { ...node, data: { ...node.data, rotation } };
|
||||
}
|
||||
if (node.type !== 'rotatableNode') return node;
|
||||
const rotation = normalizeAngle(Number(node.data?.rotation || 0) + 90);
|
||||
return { ...node, data: { ...node.data, rotation } };
|
||||
})
|
||||
@@ -3759,12 +3923,14 @@
|
||||
const getSpaceRotationTarget = useCallback(() => {
|
||||
if (spaceRotateNodeIdRef.current) return spaceRotateNodeIdRef.current;
|
||||
const selectedSpaceNode = selectedNode;
|
||||
if (!selectedSpaceNode || selectedSpaceNode.type !== 'rotatableNode' || selectedSpaceNode.data?.elementType) return null;
|
||||
if (!selectedSpaceNode) return null;
|
||||
if (selectedSpaceNode.type !== 'rotatableNode' && selectedSpaceNode.type !== 'portNode' && selectedSpaceNode.type !== 'anchorNode') return null;
|
||||
return selectedSpaceNode.id;
|
||||
}, [selectedNode]);
|
||||
|
||||
const onNodeMouseDown = useCallback((event, node) => {
|
||||
if (event.button !== 0 || node.type !== 'rotatableNode' || node.data?.elementType) return;
|
||||
if (event.button !== 0) return;
|
||||
if (node.type !== 'rotatableNode' && node.type !== 'portNode' && node.type !== 'anchorNode') return;
|
||||
spaceRotateNodeIdRef.current = node.id;
|
||||
}, []);
|
||||
|
||||
@@ -4061,6 +4227,89 @@
|
||||
return names;
|
||||
}, []);
|
||||
|
||||
const getAvailableComponentsForLoadedComponent = useCallback((componentName) => {
|
||||
if (!library || !componentName || isForgeComponent(componentName) || isBasicComponent(componentName)) return undefined;
|
||||
const componentEntries = collectComponentNames(library);
|
||||
const matchedComponent = componentEntries.find(component => component.name === componentName);
|
||||
if (!matchedComponent) return undefined;
|
||||
const sameCategoryComponents = componentEntries
|
||||
.filter(component => component.category === matchedComponent.category)
|
||||
.map(component => component.name)
|
||||
.filter(Boolean);
|
||||
return Array.from(new Set([FORGE_COMPONENT_LABEL, ...sameCategoryComponents, componentName]));
|
||||
}, [library, collectComponentNames]);
|
||||
|
||||
const buildElementNodesFromYaml = useCallback((doc, usesGdsYUp, nodeNameMap = {}) => {
|
||||
const nodes = [];
|
||||
Object.entries(doc.elements || {}).forEach(([elementName, element]) => {
|
||||
if (!element || typeof element !== 'object') return;
|
||||
const elementType = element.type === 'anchor' ? 'anchor' : (element.type === 'port' ? 'port' : '');
|
||||
if (!elementType) return;
|
||||
if (elementType === 'port' && elementName === 'port' && Array.isArray(doc.ports) && doc.ports.length > 0) {
|
||||
return;
|
||||
}
|
||||
const portNumberValue = Math.floor(Number(element.port_number ?? element.portNumber ?? 1));
|
||||
const portNumber = Number.isFinite(portNumberValue) ? Math.max(1, portNumberValue) : 1;
|
||||
const pitchValue = Number(element.pitch ?? DEFAULT_ELEMENT_PITCH);
|
||||
const pitch = Number.isFinite(pitchValue) ? Math.max(0, pitchValue) : DEFAULT_ELEMENT_PITCH;
|
||||
const widthValue = Number(element.width ?? 0.5);
|
||||
const width = Number.isFinite(widthValue) ? widthValue : 0.5;
|
||||
const xValue = Number(element.x || 0);
|
||||
const yValue = Number(element.y || 0);
|
||||
const x = Number.isFinite(xValue) ? xValue : 0;
|
||||
const y = Number.isFinite(yValue) ? yValue : 0;
|
||||
const baseData = {
|
||||
label: elementName,
|
||||
componentDisplayName: elementName,
|
||||
elementType,
|
||||
width,
|
||||
portNumber,
|
||||
pitch,
|
||||
layer: element.layer || 'WG_CORE',
|
||||
description: element.description || '',
|
||||
boxSize: buildElementBoxSize({ elementType, portNumber, pitch })
|
||||
};
|
||||
const nodeId = `element-${elementName}-${Date.now()}-${Math.random().toString(36).substr(2, 5)}`;
|
||||
nodeNameMap[elementName] = nodeId;
|
||||
if (elementType === 'port') {
|
||||
const angle = Number(element.angle ?? element.a ?? 0);
|
||||
nodes.push({
|
||||
id: nodeId,
|
||||
type: 'portNode',
|
||||
position: {
|
||||
x,
|
||||
y: usesGdsYUp ? layoutToCanvasY(y) : y,
|
||||
},
|
||||
data: {
|
||||
...baseData,
|
||||
portName: elementName,
|
||||
angle: Number.isFinite(angle) ? angle : 0,
|
||||
ports: buildElementPorts('port', { angle: Number.isFinite(angle) ? angle : 0, width, portNumber, pitch })
|
||||
},
|
||||
});
|
||||
return;
|
||||
}
|
||||
const rotation = Number(element.angle ?? element.rotation ?? 0);
|
||||
nodes.push({
|
||||
id: nodeId,
|
||||
type: 'anchorNode',
|
||||
position: {
|
||||
x,
|
||||
y: usesGdsYUp ? layoutToCanvasY(y) : y,
|
||||
},
|
||||
data: {
|
||||
...baseData,
|
||||
componentName: 'Anchor',
|
||||
category: null,
|
||||
rotation: Number.isFinite(rotation) ? rotation : 0,
|
||||
hideIcon: true,
|
||||
ports: buildElementPorts('anchor', { portNumber, pitch, width })
|
||||
},
|
||||
});
|
||||
});
|
||||
return nodes;
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
const input = document.getElementById('open-yaml-input');
|
||||
if (!input) return;
|
||||
@@ -4072,8 +4321,8 @@
|
||||
const text = await file.text();
|
||||
const doc = jsyaml.load(text);
|
||||
const usesGdsYUp = doc.coordinate_system === 'gds_y_up';
|
||||
if (!doc.instances) {
|
||||
alert('no instances found');
|
||||
if (!doc.instances && !doc.elements) {
|
||||
alert('no instances or elements found');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4081,14 +4330,18 @@
|
||||
const newEdges = [];
|
||||
const nodeNameMap = {};
|
||||
const isProject = doc.type === 'project';
|
||||
if (!isProject) {
|
||||
nodeNameMap.port = 'page-port';
|
||||
}
|
||||
|
||||
for (const [instName, inst] of Object.entries(doc.instances)) {
|
||||
for (const [instName, inst] of Object.entries(doc.instances || {})) {
|
||||
const compPath = inst.component || '';
|
||||
const compName = compPath.split('/').pop();
|
||||
const instIsForge = isForgeComponent(compPath) || isForgeComponent(compName);
|
||||
const instIsBasic = isBasicComponent(compPath) || isBasicComponent(compName);
|
||||
const displayCompName = instIsForge ? FORGE_COMPONENT_LABEL : (instIsBasic ? compPath : compName);
|
||||
const basicMetadata = instIsBasic ? getBasicComponentMetadata(displayCompName, inst.settings) : null;
|
||||
const loadedAvailableComponents = getAvailableComponentsForLoadedComponent(displayCompName);
|
||||
let category = '';
|
||||
|
||||
if (!isProject && displayCompName && library && !instIsForge) {
|
||||
@@ -4124,7 +4377,7 @@
|
||||
flop: toBooleanFlag(inst.flop),
|
||||
componentDisplayName: instName,
|
||||
type: isProject ? 'composite' : undefined,
|
||||
availableComponents: instIsForge ? [FORGE_COMPONENT_LABEL] : undefined,
|
||||
availableComponents: instIsForge ? [FORGE_COMPONENT_LABEL] : loadedAvailableComponents,
|
||||
ports: instIsBasic ? (basicMetadata?.ports || {}) : (instIsForge ? {} : undefined),
|
||||
boxSize: instIsBasic && basicMetadata ? normalizeBoxSize(basicMetadata) : undefined,
|
||||
forgeArguments: instIsForge ? createForgeArguments(inst.settings) : undefined,
|
||||
@@ -4132,6 +4385,7 @@
|
||||
},
|
||||
});
|
||||
}
|
||||
newNodes.push(...buildElementNodesFromYaml(doc, usesGdsYUp, nodeNameMap));
|
||||
|
||||
if (!isProject) {
|
||||
const links = doc.bundles?.output_bus?.links;
|
||||
@@ -4198,7 +4452,7 @@
|
||||
if (isProject) {
|
||||
setProjectCompositeMap(prev => ({
|
||||
...prev,
|
||||
[newPageName]: [...(prev[newPageName] || []), ...Object.keys(doc.instances)]
|
||||
[newPageName]: [...(prev[newPageName] || []), ...Object.keys(doc.instances || {})]
|
||||
}));
|
||||
} else {
|
||||
setStandaloneComposites(prev => {
|
||||
@@ -4208,7 +4462,7 @@
|
||||
|
||||
if (library) {
|
||||
const compTree = {};
|
||||
for (const inst of Object.values(doc.instances)) {
|
||||
for (const inst of Object.values(doc.instances || {})) {
|
||||
const compPath = inst.component || '';
|
||||
const compName = compPath.split('/').pop();
|
||||
if (isForgeComponent(compPath) || isForgeComponent(compName)) continue;
|
||||
@@ -4240,7 +4494,7 @@
|
||||
|
||||
input.addEventListener('change', handleFile);
|
||||
return () => input.removeEventListener('change', handleFile);
|
||||
}, [library, technologyManifest, makeFreeRouteEdge]);
|
||||
}, [library, technologyManifest, makeFreeRouteEdge, buildElementNodesFromYaml, getAvailableComponentsForLoadedComponent]);
|
||||
|
||||
useEffect(() => {
|
||||
setProjectCompositeMap(prev => {
|
||||
@@ -4307,6 +4561,7 @@
|
||||
}
|
||||
];
|
||||
const edges = [];
|
||||
nodeNameMap.port = 'page-port';
|
||||
|
||||
Object.entries(doc.instances || {}).forEach(([instName, inst]) => {
|
||||
const compPath = inst.component || '';
|
||||
@@ -4315,6 +4570,7 @@
|
||||
const instIsBasic = isBasicComponent(compPath) || isBasicComponent(compName);
|
||||
const displayCompName = instIsForge ? FORGE_COMPONENT_LABEL : (instIsBasic ? compPath : compName);
|
||||
const basicMetadata = instIsBasic ? getBasicComponentMetadata(displayCompName, inst.settings) : null;
|
||||
const loadedAvailableComponents = getAvailableComponentsForLoadedComponent(displayCompName);
|
||||
const nodeId = `node-${Date.now()}-${Math.random().toString(36).substr(2, 5)}`;
|
||||
nodeNameMap[instName] = nodeId;
|
||||
nodes.push({
|
||||
@@ -4332,7 +4588,7 @@
|
||||
flip: toBooleanFlag(inst.flip ?? inst.mirror),
|
||||
flop: toBooleanFlag(inst.flop),
|
||||
componentDisplayName: instName,
|
||||
availableComponents: instIsForge ? [FORGE_COMPONENT_LABEL] : undefined,
|
||||
availableComponents: instIsForge ? [FORGE_COMPONENT_LABEL] : loadedAvailableComponents,
|
||||
ports: instIsBasic ? (basicMetadata?.ports || {}) : (instIsForge ? {} : undefined),
|
||||
boxSize: instIsBasic && basicMetadata ? normalizeBoxSize(basicMetadata) : undefined,
|
||||
forgeArguments: instIsForge ? createForgeArguments(inst.settings) : undefined,
|
||||
@@ -4340,6 +4596,7 @@
|
||||
},
|
||||
});
|
||||
});
|
||||
nodes.push(...buildElementNodesFromYaml(doc, usesGdsYUp, nodeNameMap));
|
||||
|
||||
const links = doc.bundles?.output_bus?.links;
|
||||
if (links) {
|
||||
@@ -4422,7 +4679,7 @@
|
||||
};
|
||||
|
||||
loadProject();
|
||||
}, [library, currentProjectName, loadTechnologyManifest, toBooleanFlag, makeFreeRouteEdge]);
|
||||
}, [library, currentProjectName, loadTechnologyManifest, toBooleanFlag, makeFreeRouteEdge, buildElementNodesFromYaml, getAvailableComponentsForLoadedComponent]);
|
||||
|
||||
useEffect(() => {
|
||||
if (activePage && activePage.type !== 'layoutPreview' && reactFlowInstance) {
|
||||
@@ -4900,7 +5157,9 @@
|
||||
const position = clampPositionToCanvas(
|
||||
reactFlowInstance.screenToFlowPosition({ x: event.clientX, y: event.clientY }),
|
||||
activePage?.canvasSize || activeCanvasSize,
|
||||
parsedData.type === 'element' ? { width: PORT_NODE_SIZE, height: PORT_NODE_SIZE } : DEFAULT_COMPONENT_BOX_SIZE
|
||||
parsedData.type === 'element'
|
||||
? buildElementBoxSize({ elementType: parsedData.elementType === 'anchor' ? 'anchor' : 'port', portNumber: 1, pitch: DEFAULT_ELEMENT_PITCH })
|
||||
: DEFAULT_COMPONENT_BOX_SIZE
|
||||
);
|
||||
if (parsedData.type === 'basic') {
|
||||
const componentName = parsedData.componentName || parsedData.name;
|
||||
@@ -4946,14 +5205,18 @@
|
||||
elementType: 'port',
|
||||
angle: 0,
|
||||
width: 0.5,
|
||||
portNumber: 1,
|
||||
pitch: DEFAULT_ELEMENT_PITCH,
|
||||
layer: 'WG_CORE',
|
||||
description: ''
|
||||
description: '',
|
||||
boxSize: buildElementBoxSize({ elementType: 'port', portNumber: 1, pitch: DEFAULT_ELEMENT_PITCH }),
|
||||
ports: buildElementPorts('port', { angle: 0, width: 0.5, portNumber: 1, pitch: DEFAULT_ELEMENT_PITCH })
|
||||
},
|
||||
}
|
||||
: {
|
||||
id: Date.now().toString(),
|
||||
type: 'anchorNode',
|
||||
position: clampPositionToCanvas(position, activePage?.canvasSize || activeCanvasSize, { width: PORT_NODE_SIZE, height: PORT_NODE_SIZE }),
|
||||
position: clampPositionToCanvas(position, activePage?.canvasSize || activeCanvasSize, buildElementBoxSize({ elementType: 'anchor', portNumber: 1, pitch: DEFAULT_ELEMENT_PITCH })),
|
||||
data: {
|
||||
label: elementName,
|
||||
componentName: 'Anchor',
|
||||
@@ -4962,11 +5225,13 @@
|
||||
category: null,
|
||||
rotation: 0,
|
||||
width: 0.5,
|
||||
portNumber: 1,
|
||||
pitch: DEFAULT_ELEMENT_PITCH,
|
||||
layer: 'WG_CORE',
|
||||
description: '',
|
||||
hideIcon: true,
|
||||
boxSize: { width: PORT_NODE_SIZE, height: PORT_NODE_SIZE },
|
||||
ports: buildElementPorts('anchor')
|
||||
boxSize: buildElementBoxSize({ elementType: 'anchor', portNumber: 1, pitch: DEFAULT_ELEMENT_PITCH }),
|
||||
ports: buildElementPorts('anchor', { portNumber: 1, pitch: DEFAULT_ELEMENT_PITCH, width: 0.5 })
|
||||
},
|
||||
};
|
||||
setPages(prev => prev.map(p => {
|
||||
|
||||
@@ -142,22 +142,22 @@ assert.strictEqual(
|
||||
);
|
||||
assert.deepStrictEqual(
|
||||
{
|
||||
left: helpers.buildElementPorts('anchor').left.a,
|
||||
right: helpers.buildElementPorts('anchor').right.a,
|
||||
a1: helpers.buildElementPorts('anchor').a1.a,
|
||||
b1: helpers.buildElementPorts('anchor').b1.a,
|
||||
},
|
||||
{ left: 180, right: 0 },
|
||||
'Anchor objects should default to 180 degree left port and 0 degree right port'
|
||||
{ a1: 180, b1: 0 },
|
||||
'Anchor objects should default to a1 for the left port and b1 for the right port'
|
||||
);
|
||||
assert.deepStrictEqual(
|
||||
{
|
||||
left: helpers.buildElementPorts('anchor').left,
|
||||
right: helpers.buildElementPorts('anchor').right,
|
||||
a1: helpers.buildElementPorts('anchor').a1,
|
||||
b1: helpers.buildElementPorts('anchor').b1,
|
||||
},
|
||||
{
|
||||
left: { x: 0, y: -15, a: 180, width: 0.5 },
|
||||
right: { x: 30, y: -15, a: 0, width: 0.5 }
|
||||
a1: { x: 0, y: -15, a: 180, width: 0.5 },
|
||||
b1: { x: 0, y: -15, a: 0, width: 0.5 }
|
||||
},
|
||||
'Anchor ports should sit on the left and right edges of a port-sized circle'
|
||||
'Anchor a/b port pairs should share coordinates and keep opposite directions'
|
||||
);
|
||||
assert.deepStrictEqual(
|
||||
helpers.buildBasicComponentPorts('waveguide', { length: 120, width: 0.6 }).b1,
|
||||
@@ -300,7 +300,46 @@ const elementNodes = [
|
||||
assert.deepStrictEqual(helpers.buildElementPorts('port', { angle: 90, width: 0.8 }), {
|
||||
port: { x: 0, y: 0, a: 90, width: 0.8 }
|
||||
});
|
||||
assert.deepStrictEqual(Object.keys(helpers.buildElementPorts('anchor')), ['left', 'right']);
|
||||
assert.deepStrictEqual(Object.keys(helpers.buildElementPorts('anchor')), ['a1', 'b1']);
|
||||
assert.deepStrictEqual(Object.keys(helpers.buildElementPorts('port', { portNumber: 3, pitch: 10 })), ['port_1', 'port_2', 'port_3']);
|
||||
assert.deepStrictEqual(helpers.buildElementPorts('port', { portNumber: 3, pitch: 10 }).port_1, { x: 0, y: 10, a: 0, width: 0.5 });
|
||||
assert.deepStrictEqual(helpers.buildElementPorts('port', { portNumber: 3 }).port_1, { x: 0, y: 10, a: 0, width: 0.5 });
|
||||
assert.deepStrictEqual(Object.keys(helpers.buildElementPorts('anchor', { portNumber: 2, pitch: 12 })), ['a1', 'b1', 'a2', 'b2']);
|
||||
assert.deepStrictEqual(helpers.buildElementPorts('anchor', { portNumber: 2, pitch: 12 }).b2, { x: 0, y: -21, a: 0, width: 0.5 });
|
||||
assert.deepStrictEqual(helpers.buildElementPorts('anchor', { portNumber: 2, pitch: 12 }).a2, { x: 0, y: -21, a: 180, width: 0.5 });
|
||||
assert.deepStrictEqual(
|
||||
helpers.getNodePortCanvasPoint({
|
||||
id: 'anchor-rotated',
|
||||
type: 'anchorNode',
|
||||
position: { x: 100, y: 200 },
|
||||
data: {
|
||||
elementType: 'anchor',
|
||||
rotation: 90,
|
||||
portNumber: 1,
|
||||
pitch: 10,
|
||||
ports: helpers.buildElementPorts('anchor', { portNumber: 1, pitch: 10 })
|
||||
}
|
||||
}, 'a1'),
|
||||
{ x: 115, y: 200 },
|
||||
'Anchor port endpoint coordinates should rotate with the anchor body'
|
||||
);
|
||||
assert.deepStrictEqual(helpers.buildElementBoxSize({ portNumber: 1 }), { width: 30, height: 30 });
|
||||
assert.deepStrictEqual(helpers.buildElementBoxSize({ elementType: 'anchor', portNumber: 1 }), { width: 8, height: 30 });
|
||||
assert.deepStrictEqual(helpers.buildElementBoxSize({ elementType: 'anchor', portNumber: 4, pitch: 10 }), { width: 8, height: 72 });
|
||||
assert.deepStrictEqual(helpers.buildElementBoxSize({ portNumber: 4, pitch: 10 }), { width: 30, height: 72 });
|
||||
assert.deepStrictEqual(
|
||||
helpers.buildPageComponentPorts(null, [{
|
||||
id: 'port-array',
|
||||
type: 'portNode',
|
||||
position: { x: 100, y: 200 },
|
||||
data: { componentDisplayName: 'array', elementType: 'port', portNumber: 3, pitch: 10, width: 0.6 }
|
||||
}]),
|
||||
{
|
||||
array_1: { x: 100, y: 190, a: 0, width: 0.6 },
|
||||
array_2: { x: 100, y: 200, a: 0, width: 0.6 },
|
||||
array_3: { x: 100, y: 210, a: 0, width: 0.6 }
|
||||
}
|
||||
);
|
||||
|
||||
const canvasPortsYaml = helpers.buildCanvasPortsYaml(elementNodes);
|
||||
assert(canvasPortsYaml.includes('name: in0'));
|
||||
@@ -314,6 +353,8 @@ assert(elementsYaml.includes('type: port'));
|
||||
assert(elementsYaml.includes('anchor_1:'));
|
||||
assert(elementsYaml.includes('type: anchor'));
|
||||
assert(elementsYaml.includes('y: -20.0'));
|
||||
assert(elementsYaml.includes('port_number: 1'));
|
||||
assert(elementsYaml.includes('pitch: 10'));
|
||||
|
||||
const instancesWithoutElements = helpers.buildInstancesYaml({
|
||||
nodes: elementNodes,
|
||||
@@ -484,7 +525,20 @@ const edgeD = {
|
||||
target: 'f',
|
||||
data: { route: { xsection: 'rib_low', family: 'optical' } }
|
||||
};
|
||||
const edgeE = {
|
||||
id: 'edge-metal-alias',
|
||||
source: 'e',
|
||||
target: 'f',
|
||||
data: { route: { xsection: 'metal1', family: 'electrical' } }
|
||||
};
|
||||
const edgeF = {
|
||||
id: 'edge-metal-underscore',
|
||||
source: 'a',
|
||||
target: 'b',
|
||||
data: { route: { xsection: 'metal_1', family: 'electrical' } }
|
||||
};
|
||||
assert.strictEqual(helpers.findSameTypeRouteCrossing(edgeB, [edgeA], crossingNodes).conflictEdge.id, 'edge-a-b');
|
||||
assert.strictEqual(helpers.findSameTypeRouteCrossing(edgeC, [edgeA], crossingNodes), null);
|
||||
assert.strictEqual(helpers.findSameTypeRouteCrossing(edgeD, [edgeA], crossingNodes), null);
|
||||
assert.strictEqual(helpers.findSameTypeRouteCrossing(edgeE, [edgeF], crossingNodes).conflictEdge.id, 'edge-metal-underscore');
|
||||
assert.strictEqual(helpers.findSameFamilyRouteCrossing(edgeB, [edgeA], crossingNodes).conflictEdge.id, 'edge-a-b');
|
||||
|
||||
@@ -85,6 +85,24 @@ assert(
|
||||
'Build GDS should not silently fall back to unrouted gdstk when links are present'
|
||||
);
|
||||
|
||||
const routerDir = path.resolve(root, '..', 'mxpic_router', 'mxpic_router');
|
||||
if (fs.existsSync(routerDir)) {
|
||||
const routerLoaderPy = fs.readFileSync(path.join(routerDir, 'eda_loader.py'), 'utf8');
|
||||
const routerBuilderPy = fs.readFileSync(path.join(routerDir, 'builder.py'), 'utf8');
|
||||
assert(
|
||||
routerLoaderPy.includes('port_number: int = 1') &&
|
||||
routerLoaderPy.includes('pitch: float = 10.0') &&
|
||||
routerLoaderPy.includes('port_number=_int(element.get("port_number"'),
|
||||
'mxpic_router loader should parse multi-port anchor metadata from exported elements'
|
||||
);
|
||||
assert(
|
||||
routerBuilderPy.includes('for index in range(port_number):') &&
|
||||
routerBuilderPy.includes('a{index + 1}') &&
|
||||
routerBuilderPy.includes('b{index + 1}'),
|
||||
'mxpic_router builder should register aN/bN pins for multi-port anchors'
|
||||
);
|
||||
}
|
||||
|
||||
assert(
|
||||
serverPy.includes('def scoped_pdk_root_for_project') &&
|
||||
serverPy.includes('read_project_meta(project_name).get("technology")') &&
|
||||
|
||||
@@ -196,8 +196,51 @@ assert(
|
||||
'holding a component and pressing Space should rotate it by 90 degrees'
|
||||
);
|
||||
assert(
|
||||
canvasHtml.includes('getSpaceRotationTarget') && canvasHtml.includes('selectedSpaceNode'),
|
||||
'Space rotation should also use the currently selected component when no mouse-hold target is active'
|
||||
canvasHtml.includes('getSpaceRotationTarget') &&
|
||||
canvasHtml.includes('selectedSpaceNode') &&
|
||||
canvasHtml.includes('node.type !== \'rotatableNode\' && node.type !== \'portNode\' && node.type !== \'anchorNode\'') &&
|
||||
canvasHtml.includes('node.type === \'portNode\' || node.data?.elementType === \'port\'') &&
|
||||
canvasHtml.includes('angle: normalizeAngle(Number(node.data?.angle || 0) + 90)'),
|
||||
'Space rotation should also rotate selected Port and Anchor elements'
|
||||
);
|
||||
assert(
|
||||
canvasHtml.includes('const anchorRotation = data.rotation || 0') &&
|
||||
canvasHtml.includes('const anchorVisualRotation = -Number(anchorRotation || 0)') &&
|
||||
canvasHtml.includes('transform: `rotate(${anchorVisualRotation}deg)`') &&
|
||||
canvasHtml.includes('buildPortHandles(localAnchorHandlePorts, { rotation: 0') &&
|
||||
canvasHtml.includes('anchorDirectionHandles') &&
|
||||
canvasHtml.includes('rotation: Number(anchorRotation || 0)') &&
|
||||
canvasHtml.includes('anchorHandleVisualStyle(portHandle') &&
|
||||
canvasHtml.includes('anchorPortVisualSide') &&
|
||||
canvasHtml.includes('portHandle.name') &&
|
||||
canvasHtml.includes('visualSide === \'left\' ? 0 : elementSize.width') &&
|
||||
canvasHtml.includes('anchorPortVisualTop') &&
|
||||
canvasHtml.includes('(index - 1) / (portCount - 1)') &&
|
||||
canvasHtml.includes('elementSize.height - baseHandleStyle.height') &&
|
||||
canvasHtml.includes('localLeft') &&
|
||||
canvasHtml.includes('localTop') &&
|
||||
canvasHtml.includes('handlePositionMap[anchorDirectionHandles.get(portHandle.name) || portHandle.position]') &&
|
||||
canvasHtml.includes('getAnchorHandleRouteDirection') &&
|
||||
canvasHtml.includes('rotation: Number(node.data?.rotation || 0)') &&
|
||||
canvasHtml.includes('directionToReactFlowPosition') &&
|
||||
canvasHtml.includes('sourcePosition: directionToReactFlowPosition(sourceDirection)') &&
|
||||
canvasHtml.includes('targetPosition: directionToReactFlowPosition(targetDirection)') &&
|
||||
!canvasHtml.includes('type: \'parallelRoute\',\n data: {\n ...(edge.data || {}),\n parallelOffset: offset,\n sourceDirection,\n targetDirection') &&
|
||||
!canvasHtml.includes('rotatedAnchorHandlePositions'),
|
||||
'Anchor port circles should split into side columns and spread across the full anchor body while built-in rectangular links use rotated directions'
|
||||
);
|
||||
assert(
|
||||
canvasHtml.includes('Port Number') &&
|
||||
canvasHtml.includes('Pitch') &&
|
||||
canvasHtml.includes('portNumber') &&
|
||||
canvasHtml.includes('pitch') &&
|
||||
canvasHtml.includes('DEFAULT_ELEMENT_PITCH') &&
|
||||
canvasHtml.includes('buildElementBoxSize') &&
|
||||
canvasHtml.includes('height: elementSize.height') &&
|
||||
canvasHtml.includes('elementType: \'anchor\'') &&
|
||||
canvasHtml.includes('pitch: DEFAULT_ELEMENT_PITCH') &&
|
||||
canvasHtml.includes('ports: buildElementPorts'),
|
||||
'Port and Anchor inspectors should expose port number and pitch, default to 10 um pitch, and grow in height'
|
||||
);
|
||||
assert(
|
||||
canvasHtml.includes('const componentIndexesByPrefixRef = useRef({});') &&
|
||||
|
||||
@@ -17,3 +17,27 @@ assert(
|
||||
canvasHtml.includes('layoutToCanvasY'),
|
||||
'loading saved layout YAML should convert GDS/layout Y coordinates back to canvas coordinates'
|
||||
);
|
||||
assert(
|
||||
canvasHtml.includes('buildElementNodesFromYaml'),
|
||||
'project loading should rebuild saved anchor/port element nodes from YAML elements'
|
||||
);
|
||||
assert(
|
||||
canvasHtml.includes('Object.entries(doc.elements || {})'),
|
||||
'project loading should read doc.elements, not only doc.instances'
|
||||
);
|
||||
assert(
|
||||
canvasHtml.includes('nodeNameMap[elementName] = nodeId'),
|
||||
'loaded element names should be registered so saved links can reconnect to anchors and ports'
|
||||
);
|
||||
assert(
|
||||
canvasHtml.includes('getAvailableComponentsForLoadedComponent'),
|
||||
'project loading should reconstruct PDK component selection options for saved instances'
|
||||
);
|
||||
assert(
|
||||
canvasHtml.includes('availableComponents: instIsForge ? [FORGE_COMPONENT_LABEL] : loadedAvailableComponents'),
|
||||
'loaded PDK instances should keep availableComponents so the right panel can show the PDK selector'
|
||||
);
|
||||
assert(
|
||||
canvasHtml.includes('Array.from(new Set([FORGE_COMPONENT_LABEL, ...sameCategoryComponents'),
|
||||
'loaded PDK selector choices should include forge and same-category library components'
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user