aboutsummaryrefslogtreecommitdiff
path: root/Tests
diff options
context:
space:
mode:
Diffstat (limited to 'Tests')
-rw-r--r--Tests/colorLib/builder_test.py40
-rw-r--r--Tests/cu2qu/data/curves.json1
-rw-r--r--Tests/feaLib/builder_test.py3
-rw-r--r--Tests/feaLib/data/ChainPosSubtable.ttx36
-rw-r--r--Tests/feaLib/data/GPOS_8.ttx68
-rw-r--r--Tests/feaLib/data/GSUB_5_formats.fea20
-rw-r--r--Tests/feaLib/data/GSUB_5_formats.ttx197
-rw-r--r--Tests/feaLib/data/GSUB_6.ttx52
-rw-r--r--Tests/feaLib/data/GSUB_6_formats.fea20
-rw-r--r--Tests/feaLib/data/GSUB_6_formats.ttx256
-rw-r--r--Tests/feaLib/data/ZeroValue_ChainSinglePos_horizontal.ttx69
-rw-r--r--Tests/feaLib/data/ZeroValue_ChainSinglePos_vertical.ttx69
-rw-r--r--Tests/feaLib/data/bug512.ttx83
-rw-r--r--Tests/feaLib/data/spec5f_ii_3.ttx212
-rw-r--r--Tests/pens/cocoaPen_test.py59
-rw-r--r--Tests/pens/quartzPen_test.py79
-rw-r--r--Tests/subset/data/expect_layout_scripts.ttx129
-rw-r--r--Tests/subset/data/layout_scripts.ttx997
-rw-r--r--Tests/subset/subset_test.py10
-rw-r--r--Tests/ttLib/tables/C_O_L_R_test.py396
-rw-r--r--Tests/ttLib/woff2_test.py5
-rw-r--r--Tests/ttx/ttx_test.py5
-rw-r--r--Tests/ufoLib/UFO3_test.py20
-rw-r--r--Tests/ufoLib/glifLib_test.py10
-rw-r--r--Tests/ufoLib/testdata/TestFont1 (UFO3).ufozbin0 -> 10577 bytes
-rw-r--r--Tests/varLib/data/test_results/InterpolateLayoutGPOS_7_diff.ttx38
-rw-r--r--Tests/varLib/data/test_results/InterpolateLayoutGPOS_7_same.ttx38
-rw-r--r--Tests/varLib/varLib_test.py53
28 files changed, 2448 insertions, 517 deletions
diff --git a/Tests/colorLib/builder_test.py b/Tests/colorLib/builder_test.py
index 86b5f9e9..152e16e0 100644
--- a/Tests/colorLib/builder_test.py
+++ b/Tests/colorLib/builder_test.py
@@ -544,7 +544,7 @@ def test_buildPaintComposite():
composite = layerBuilder.buildPaintComposite(
mode=ot.CompositeMode.SRC_OVER,
source={
- "format": 8,
+ "format": 10,
"mode": "src_over",
"source": {"format": 5, "glyph": "c", "paint": 2},
"backdrop": {"format": 5, "glyph": "b", "paint": 1},
@@ -574,6 +574,44 @@ def test_buildPaintComposite():
assert composite.BackdropPaint.Paint.Color.PaletteIndex == 0
+def test_buildPaintRotate():
+ layerBuilder = LayerV1ListBuilder()
+ paint = layerBuilder.buildPaintRotate(
+ paint=layerBuilder.buildPaintGlyph(
+ "a", layerBuilder.buildPaintSolid(paletteIndex=0, alpha=1.0)
+ ),
+ angle=15,
+ centerX=127,
+ centerY=129,
+ )
+
+ assert paint.Format == ot.Paint.Format.PaintRotate
+ assert paint.Paint.Format == ot.Paint.Format.PaintGlyph
+ assert paint.angle.value == 15
+ assert paint.centerX.value == 127
+ assert paint.centerY.value == 129
+
+
+def test_buildPaintRotate():
+ layerBuilder = LayerV1ListBuilder()
+ paint = layerBuilder.buildPaintSkew(
+ paint=layerBuilder.buildPaintGlyph(
+ "a", layerBuilder.buildPaintSolid(paletteIndex=0, alpha=1.0)
+ ),
+ xSkewAngle=15,
+ ySkewAngle=42,
+ centerX=127,
+ centerY=129,
+ )
+
+ assert paint.Format == ot.Paint.Format.PaintSkew
+ assert paint.Paint.Format == ot.Paint.Format.PaintGlyph
+ assert paint.xSkewAngle.value == 15
+ assert paint.ySkewAngle.value == 42
+ assert paint.centerX.value == 127
+ assert paint.centerY.value == 129
+
+
def test_buildColrV1():
colorGlyphs = {
"a": [("b", 0), ("c", 1)],
diff --git a/Tests/cu2qu/data/curves.json b/Tests/cu2qu/data/curves.json
new file mode 100644
index 00000000..23af5752
--- /dev/null
+++ b/Tests/cu2qu/data/curves.json
@@ -0,0 +1 @@
+[[[550.0,258.0],[1044.0,482.0],[2029.0,1841.0],[1934.0,1554.0]],[[859.0,384.0],[1998.0,116.0],[1596.0,1772.0],[8.0,1824.0]],[[1090.0,937.0],[418.0,1300.0],[125.0,91.0],[104.0,37.0]],[[1561.0,887.0],[1728.0,118.0],[908.0,1793.0],[2030.0,954.0]],[[1415.0,945.0],[896.0,1882.0],[1186.0,88.0],[1704.0,409.0]],[[761.0,1214.0],[495.0,1362.0],[1728.0,777.0],[1242.0,1163.0]],[[2045.0,1611.0],[141.0,1967.0],[994.0,1655.0],[1697.0,708.0]],[[1503.0,1534.0],[354.0,1797.0],[442.0,670.0],[1610.0,1517.0]],[[2005.0,121.0],[1922.0,178.0],[1263.0,1612.0],[697.0,690.0]],[[929.0,50.0],[817.0,950.0],[1656.0,1408.0],[1447.0,1880.0]],[[1102.0,23.0],[1571.0,529.0],[841.0,1745.0],[229.0,1970.0]],[[1493.0,818.0],[1693.0,1986.0],[1461.0,1697.0],[1417.0,6.0]],[[1356.0,1876.0],[114.0,940.0],[725.0,740.0],[375.0,1045.0]],[[132.0,288.0],[340.0,68.0],[1855.0,59.0],[1151.0,1022.0]],[[1100.0,448.0],[756.0,1410.0],[1189.0,284.0],[685.0,653.0]],[[1045.0,688.0],[1117.0,1206.0],[1862.0,1318.0],[2033.0,1940.0]],[[467.0,96.0],[1277.0,1583.0],[1406.0,1724.0],[770.0,1058.0]],[[445.0,1038.0],[856.0,1768.0],[85.0,923.0],[73.0,1627.0]],[[599.0,144.0],[656.0,1825.0],[1747.0,903.0],[1846.0,914.0]],[[125.0,1617.0],[1315.0,1746.0],[240.0,1223.0],[514.0,868.0]],[[194.0,1254.0],[289.0,313.0],[1271.0,1220.0],[648.0,1704.0]],[[1033.0,534.0],[34.0,155.0],[891.0,1887.0],[702.0,153.0]],[[1548.0,820.0],[1421.0,405.0],[842.0,1773.0],[795.0,2016.0]],[[427.0,1597.0],[1212.0,2047.0],[70.0,1332.0],[1647.0,1152.0]],[[74.0,642.0],[822.0,1342.0],[553.0,1388.0],[1758.0,872.0]],[[1091.0,394.0],[1553.0,1408.0],[1984.0,961.0],[267.0,165.0]],[[346.0,544.0],[695.0,682.0],[872.0,1097.0],[1360.0,1045.0]],[[1507.0,1387.0],[1393.0,466.0],[1192.0,963.0],[2002.0,554.0]],[[427.0,1313.0],[160.0,1665.0],[299.0,1557.0],[603.0,512.0]],[[1396.0,469.0],[1548.0,313.0],[916.0,334.0],[1092.0,1494.0]],[[1210.0,468.0],[1875.0,1135.0],[441.0,187.0],[1211.0,50.0]],[[59.0,375.0],[1693.0,471.0],[163.0,769.0],[981.0,1724.0]],[[663.0,473.0],[1846.0,685.0],[988.0,651.0],[421.0,1782.0]],[[1549.0,1204.0],[1037.0,1953.0],[1288.0,410.0],[850.0,1300.0]],[[162.0,111.0],[43.0,1210.0],[1311.0,1842.0],[1602.0,1283.0]],[[1632.0,257.0],[262.0,1299.0],[1867.0,456.0],[1024.0,881.0]],[[1920.0,1457.0],[1061.0,750.0],[851.0,1258.0],[815.0,1009.0]],[[1476.0,333.0],[1150.0,366.0],[1834.0,370.0],[1388.0,931.0]],[[1599.0,1256.0],[168.0,1340.0],[765.0,1297.0],[1240.0,1006.0]],[[1369.0,413.0],[377.0,1003.0],[901.0,83.0],[998.0,1645.0]],[[296.0,1097.0],[290.0,307.0],[88.0,40.0],[1191.0,1471.0]],[[2020.0,1920.0],[631.0,413.0],[1343.0,315.0],[709.0,735.0]],[[612.0,579.0],[1309.0,1251.0],[437.0,1202.0],[517.0,846.0]],[[580.0,130.0],[1294.0,841.0],[729.0,1224.0],[1772.0,646.0]],[[198.0,1012.0],[1034.0,263.0],[1829.0,1761.0],[1024.0,1799.0]],[[1856.0,44.0],[1620.0,1387.0],[702.0,1056.0],[1989.0,99.0]],[[1706.0,77.0],[255.0,1453.0],[566.0,512.0],[567.0,1061.0]],[[1134.0,1629.0],[1642.0,705.0],[365.0,956.0],[1990.0,30.0]],[[727.0,1299.0],[1795.0,924.0],[976.0,1281.0],[2027.0,1961.0]],[[921.0,1688.0],[1380.0,1127.0],[898.0,197.0],[293.0,1510.0]],[[653.0,834.0],[1277.0,1223.0],[1227.0,1522.0],[676.0,1903.0]],[[348.0,504.0],[1545.0,722.0],[638.0,1026.0],[1747.0,891.0]],[[213.0,2027.0],[1612.0,1425.0],[1572.0,675.0],[166.0,370.0]],[[1045.0,413.0],[1095.0,342.0],[569.0,335.0],[1822.0,987.0]],[[1566.0,1773.0],[1627.0,674.0],[1333.0,1794.0],[517.0,1998.0]],[[868.0,488.0],[1766.0,1672.0],[483.0,1210.0],[1137.0,1016.0]],[[1551.0,16.0],[777.0,1797.0],[86.0,126.0],[992.0,1066.0]],[[846.0,708.0],[1166.0,607.0],[821.0,1119.0],[1274.0,1027.0]],[[1828.0,688.0],[1462.0,2010.0],[1720.0,498.0],[855.0,1569.0]],[[838.0,1163.0],[442.0,98.0],[483.0,54.0],[1214.0,559.0]],[[307.0,1530.0],[1274.0,1790.0],[1461.0,1325.0],[3.0,507.0]],[[1811.0,1841.0],[1434.0,1248.0],[1635.0,1390.0],[2016.0,463.0]],[[1546.0,1566.0],[835.0,15.0],[1137.0,814.0],[1890.0,1675.0]],[[1250.0,697.0],[1840.0,808.0],[1472.0,14.0],[1594.0,1744.0]],[[1659.0,1376.0],[277.0,2018.0],[1014.0,1191.0],[85.0,1667.0]],[[639.0,1627.0],[1106.0,729.0],[300.0,41.0],[1431.0,1083.0]],[[1684.0,1243.0],[622.0,1892.0],[1062.0,1984.0],[694.0,1913.0]],[[185.0,1109.0],[403.0,1730.0],[285.0,1454.0],[274.0,1812.0]],[[80.0,672.0],[662.0,381.0],[1646.0,1129.0],[1246.0,855.0]],[[850.0,971.0],[1367.0,1102.0],[280.0,306.0],[1508.0,1916.0]],[[203.0,690.0],[1216.0,1104.0],[1457.0,950.0],[1607.0,1637.0]],[[705.0,1980.0],[1063.0,1350.0],[910.0,1059.0],[1000.0,125.0]],[[1649.0,1296.0],[1768.0,1017.0],[1102.0,777.0],[297.0,678.0]],[[1816.0,606.0],[1073.0,1881.0],[665.0,567.0],[565.0,1805.0]],[[1479.0,1268.0],[1641.0,985.0],[474.0,844.0],[1251.0,279.0]],[[435.0,932.0],[1626.0,1316.0],[2016.0,409.0],[764.0,184.0]],[[226.0,95.0],[887.0,142.0],[2025.0,1811.0],[1402.0,1124.0]],[[483.0,707.0],[390.0,909.0],[1637.0,955.0],[2027.0,1842.0]],[[1547.0,690.0],[949.0,965.0],[1161.0,1894.0],[1595.0,867.0]],[[1850.0,1056.0],[1352.0,2032.0],[454.0,875.0],[322.0,189.0]],[[63.0,21.0],[1967.0,1308.0],[1569.0,1176.0],[802.0,1638.0]],[[655.0,623.0],[124.0,62.0],[1586.0,594.0],[233.0,1554.0]],[[1041.0,532.0],[325.0,1895.0],[1242.0,59.0],[145.0,249.0]],[[528.0,175.0],[1120.0,481.0],[1771.0,372.0],[778.0,113.0]],[[2046.0,533.0],[1143.0,786.0],[1833.0,1596.0],[1350.0,1097.0]],[[1064.0,995.0],[1005.0,246.0],[717.0,1432.0],[1755.0,249.0]],[[1446.0,1690.0],[816.0,1737.0],[287.0,1094.0],[296.0,1030.0]],[[727.0,395.0],[618.0,240.0],[832.0,1753.0],[183.0,216.0]],[[373.0,1921.0],[1516.0,406.0],[1280.0,164.0],[518.0,135.0]],[[1815.0,525.0],[1618.0,1827.0],[100.0,1105.0],[370.0,1024.0]],[[1332.0,351.0],[1236.0,140.0],[1573.0,238.0],[1069.0,1282.0]],[[532.0,1066.0],[1557.0,479.0],[1244.0,385.0],[1740.0,1005.0]],[[841.0,1352.0],[1387.0,1601.0],[1970.0,428.0],[531.0,1837.0]],[[123.0,1193.0],[643.0,819.0],[1516.0,1594.0],[1328.0,398.0]],[[1677.0,1414.0],[517.0,265.0],[178.0,1230.0],[1284.0,1710.0]],[[1221.0,1305.0],[1444.0,1116.0],[1332.0,35.0],[499.0,609.0]],[[1298.0,1333.0],[1341.0,281.0],[1850.0,1145.0],[1964.0,1860.0]],[[1491.0,1558.0],[320.0,229.0],[551.0,199.0],[2015.0,1031.0]],[[1005.0,1387.0],[1481.0,1516.0],[1648.0,1259.0],[1902.0,1394.0]],[[687.0,119.0],[607.0,1024.0],[905.0,546.0],[461.0,756.0]],[[1683.0,205.0],[406.0,1088.0],[438.0,836.0],[1071.0,273.0]],[[321.0,298.0],[890.0,710.0],[1769.0,89.0],[1507.0,1993.0]],[[1162.0,900.0],[820.0,2021.0],[963.0,1742.0],[1852.0,1503.0]],[[773.0,1974.0],[297.0,1050.0],[1668.0,824.0],[33.0,1559.0]],[[1995.0,312.0],[1653.0,1743.0],[164.0,1441.0],[1877.0,26.0]],[[777.0,1226.0],[22.0,491.0],[1239.0,1292.0],[1157.0,1685.0]],[[1672.0,1260.0],[1853.0,1236.0],[536.0,1819.0],[574.0,667.0]],[[1035.0,39.0],[1737.0,148.0],[1508.0,1723.0],[1647.0,1153.0]],[[75.0,370.0],[368.0,19.0],[1570.0,1101.0],[1902.0,1113.0]],[[1526.0,1971.0],[1378.0,1591.0],[1868.0,477.0],[1981.0,1452.0]],[[592.0,1700.0],[607.0,74.0],[704.0,1065.0],[1506.0,520.0]],[[1176.0,1691.0],[1056.0,1176.0],[1723.0,1120.0],[1775.0,1375.0]],[[1989.0,882.0],[2012.0,1646.0],[1741.0,374.0],[263.0,530.0]],[[844.0,612.0],[938.0,107.0],[422.0,1037.0],[637.0,1965.0]],[[405.0,1634.0],[767.0,12.0],[365.0,1751.0],[208.0,894.0]],[[1728.0,1420.0],[192.0,422.0],[1718.0,485.0],[1086.0,1141.0]],[[733.0,1964.0],[195.0,877.0],[357.0,1596.0],[507.0,1832.0]],[[1205.0,2039.0],[1610.0,475.0],[1962.0,433.0],[610.0,1582.0]],[[824.0,684.0],[1055.0,1706.0],[1182.0,2017.0],[879.0,1380.0]],[[1990.0,421.0],[35.0,1420.0],[1095.0,231.0],[1803.0,1228.0]],[[412.0,936.0],[1124.0,1107.0],[1009.0,1686.0],[607.0,533.0]],[[1049.0,799.0],[1670.0,239.0],[609.0,1694.0],[1106.0,1146.0]],[[1966.0,1252.0],[1093.0,2012.0],[878.0,2042.0],[1506.0,1927.0]],[[989.0,1386.0],[721.0,742.0],[1847.0,612.0],[238.0,1335.0]],[[553.0,873.0],[1291.0,2022.0],[1967.0,1351.0],[484.0,523.0]],[[573.0,1050.0],[921.0,360.0],[204.0,704.0],[475.0,926.0]],[[816.0,1261.0],[1729.0,1342.0],[17.0,82.0],[1250.0,902.0]],[[346.0,919.0],[1147.0,1397.0],[1102.0,1553.0],[94.0,498.0]],[[1351.0,1421.0],[571.0,464.0],[1027.0,586.0],[168.0,1421.0]],[[316.0,376.0],[422.0,1228.0],[1298.0,1019.0],[1103.0,203.0]],[[1481.0,127.0],[320.0,569.0],[1635.0,1523.0],[991.0,384.0]],[[1346.0,1120.0],[32.0,1318.0],[459.0,1443.0],[515.0,1110.0]],[[1659.0,373.0],[1947.0,1715.0],[1612.0,1233.0],[898.0,1239.0]],[[545.0,220.0],[450.0,717.0],[985.0,880.0],[1780.0,1124.0]],[[81.0,1025.0],[1109.0,1072.0],[1938.0,516.0],[1651.0,424.0]],[[1529.0,282.0],[1487.0,124.0],[1262.0,1824.0],[541.0,638.0]],[[304.0,581.0],[885.0,1982.0],[1374.0,1495.0],[1197.0,654.0]],[[637.0,1563.0],[1801.0,1661.0],[482.0,594.0],[1104.0,1209.0]],[[33.0,39.0],[543.0,1554.0],[414.0,1882.0],[124.0,1769.0]],[[1729.0,1130.0],[1516.0,1672.0],[1663.0,1892.0],[218.0,406.0]],[[1928.0,153.0],[2.0,172.0],[455.0,571.0],[1459.0,1109.0]],[[1459.0,1941.0],[1004.0,982.0],[432.0,1465.0],[649.0,476.0]],[[166.0,1284.0],[1730.0,1418.0],[1038.0,228.0],[1781.0,1699.0]],[[1541.0,1469.0],[1203.0,1397.0],[1806.0,975.0],[591.0,229.0]],[[1398.0,464.0],[705.0,1996.0],[1396.0,497.0],[88.0,1967.0]],[[856.0,1569.0],[715.0,1627.0],[933.0,408.0],[1017.0,1374.0]],[[1347.0,1004.0],[1889.0,1929.0],[1513.0,2017.0],[793.0,1769.0]],[[1804.0,1633.0],[493.0,1999.0],[1091.0,512.0],[613.0,48.0]],[[1540.0,1698.0],[446.0,107.0],[305.0,749.0],[1879.0,1544.0]],[[1181.0,636.0],[631.0,433.0],[1042.0,76.0],[1902.0,1624.0]],[[935.0,1600.0],[21.0,1021.0],[1732.0,650.0],[733.0,1402.0]],[[979.0,311.0],[659.0,719.0],[1538.0,88.0],[888.0,1750.0]],[[965.0,165.0],[779.0,316.0],[1015.0,1630.0],[1904.0,487.0]],[[198.0,1585.0],[367.0,387.0],[1961.0,184.0],[979.0,49.0]],[[85.0,1277.0],[1910.0,1138.0],[1702.0,682.0],[545.0,1303.0]],[[1837.0,1710.0],[686.0,1619.0],[1593.0,822.0],[2029.0,1140.0]],[[1474.0,620.0],[1062.0,1144.0],[717.0,342.0],[1476.0,1376.0]],[[584.0,1058.0],[1044.0,1033.0],[1430.0,1573.0],[1143.0,1915.0]],[[55.0,610.0],[533.0,1035.0],[925.0,804.0],[288.0,812.0]],[[1758.0,982.0],[570.0,1886.0],[1602.0,802.0],[338.0,316.0]],[[627.0,235.0],[123.0,1660.0],[1567.0,1709.0],[563.0,529.0]],[[303.0,988.0],[1563.0,571.0],[1170.0,829.0],[1626.0,1461.0]],[[730.0,922.0],[1219.0,589.0],[1424.0,2015.0],[1195.0,362.0]],[[1224.0,855.0],[1898.0,89.0],[1189.0,422.0],[1526.0,1816.0]],[[1044.0,238.0],[213.0,1292.0],[654.0,542.0],[423.0,460.0]],[[1782.0,1007.0],[851.0,1625.0],[497.0,869.0],[1572.0,548.0]],[[1042.0,14.0],[495.0,825.0],[1548.0,1974.0],[944.0,1096.0]],[[154.0,687.0],[954.0,1681.0],[1121.0,1725.0],[1632.0,1114.0]],[[2023.0,400.0],[530.0,764.0],[65.0,1859.0],[183.0,2000.0]],[[877.0,1613.0],[1377.0,997.0],[385.0,315.0],[174.0,1731.0]],[[1809.0,773.0],[709.0,778.0],[1576.0,1476.0],[807.0,953.0]],[[1473.0,264.0],[1396.0,212.0],[1877.0,181.0],[724.0,604.0]],[[1169.0,1921.0],[176.0,265.0],[1623.0,376.0],[1638.0,1234.0]],[[1615.0,1097.0],[1442.0,1927.0],[201.0,1954.0],[71.0,1748.0]],[[1247.0,1299.0],[611.0,1137.0],[269.0,1478.0],[1700.0,1601.0]],[[96.0,464.0],[151.0,58.0],[413.0,1360.0],[1379.0,1508.0]],[[141.0,1516.0],[303.0,1986.0],[343.0,1827.0],[1370.0,2048.0]],[[13.0,658.0],[1331.0,1478.0],[876.0,598.0],[607.0,441.0]],[[1654.0,1299.0],[1723.0,1474.0],[1398.0,1064.0],[1509.0,154.0]],[[259.0,1010.0],[1087.0,1626.0],[1162.0,341.0],[306.0,697.0]],[[1094.0,1694.0],[341.0,517.0],[1156.0,1076.0],[961.0,862.0]],[[404.0,1135.0],[1967.0,192.0],[1234.0,835.0],[307.0,1292.0]],[[1391.0,1212.0],[545.0,144.0],[1811.0,1490.0],[152.0,117.0]],[[1292.0,1710.0],[670.0,166.0],[1739.0,755.0],[808.0,953.0]],[[470.0,532.0],[501.0,1091.0],[1877.0,804.0],[226.0,1479.0]],[[1868.0,1371.0],[1452.0,900.0],[38.0,57.0],[2001.0,132.0]],[[673.0,1037.0],[163.0,37.0],[942.0,346.0],[709.0,143.0]],[[820.0,857.0],[1814.0,1182.0],[995.0,2009.0],[1521.0,1330.0]],[[1605.0,300.0],[799.0,743.0],[768.0,1216.0],[1745.0,1941.0]],[[1488.0,94.0],[1996.0,84.0],[429.0,1771.0],[1407.0,1388.0]],[[303.0,1721.0],[799.0,2024.0],[1956.0,1843.0],[1929.0,677.0]],[[1098.0,1235.0],[1623.0,1061.0],[1046.0,1270.0],[60.0,187.0]],[[1874.0,1874.0],[1456.0,950.0],[1819.0,856.0],[1949.0,1374.0]],[[593.0,1572.0],[1791.0,222.0],[455.0,1459.0],[33.0,1047.0]],[[221.0,1255.0],[1551.0,61.0],[1329.0,1385.0],[1264.0,203.0]],[[854.0,334.0],[1346.0,491.0],[271.0,525.0],[1205.0,1677.0]],[[1395.0,952.0],[111.0,749.0],[1498.0,1239.0],[1203.0,1548.0]],[[1722.0,1890.0],[303.0,815.0],[1669.0,948.0],[172.0,986.0]],[[919.0,997.0],[1616.0,1553.0],[860.0,622.0],[1225.0,1474.0]],[[5.0,1258.0],[1819.0,2039.0],[699.0,599.0],[127.0,1518.0]],[[1789.0,1400.0],[2005.0,1300.0],[456.0,1197.0],[1130.0,1759.0]],[[46.0,1272.0],[354.0,2014.0],[470.0,903.0],[1084.0,1789.0]],[[1526.0,944.0],[222.0,419.0],[667.0,531.0],[1196.0,197.0]],[[279.0,893.0],[12.0,253.0],[1732.0,86.0],[271.0,225.0]],[[36.0,142.0],[1389.0,1362.0],[76.0,36.0],[865.0,1920.0]],[[819.0,1090.0],[1209.0,1029.0],[956.0,748.0],[863.0,1603.0]],[[244.0,977.0],[1853.0,144.0],[1357.0,1338.0],[1666.0,490.0]],[[65.0,757.0],[383.0,757.0],[894.0,921.0],[723.0,1245.0]],[[400.0,240.0],[1285.0,599.0],[257.0,1815.0],[614.0,945.0]],[[176.0,1172.0],[1410.0,238.0],[365.0,1812.0],[820.0,933.0]],[[758.0,488.0],[235.0,828.0],[221.0,474.0],[358.0,900.0]],[[1171.0,1032.0],[1731.0,1018.0],[132.0,1031.0],[797.0,1334.0]],[[1433.0,1463.0],[1860.0,1566.0],[1583.0,366.0],[1745.0,1001.0]],[[2004.0,1407.0],[731.0,466.0],[981.0,296.0],[1788.0,1134.0]],[[1244.0,1372.0],[1517.0,1676.0],[1869.0,1492.0],[1441.0,1293.0]],[[1622.0,1930.0],[70.0,1516.0],[521.0,1238.0],[688.0,1237.0]],[[519.0,612.0],[683.0,1874.0],[623.0,553.0],[659.0,326.0]],[[1039.0,964.0],[1457.0,1291.0],[702.0,1135.0],[1937.0,1268.0]],[[316.0,1754.0],[630.0,1446.0],[1841.0,440.0],[638.0,1293.0]],[[283.0,765.0],[1964.0,143.0],[191.0,785.0],[1458.0,1499.0]],[[1455.0,1534.0],[1401.0,493.0],[756.0,1537.0],[133.0,1109.0]],[[860.0,255.0],[1011.0,1246.0],[1339.0,1650.0],[1000.0,1473.0]],[[202.0,949.0],[1190.0,27.0],[800.0,397.0],[554.0,912.0]],[[1510.0,1091.0],[576.0,665.0],[934.0,308.0],[1275.0,1769.0]],[[1799.0,1945.0],[749.0,1456.0],[800.0,1773.0],[303.0,1134.0]],[[840.0,937.0],[582.0,547.0],[852.0,86.0],[670.0,1989.0]],[[1486.0,753.0],[201.0,1475.0],[337.0,972.0],[865.0,356.0]],[[1807.0,804.0],[1402.0,675.0],[73.0,891.0],[1294.0,1967.0]],[[148.0,214.0],[1502.0,2047.0],[1431.0,555.0],[1999.0,279.0]],[[1305.0,1276.0],[1301.0,366.0],[1969.0,1384.0],[1702.0,292.0]],[[1073.0,257.0],[1322.0,78.0],[738.0,1341.0],[924.0,1282.0]],[[1075.0,1033.0],[1254.0,1997.0],[1703.0,49.0],[1206.0,665.0]],[[1191.0,199.0],[474.0,1767.0],[1763.0,890.0],[1139.0,1460.0]],[[2024.0,1152.0],[1048.0,706.0],[1321.0,584.0],[1440.0,387.0]],[[1626.0,1461.0],[787.0,1621.0],[1840.0,614.0],[1970.0,994.0]],[[154.0,1014.0],[323.0,288.0],[157.0,1931.0],[1983.0,1340.0]],[[698.0,2036.0],[1628.0,54.0],[1581.0,1845.0],[677.0,1528.0]],[[211.0,1508.0],[1445.0,1793.0],[972.0,1243.0],[361.0,1809.0]],[[1462.0,799.0],[660.0,551.0],[1811.0,184.0],[1491.0,1381.0]],[[710.0,2008.0],[1959.0,34.0],[958.0,243.0],[1819.0,669.0]],[[853.0,1639.0],[1908.0,505.0],[1289.0,1073.0],[566.0,693.0]],[[1351.0,539.0],[739.0,1262.0],[959.0,1750.0],[1917.0,1875.0]],[[1274.0,695.0],[1264.0,846.0],[1157.0,633.0],[26.0,1394.0]],[[487.0,1742.0],[1556.0,732.0],[1800.0,1840.0],[1811.0,1489.0]],[[845.0,221.0],[348.0,439.0],[398.0,1587.0],[562.0,1816.0]],[[1626.0,745.0],[1945.0,1838.0],[149.0,794.0],[1843.0,2000.0]],[[1596.0,1190.0],[1428.0,710.0],[1119.0,738.0],[112.0,248.0]],[[265.0,941.0],[1825.0,1306.0],[1808.0,1373.0],[416.0,1590.0]],[[220.0,1918.0],[1139.0,1676.0],[1905.0,1356.0],[393.0,672.0]],[[1643.0,1749.0],[1956.0,610.0],[1308.0,597.0],[1433.0,562.0]],[[792.0,921.0],[885.0,1859.0],[637.0,423.0],[421.0,1741.0]],[[215.0,1857.0],[621.0,1534.0],[1317.0,1147.0],[1630.0,58.0]],[[1587.0,1995.0],[1824.0,1235.0],[1241.0,1585.0],[1282.0,1186.0]],[[713.0,410.0],[2004.0,736.0],[1825.0,628.0],[1878.0,432.0]],[[505.0,1304.0],[1295.0,2024.0],[1396.0,1309.0],[1894.0,1324.0]],[[1984.0,1614.0],[893.0,680.0],[987.0,819.0],[1004.0,211.0]],[[1314.0,252.0],[1344.0,1719.0],[121.0,1410.0],[1472.0,1480.0]],[[1674.0,856.0],[1182.0,919.0],[1284.0,1627.0],[1575.0,719.0]],[[34.0,1592.0],[1434.0,910.0],[958.0,269.0],[1311.0,1575.0]],[[834.0,1202.0],[392.0,1777.0],[16.0,1437.0],[381.0,1670.0]],[[627.0,456.0],[734.0,1394.0],[590.0,1538.0],[1789.0,1333.0]],[[1135.0,854.0],[794.0,648.0],[674.0,657.0],[600.0,490.0]],[[1810.0,532.0],[1766.0,548.0],[1367.0,1299.0],[561.0,84.0]],[[1468.0,713.0],[926.0,962.0],[2035.0,2001.0],[140.0,367.0]],[[547.0,1920.0],[584.0,856.0],[1476.0,564.0],[1147.0,1427.0]],[[265.0,1571.0],[1946.0,122.0],[1891.0,806.0],[986.0,844.0]],[[20.0,1245.0],[172.0,1093.0],[775.0,294.0],[433.0,451.0]],[[1639.0,1359.0],[429.0,1824.0],[1977.0,1149.0],[584.0,1766.0]],[[1521.0,1429.0],[1571.0,1685.0],[1786.0,1507.0],[843.0,801.0]],[[267.0,593.0],[974.0,982.0],[85.0,987.0],[1612.0,1870.0]],[[1805.0,390.0],[221.0,705.0],[31.0,181.0],[1762.0,1140.0]],[[1701.0,543.0],[965.0,1533.0],[1698.0,1400.0],[193.0,1861.0]],[[529.0,1491.0],[246.0,1430.0],[480.0,1005.0],[510.0,1788.0]],[[609.0,78.0],[1496.0,532.0],[616.0,1180.0],[101.0,1934.0]],[[109.0,1978.0],[274.0,1765.0],[376.0,1924.0],[396.0,527.0]],[[1612.0,1679.0],[990.0,1555.0],[1956.0,1299.0],[1793.0,478.0]],[[275.0,862.0],[1512.0,427.0],[393.0,1453.0],[432.0,802.0]],[[455.0,358.0],[14.0,1768.0],[960.0,374.0],[1258.0,1997.0]],[[253.0,1757.0],[1221.0,1605.0],[167.0,118.0],[1133.0,1959.0]],[[1793.0,896.0],[1100.0,1317.0],[1956.0,1808.0],[224.0,1101.0]],[[711.0,1793.0],[1865.0,1211.0],[747.0,1314.0],[1629.0,1694.0]],[[1631.0,1955.0],[903.0,1254.0],[70.0,258.0],[605.0,2021.0]],[[474.0,1472.0],[1061.0,1266.0],[1241.0,567.0],[437.0,565.0]],[[1864.0,155.0],[1825.0,1923.0],[1334.0,1520.0],[512.0,59.0]],[[825.0,1100.0],[265.0,1892.0],[1160.0,49.0],[1089.0,88.0]],[[1644.0,458.0],[400.0,1319.0],[1832.0,374.0],[2041.0,1407.0]],[[178.0,769.0],[694.0,227.0],[476.0,174.0],[480.0,1249.0]],[[821.0,663.0],[615.0,933.0],[890.0,367.0],[1445.0,1783.0]],[[1092.0,551.0],[1171.0,1016.0],[284.0,1084.0],[232.0,89.0]],[[1768.0,1156.0],[1944.0,1728.0],[1787.0,278.0],[758.0,879.0]],[[139.0,1758.0],[1697.0,1453.0],[1453.0,607.0],[732.0,925.0]],[[939.0,243.0],[1497.0,274.0],[1828.0,1318.0],[891.0,897.0]],[[1055.0,634.0],[1562.0,439.0],[1956.0,7.0],[1933.0,1278.0]],[[1075.0,1192.0],[854.0,543.0],[1558.0,143.0],[1566.0,1872.0]],[[99.0,539.0],[948.0,2020.0],[405.0,1212.0],[1786.0,822.0]],[[1367.0,402.0],[1019.0,993.0],[2013.0,474.0],[728.0,2033.0]],[[1468.0,1774.0],[1639.0,1727.0],[97.0,1635.0],[579.0,1743.0]],[[521.0,248.0],[1197.0,1591.0],[1761.0,390.0],[825.0,1111.0]],[[1961.0,1729.0],[1082.0,436.0],[1334.0,626.0],[1063.0,100.0]],[[397.0,1518.0],[1860.0,1085.0],[387.0,1163.0],[569.0,346.0]],[[1664.0,1558.0],[114.0,1961.0],[532.0,1603.0],[2015.0,954.0]],[[115.0,1540.0],[253.0,1681.0],[344.0,1023.0],[162.0,1860.0]],[[343.0,1202.0],[162.0,1423.0],[173.0,279.0],[299.0,185.0]],[[1256.0,1451.0],[1261.0,371.0],[1927.0,1464.0],[1338.0,700.0]],[[1454.0,1023.0],[1340.0,953.0],[1017.0,891.0],[1272.0,1253.0]],[[1322.0,1236.0],[19.0,1970.0],[1035.0,942.0],[604.0,989.0]],[[660.0,346.0],[1063.0,1633.0],[829.0,564.0],[675.0,303.0]],[[1295.0,1581.0],[864.0,648.0],[158.0,1825.0],[884.0,1641.0]],[[461.0,1273.0],[900.0,1186.0],[1826.0,1378.0],[341.0,280.0]],[[288.0,945.0],[490.0,1898.0],[1877.0,40.0],[686.0,1876.0]],[[1772.0,449.0],[787.0,63.0],[996.0,1260.0],[877.0,1204.0]],[[1261.0,1081.0],[1431.0,1088.0],[1177.0,194.0],[119.0,43.0]],[[1807.0,173.0],[844.0,315.0],[1292.0,1852.0],[1246.0,468.0]],[[1010.0,454.0],[790.0,123.0],[797.0,555.0],[105.0,1803.0]],[[117.0,931.0],[1946.0,708.0],[36.0,917.0],[566.0,256.0]],[[65.0,561.0],[1312.0,346.0],[1068.0,798.0],[1631.0,32.0]],[[1145.0,1441.0],[1060.0,1578.0],[1654.0,1906.0],[1142.0,362.0]],[[737.0,1963.0],[1613.0,545.0],[853.0,105.0],[211.0,1299.0]],[[592.0,896.0],[1305.0,1625.0],[167.0,1672.0],[1944.0,265.0]],[[140.0,537.0],[1682.0,1595.0],[1112.0,181.0],[891.0,795.0]],[[1246.0,1557.0],[1227.0,93.0],[1092.0,781.0],[665.0,941.0]],[[360.0,863.0],[1967.0,674.0],[215.0,1648.0],[1158.0,60.0]],[[618.0,405.0],[162.0,1761.0],[1945.0,717.0],[893.0,1919.0]],[[441.0,1658.0],[917.0,259.0],[520.0,1384.0],[1944.0,2021.0]],[[1505.0,1772.0],[1016.0,1814.0],[1064.0,1655.0],[1457.0,1582.0]],[[937.0,1545.0],[435.0,740.0],[1411.0,310.0],[105.0,1718.0]],[[2023.0,249.0],[1885.0,451.0],[959.0,1862.0],[1438.0,374.0]],[[1372.0,151.0],[1133.0,1372.0],[531.0,684.0],[1760.0,1276.0]],[[1813.0,996.0],[2004.0,1571.0],[113.0,1043.0],[493.0,1174.0]],[[1063.0,101.0],[345.0,1329.0],[741.0,896.0],[1202.0,331.0]],[[698.0,1865.0],[1523.0,1633.0],[1854.0,1933.0],[420.0,2001.0]],[[341.0,139.0],[242.0,76.0],[1141.0,149.0],[1100.0,1273.0]],[[722.0,1955.0],[1381.0,69.0],[1862.0,1400.0],[972.0,927.0]],[[1416.0,237.0],[93.0,1804.0],[811.0,1612.0],[627.0,734.0]],[[950.0,333.0],[1617.0,167.0],[713.0,1311.0],[19.0,1860.0]],[[665.0,156.0],[1730.0,909.0],[1053.0,1793.0],[773.0,166.0]],[[1546.0,1681.0],[1632.0,1745.0],[1113.0,1813.0],[1380.0,97.0]],[[320.0,1935.0],[1717.0,663.0],[1763.0,656.0],[704.0,1094.0]],[[1691.0,1971.0],[1169.0,1422.0],[1870.0,1628.0],[1542.0,1172.0]],[[983.0,1469.0],[923.0,1084.0],[82.0,296.0],[1078.0,1596.0]],[[657.0,1081.0],[1033.0,2009.0],[64.0,652.0],[1980.0,452.0]],[[899.0,622.0],[462.0,1574.0],[232.0,706.0],[279.0,388.0]],[[1918.0,1918.0],[102.0,237.0],[1111.0,210.0],[1934.0,851.0]],[[1457.0,1793.0],[452.0,1387.0],[1304.0,1565.0],[1593.0,1188.0]],[[338.0,938.0],[1807.0,1431.0],[1750.0,1766.0],[1785.0,1091.0]],[[764.0,617.0],[216.0,1353.0],[1440.0,1542.0],[275.0,1302.0]],[[725.0,595.0],[469.0,836.0],[1954.0,954.0],[1468.0,661.0]],[[832.0,1224.0],[703.0,566.0],[1638.0,1743.0],[2003.0,1437.0]],[[139.0,308.0],[99.0,1507.0],[1019.0,637.0],[874.0,1622.0]],[[1817.0,1117.0],[1745.0,1384.0],[1974.0,1395.0],[332.0,224.0]],[[570.0,1924.0],[721.0,372.0],[33.0,266.0],[98.0,751.0]],[[1141.0,795.0],[1886.0,1647.0],[1111.0,1081.0],[1574.0,431.0]],[[1619.0,1897.0],[988.0,291.0],[1280.0,550.0],[108.0,1550.0]],[[230.0,1189.0],[1413.0,69.0],[1798.0,1299.0],[41.0,1293.0]],[[1605.0,209.0],[1829.0,398.0],[1734.0,1663.0],[504.0,71.0]],[[47.0,1673.0],[1426.0,719.0],[1656.0,166.0],[586.0,1169.0]],[[1683.0,680.0],[1921.0,1202.0],[1049.0,143.0],[1600.0,1687.0]],[[599.0,1327.0],[697.0,1856.0],[1610.0,514.0],[323.0,1609.0]],[[1066.0,1604.0],[2003.0,137.0],[1190.0,653.0],[1101.0,1590.0]],[[1122.0,511.0],[1046.0,36.0],[489.0,437.0],[1916.0,619.0]],[[1908.0,986.0],[973.0,170.0],[920.0,327.0],[443.0,395.0]],[[153.0,467.0],[179.0,1033.0],[1699.0,600.0],[1420.0,467.0]],[[204.0,1595.0],[915.0,652.0],[2004.0,702.0],[1442.0,1630.0]],[[701.0,1335.0],[288.0,203.0],[62.0,1220.0],[407.0,1845.0]],[[356.0,2.0],[194.0,1151.0],[1249.0,1042.0],[1878.0,1569.0]],[[480.0,915.0],[1253.0,514.0],[98.0,1499.0],[1828.0,386.0]],[[1765.0,636.0],[1125.0,466.0],[1528.0,1033.0],[864.0,1345.0]],[[577.0,913.0],[30.0,942.0],[1976.0,1469.0],[521.0,1672.0]],[[1404.0,1750.0],[1802.0,458.0],[1025.0,217.0],[1209.0,1305.0]],[[815.0,852.0],[939.0,991.0],[1540.0,1421.0],[1050.0,6.0]],[[2015.0,575.0],[1751.0,1981.0],[370.0,1130.0],[409.0,898.0]],[[444.0,1745.0],[1659.0,582.0],[469.0,1800.0],[886.0,660.0]],[[882.0,1116.0],[1497.0,1337.0],[1422.0,1031.0],[611.0,127.0]],[[906.0,1053.0],[1974.0,65.0],[1400.0,68.0],[714.0,822.0]],[[1063.0,942.0],[299.0,1745.0],[1511.0,1516.0],[776.0,432.0]],[[18.0,1606.0],[1388.0,1350.0],[1680.0,1405.0],[1054.0,1648.0]],[[1129.0,1446.0],[307.0,1791.0],[913.0,1933.0],[1417.0,1158.0]],[[119.0,434.0],[220.0,700.0],[922.0,1799.0],[1203.0,1733.0]],[[1632.0,18.0],[278.0,1625.0],[625.0,850.0],[1942.0,1612.0]],[[2022.0,404.0],[1679.0,675.0],[2018.0,880.0],[1264.0,148.0]],[[1223.0,1200.0],[568.0,1028.0],[1244.0,1949.0],[546.0,1787.0]],[[1365.0,1315.0],[863.0,1138.0],[162.0,1272.0],[1206.0,2036.0]],[[1224.0,1082.0],[654.0,1186.0],[1077.0,1368.0],[610.0,1060.0]],[[1586.0,1810.0],[2027.0,690.0],[1571.0,162.0],[379.0,842.0]],[[1298.0,209.0],[1251.0,164.0],[1701.0,445.0],[1326.0,529.0]],[[42.0,1410.0],[988.0,1451.0],[1779.0,986.0],[342.0,133.0]],[[1371.0,77.0],[1816.0,106.0],[690.0,1151.0],[857.0,1756.0]],[[1184.0,675.0],[179.0,159.0],[2036.0,1598.0],[456.0,1556.0]],[[1179.0,1786.0],[204.0,938.0],[1366.0,1717.0],[1994.0,832.0]],[[364.0,1378.0],[1657.0,734.0],[964.0,1987.0],[295.0,1716.0]],[[1618.0,893.0],[1047.0,6.0],[1154.0,133.0],[1065.0,349.0]],[[736.0,1034.0],[1838.0,1780.0],[1251.0,411.0],[1217.0,220.0]],[[1954.0,719.0],[1042.0,855.0],[516.0,172.0],[1635.0,40.0]],[[1216.0,11.0],[1563.0,1392.0],[396.0,1051.0],[663.0,818.0]],[[297.0,716.0],[1544.0,95.0],[902.0,1663.0],[73.0,17.0]],[[1702.0,719.0],[218.0,1621.0],[1697.0,781.0],[651.0,909.0]],[[375.0,1851.0],[1369.0,1024.0],[785.0,1047.0],[1591.0,1013.0]],[[1197.0,1055.0],[602.0,1089.0],[1481.0,1128.0],[896.0,775.0]],[[89.0,431.0],[895.0,1129.0],[691.0,1319.0],[899.0,666.0]],[[134.0,897.0],[1588.0,1072.0],[1054.0,869.0],[1070.0,1538.0]],[[171.0,135.0],[630.0,2035.0],[1788.0,1234.0],[1501.0,1661.0]],[[1458.0,810.0],[1173.0,1147.0],[1082.0,1979.0],[625.0,1460.0]],[[579.0,1596.0],[250.0,295.0],[1065.0,308.0],[2021.0,852.0]],[[1858.0,1259.0],[164.0,1101.0],[1380.0,17.0],[2029.0,1767.0]],[[1766.0,1735.0],[1501.0,1990.0],[792.0,1771.0],[1603.0,1184.0]],[[393.0,331.0],[659.0,1381.0],[1496.0,1758.0],[1564.0,504.0]],[[1541.0,212.0],[1776.0,823.0],[461.0,938.0],[1956.0,1571.0]],[[708.0,545.0],[901.0,392.0],[1420.0,1323.0],[1800.0,682.0]],[[1549.0,1983.0],[754.0,153.0],[812.0,1023.0],[537.0,489.0]],[[1121.0,53.0],[20.0,1523.0],[1169.0,879.0],[222.0,1277.0]],[[606.0,521.0],[275.0,640.0],[1712.0,1099.0],[535.0,298.0]],[[791.0,658.0],[1707.0,887.0],[1608.0,2007.0],[709.0,263.0]],[[2041.0,994.0],[835.0,298.0],[621.0,1001.0],[775.0,603.0]],[[1063.0,267.0],[1524.0,323.0],[1456.0,1141.0],[734.0,1923.0]],[[1775.0,904.0],[516.0,481.0],[1783.0,1755.0],[1506.0,917.0]],[[1817.0,1604.0],[1362.0,751.0],[214.0,199.0],[1504.0,1897.0]],[[661.0,1911.0],[1528.0,1442.0],[639.0,1873.0],[823.0,1954.0]],[[1155.0,852.0],[520.0,902.0],[1157.0,433.0],[360.0,929.0]],[[1738.0,877.0],[1231.0,2016.0],[252.0,1538.0],[835.0,218.0]],[[1265.0,1226.0],[863.0,1755.0],[51.0,1870.0],[1333.0,1719.0]],[[999.0,431.0],[690.0,208.0],[1565.0,667.0],[70.0,2031.0]],[[1987.0,1510.0],[1747.0,117.0],[1785.0,1594.0],[972.0,33.0]],[[176.0,818.0],[1292.0,146.0],[552.0,1796.0],[731.0,1851.0]],[[599.0,588.0],[1030.0,1564.0],[380.0,505.0],[290.0,1570.0]],[[1982.0,1501.0],[862.0,154.0],[1676.0,903.0],[1970.0,809.0]],[[691.0,969.0],[807.0,1386.0],[1223.0,1955.0],[963.0,872.0]],[[1153.0,504.0],[41.0,150.0],[1291.0,364.0],[731.0,1868.0]],[[329.0,1678.0],[574.0,177.0],[574.0,1309.0],[1469.0,1851.0]],[[780.0,1639.0],[1898.0,351.0],[1615.0,1498.0],[40.0,1167.0]],[[866.0,1458.0],[1533.0,30.0],[388.0,1824.0],[1660.0,1256.0]],[[709.0,1225.0],[898.0,1351.0],[1361.0,867.0],[167.0,208.0]],[[76.0,745.0],[1894.0,1328.0],[150.0,1089.0],[1112.0,269.0]],[[1023.0,48.0],[532.0,1692.0],[1423.0,1105.0],[2041.0,159.0]],[[1580.0,453.0],[1250.0,1717.0],[1016.0,939.0],[1785.0,1081.0]],[[42.0,23.0],[620.0,1945.0],[610.0,1433.0],[317.0,1013.0]],[[632.0,543.0],[1642.0,568.0],[1352.0,795.0],[530.0,560.0]],[[477.0,521.0],[136.0,1139.0],[1118.0,1443.0],[30.0,595.0]],[[35.0,261.0],[1868.0,1772.0],[1628.0,1267.0],[547.0,1604.0]],[[1745.0,1474.0],[1834.0,1432.0],[1197.0,1946.0],[760.0,1101.0]],[[32.0,1275.0],[941.0,217.0],[2045.0,244.0],[30.0,324.0]],[[1897.0,10.0],[1005.0,542.0],[1605.0,1591.0],[911.0,1133.0]],[[750.0,893.0],[661.0,371.0],[1353.0,1420.0],[352.0,499.0]],[[945.0,838.0],[1345.0,1834.0],[339.0,1766.0],[1459.0,676.0]],[[741.0,416.0],[1451.0,756.0],[2020.0,324.0],[1868.0,1766.0]],[[895.0,259.0],[277.0,1030.0],[1344.0,1605.0],[1508.0,1336.0]],[[1762.0,289.0],[779.0,1686.0],[1423.0,2036.0],[1419.0,488.0]],[[1832.0,1348.0],[35.0,922.0],[1245.0,1682.0],[573.0,784.0]],[[1139.0,189.0],[664.0,1269.0],[233.0,455.0],[1088.0,457.0]],[[736.0,1852.0],[1015.0,1919.0],[1765.0,223.0],[577.0,2018.0]],[[1473.0,1195.0],[1537.0,364.0],[1790.0,531.0],[955.0,1753.0]],[[1993.0,256.0],[1481.0,758.0],[253.0,835.0],[776.0,76.0]],[[1421.0,973.0],[978.0,1682.0],[1699.0,676.0],[961.0,3.0]],[[899.0,232.0],[636.0,369.0],[101.0,582.0],[1091.0,940.0]],[[1477.0,1362.0],[564.0,384.0],[1047.0,1690.0],[1456.0,173.0]],[[254.0,1877.0],[154.0,1288.0],[1275.0,1229.0],[1596.0,1256.0]],[[1576.0,1976.0],[1206.0,491.0],[46.0,433.0],[1736.0,301.0]],[[854.0,504.0],[38.0,1006.0],[1921.0,290.0],[871.0,1396.0]],[[879.0,1212.0],[1170.0,1905.0],[1905.0,861.0],[1895.0,1542.0]],[[342.0,126.0],[302.0,1232.0],[1840.0,839.0],[1209.0,1697.0]],[[757.0,1616.0],[1536.0,1896.0],[906.0,1010.0],[2022.0,57.0]],[[1198.0,1099.0],[1942.0,2021.0],[1441.0,448.0],[491.0,876.0]],[[1828.0,1589.0],[880.0,1724.0],[252.0,720.0],[1583.0,1741.0]],[[1530.0,580.0],[278.0,654.0],[184.0,868.0],[1905.0,1269.0]],[[1232.0,1947.0],[551.0,86.0],[1848.0,1776.0],[1413.0,1784.0]],[[1488.0,892.0],[1106.0,832.0],[1888.0,1940.0],[1111.0,1701.0]],[[1165.0,1134.0],[1817.0,269.0],[455.0,1332.0],[1833.0,1176.0]],[[929.0,1311.0],[1016.0,635.0],[643.0,1041.0],[1016.0,1686.0]],[[123.0,1758.0],[1630.0,923.0],[557.0,294.0],[347.0,676.0]],[[1919.0,1554.0],[900.0,1196.0],[1602.0,1099.0],[32.0,1162.0]],[[613.0,492.0],[1765.0,1153.0],[1232.0,1714.0],[250.0,609.0]],[[398.0,678.0],[1996.0,1773.0],[454.0,235.0],[1469.0,1303.0]],[[1258.0,147.0],[1254.0,1848.0],[128.0,1409.0],[1165.0,870.0]],[[1079.0,1121.0],[691.0,1175.0],[1385.0,367.0],[145.0,527.0]],[[538.0,1571.0],[1323.0,1388.0],[1929.0,685.0],[1199.0,111.0]],[[1086.0,72.0],[94.0,1721.0],[1900.0,99.0],[1593.0,435.0]],[[509.0,67.0],[1571.0,366.0],[2045.0,879.0],[1449.0,133.0]],[[1678.0,1933.0],[1307.0,775.0],[34.0,520.0],[1932.0,1928.0]],[[1026.0,1770.0],[412.0,1704.0],[1853.0,1208.0],[381.0,213.0]],[[1735.0,630.0],[1437.0,811.0],[339.0,1869.0],[1481.0,453.0]],[[1356.0,412.0],[833.0,1301.0],[649.0,657.0],[1353.0,334.0]],[[854.0,1201.0],[269.0,2009.0],[1889.0,2048.0],[1820.0,1581.0]],[[1491.0,1945.0],[714.0,583.0],[1.0,717.0],[1263.0,725.0]],[[614.0,849.0],[550.0,998.0],[1873.0,565.0],[347.0,1984.0]],[[1595.0,1615.0],[1737.0,1786.0],[1927.0,1147.0],[1955.0,513.0]],[[810.0,1548.0],[144.0,1123.0],[575.0,1802.0],[891.0,635.0]],[[1598.0,1811.0],[253.0,1423.0],[925.0,639.0],[1170.0,2005.0]],[[1354.0,627.0],[264.0,1611.0],[299.0,303.0],[0.0,123.0]],[[307.0,357.0],[536.0,1030.0],[251.0,853.0],[1764.0,1383.0]],[[1140.0,1455.0],[820.0,649.0],[1678.0,328.0],[1451.0,472.0]],[[1731.0,1846.0],[1366.0,416.0],[42.0,229.0],[607.0,1670.0]],[[864.0,826.0],[279.0,656.0],[1865.0,97.0],[1339.0,1206.0]],[[1271.0,628.0],[1852.0,214.0],[179.0,1180.0],[652.0,99.0]],[[1293.0,97.0],[605.0,1032.0],[436.0,956.0],[1050.0,2026.0]],[[2044.0,785.0],[316.0,536.0],[1169.0,123.0],[966.0,645.0]],[[716.0,997.0],[1884.0,440.0],[14.0,801.0],[1497.0,698.0]],[[1106.0,388.0],[330.0,1230.0],[950.0,1543.0],[1219.0,555.0]],[[1234.0,570.0],[1219.0,493.0],[1226.0,411.0],[854.0,1802.0]],[[1636.0,400.0],[124.0,1619.0],[1952.0,31.0],[1203.0,1922.0]],[[1920.0,1511.0],[737.0,857.0],[1954.0,817.0],[927.0,564.0]],[[1772.0,813.0],[1493.0,2012.0],[933.0,199.0],[1006.0,470.0]],[[1487.0,273.0],[174.0,870.0],[1769.0,1356.0],[1667.0,1840.0]],[[1809.0,1885.0],[1839.0,1520.0],[160.0,833.0],[1063.0,533.0]],[[443.0,1700.0],[819.0,1341.0],[422.0,21.0],[914.0,812.0]],[[1573.0,798.0],[1241.0,1265.0],[1533.0,953.0],[115.0,1022.0]],[[1136.0,1249.0],[742.0,468.0],[60.0,1425.0],[632.0,1595.0]],[[2011.0,1864.0],[460.0,925.0],[1438.0,252.0],[336.0,988.0]],[[703.0,808.0],[1751.0,575.0],[1550.0,1642.0],[1442.0,336.0]],[[152.0,1865.0],[1448.0,1179.0],[1524.0,1347.0],[1532.0,45.0]],[[468.0,1584.0],[1235.0,1119.0],[239.0,1965.0],[1132.0,213.0]],[[2013.0,1301.0],[1754.0,1866.0],[901.0,698.0],[168.0,1642.0]],[[1050.0,785.0],[1289.0,824.0],[457.0,685.0],[1722.0,1727.0]],[[1035.0,528.0],[380.0,1056.0],[981.0,1144.0],[753.0,1856.0]],[[1743.0,69.0],[592.0,1250.0],[567.0,581.0],[1685.0,150.0]],[[1913.0,2029.0],[183.0,1584.0],[434.0,1204.0],[1693.0,1897.0]],[[440.0,1750.0],[1681.0,109.0],[1075.0,253.0],[1193.0,1062.0]],[[1332.0,117.0],[573.0,225.0],[894.0,1294.0],[397.0,671.0]],[[1236.0,1691.0],[587.0,324.0],[2030.0,258.0],[1744.0,1497.0]],[[612.0,1886.0],[1663.0,1342.0],[1155.0,2042.0],[318.0,553.0]],[[73.0,360.0],[840.0,1489.0],[1965.0,607.0],[715.0,543.0]],[[1739.0,186.0],[305.0,1458.0],[1277.0,1028.0],[1476.0,1515.0]],[[1270.0,1665.0],[1632.0,1949.0],[1795.0,1508.0],[1335.0,1690.0]],[[620.0,543.0],[1957.0,1025.0],[1035.0,1749.0],[1931.0,198.0]],[[1204.0,2020.0],[1411.0,2027.0],[538.0,1830.0],[593.0,1942.0]],[[619.0,953.0],[1364.0,287.0],[1495.0,696.0],[1720.0,1678.0]],[[1246.0,1105.0],[904.0,41.0],[1965.0,1464.0],[331.0,1076.0]],[[1990.0,1609.0],[1881.0,186.0],[1749.0,1036.0],[1996.0,612.0]],[[1318.0,607.0],[843.0,1561.0],[498.0,454.0],[1316.0,588.0]],[[1921.0,1839.0],[632.0,2023.0],[638.0,249.0],[775.0,1632.0]],[[1369.0,1059.0],[1999.0,1185.0],[151.0,1785.0],[329.0,878.0]],[[109.0,1310.0],[1657.0,1194.0],[1008.0,1229.0],[1768.0,1433.0]],[[1809.0,1328.0],[1137.0,493.0],[1522.0,139.0],[1182.0,832.0]],[[445.0,1058.0],[69.0,1056.0],[1368.0,452.0],[1632.0,1887.0]],[[1207.0,1145.0],[1526.0,591.0],[2016.0,236.0],[427.0,1551.0]],[[1820.0,1282.0],[28.0,1911.0],[963.0,558.0],[1284.0,614.0]],[[835.0,1987.0],[703.0,1152.0],[1411.0,898.0],[849.0,250.0]],[[1861.0,1129.0],[1898.0,1888.0],[1924.0,1495.0],[1749.0,1732.0]],[[279.0,921.0],[1411.0,227.0],[1331.0,425.0],[1571.0,2047.0]],[[1355.0,583.0],[831.0,280.0],[1098.0,2035.0],[1992.0,1919.0]],[[1305.0,1906.0],[328.0,2017.0],[1147.0,464.0],[539.0,1706.0]],[[381.0,592.0],[1565.0,394.0],[1735.0,893.0],[600.0,15.0]],[[460.0,415.0],[335.0,1353.0],[509.0,1533.0],[1707.0,1616.0]],[[305.0,1695.0],[1847.0,1229.0],[1785.0,1804.0],[1629.0,546.0]],[[1872.0,1958.0],[1585.0,434.0],[1360.0,1136.0],[578.0,1084.0]],[[178.0,387.0],[681.0,145.0],[18.0,1339.0],[1384.0,168.0]],[[662.0,1727.0],[1798.0,70.0],[1766.0,1645.0],[500.0,1618.0]],[[232.0,112.0],[558.0,983.0],[1990.0,1599.0],[1285.0,525.0]],[[1181.0,570.0],[573.0,578.0],[597.0,970.0],[812.0,125.0]],[[870.0,2005.0],[1875.0,1490.0],[1923.0,1753.0],[2.0,1720.0]],[[977.0,1552.0],[1092.0,109.0],[1326.0,445.0],[1005.0,1755.0]],[[1052.0,529.0],[1916.0,1504.0],[1031.0,496.0],[373.0,1433.0]],[[1658.0,1810.0],[1493.0,1727.0],[1798.0,2046.0],[1542.0,115.0]],[[196.0,1998.0],[1321.0,946.0],[422.0,80.0],[1433.0,315.0]],[[735.0,1946.0],[502.0,946.0],[592.0,1882.0],[309.0,686.0]],[[1143.0,1939.0],[1494.0,765.0],[954.0,178.0],[1197.0,1816.0]],[[1856.0,1154.0],[1006.0,45.0],[1245.0,1925.0],[609.0,812.0]],[[806.0,743.0],[1254.0,295.0],[1051.0,690.0],[1604.0,1238.0]],[[740.0,1861.0],[1630.0,383.0],[1463.0,1461.0],[944.0,11.0]],[[673.0,1862.0],[515.0,1156.0],[1583.0,608.0],[1379.0,1404.0]],[[1026.0,13.0],[587.0,770.0],[1053.0,872.0],[25.0,237.0]],[[148.0,1881.0],[1165.0,911.0],[449.0,319.0],[612.0,831.0]],[[729.0,127.0],[1784.0,642.0],[703.0,1802.0],[1313.0,212.0]],[[1829.0,1464.0],[1175.0,522.0],[215.0,996.0],[465.0,1852.0]],[[2013.0,941.0],[1296.0,457.0],[1253.0,618.0],[1091.0,1719.0]],[[1085.0,470.0],[74.0,17.0],[1518.0,753.0],[232.0,1340.0]],[[651.0,173.0],[141.0,120.0],[1070.0,1014.0],[125.0,1193.0]],[[1975.0,2045.0],[1383.0,366.0],[817.0,717.0],[1438.0,365.0]],[[1515.0,591.0],[1474.0,794.0],[1891.0,1551.0],[1835.0,1420.0]],[[320.0,1010.0],[955.0,389.0],[966.0,361.0],[1278.0,1514.0]],[[332.0,499.0],[1476.0,1021.0],[1161.0,1268.0],[510.0,685.0]],[[1665.0,867.0],[1900.0,559.0],[806.0,325.0],[1777.0,297.0]],[[1561.0,630.0],[999.0,1234.0],[1049.0,1961.0],[1582.0,480.0]],[[444.0,1472.0],[1860.0,1974.0],[1616.0,869.0],[1365.0,615.0]],[[1099.0,1331.0],[802.0,184.0],[1648.0,1088.0],[1318.0,440.0]],[[543.0,835.0],[1529.0,1926.0],[1329.0,176.0],[225.0,1877.0]],[[549.0,1860.0],[2043.0,873.0],[1139.0,1054.0],[639.0,1163.0]],[[486.0,1301.0],[915.0,1399.0],[1280.0,804.0],[497.0,1702.0]],[[864.0,1722.0],[544.0,363.0],[1591.0,119.0],[1580.0,570.0]],[[1613.0,1416.0],[1624.0,599.0],[381.0,945.0],[817.0,1992.0]],[[1937.0,1551.0],[1301.0,1034.0],[36.0,1067.0],[99.0,1561.0]],[[1610.0,592.0],[698.0,1063.0],[406.0,1666.0],[467.0,1956.0]],[[1654.0,219.0],[1998.0,334.0],[325.0,911.0],[1381.0,1580.0]],[[1406.0,1456.0],[1027.0,989.0],[1678.0,562.0],[906.0,1642.0]],[[190.0,1008.0],[769.0,604.0],[1388.0,767.0],[445.0,853.0]],[[1722.0,215.0],[1361.0,1480.0],[1430.0,1788.0],[933.0,1435.0]],[[1559.0,292.0],[921.0,1916.0],[525.0,1461.0],[1510.0,378.0]],[[1896.0,1712.0],[1546.0,1076.0],[300.0,1875.0],[1912.0,610.0]],[[1079.0,58.0],[1484.0,1735.0],[968.0,1438.0],[1907.0,1357.0]],[[1805.0,47.0],[592.0,984.0],[405.0,922.0],[1116.0,1495.0]],[[917.0,755.0],[1821.0,1465.0],[1506.0,159.0],[747.0,1592.0]],[[1447.0,1423.0],[1674.0,1237.0],[1066.0,1877.0],[336.0,218.0]],[[424.0,1103.0],[1268.0,870.0],[1749.0,819.0],[1006.0,1142.0]],[[376.0,1708.0],[1606.0,1178.0],[1197.0,1989.0],[378.0,1691.0]],[[919.0,818.0],[1972.0,497.0],[1470.0,341.0],[128.0,334.0]],[[1323.0,1000.0],[1812.0,371.0],[789.0,135.0],[1807.0,543.0]],[[350.0,1928.0],[264.0,204.0],[590.0,2024.0],[513.0,2024.0]],[[1786.0,1963.0],[1205.0,46.0],[1024.0,487.0],[373.0,1496.0]],[[137.0,955.0],[620.0,89.0],[1560.0,171.0],[542.0,1365.0]],[[1569.0,297.0],[1844.0,1261.0],[1342.0,847.0],[1748.0,1982.0]],[[262.0,1559.0],[1032.0,18.0],[431.0,1237.0],[901.0,1548.0]],[[53.0,1603.0],[309.0,368.0],[997.0,256.0],[1716.0,1830.0]],[[1274.0,133.0],[588.0,2023.0],[1987.0,1505.0],[614.0,477.0]],[[845.0,1096.0],[57.0,2035.0],[1854.0,589.0],[604.0,1295.0]],[[1639.0,1808.0],[1116.0,1878.0],[1516.0,1625.0],[343.0,89.0]],[[883.0,912.0],[1009.0,1423.0],[1774.0,393.0],[339.0,119.0]],[[956.0,1357.0],[983.0,822.0],[670.0,344.0],[661.0,251.0]],[[1230.0,1026.0],[1367.0,1425.0],[1735.0,1522.0],[843.0,6.0]],[[2044.0,536.0],[731.0,1561.0],[8.0,746.0],[68.0,1085.0]],[[1498.0,894.0],[1666.0,775.0],[997.0,1712.0],[831.0,1701.0]],[[1554.0,176.0],[700.0,5.0],[851.0,410.0],[235.0,1192.0]],[[603.0,1609.0],[1475.0,753.0],[690.0,669.0],[602.0,2047.0]],[[362.0,1832.0],[748.0,1179.0],[1094.0,1432.0],[1812.0,992.0]],[[178.0,937.0],[891.0,1101.0],[980.0,1762.0],[1146.0,963.0]],[[1473.0,2007.0],[1683.0,827.0],[1878.0,1292.0],[190.0,952.0]],[[911.0,635.0],[1734.0,504.0],[300.0,1706.0],[1744.0,1560.0]],[[1876.0,387.0],[829.0,241.0],[1600.0,854.0],[864.0,1770.0]],[[1931.0,1532.0],[430.0,1541.0],[1204.0,1505.0],[1281.0,720.0]],[[1727.0,1009.0],[779.0,307.0],[929.0,350.0],[1042.0,1720.0]],[[913.0,2016.0],[1048.0,137.0],[1613.0,1411.0],[1644.0,1901.0]],[[1707.0,836.0],[223.0,1169.0],[951.0,618.0],[585.0,1379.0]],[[1215.0,1848.0],[1743.0,1234.0],[1532.0,1282.0],[1062.0,931.0]],[[1857.0,1615.0],[1350.0,156.0],[862.0,390.0],[558.0,1012.0]],[[1440.0,589.0],[1830.0,1634.0],[1026.0,51.0],[1706.0,1293.0]],[[586.0,1304.0],[283.0,847.0],[1582.0,861.0],[1638.0,369.0]],[[1917.0,865.0],[461.0,567.0],[1556.0,457.0],[1581.0,1003.0]],[[1912.0,1978.0],[335.0,662.0],[23.0,1445.0],[230.0,1882.0]],[[559.0,2047.0],[1571.0,826.0],[773.0,251.0],[1393.0,805.0]],[[1960.0,1148.0],[731.0,2037.0],[1709.0,196.0],[635.0,787.0]],[[41.0,1259.0],[1715.0,292.0],[755.0,98.0],[1542.0,1185.0]],[[607.0,1168.0],[564.0,699.0],[1222.0,957.0],[1263.0,1837.0]],[[866.0,796.0],[213.0,843.0],[1541.0,1342.0],[1459.0,1569.0]],[[180.0,1619.0],[361.0,644.0],[2021.0,630.0],[1443.0,1266.0]],[[740.0,164.0],[1974.0,1888.0],[1459.0,1412.0],[1422.0,891.0]],[[547.0,988.0],[1697.0,258.0],[982.0,1053.0],[1226.0,1899.0]],[[1369.0,1813.0],[66.0,2014.0],[1998.0,543.0],[108.0,1741.0]],[[1586.0,766.0],[1170.0,1547.0],[780.0,1635.0],[105.0,996.0]],[[1983.0,1392.0],[1484.0,1823.0],[1267.0,322.0],[237.0,1291.0]],[[644.0,557.0],[216.0,1481.0],[1935.0,990.0],[174.0,142.0]],[[59.0,1955.0],[1878.0,1912.0],[1758.0,994.0],[1662.0,720.0]],[[424.0,994.0],[1166.0,1246.0],[942.0,102.0],[432.0,841.0]],[[1759.0,1169.0],[2030.0,1148.0],[1255.0,449.0],[1910.0,568.0]],[[1151.0,1281.0],[1275.0,1391.0],[145.0,1216.0],[805.0,1045.0]],[[1902.0,912.0],[13.0,1282.0],[1870.0,454.0],[264.0,1746.0]],[[1446.0,1033.0],[172.0,573.0],[1250.0,1534.0],[1406.0,1635.0]],[[733.0,214.0],[1917.0,1336.0],[669.0,939.0],[1966.0,667.0]],[[1747.0,1630.0],[448.0,1279.0],[374.0,1880.0],[665.0,1782.0]],[[2009.0,574.0],[258.0,127.0],[1963.0,542.0],[978.0,182.0]],[[1235.0,1695.0],[1897.0,1053.0],[1428.0,1364.0],[1496.0,138.0]],[[737.0,1749.0],[911.0,2034.0],[1521.0,1036.0],[995.0,270.0]],[[1063.0,1198.0],[138.0,1202.0],[1958.0,1973.0],[670.0,378.0]],[[815.0,205.0],[1390.0,1171.0],[270.0,925.0],[694.0,595.0]],[[1774.0,1285.0],[818.0,1904.0],[758.0,3.0],[828.0,207.0]],[[71.0,313.0],[1584.0,1480.0],[1790.0,768.0],[660.0,20.0]],[[1744.0,129.0],[1007.0,254.0],[1609.0,461.0],[1513.0,1533.0]],[[547.0,1559.0],[384.0,1303.0],[2006.0,15.0],[1915.0,962.0]],[[1653.0,327.0],[1773.0,1540.0],[78.0,1409.0],[1201.0,949.0]],[[1631.0,2033.0],[1655.0,1512.0],[204.0,252.0],[1669.0,1754.0]],[[643.0,594.0],[1354.0,780.0],[577.0,2014.0],[1692.0,1284.0]],[[24.0,1497.0],[1526.0,1484.0],[328.0,1571.0],[539.0,148.0]],[[579.0,202.0],[1264.0,1083.0],[1363.0,166.0],[324.0,522.0]],[[562.0,982.0],[1300.0,863.0],[644.0,1818.0],[815.0,1673.0]],[[1525.0,539.0],[1274.0,751.0],[1884.0,101.0],[730.0,499.0]],[[129.0,577.0],[1696.0,1195.0],[870.0,233.0],[290.0,1737.0]],[[1099.0,1925.0],[1806.0,1906.0],[333.0,1405.0],[435.0,1228.0]],[[938.0,182.0],[973.0,475.0],[842.0,733.0],[1609.0,1659.0]],[[527.0,946.0],[846.0,1998.0],[628.0,477.0],[1569.0,1822.0]],[[1470.0,85.0],[1971.0,1998.0],[240.0,1020.0],[1162.0,710.0]],[[1920.0,279.0],[1302.0,354.0],[1069.0,1236.0],[531.0,243.0]],[[1291.0,324.0],[603.0,2048.0],[533.0,707.0],[100.0,2.0]],[[251.0,283.0],[1478.0,1954.0],[196.0,317.0],[1882.0,1861.0]],[[72.0,1128.0],[1457.0,1837.0],[329.0,1421.0],[263.0,716.0]],[[725.0,17.0],[1616.0,793.0],[917.0,633.0],[1992.0,502.0]],[[1424.0,2010.0],[421.0,724.0],[2048.0,1265.0],[398.0,1228.0]],[[361.0,477.0],[1319.0,1807.0],[1181.0,1801.0],[1182.0,1798.0]],[[1890.0,612.0],[1244.0,1104.0],[317.0,1171.0],[138.0,1623.0]],[[532.0,2005.0],[1324.0,1074.0],[497.0,1185.0],[1784.0,908.0]],[[999.0,1599.0],[298.0,1647.0],[517.0,1039.0],[172.0,1038.0]],[[963.0,1388.0],[330.0,1058.0],[1562.0,427.0],[538.0,990.0]],[[1991.0,1327.0],[1893.0,1666.0],[332.0,1918.0],[147.0,1779.0]],[[813.0,1614.0],[1066.0,524.0],[545.0,1546.0],[226.0,73.0]],[[219.0,1805.0],[15.0,1417.0],[1824.0,1337.0],[760.0,856.0]],[[1805.0,877.0],[819.0,1594.0],[1359.0,1813.0],[1142.0,1123.0]],[[661.0,1229.0],[357.0,288.0],[1964.0,998.0],[391.0,2046.0]],[[491.0,1842.0],[683.0,462.0],[1330.0,1545.0],[918.0,392.0]],[[1846.0,936.0],[458.0,357.0],[1950.0,1031.0],[1238.0,81.0]],[[1366.0,1574.0],[999.0,1766.0],[625.0,1838.0],[278.0,1948.0]],[[1050.0,1677.0],[278.0,500.0],[1573.0,485.0],[1095.0,1549.0]],[[131.0,376.0],[1409.0,305.0],[1605.0,1924.0],[1963.0,643.0]],[[1638.0,173.0],[1070.0,1631.0],[1605.0,1578.0],[1853.0,63.0]],[[994.0,535.0],[300.0,2043.0],[1655.0,858.0],[439.0,1891.0]],[[804.0,1655.0],[1663.0,1780.0],[105.0,1149.0],[89.0,178.0]],[[1992.0,1713.0],[535.0,721.0],[774.0,1541.0],[1162.0,324.0]],[[173.0,1692.0],[598.0,1912.0],[651.0,1216.0],[162.0,1231.0]],[[1198.0,128.0],[1341.0,1203.0],[130.0,1997.0],[355.0,669.0]],[[1569.0,2019.0],[1080.0,1839.0],[92.0,1720.0],[143.0,1208.0]],[[201.0,1421.0],[817.0,1402.0],[740.0,1002.0],[566.0,372.0]],[[166.0,386.0],[632.0,1258.0],[1294.0,2019.0],[1941.0,87.0]],[[1577.0,1553.0],[960.0,582.0],[428.0,1708.0],[1580.0,916.0]],[[34.0,1295.0],[1679.0,1591.0],[894.0,543.0],[1790.0,723.0]],[[448.0,461.0],[1220.0,719.0],[1440.0,1935.0],[2038.0,657.0]],[[1094.0,982.0],[1081.0,288.0],[1332.0,1002.0],[899.0,1076.0]],[[661.0,536.0],[232.0,1895.0],[1460.0,528.0],[1017.0,1247.0]],[[169.0,1738.0],[1829.0,2018.0],[217.0,710.0],[1549.0,2041.0]],[[1280.0,1256.0],[1139.0,648.0],[1465.0,1509.0],[379.0,1758.0]],[[992.0,1488.0],[386.0,1443.0],[994.0,270.0],[1501.0,1272.0]],[[176.0,1450.0],[51.0,1577.0],[393.0,9.0],[9.0,733.0]],[[1892.0,446.0],[886.0,1528.0],[272.0,565.0],[1641.0,754.0]],[[1793.0,388.0],[1115.0,1962.0],[746.0,1533.0],[618.0,495.0]],[[546.0,318.0],[1622.0,660.0],[747.0,919.0],[1176.0,438.0]],[[201.0,891.0],[25.0,881.0],[51.0,1811.0],[785.0,1540.0]],[[1216.0,611.0],[1389.0,1523.0],[1551.0,443.0],[795.0,1389.0]],[[33.0,1730.0],[1828.0,791.0],[677.0,90.0],[1078.0,1918.0]],[[953.0,337.0],[266.0,880.0],[574.0,1018.0],[981.0,1478.0]],[[76.0,810.0],[1842.0,131.0],[404.0,713.0],[1683.0,526.0]],[[1989.0,940.0],[982.0,230.0],[1521.0,692.0],[668.0,1767.0]],[[1007.0,1101.0],[1418.0,831.0],[1209.0,969.0],[419.0,168.0]],[[1350.0,1252.0],[731.0,515.0],[1692.0,1301.0],[1164.0,95.0]],[[1014.0,117.0],[1302.0,1954.0],[207.0,838.0],[1635.0,405.0]],[[1802.0,1658.0],[2023.0,829.0],[1833.0,438.0],[788.0,718.0]],[[1055.0,1075.0],[30.0,275.0],[1582.0,75.0],[783.0,1363.0]],[[1122.0,840.0],[1957.0,606.0],[1852.0,169.0],[1557.0,1617.0]],[[1646.0,226.0],[247.0,1184.0],[1448.0,959.0],[804.0,1882.0]],[[1925.0,1922.0],[154.0,782.0],[482.0,1316.0],[1226.0,1753.0]],[[1019.0,643.0],[1135.0,1091.0],[1534.0,438.0],[1472.0,1740.0]],[[1736.0,1848.0],[1962.0,915.0],[402.0,724.0],[1848.0,1913.0]],[[233.0,419.0],[345.0,1642.0],[1633.0,1089.0],[783.0,2015.0]],[[1464.0,1539.0],[462.0,50.0],[972.0,2001.0],[1578.0,1077.0]],[[1092.0,349.0],[664.0,1613.0],[401.0,210.0],[868.0,1412.0]],[[737.0,712.0],[1190.0,472.0],[959.0,60.0],[1713.0,1180.0]],[[642.0,597.0],[546.0,1342.0],[779.0,503.0],[1369.0,2021.0]],[[827.0,1279.0],[160.0,781.0],[722.0,1352.0],[780.0,787.0]],[[1735.0,453.0],[1336.0,1103.0],[731.0,10.0],[1242.0,1567.0]],[[1580.0,1655.0],[260.0,1298.0],[1376.0,552.0],[1061.0,1096.0]],[[1807.0,654.0],[1888.0,784.0],[1571.0,1922.0],[382.0,1811.0]],[[498.0,765.0],[1052.0,1267.0],[1680.0,1205.0],[1223.0,816.0]],[[1462.0,533.0],[880.0,426.0],[1765.0,887.0],[1073.0,969.0]],[[540.0,278.0],[1381.0,213.0],[1826.0,1026.0],[239.0,235.0]],[[1006.0,150.0],[1450.0,380.0],[692.0,739.0],[784.0,768.0]],[[177.0,47.0],[1673.0,2023.0],[245.0,982.0],[984.0,442.0]],[[1331.0,1746.0],[723.0,131.0],[1582.0,1248.0],[1449.0,126.0]],[[1882.0,1398.0],[1581.0,1793.0],[2043.0,1939.0],[1455.0,670.0]],[[1790.0,249.0],[1346.0,1061.0],[196.0,127.0],[1573.0,630.0]],[[1945.0,804.0],[1597.0,1914.0],[731.0,927.0],[244.0,673.0]],[[1684.0,1856.0],[4.0,811.0],[190.0,1624.0],[301.0,1647.0]],[[23.0,579.0],[921.0,1636.0],[1389.0,852.0],[419.0,1593.0]],[[1297.0,134.0],[313.0,827.0],[1434.0,1441.0],[174.0,1750.0]],[[1252.0,1783.0],[1201.0,658.0],[691.0,549.0],[51.0,2.0]],[[1784.0,881.0],[909.0,1798.0],[393.0,30.0],[1787.0,652.0]],[[1179.0,1892.0],[761.0,1600.0],[786.0,1188.0],[1297.0,470.0]],[[484.0,485.0],[1981.0,210.0],[1573.0,1456.0],[226.0,432.0]],[[1900.0,1094.0],[238.0,1342.0],[1792.0,512.0],[1272.0,1876.0]],[[195.0,519.0],[1180.0,464.0],[500.0,333.0],[1754.0,1763.0]],[[351.0,1732.0],[1457.0,689.0],[2017.0,2045.0],[1698.0,1202.0]],[[1892.0,1913.0],[991.0,855.0],[788.0,540.0],[254.0,1134.0]],[[56.0,1809.0],[1837.0,718.0],[853.0,1184.0],[1239.0,595.0]],[[348.0,755.0],[369.0,682.0],[698.0,1668.0],[689.0,873.0]],[[1727.0,1035.0],[1389.0,628.0],[950.0,1698.0],[1344.0,46.0]],[[945.0,699.0],[1197.0,232.0],[458.0,924.0],[124.0,1746.0]],[[18.0,138.0],[713.0,77.0],[1800.0,1734.0],[600.0,1491.0]],[[1642.0,923.0],[2028.0,1144.0],[499.0,1180.0],[96.0,1201.0]],[[253.0,1172.0],[225.0,377.0],[1516.0,1458.0],[469.0,1844.0]],[[1124.0,140.0],[227.0,1118.0],[1387.0,1428.0],[1004.0,1149.0]],[[2007.0,1082.0],[276.0,939.0],[1672.0,1559.0],[1924.0,664.0]],[[1691.0,1877.0],[1779.0,907.0],[1870.0,335.0],[1616.0,1556.0]],[[772.0,822.0],[545.0,153.0],[585.0,1871.0],[1438.0,1443.0]],[[384.0,1038.0],[987.0,1309.0],[1268.0,72.0],[1045.0,1780.0]],[[1863.0,1087.0],[1395.0,340.0],[50.0,1100.0],[1743.0,633.0]],[[946.0,1521.0],[1577.0,20.0],[967.0,717.0],[909.0,490.0]],[[786.0,385.0],[790.0,945.0],[173.0,1695.0],[1400.0,590.0]],[[51.0,1909.0],[886.0,248.0],[140.0,409.0],[147.0,768.0]],[[1447.0,257.0],[1542.0,888.0],[1304.0,1602.0],[1192.0,702.0]],[[1196.0,1264.0],[1143.0,1484.0],[935.0,901.0],[489.0,1547.0]],[[582.0,1474.0],[1163.0,1440.0],[1459.0,215.0],[232.0,370.0]],[[1778.0,1388.0],[1460.0,986.0],[1249.0,1169.0],[1582.0,1321.0]],[[683.0,609.0],[410.0,621.0],[911.0,1239.0],[1780.0,1728.0]],[[1079.0,1498.0],[1265.0,1812.0],[1832.0,231.0],[1863.0,1680.0]],[[1.0,506.0],[1220.0,742.0],[298.0,461.0],[979.0,1486.0]],[[1835.0,1501.0],[1185.0,615.0],[1136.0,419.0],[528.0,2002.0]],[[1357.0,950.0],[1443.0,154.0],[228.0,481.0],[752.0,2035.0]],[[1863.0,382.0],[1663.0,250.0],[614.0,296.0],[1244.0,45.0]],[[1879.0,993.0],[945.0,884.0],[534.0,1662.0],[541.0,610.0]],[[641.0,1449.0],[229.0,1523.0],[120.0,2032.0],[1851.0,377.0]],[[143.0,1835.0],[562.0,1566.0],[1088.0,247.0],[155.0,155.0]],[[754.0,910.0],[1155.0,486.0],[1248.0,756.0],[146.0,438.0]],[[1959.0,608.0],[1041.0,472.0],[344.0,1347.0],[543.0,944.0]],[[931.0,1377.0],[1803.0,1427.0],[46.0,269.0],[1118.0,757.0]],[[59.0,1514.0],[1205.0,697.0],[46.0,2009.0],[686.0,1485.0]],[[1496.0,1758.0],[2046.0,1933.0],[1411.0,1672.0],[400.0,309.0]],[[404.0,937.0],[1330.0,845.0],[154.0,244.0],[1442.0,906.0]],[[1708.0,1543.0],[211.0,209.0],[1771.0,1137.0],[1535.0,299.0]],[[423.0,1345.0],[735.0,1425.0],[1590.0,1912.0],[650.0,717.0]],[[1717.0,1933.0],[774.0,108.0],[652.0,811.0],[751.0,331.0]],[[107.0,366.0],[781.0,1854.0],[1054.0,249.0],[1632.0,1104.0]],[[1727.0,970.0],[1851.0,508.0],[284.0,868.0],[851.0,891.0]],[[125.0,717.0],[1686.0,2002.0],[1800.0,1356.0],[728.0,784.0]],[[1722.0,380.0],[1561.0,1490.0],[1482.0,353.0],[1883.0,30.0]],[[802.0,1142.0],[1461.0,1471.0],[114.0,768.0],[1007.0,1741.0]],[[1329.0,1511.0],[1804.0,1895.0],[452.0,145.0],[857.0,1402.0]],[[316.0,1766.0],[1034.0,997.0],[237.0,1274.0],[385.0,1274.0]],[[604.0,1762.0],[1479.0,340.0],[1254.0,295.0],[1812.0,1958.0]],[[671.0,980.0],[4.0,121.0],[813.0,863.0],[1343.0,375.0]],[[1596.0,1680.0],[1549.0,1401.0],[1551.0,1793.0],[1153.0,1460.0]],[[779.0,573.0],[1220.0,388.0],[1996.0,1434.0],[1624.0,756.0]],[[135.0,347.0],[2016.0,245.0],[1608.0,633.0],[561.0,751.0]],[[282.0,1611.0],[791.0,1606.0],[1454.0,1696.0],[713.0,1666.0]],[[1124.0,956.0],[1535.0,33.0],[1199.0,1178.0],[1096.0,597.0]],[[843.0,1907.0],[159.0,1109.0],[470.0,359.0],[210.0,272.0]],[[2039.0,554.0],[1993.0,1892.0],[1595.0,925.0],[217.0,1700.0]],[[694.0,215.0],[1190.0,1860.0],[183.0,636.0],[781.0,852.0]],[[660.0,875.0],[517.0,77.0],[1539.0,70.0],[1659.0,1506.0]],[[1477.0,1366.0],[619.0,1319.0],[1321.0,1390.0],[240.0,1326.0]],[[1856.0,664.0],[380.0,61.0],[109.0,1996.0],[424.0,771.0]],[[1596.0,1686.0],[449.0,1074.0],[1787.0,179.0],[1880.0,886.0]],[[178.0,11.0],[1201.0,1722.0],[260.0,1371.0],[1414.0,1644.0]],[[252.0,1102.0],[539.0,838.0],[53.0,657.0],[1828.0,217.0]],[[1685.0,447.0],[133.0,689.0],[1887.0,266.0],[47.0,35.0]],[[577.0,924.0],[11.0,128.0],[962.0,1783.0],[441.0,1995.0]],[[1527.0,1367.0],[671.0,871.0],[1000.0,343.0],[891.0,676.0]],[[1233.0,379.0],[322.0,853.0],[529.0,308.0],[1842.0,1056.0]],[[1479.0,1012.0],[577.0,705.0],[979.0,1739.0],[305.0,1523.0]],[[711.0,246.0],[177.0,1143.0],[26.0,1955.0],[1704.0,786.0]],[[460.0,1444.0],[1372.0,1058.0],[674.0,1165.0],[1215.0,1996.0]],[[1327.0,1752.0],[455.0,196.0],[266.0,260.0],[1277.0,1724.0]],[[1582.0,1524.0],[1344.0,367.0],[601.0,1804.0],[1710.0,921.0]],[[1036.0,1697.0],[1377.0,1277.0],[708.0,171.0],[462.0,411.0]],[[1793.0,498.0],[1947.0,1429.0],[1128.0,489.0],[1287.0,1564.0]],[[498.0,673.0],[1836.0,363.0],[2040.0,1402.0],[508.0,1317.0]],[[400.0,404.0],[998.0,2028.0],[993.0,1990.0],[1380.0,181.0]],[[682.0,252.0],[63.0,1755.0],[1358.0,1248.0],[1007.0,1455.0]],[[598.0,289.0],[771.0,142.0],[721.0,1464.0],[1785.0,1079.0]],[[860.0,659.0],[858.0,1660.0],[758.0,716.0],[979.0,1903.0]],[[586.0,1154.0],[1327.0,659.0],[1308.0,1154.0],[986.0,799.0]],[[683.0,1154.0],[131.0,582.0],[533.0,105.0],[1787.0,213.0]],[[1434.0,1838.0],[593.0,1752.0],[884.0,642.0],[1467.0,713.0]],[[280.0,1073.0],[1521.0,1374.0],[198.0,1249.0],[637.0,1968.0]],[[212.0,1906.0],[1708.0,359.0],[74.0,33.0],[177.0,66.0]],[[118.0,881.0],[1512.0,834.0],[1845.0,181.0],[203.0,907.0]],[[1221.0,821.0],[732.0,790.0],[813.0,1521.0],[880.0,554.0]],[[409.0,1286.0],[656.0,1903.0],[2044.0,94.0],[1959.0,277.0]],[[53.0,1860.0],[1309.0,1470.0],[1416.0,1685.0],[586.0,508.0]],[[446.0,1895.0],[1332.0,681.0],[287.0,1577.0],[85.0,1818.0]],[[0.0,552.0],[1214.0,1151.0],[1244.0,244.0],[1949.0,1945.0]],[[251.0,611.0],[3.0,2036.0],[1686.0,151.0],[997.0,477.0]],[[1591.0,114.0],[1260.0,27.0],[92.0,987.0],[1577.0,1140.0]],[[1490.0,22.0],[873.0,1756.0],[874.0,1853.0],[202.0,529.0]],[[1107.0,139.0],[397.0,1623.0],[391.0,197.0],[2026.0,2006.0]],[[612.0,456.0],[2001.0,1026.0],[746.0,246.0],[443.0,1902.0]],[[293.0,750.0],[1381.0,1908.0],[643.0,1997.0],[1533.0,1053.0]],[[1218.0,1982.0],[705.0,1236.0],[119.0,722.0],[996.0,428.0]],[[1593.0,315.0],[496.0,1209.0],[404.0,1039.0],[904.0,710.0]],[[1480.0,438.0],[1841.0,407.0],[1322.0,271.0],[1828.0,1779.0]],[[357.0,458.0],[1916.0,1935.0],[1050.0,1561.0],[1905.0,1937.0]],[[1552.0,1571.0],[399.0,1540.0],[1367.0,42.0],[283.0,711.0]],[[2016.0,1763.0],[122.0,350.0],[1590.0,1352.0],[162.0,110.0]],[[3.0,1847.0],[717.0,1853.0],[1239.0,1664.0],[316.0,837.0]],[[1749.0,1303.0],[2015.0,1759.0],[1603.0,126.0],[418.0,700.0]],[[1659.0,634.0],[1043.0,881.0],[2026.0,563.0],[1407.0,422.0]],[[647.0,2018.0],[79.0,1274.0],[154.0,399.0],[1102.0,2018.0]],[[643.0,1683.0],[1029.0,1441.0],[1206.0,1326.0],[1037.0,760.0]],[[876.0,445.0],[640.0,1032.0],[495.0,828.0],[181.0,562.0]],[[1857.0,471.0],[1012.0,727.0],[1710.0,1727.0],[679.0,163.0]],[[1344.0,51.0],[1313.0,697.0],[604.0,1509.0],[1011.0,172.0]],[[1715.0,640.0],[1337.0,877.0],[997.0,1970.0],[1153.0,1105.0]],[[1975.0,916.0],[663.0,269.0],[1021.0,1862.0],[568.0,1540.0]],[[688.0,84.0],[385.0,233.0],[139.0,225.0],[2040.0,1901.0]],[[99.0,2016.0],[1074.0,1160.0],[1129.0,1561.0],[1960.0,487.0]],[[359.0,1272.0],[1545.0,1783.0],[806.0,963.0],[629.0,282.0]],[[1184.0,845.0],[414.0,1432.0],[1102.0,560.0],[905.0,1466.0]],[[1439.0,652.0],[424.0,429.0],[805.0,1243.0],[964.0,268.0]],[[168.0,1361.0],[1545.0,874.0],[1495.0,314.0],[1880.0,1915.0]],[[1359.0,1198.0],[1361.0,78.0],[352.0,527.0],[677.0,82.0]],[[108.0,1015.0],[836.0,1769.0],[1268.0,758.0],[437.0,1538.0]],[[36.0,807.0],[273.0,894.0],[654.0,1282.0],[834.0,1297.0]],[[938.0,1073.0],[1422.0,1605.0],[1300.0,200.0],[1864.0,819.0]],[[449.0,1889.0],[636.0,1596.0],[1544.0,849.0],[1285.0,1389.0]],[[975.0,2030.0],[1912.0,1633.0],[17.0,1908.0],[1440.0,1971.0]],[[1381.0,224.0],[1813.0,1607.0],[1948.0,1998.0],[1178.0,246.0]],[[1894.0,949.0],[383.0,1239.0],[667.0,1847.0],[864.0,1095.0]],[[666.0,1239.0],[1606.0,27.0],[771.0,1966.0],[56.0,1199.0]],[[1087.0,1063.0],[315.0,1598.0],[190.0,157.0],[803.0,1937.0]],[[885.0,1616.0],[1325.0,1224.0],[1994.0,1049.0],[1079.0,658.0]],[[1622.0,1655.0],[2047.0,924.0],[964.0,1665.0],[1830.0,307.0]],[[1586.0,230.0],[5.0,777.0],[1442.0,807.0],[432.0,154.0]],[[1932.0,782.0],[222.0,731.0],[1293.0,175.0],[1046.0,844.0]],[[782.0,1670.0],[265.0,735.0],[1047.0,184.0],[595.0,56.0]],[[242.0,883.0],[717.0,1342.0],[573.0,706.0],[1654.0,4.0]],[[11.0,1364.0],[109.0,881.0],[326.0,1974.0],[1900.0,303.0]],[[699.0,1105.0],[75.0,1695.0],[1193.0,820.0],[742.0,1309.0]],[[402.0,1192.0],[1242.0,820.0],[456.0,50.0],[1148.0,850.0]],[[886.0,963.0],[813.0,2041.0],[1300.0,1634.0],[1974.0,428.0]],[[1521.0,307.0],[1907.0,1033.0],[1948.0,244.0],[82.0,1361.0]],[[1959.0,43.0],[1009.0,514.0],[201.0,1616.0],[393.0,948.0]],[[216.0,1228.0],[1515.0,420.0],[394.0,1129.0],[1149.0,627.0]],[[964.0,639.0],[1955.0,228.0],[1686.0,1802.0],[123.0,50.0]],[[1356.0,1779.0],[1221.0,1998.0],[211.0,1807.0],[1303.0,1740.0]],[[104.0,690.0],[1150.0,1485.0],[985.0,277.0],[593.0,1308.0]],[[1618.0,1267.0],[1320.0,1503.0],[1998.0,577.0],[858.0,1704.0]],[[881.0,424.0],[332.0,703.0],[60.0,87.0],[339.0,1860.0]],[[300.0,760.0],[1470.0,709.0],[751.0,1706.0],[310.0,1892.0]],[[444.0,10.0],[1973.0,1494.0],[1653.0,589.0],[1490.0,569.0]],[[969.0,1595.0],[1337.0,773.0],[408.0,1264.0],[1803.0,846.0]],[[1859.0,622.0],[1049.0,219.0],[669.0,804.0],[2011.0,807.0]],[[174.0,1636.0],[1411.0,1956.0],[1701.0,906.0],[796.0,329.0]],[[63.0,637.0],[2027.0,883.0],[2035.0,1101.0],[1612.0,506.0]],[[286.0,401.0],[1420.0,690.0],[814.0,1751.0],[1268.0,1676.0]],[[1055.0,1004.0],[1544.0,1670.0],[139.0,163.0],[788.0,1524.0]],[[1661.0,1318.0],[1678.0,1132.0],[1851.0,1604.0],[719.0,527.0]],[[1762.0,1430.0],[1498.0,1528.0],[1781.0,140.0],[1507.0,506.0]],[[1368.0,219.0],[871.0,1467.0],[732.0,1173.0],[2044.0,712.0]],[[1732.0,1509.0],[1520.0,124.0],[682.0,749.0],[1470.0,1925.0]],[[1827.0,786.0],[501.0,1314.0],[67.0,1755.0],[911.0,1798.0]],[[1264.0,1721.0],[1129.0,325.0],[813.0,1854.0],[457.0,156.0]],[[19.0,918.0],[981.0,130.0],[2041.0,1358.0],[838.0,780.0]],[[455.0,116.0],[1226.0,1149.0],[387.0,546.0],[1518.0,1843.0]],[[1735.0,1348.0],[254.0,1244.0],[343.0,1899.0],[911.0,652.0]],[[859.0,1198.0],[1924.0,1174.0],[1148.0,405.0],[1039.0,660.0]],[[727.0,681.0],[1757.0,1236.0],[1626.0,1630.0],[949.0,686.0]],[[1687.0,702.0],[1352.0,999.0],[891.0,609.0],[1178.0,306.0]],[[308.0,980.0],[472.0,1248.0],[43.0,540.0],[1662.0,1620.0]],[[230.0,510.0],[215.0,539.0],[1906.0,1617.0],[1196.0,976.0]],[[651.0,1927.0],[958.0,922.0],[1029.0,1711.0],[1886.0,1152.0]],[[541.0,528.0],[132.0,535.0],[630.0,38.0],[1035.0,712.0]],[[140.0,1420.0],[1969.0,763.0],[949.0,1332.0],[755.0,864.0]],[[706.0,2019.0],[1013.0,513.0],[855.0,191.0],[1370.0,1010.0]],[[1656.0,1872.0],[1085.0,746.0],[479.0,180.0],[356.0,148.0]],[[1172.0,2040.0],[206.0,492.0],[1278.0,1519.0],[1416.0,979.0]],[[867.0,1050.0],[778.0,664.0],[1391.0,1142.0],[1323.0,1484.0]],[[151.0,319.0],[873.0,710.0],[1613.0,1875.0],[859.0,50.0]],[[1897.0,1624.0],[1548.0,1427.0],[1519.0,2017.0],[34.0,1033.0]],[[316.0,238.0],[1656.0,1666.0],[1530.0,1642.0],[757.0,1247.0]],[[800.0,367.0],[1244.0,121.0],[1739.0,158.0],[1875.0,23.0]],[[1653.0,831.0],[1949.0,1049.0],[97.0,857.0],[914.0,569.0]],[[1357.0,980.0],[1078.0,1356.0],[146.0,1577.0],[1187.0,71.0]],[[1916.0,105.0],[1741.0,64.0],[447.0,709.0],[1016.0,76.0]],[[1657.0,1822.0],[629.0,315.0],[879.0,782.0],[1707.0,1466.0]],[[1504.0,256.0],[902.0,804.0],[385.0,522.0],[1133.0,1420.0]],[[1341.0,1738.0],[1080.0,1689.0],[1455.0,933.0],[306.0,1861.0]],[[896.0,1132.0],[42.0,1304.0],[774.0,1471.0],[1246.0,1532.0]],[[807.0,1437.0],[1321.0,1097.0],[1666.0,367.0],[1544.0,780.0]],[[1838.0,806.0],[886.0,1333.0],[1962.0,1799.0],[20.0,197.0]],[[1227.0,517.0],[1594.0,290.0],[1202.0,525.0],[1321.0,1319.0]],[[1581.0,1948.0],[598.0,1052.0],[900.0,1009.0],[1544.0,1509.0]],[[204.0,1234.0],[1896.0,1409.0],[21.0,611.0],[1950.0,2040.0]],[[78.0,133.0],[1601.0,1784.0],[440.0,839.0],[1740.0,1523.0]],[[1764.0,1845.0],[1574.0,1740.0],[257.0,2044.0],[747.0,876.0]],[[761.0,408.0],[1739.0,1479.0],[900.0,736.0],[1577.0,1455.0]],[[1515.0,578.0],[652.0,956.0],[1051.0,1013.0],[292.0,324.0]],[[829.0,1789.0],[2015.0,156.0],[1316.0,901.0],[307.0,1759.0]],[[345.0,1307.0],[746.0,1956.0],[965.0,1449.0],[815.0,1160.0]],[[685.0,1855.0],[460.0,115.0],[418.0,1039.0],[1250.0,423.0]],[[1163.0,829.0],[1895.0,920.0],[116.0,1701.0],[303.0,1392.0]],[[1906.0,1850.0],[1850.0,915.0],[1771.0,1131.0],[1554.0,356.0]],[[1635.0,1624.0],[409.0,427.0],[1493.0,1446.0],[1438.0,1622.0]],[[1952.0,1994.0],[843.0,882.0],[577.0,847.0],[474.0,56.0]],[[754.0,1994.0],[1407.0,1031.0],[1273.0,366.0],[860.0,577.0]],[[1035.0,976.0],[392.0,1224.0],[1705.0,1318.0],[1460.0,635.0]],[[1880.0,932.0],[1281.0,849.0],[1346.0,525.0],[563.0,1618.0]],[[1154.0,151.0],[120.0,140.0],[1666.0,1503.0],[174.0,1889.0]],[[1866.0,1212.0],[1635.0,1655.0],[1353.0,1037.0],[1994.0,327.0]],[[82.0,612.0],[1294.0,264.0],[1474.0,223.0],[248.0,1570.0]],[[1318.0,884.0],[568.0,1755.0],[957.0,1160.0],[1395.0,19.0]],[[921.0,871.0],[1085.0,1656.0],[1231.0,1927.0],[1660.0,1997.0]],[[1909.0,1080.0],[69.0,1910.0],[1836.0,1863.0],[1744.0,892.0]],[[1499.0,1791.0],[696.0,714.0],[1872.0,1449.0],[94.0,881.0]],[[454.0,1530.0],[164.0,1837.0],[266.0,1332.0],[397.0,372.0]],[[1496.0,936.0],[371.0,1362.0],[528.0,996.0],[1439.0,960.0]],[[1095.0,1004.0],[1600.0,149.0],[59.0,1065.0],[1147.0,2041.0]],[[476.0,1992.0],[1687.0,1146.0],[396.0,252.0],[1408.0,1998.0]],[[1504.0,1082.0],[821.0,1755.0],[1567.0,695.0],[1510.0,286.0]],[[1823.0,1154.0],[1924.0,1508.0],[827.0,1351.0],[1575.0,1511.0]],[[697.0,1823.0],[1483.0,1026.0],[523.0,906.0],[653.0,1361.0]],[[9.0,508.0],[568.0,823.0],[538.0,204.0],[1564.0,575.0]],[[530.0,1391.0],[1935.0,1903.0],[393.0,64.0],[1592.0,599.0]],[[1552.0,353.0],[546.0,349.0],[1065.0,1214.0],[619.0,1367.0]],[[411.0,1814.0],[350.0,50.0],[791.0,1473.0],[1799.0,468.0]],[[773.0,70.0],[100.0,427.0],[1248.0,87.0],[1707.0,706.0]],[[1071.0,720.0],[191.0,94.0],[774.0,770.0],[708.0,495.0]],[[1472.0,197.0],[1264.0,452.0],[685.0,886.0],[0.0,206.0]],[[956.0,702.0],[1727.0,958.0],[578.0,20.0],[1913.0,2014.0]],[[129.0,604.0],[2041.0,1044.0],[1902.0,1457.0],[1385.0,1897.0]],[[1705.0,967.0],[1528.0,1908.0],[1963.0,2024.0],[26.0,768.0]],[[1361.0,784.0],[409.0,1371.0],[1909.0,184.0],[764.0,1070.0]],[[995.0,1834.0],[1771.0,524.0],[704.0,162.0],[1281.0,1979.0]],[[1220.0,1043.0],[1136.0,1543.0],[1002.0,917.0],[1406.0,1263.0]],[[1132.0,1305.0],[1559.0,1070.0],[995.0,340.0],[2031.0,678.0]],[[1526.0,652.0],[334.0,1809.0],[1953.0,1491.0],[1301.0,306.0]],[[885.0,909.0],[599.0,1454.0],[1404.0,702.0],[679.0,784.0]],[[837.0,845.0],[129.0,1698.0],[770.0,1882.0],[1680.0,1355.0]],[[118.0,1293.0],[733.0,516.0],[947.0,1713.0],[1994.0,709.0]],[[484.0,510.0],[401.0,65.0],[1908.0,730.0],[342.0,361.0]],[[572.0,52.0],[1671.0,1138.0],[780.0,1414.0],[1796.0,2002.0]],[[1898.0,2022.0],[1915.0,1071.0],[418.0,1378.0],[1394.0,260.0]],[[1870.0,1588.0],[1148.0,1615.0],[1358.0,278.0],[1238.0,560.0]],[[1063.0,81.0],[601.0,738.0],[767.0,1566.0],[511.0,1013.0]],[[1653.0,699.0],[1195.0,1417.0],[525.0,1630.0],[471.0,1557.0]],[[1484.0,935.0],[53.0,417.0],[870.0,1562.0],[320.0,119.0]],[[1503.0,1451.0],[1582.0,476.0],[567.0,678.0],[888.0,859.0]],[[1907.0,901.0],[742.0,1889.0],[1054.0,1982.0],[920.0,1603.0]],[[77.0,50.0],[507.0,711.0],[206.0,958.0],[1304.0,1292.0]],[[437.0,1710.0],[1935.0,568.0],[162.0,1116.0],[1463.0,859.0]],[[1404.0,2031.0],[560.0,1158.0],[1190.0,91.0],[1488.0,2027.0]]] \ No newline at end of file
diff --git a/Tests/feaLib/builder_test.py b/Tests/feaLib/builder_test.py
index 8e987522..151cd896 100644
--- a/Tests/feaLib/builder_test.py
+++ b/Tests/feaLib/builder_test.py
@@ -72,7 +72,8 @@ class BuilderTest(unittest.TestCase):
PairPosSubtable ChainSubstSubtable SubstSubtable ChainPosSubtable
LigatureSubtable AlternateSubtable MultipleSubstSubtable
SingleSubstSubtable aalt_chain_contextual_subst AlternateChained
- MultipleLookupsPerGlyph MultipleLookupsPerGlyph2
+ MultipleLookupsPerGlyph MultipleLookupsPerGlyph2 GSUB_6_formats
+ GSUB_5_formats
""".split()
def __init__(self, methodName):
diff --git a/Tests/feaLib/data/ChainPosSubtable.ttx b/Tests/feaLib/data/ChainPosSubtable.ttx
index a780ccb7..695dd862 100644
--- a/Tests/feaLib/data/ChainPosSubtable.ttx
+++ b/Tests/feaLib/data/ChainPosSubtable.ttx
@@ -67,24 +67,26 @@
<LookupListIndex value="1"/>
</PosLookupRecord>
</ChainContextPos>
- <ChainContextPos index="1" Format="3">
- <!-- BacktrackGlyphCount=1 -->
- <BacktrackCoverage index="0">
- <Glyph value="X"/>
- </BacktrackCoverage>
- <!-- InputGlyphCount=1 -->
- <InputCoverage index="0">
+ <ChainContextPos index="1" Format="1">
+ <Coverage>
<Glyph value="A"/>
- </InputCoverage>
- <!-- LookAheadGlyphCount=1 -->
- <LookAheadCoverage index="0">
- <Glyph value="Y"/>
- </LookAheadCoverage>
- <!-- PosCount=1 -->
- <PosLookupRecord index="0">
- <SequenceIndex value="0"/>
- <LookupListIndex value="2"/>
- </PosLookupRecord>
+ </Coverage>
+ <!-- ChainPosRuleSetCount=1 -->
+ <ChainPosRuleSet index="0">
+ <!-- ChainPosRuleCount=1 -->
+ <ChainPosRule index="0">
+ <!-- BacktrackGlyphCount=1 -->
+ <Backtrack index="0" value="X"/>
+ <!-- InputGlyphCount=1 -->
+ <!-- LookAheadGlyphCount=1 -->
+ <LookAhead index="0" value="Y"/>
+ <!-- PosCount=1 -->
+ <PosLookupRecord index="0">
+ <SequenceIndex value="0"/>
+ <LookupListIndex value="2"/>
+ </PosLookupRecord>
+ </ChainPosRule>
+ </ChainPosRuleSet>
</ChainContextPos>
<ChainContextPos index="2" Format="3">
<!-- BacktrackGlyphCount=1 -->
diff --git a/Tests/feaLib/data/GPOS_8.ttx b/Tests/feaLib/data/GPOS_8.ttx
index 86f97560..4d790715 100644
--- a/Tests/feaLib/data/GPOS_8.ttx
+++ b/Tests/feaLib/data/GPOS_8.ttx
@@ -34,42 +34,40 @@
<LookupType value="8"/>
<LookupFlag value="0"/>
<!-- SubTableCount=1 -->
- <ChainContextPos index="0" Format="3">
- <!-- BacktrackGlyphCount=1 -->
- <BacktrackCoverage index="0">
- <Glyph value="A"/>
- </BacktrackCoverage>
- <!-- InputGlyphCount=4 -->
- <InputCoverage index="0">
- <Glyph value="one"/>
- </InputCoverage>
- <InputCoverage index="1">
- <Glyph value="two"/>
- </InputCoverage>
- <InputCoverage index="2">
+ <ChainContextPos index="0" Format="1">
+ <Coverage>
<Glyph value="one"/>
- </InputCoverage>
- <InputCoverage index="3">
- <Glyph value="two"/>
- </InputCoverage>
- <!-- LookAheadGlyphCount=0 -->
- <!-- PosCount=4 -->
- <PosLookupRecord index="0">
- <SequenceIndex value="0"/>
- <LookupListIndex value="1"/>
- </PosLookupRecord>
- <PosLookupRecord index="1">
- <SequenceIndex value="1"/>
- <LookupListIndex value="1"/>
- </PosLookupRecord>
- <PosLookupRecord index="2">
- <SequenceIndex value="2"/>
- <LookupListIndex value="2"/>
- </PosLookupRecord>
- <PosLookupRecord index="3">
- <SequenceIndex value="3"/>
- <LookupListIndex value="2"/>
- </PosLookupRecord>
+ </Coverage>
+ <!-- ChainPosRuleSetCount=1 -->
+ <ChainPosRuleSet index="0">
+ <!-- ChainPosRuleCount=1 -->
+ <ChainPosRule index="0">
+ <!-- BacktrackGlyphCount=1 -->
+ <Backtrack index="0" value="A"/>
+ <!-- InputGlyphCount=4 -->
+ <Input index="0" value="two"/>
+ <Input index="1" value="one"/>
+ <Input index="2" value="two"/>
+ <!-- LookAheadGlyphCount=0 -->
+ <!-- PosCount=4 -->
+ <PosLookupRecord index="0">
+ <SequenceIndex value="0"/>
+ <LookupListIndex value="1"/>
+ </PosLookupRecord>
+ <PosLookupRecord index="1">
+ <SequenceIndex value="1"/>
+ <LookupListIndex value="1"/>
+ </PosLookupRecord>
+ <PosLookupRecord index="2">
+ <SequenceIndex value="2"/>
+ <LookupListIndex value="2"/>
+ </PosLookupRecord>
+ <PosLookupRecord index="3">
+ <SequenceIndex value="3"/>
+ <LookupListIndex value="2"/>
+ </PosLookupRecord>
+ </ChainPosRule>
+ </ChainPosRuleSet>
</ChainContextPos>
</Lookup>
<Lookup index="1">
diff --git a/Tests/feaLib/data/GSUB_5_formats.fea b/Tests/feaLib/data/GSUB_5_formats.fea
new file mode 100644
index 00000000..3acb7edf
--- /dev/null
+++ b/Tests/feaLib/data/GSUB_5_formats.fea
@@ -0,0 +1,20 @@
+lookup GSUB5f1 {
+ ignore sub three four;
+ ignore sub four five;
+} GSUB5f1;
+
+lookup GSUB5f2 {
+ ignore sub [a - z] [A - H] [I - Z];
+ ignore sub [a - z] [A - H] [I - Z];
+ ignore sub [a - z] [I - Z] [A - H];
+} GSUB5f2;
+
+lookup GSUB5f3 {
+ ignore sub e;
+} GSUB5f3;
+
+feature test {
+ lookup GSUB5f1;
+ lookup GSUB5f2;
+ lookup GSUB5f3;
+} test;
diff --git a/Tests/feaLib/data/GSUB_5_formats.ttx b/Tests/feaLib/data/GSUB_5_formats.ttx
new file mode 100644
index 00000000..80196aaa
--- /dev/null
+++ b/Tests/feaLib/data/GSUB_5_formats.ttx
@@ -0,0 +1,197 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=1 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="test"/>
+ <Feature>
+ <!-- LookupCount=3 -->
+ <LookupListIndex index="0" value="0"/>
+ <LookupListIndex index="1" value="1"/>
+ <LookupListIndex index="2" value="2"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=3 -->
+ <Lookup index="0">
+ <LookupType value="5"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <ContextSubst index="0" Format="1">
+ <Coverage>
+ <Glyph value="three"/>
+ <Glyph value="four"/>
+ </Coverage>
+ <!-- SubRuleSetCount=2 -->
+ <SubRuleSet index="0">
+ <!-- SubRuleCount=1 -->
+ <SubRule index="0">
+ <!-- GlyphCount=2 -->
+ <!-- SubstCount=0 -->
+ <Input index="0" value="four"/>
+ </SubRule>
+ </SubRuleSet>
+ <SubRuleSet index="1">
+ <!-- SubRuleCount=1 -->
+ <SubRule index="0">
+ <!-- GlyphCount=2 -->
+ <!-- SubstCount=0 -->
+ <Input index="0" value="five"/>
+ </SubRule>
+ </SubRuleSet>
+ </ContextSubst>
+ </Lookup>
+ <Lookup index="1">
+ <LookupType value="5"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <ContextSubst index="0" Format="2">
+ <Coverage>
+ <Glyph value="a"/>
+ <Glyph value="b"/>
+ <Glyph value="c"/>
+ <Glyph value="d"/>
+ <Glyph value="e"/>
+ <Glyph value="f"/>
+ <Glyph value="g"/>
+ <Glyph value="h"/>
+ <Glyph value="i"/>
+ <Glyph value="j"/>
+ <Glyph value="k"/>
+ <Glyph value="l"/>
+ <Glyph value="m"/>
+ <Glyph value="n"/>
+ <Glyph value="o"/>
+ <Glyph value="p"/>
+ <Glyph value="q"/>
+ <Glyph value="r"/>
+ <Glyph value="s"/>
+ <Glyph value="t"/>
+ <Glyph value="u"/>
+ <Glyph value="v"/>
+ <Glyph value="w"/>
+ <Glyph value="x"/>
+ <Glyph value="y"/>
+ <Glyph value="z"/>
+ </Coverage>
+ <ClassDef>
+ <ClassDef glyph="A" class="3"/>
+ <ClassDef glyph="B" class="3"/>
+ <ClassDef glyph="C" class="3"/>
+ <ClassDef glyph="D" class="3"/>
+ <ClassDef glyph="E" class="3"/>
+ <ClassDef glyph="F" class="3"/>
+ <ClassDef glyph="G" class="3"/>
+ <ClassDef glyph="H" class="3"/>
+ <ClassDef glyph="I" class="2"/>
+ <ClassDef glyph="J" class="2"/>
+ <ClassDef glyph="K" class="2"/>
+ <ClassDef glyph="L" class="2"/>
+ <ClassDef glyph="M" class="2"/>
+ <ClassDef glyph="N" class="2"/>
+ <ClassDef glyph="O" class="2"/>
+ <ClassDef glyph="P" class="2"/>
+ <ClassDef glyph="Q" class="2"/>
+ <ClassDef glyph="R" class="2"/>
+ <ClassDef glyph="S" class="2"/>
+ <ClassDef glyph="T" class="2"/>
+ <ClassDef glyph="U" class="2"/>
+ <ClassDef glyph="V" class="2"/>
+ <ClassDef glyph="W" class="2"/>
+ <ClassDef glyph="X" class="2"/>
+ <ClassDef glyph="Y" class="2"/>
+ <ClassDef glyph="Z" class="2"/>
+ <ClassDef glyph="a" class="1"/>
+ <ClassDef glyph="b" class="1"/>
+ <ClassDef glyph="c" class="1"/>
+ <ClassDef glyph="d" class="1"/>
+ <ClassDef glyph="e" class="1"/>
+ <ClassDef glyph="f" class="1"/>
+ <ClassDef glyph="g" class="1"/>
+ <ClassDef glyph="h" class="1"/>
+ <ClassDef glyph="i" class="1"/>
+ <ClassDef glyph="j" class="1"/>
+ <ClassDef glyph="k" class="1"/>
+ <ClassDef glyph="l" class="1"/>
+ <ClassDef glyph="m" class="1"/>
+ <ClassDef glyph="n" class="1"/>
+ <ClassDef glyph="o" class="1"/>
+ <ClassDef glyph="p" class="1"/>
+ <ClassDef glyph="q" class="1"/>
+ <ClassDef glyph="r" class="1"/>
+ <ClassDef glyph="s" class="1"/>
+ <ClassDef glyph="t" class="1"/>
+ <ClassDef glyph="u" class="1"/>
+ <ClassDef glyph="v" class="1"/>
+ <ClassDef glyph="w" class="1"/>
+ <ClassDef glyph="x" class="1"/>
+ <ClassDef glyph="y" class="1"/>
+ <ClassDef glyph="z" class="1"/>
+ </ClassDef>
+ <!-- SubClassSetCount=4 -->
+ <SubClassSet index="0">
+ <!-- SubClassRuleCount=0 -->
+ </SubClassSet>
+ <SubClassSet index="1">
+ <!-- SubClassRuleCount=3 -->
+ <SubClassRule index="0">
+ <!-- GlyphCount=3 -->
+ <!-- SubstCount=0 -->
+ <Class index="0" value="3"/>
+ <Class index="1" value="2"/>
+ </SubClassRule>
+ <SubClassRule index="1">
+ <!-- GlyphCount=3 -->
+ <!-- SubstCount=0 -->
+ <Class index="0" value="3"/>
+ <Class index="1" value="2"/>
+ </SubClassRule>
+ <SubClassRule index="2">
+ <!-- GlyphCount=3 -->
+ <!-- SubstCount=0 -->
+ <Class index="0" value="2"/>
+ <Class index="1" value="3"/>
+ </SubClassRule>
+ </SubClassSet>
+ <SubClassSet index="2">
+ <!-- SubClassRuleCount=0 -->
+ </SubClassSet>
+ <SubClassSet index="3">
+ <!-- SubClassRuleCount=0 -->
+ </SubClassSet>
+ </ContextSubst>
+ </Lookup>
+ <Lookup index="2">
+ <LookupType value="5"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <ContextSubst index="0" Format="3">
+ <!-- GlyphCount=1 -->
+ <!-- SubstCount=0 -->
+ <Coverage index="0">
+ <Glyph value="e"/>
+ </Coverage>
+ </ContextSubst>
+ </Lookup>
+ </LookupList>
+ </GSUB>
+
+</ttFont>
diff --git a/Tests/feaLib/data/GSUB_6.ttx b/Tests/feaLib/data/GSUB_6.ttx
index f32e47d9..18405d25 100644
--- a/Tests/feaLib/data/GSUB_6.ttx
+++ b/Tests/feaLib/data/GSUB_6.ttx
@@ -229,36 +229,30 @@
<LookupType value="6"/>
<LookupFlag value="0"/>
<!-- SubTableCount=1 -->
- <ChainContextSubst index="0" Format="3">
- <!-- BacktrackGlyphCount=3 -->
- <BacktrackCoverage index="0">
- <Glyph value="E"/>
- </BacktrackCoverage>
- <BacktrackCoverage index="1">
- <Glyph value="D"/>
- </BacktrackCoverage>
- <BacktrackCoverage index="2">
- <Glyph value="A"/>
- </BacktrackCoverage>
- <!-- InputGlyphCount=1 -->
- <InputCoverage index="0">
+ <ChainContextSubst index="0" Format="1">
+ <Coverage>
<Glyph value="c_t"/>
- </InputCoverage>
- <!-- LookAheadGlyphCount=3 -->
- <LookAheadCoverage index="0">
- <Glyph value="V"/>
- </LookAheadCoverage>
- <LookAheadCoverage index="1">
- <Glyph value="W"/>
- </LookAheadCoverage>
- <LookAheadCoverage index="2">
- <Glyph value="X"/>
- </LookAheadCoverage>
- <!-- SubstCount=1 -->
- <SubstLookupRecord index="0">
- <SequenceIndex value="0"/>
- <LookupListIndex value="2"/>
- </SubstLookupRecord>
+ </Coverage>
+ <!-- ChainSubRuleSetCount=1 -->
+ <ChainSubRuleSet index="0">
+ <!-- ChainSubRuleCount=1 -->
+ <ChainSubRule index="0">
+ <!-- BacktrackGlyphCount=3 -->
+ <Backtrack index="0" value="E"/>
+ <Backtrack index="1" value="D"/>
+ <Backtrack index="2" value="A"/>
+ <!-- InputGlyphCount=1 -->
+ <!-- LookAheadGlyphCount=3 -->
+ <LookAhead index="0" value="V"/>
+ <LookAhead index="1" value="W"/>
+ <LookAhead index="2" value="X"/>
+ <!-- SubstCount=1 -->
+ <SubstLookupRecord index="0">
+ <SequenceIndex value="0"/>
+ <LookupListIndex value="2"/>
+ </SubstLookupRecord>
+ </ChainSubRule>
+ </ChainSubRuleSet>
</ChainContextSubst>
</Lookup>
</LookupList>
diff --git a/Tests/feaLib/data/GSUB_6_formats.fea b/Tests/feaLib/data/GSUB_6_formats.fea
new file mode 100644
index 00000000..44135d24
--- /dev/null
+++ b/Tests/feaLib/data/GSUB_6_formats.fea
@@ -0,0 +1,20 @@
+lookup GSUB6f1 {
+ ignore sub one two three' four' five six seven;
+ ignore sub two one three' four' six five seven;
+} GSUB6f1;
+
+lookup GSUB6f2 {
+ ignore sub [A - H] [I - Z] [a - z]' [A - H]' [I - Z]';
+ ignore sub [I - Z] [A - H] [a - z]' [A - H]' [I - Z]';
+ ignore sub [A - H] [I - Z] [a - z]' [I - Z]' [A - H]';
+} GSUB6f2;
+
+lookup GSUB6f3 {
+ ignore sub [space comma semicolon] e';
+} GSUB6f3;
+
+feature test {
+ lookup GSUB6f1;
+ lookup GSUB6f2;
+ lookup GSUB6f3;
+} test;
diff --git a/Tests/feaLib/data/GSUB_6_formats.ttx b/Tests/feaLib/data/GSUB_6_formats.ttx
new file mode 100644
index 00000000..ad2a1c5e
--- /dev/null
+++ b/Tests/feaLib/data/GSUB_6_formats.ttx
@@ -0,0 +1,256 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=1 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="test"/>
+ <Feature>
+ <!-- LookupCount=3 -->
+ <LookupListIndex index="0" value="0"/>
+ <LookupListIndex index="1" value="1"/>
+ <LookupListIndex index="2" value="2"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=3 -->
+ <Lookup index="0">
+ <LookupType value="6"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <ChainContextSubst index="0" Format="1">
+ <Coverage>
+ <Glyph value="three"/>
+ </Coverage>
+ <!-- ChainSubRuleSetCount=1 -->
+ <ChainSubRuleSet index="0">
+ <!-- ChainSubRuleCount=2 -->
+ <ChainSubRule index="0">
+ <!-- BacktrackGlyphCount=2 -->
+ <Backtrack index="0" value="two"/>
+ <Backtrack index="1" value="one"/>
+ <!-- InputGlyphCount=2 -->
+ <Input index="0" value="four"/>
+ <!-- LookAheadGlyphCount=3 -->
+ <LookAhead index="0" value="five"/>
+ <LookAhead index="1" value="six"/>
+ <LookAhead index="2" value="seven"/>
+ <!-- SubstCount=0 -->
+ </ChainSubRule>
+ <ChainSubRule index="1">
+ <!-- BacktrackGlyphCount=2 -->
+ <Backtrack index="0" value="one"/>
+ <Backtrack index="1" value="two"/>
+ <!-- InputGlyphCount=2 -->
+ <Input index="0" value="four"/>
+ <!-- LookAheadGlyphCount=3 -->
+ <LookAhead index="0" value="six"/>
+ <LookAhead index="1" value="five"/>
+ <LookAhead index="2" value="seven"/>
+ <!-- SubstCount=0 -->
+ </ChainSubRule>
+ </ChainSubRuleSet>
+ </ChainContextSubst>
+ </Lookup>
+ <Lookup index="1">
+ <LookupType value="6"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <ChainContextSubst index="0" Format="2">
+ <Coverage>
+ <Glyph value="a"/>
+ <Glyph value="b"/>
+ <Glyph value="c"/>
+ <Glyph value="d"/>
+ <Glyph value="e"/>
+ <Glyph value="f"/>
+ <Glyph value="g"/>
+ <Glyph value="h"/>
+ <Glyph value="i"/>
+ <Glyph value="j"/>
+ <Glyph value="k"/>
+ <Glyph value="l"/>
+ <Glyph value="m"/>
+ <Glyph value="n"/>
+ <Glyph value="o"/>
+ <Glyph value="p"/>
+ <Glyph value="q"/>
+ <Glyph value="r"/>
+ <Glyph value="s"/>
+ <Glyph value="t"/>
+ <Glyph value="u"/>
+ <Glyph value="v"/>
+ <Glyph value="w"/>
+ <Glyph value="x"/>
+ <Glyph value="y"/>
+ <Glyph value="z"/>
+ </Coverage>
+ <BacktrackClassDef>
+ <ClassDef glyph="A" class="2"/>
+ <ClassDef glyph="B" class="2"/>
+ <ClassDef glyph="C" class="2"/>
+ <ClassDef glyph="D" class="2"/>
+ <ClassDef glyph="E" class="2"/>
+ <ClassDef glyph="F" class="2"/>
+ <ClassDef glyph="G" class="2"/>
+ <ClassDef glyph="H" class="2"/>
+ <ClassDef glyph="I" class="1"/>
+ <ClassDef glyph="J" class="1"/>
+ <ClassDef glyph="K" class="1"/>
+ <ClassDef glyph="L" class="1"/>
+ <ClassDef glyph="M" class="1"/>
+ <ClassDef glyph="N" class="1"/>
+ <ClassDef glyph="O" class="1"/>
+ <ClassDef glyph="P" class="1"/>
+ <ClassDef glyph="Q" class="1"/>
+ <ClassDef glyph="R" class="1"/>
+ <ClassDef glyph="S" class="1"/>
+ <ClassDef glyph="T" class="1"/>
+ <ClassDef glyph="U" class="1"/>
+ <ClassDef glyph="V" class="1"/>
+ <ClassDef glyph="W" class="1"/>
+ <ClassDef glyph="X" class="1"/>
+ <ClassDef glyph="Y" class="1"/>
+ <ClassDef glyph="Z" class="1"/>
+ </BacktrackClassDef>
+ <InputClassDef>
+ <ClassDef glyph="A" class="3"/>
+ <ClassDef glyph="B" class="3"/>
+ <ClassDef glyph="C" class="3"/>
+ <ClassDef glyph="D" class="3"/>
+ <ClassDef glyph="E" class="3"/>
+ <ClassDef glyph="F" class="3"/>
+ <ClassDef glyph="G" class="3"/>
+ <ClassDef glyph="H" class="3"/>
+ <ClassDef glyph="I" class="2"/>
+ <ClassDef glyph="J" class="2"/>
+ <ClassDef glyph="K" class="2"/>
+ <ClassDef glyph="L" class="2"/>
+ <ClassDef glyph="M" class="2"/>
+ <ClassDef glyph="N" class="2"/>
+ <ClassDef glyph="O" class="2"/>
+ <ClassDef glyph="P" class="2"/>
+ <ClassDef glyph="Q" class="2"/>
+ <ClassDef glyph="R" class="2"/>
+ <ClassDef glyph="S" class="2"/>
+ <ClassDef glyph="T" class="2"/>
+ <ClassDef glyph="U" class="2"/>
+ <ClassDef glyph="V" class="2"/>
+ <ClassDef glyph="W" class="2"/>
+ <ClassDef glyph="X" class="2"/>
+ <ClassDef glyph="Y" class="2"/>
+ <ClassDef glyph="Z" class="2"/>
+ <ClassDef glyph="a" class="1"/>
+ <ClassDef glyph="b" class="1"/>
+ <ClassDef glyph="c" class="1"/>
+ <ClassDef glyph="d" class="1"/>
+ <ClassDef glyph="e" class="1"/>
+ <ClassDef glyph="f" class="1"/>
+ <ClassDef glyph="g" class="1"/>
+ <ClassDef glyph="h" class="1"/>
+ <ClassDef glyph="i" class="1"/>
+ <ClassDef glyph="j" class="1"/>
+ <ClassDef glyph="k" class="1"/>
+ <ClassDef glyph="l" class="1"/>
+ <ClassDef glyph="m" class="1"/>
+ <ClassDef glyph="n" class="1"/>
+ <ClassDef glyph="o" class="1"/>
+ <ClassDef glyph="p" class="1"/>
+ <ClassDef glyph="q" class="1"/>
+ <ClassDef glyph="r" class="1"/>
+ <ClassDef glyph="s" class="1"/>
+ <ClassDef glyph="t" class="1"/>
+ <ClassDef glyph="u" class="1"/>
+ <ClassDef glyph="v" class="1"/>
+ <ClassDef glyph="w" class="1"/>
+ <ClassDef glyph="x" class="1"/>
+ <ClassDef glyph="y" class="1"/>
+ <ClassDef glyph="z" class="1"/>
+ </InputClassDef>
+ <LookAheadClassDef>
+ </LookAheadClassDef>
+ <!-- ChainSubClassSetCount=4 -->
+ <ChainSubClassSet index="0">
+ <!-- ChainSubClassRuleCount=0 -->
+ </ChainSubClassSet>
+ <ChainSubClassSet index="1">
+ <!-- ChainSubClassRuleCount=3 -->
+ <ChainSubClassRule index="0">
+ <!-- BacktrackGlyphCount=2 -->
+ <Backtrack index="0" value="1"/>
+ <Backtrack index="1" value="2"/>
+ <!-- InputGlyphCount=3 -->
+ <Input index="0" value="3"/>
+ <Input index="1" value="2"/>
+ <!-- LookAheadGlyphCount=0 -->
+ <!-- SubstCount=0 -->
+ </ChainSubClassRule>
+ <ChainSubClassRule index="1">
+ <!-- BacktrackGlyphCount=2 -->
+ <Backtrack index="0" value="2"/>
+ <Backtrack index="1" value="1"/>
+ <!-- InputGlyphCount=3 -->
+ <Input index="0" value="3"/>
+ <Input index="1" value="2"/>
+ <!-- LookAheadGlyphCount=0 -->
+ <!-- SubstCount=0 -->
+ </ChainSubClassRule>
+ <ChainSubClassRule index="2">
+ <!-- BacktrackGlyphCount=2 -->
+ <Backtrack index="0" value="1"/>
+ <Backtrack index="1" value="2"/>
+ <!-- InputGlyphCount=3 -->
+ <Input index="0" value="2"/>
+ <Input index="1" value="3"/>
+ <!-- LookAheadGlyphCount=0 -->
+ <!-- SubstCount=0 -->
+ </ChainSubClassRule>
+ </ChainSubClassSet>
+ <ChainSubClassSet index="2">
+ <!-- ChainSubClassRuleCount=0 -->
+ </ChainSubClassSet>
+ <ChainSubClassSet index="3">
+ <!-- ChainSubClassRuleCount=0 -->
+ </ChainSubClassSet>
+ </ChainContextSubst>
+ </Lookup>
+ <Lookup index="2">
+ <LookupType value="6"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <ChainContextSubst index="0" Format="3">
+ <!-- BacktrackGlyphCount=1 -->
+ <BacktrackCoverage index="0">
+ <Glyph value="space"/>
+ <Glyph value="semicolon"/>
+ <Glyph value="comma"/>
+ </BacktrackCoverage>
+ <!-- InputGlyphCount=1 -->
+ <InputCoverage index="0">
+ <Glyph value="e"/>
+ </InputCoverage>
+ <!-- LookAheadGlyphCount=0 -->
+ <!-- SubstCount=0 -->
+ </ChainContextSubst>
+ </Lookup>
+ </LookupList>
+ </GSUB>
+
+</ttFont>
diff --git a/Tests/feaLib/data/ZeroValue_ChainSinglePos_horizontal.ttx b/Tests/feaLib/data/ZeroValue_ChainSinglePos_horizontal.ttx
index ce76370e..98f7aa9e 100644
--- a/Tests/feaLib/data/ZeroValue_ChainSinglePos_horizontal.ttx
+++ b/Tests/feaLib/data/ZeroValue_ChainSinglePos_horizontal.ttx
@@ -32,44 +32,39 @@
<Lookup index="0">
<LookupType value="8"/>
<LookupFlag value="0"/>
- <!-- SubTableCount=2 -->
- <ChainContextPos index="0" Format="3">
- <!-- BacktrackGlyphCount=1 -->
- <BacktrackCoverage index="0">
- <Glyph value="A"/>
- </BacktrackCoverage>
- <!-- InputGlyphCount=1 -->
- <InputCoverage index="0">
- <Glyph value="G"/>
- </InputCoverage>
- <!-- LookAheadGlyphCount=1 -->
- <LookAheadCoverage index="0">
- <Glyph value="A"/>
- </LookAheadCoverage>
- <!-- PosCount=1 -->
- <PosLookupRecord index="0">
- <SequenceIndex value="0"/>
- <LookupListIndex value="1"/>
- </PosLookupRecord>
- </ChainContextPos>
- <ChainContextPos index="1" Format="3">
- <!-- BacktrackGlyphCount=1 -->
- <BacktrackCoverage index="0">
- <Glyph value="B"/>
- </BacktrackCoverage>
- <!-- InputGlyphCount=1 -->
- <InputCoverage index="0">
+ <!-- SubTableCount=1 -->
+ <ChainContextPos index="0" Format="1">
+ <Coverage>
<Glyph value="G"/>
- </InputCoverage>
- <!-- LookAheadGlyphCount=1 -->
- <LookAheadCoverage index="0">
- <Glyph value="B"/>
- </LookAheadCoverage>
- <!-- PosCount=1 -->
- <PosLookupRecord index="0">
- <SequenceIndex value="0"/>
- <LookupListIndex value="1"/>
- </PosLookupRecord>
+ </Coverage>
+ <!-- ChainPosRuleSetCount=1 -->
+ <ChainPosRuleSet index="0">
+ <!-- ChainPosRuleCount=2 -->
+ <ChainPosRule index="0">
+ <!-- BacktrackGlyphCount=1 -->
+ <Backtrack index="0" value="A"/>
+ <!-- InputGlyphCount=1 -->
+ <!-- LookAheadGlyphCount=1 -->
+ <LookAhead index="0" value="A"/>
+ <!-- PosCount=1 -->
+ <PosLookupRecord index="0">
+ <SequenceIndex value="0"/>
+ <LookupListIndex value="1"/>
+ </PosLookupRecord>
+ </ChainPosRule>
+ <ChainPosRule index="1">
+ <!-- BacktrackGlyphCount=1 -->
+ <Backtrack index="0" value="B"/>
+ <!-- InputGlyphCount=1 -->
+ <!-- LookAheadGlyphCount=1 -->
+ <LookAhead index="0" value="B"/>
+ <!-- PosCount=1 -->
+ <PosLookupRecord index="0">
+ <SequenceIndex value="0"/>
+ <LookupListIndex value="1"/>
+ </PosLookupRecord>
+ </ChainPosRule>
+ </ChainPosRuleSet>
</ChainContextPos>
</Lookup>
<Lookup index="1">
diff --git a/Tests/feaLib/data/ZeroValue_ChainSinglePos_vertical.ttx b/Tests/feaLib/data/ZeroValue_ChainSinglePos_vertical.ttx
index e1cb5d61..973cb4f6 100644
--- a/Tests/feaLib/data/ZeroValue_ChainSinglePos_vertical.ttx
+++ b/Tests/feaLib/data/ZeroValue_ChainSinglePos_vertical.ttx
@@ -32,44 +32,39 @@
<Lookup index="0">
<LookupType value="8"/>
<LookupFlag value="0"/>
- <!-- SubTableCount=2 -->
- <ChainContextPos index="0" Format="3">
- <!-- BacktrackGlyphCount=1 -->
- <BacktrackCoverage index="0">
- <Glyph value="A"/>
- </BacktrackCoverage>
- <!-- InputGlyphCount=1 -->
- <InputCoverage index="0">
- <Glyph value="G"/>
- </InputCoverage>
- <!-- LookAheadGlyphCount=1 -->
- <LookAheadCoverage index="0">
- <Glyph value="A"/>
- </LookAheadCoverage>
- <!-- PosCount=1 -->
- <PosLookupRecord index="0">
- <SequenceIndex value="0"/>
- <LookupListIndex value="1"/>
- </PosLookupRecord>
- </ChainContextPos>
- <ChainContextPos index="1" Format="3">
- <!-- BacktrackGlyphCount=1 -->
- <BacktrackCoverage index="0">
- <Glyph value="B"/>
- </BacktrackCoverage>
- <!-- InputGlyphCount=1 -->
- <InputCoverage index="0">
+ <!-- SubTableCount=1 -->
+ <ChainContextPos index="0" Format="1">
+ <Coverage>
<Glyph value="G"/>
- </InputCoverage>
- <!-- LookAheadGlyphCount=1 -->
- <LookAheadCoverage index="0">
- <Glyph value="B"/>
- </LookAheadCoverage>
- <!-- PosCount=1 -->
- <PosLookupRecord index="0">
- <SequenceIndex value="0"/>
- <LookupListIndex value="1"/>
- </PosLookupRecord>
+ </Coverage>
+ <!-- ChainPosRuleSetCount=1 -->
+ <ChainPosRuleSet index="0">
+ <!-- ChainPosRuleCount=2 -->
+ <ChainPosRule index="0">
+ <!-- BacktrackGlyphCount=1 -->
+ <Backtrack index="0" value="A"/>
+ <!-- InputGlyphCount=1 -->
+ <!-- LookAheadGlyphCount=1 -->
+ <LookAhead index="0" value="A"/>
+ <!-- PosCount=1 -->
+ <PosLookupRecord index="0">
+ <SequenceIndex value="0"/>
+ <LookupListIndex value="1"/>
+ </PosLookupRecord>
+ </ChainPosRule>
+ <ChainPosRule index="1">
+ <!-- BacktrackGlyphCount=1 -->
+ <Backtrack index="0" value="B"/>
+ <!-- InputGlyphCount=1 -->
+ <!-- LookAheadGlyphCount=1 -->
+ <LookAhead index="0" value="B"/>
+ <!-- PosCount=1 -->
+ <PosLookupRecord index="0">
+ <SequenceIndex value="0"/>
+ <LookupListIndex value="1"/>
+ </PosLookupRecord>
+ </ChainPosRule>
+ </ChainPosRuleSet>
</ChainContextPos>
</Lookup>
<Lookup index="1">
diff --git a/Tests/feaLib/data/bug512.ttx b/Tests/feaLib/data/bug512.ttx
index 50b76b46..693ebeb7 100644
--- a/Tests/feaLib/data/bug512.ttx
+++ b/Tests/feaLib/data/bug512.ttx
@@ -32,50 +32,51 @@
<Lookup index="0">
<LookupType value="5"/>
<LookupFlag value="0"/>
- <!-- SubTableCount=4 -->
- <ContextSubst index="0" Format="3">
- <!-- GlyphCount=1 -->
- <!-- SubstCount=1 -->
- <Coverage index="0">
- <Glyph value="G"/>
- </Coverage>
- <SubstLookupRecord index="0">
- <SequenceIndex value="0"/>
- <LookupListIndex value="1"/>
- </SubstLookupRecord>
- </ContextSubst>
- <ContextSubst index="1" Format="3">
- <!-- GlyphCount=1 -->
- <!-- SubstCount=1 -->
- <Coverage index="0">
- <Glyph value="H"/>
- </Coverage>
- <SubstLookupRecord index="0">
- <SequenceIndex value="0"/>
- <LookupListIndex value="1"/>
- </SubstLookupRecord>
- </ContextSubst>
- <ContextSubst index="2" Format="3">
- <!-- GlyphCount=1 -->
- <!-- SubstCount=1 -->
- <Coverage index="0">
+ <!-- SubTableCount=1 -->
+ <ContextSubst index="0" Format="1">
+ <Coverage>
<Glyph value="G"/>
- </Coverage>
- <SubstLookupRecord index="0">
- <SequenceIndex value="0"/>
- <LookupListIndex value="2"/>
- </SubstLookupRecord>
- </ContextSubst>
- <ContextSubst index="3" Format="3">
- <!-- GlyphCount=1 -->
- <!-- SubstCount=1 -->
- <Coverage index="0">
<Glyph value="H"/>
</Coverage>
- <SubstLookupRecord index="0">
- <SequenceIndex value="0"/>
- <LookupListIndex value="2"/>
- </SubstLookupRecord>
+ <!-- SubRuleSetCount=2 -->
+ <SubRuleSet index="0">
+ <!-- SubRuleCount=2 -->
+ <SubRule index="0">
+ <!-- GlyphCount=1 -->
+ <!-- SubstCount=1 -->
+ <SubstLookupRecord index="0">
+ <SequenceIndex value="0"/>
+ <LookupListIndex value="1"/>
+ </SubstLookupRecord>
+ </SubRule>
+ <SubRule index="1">
+ <!-- GlyphCount=1 -->
+ <!-- SubstCount=1 -->
+ <SubstLookupRecord index="0">
+ <SequenceIndex value="0"/>
+ <LookupListIndex value="2"/>
+ </SubstLookupRecord>
+ </SubRule>
+ </SubRuleSet>
+ <SubRuleSet index="1">
+ <!-- SubRuleCount=2 -->
+ <SubRule index="0">
+ <!-- GlyphCount=1 -->
+ <!-- SubstCount=1 -->
+ <SubstLookupRecord index="0">
+ <SequenceIndex value="0"/>
+ <LookupListIndex value="1"/>
+ </SubstLookupRecord>
+ </SubRule>
+ <SubRule index="1">
+ <!-- GlyphCount=1 -->
+ <!-- SubstCount=1 -->
+ <SubstLookupRecord index="0">
+ <SequenceIndex value="0"/>
+ <LookupListIndex value="2"/>
+ </SubstLookupRecord>
+ </SubRule>
+ </SubRuleSet>
</ContextSubst>
</Lookup>
<Lookup index="1">
diff --git a/Tests/feaLib/data/spec5f_ii_3.ttx b/Tests/feaLib/data/spec5f_ii_3.ttx
index a550f0b6..a94efcea 100644
--- a/Tests/feaLib/data/spec5f_ii_3.ttx
+++ b/Tests/feaLib/data/spec5f_ii_3.ttx
@@ -32,111 +32,115 @@
<Lookup index="0">
<LookupType value="6"/>
<LookupFlag value="0"/>
- <!-- SubTableCount=3 -->
- <ChainContextSubst index="0" Format="3">
- <!-- BacktrackGlyphCount=1 -->
- <BacktrackCoverage index="0">
- <Glyph value="a"/>
- <Glyph value="b"/>
- <Glyph value="c"/>
- <Glyph value="d"/>
- <Glyph value="e"/>
- <Glyph value="f"/>
- <Glyph value="g"/>
- <Glyph value="h"/>
- <Glyph value="i"/>
- <Glyph value="j"/>
- <Glyph value="k"/>
- <Glyph value="l"/>
- <Glyph value="m"/>
- <Glyph value="n"/>
- <Glyph value="o"/>
- <Glyph value="p"/>
- <Glyph value="q"/>
- <Glyph value="r"/>
- <Glyph value="s"/>
- <Glyph value="t"/>
- <Glyph value="u"/>
- <Glyph value="v"/>
- <Glyph value="w"/>
- <Glyph value="x"/>
- <Glyph value="y"/>
- <Glyph value="z"/>
- </BacktrackCoverage>
- <!-- InputGlyphCount=3 -->
- <InputCoverage index="0">
- <Glyph value="a"/>
- </InputCoverage>
- <InputCoverage index="1">
- <Glyph value="n"/>
- </InputCoverage>
- <InputCoverage index="2">
- <Glyph value="d"/>
- </InputCoverage>
- <!-- LookAheadGlyphCount=0 -->
- <!-- SubstCount=0 -->
- </ChainContextSubst>
- <ChainContextSubst index="1" Format="3">
- <!-- BacktrackGlyphCount=0 -->
- <!-- InputGlyphCount=3 -->
- <InputCoverage index="0">
- <Glyph value="a"/>
- </InputCoverage>
- <InputCoverage index="1">
- <Glyph value="n"/>
- </InputCoverage>
- <InputCoverage index="2">
- <Glyph value="d"/>
- </InputCoverage>
- <!-- LookAheadGlyphCount=1 -->
- <LookAheadCoverage index="0">
- <Glyph value="a"/>
- <Glyph value="b"/>
- <Glyph value="c"/>
- <Glyph value="d"/>
- <Glyph value="e"/>
- <Glyph value="f"/>
- <Glyph value="g"/>
- <Glyph value="h"/>
- <Glyph value="i"/>
- <Glyph value="j"/>
- <Glyph value="k"/>
- <Glyph value="l"/>
- <Glyph value="m"/>
- <Glyph value="n"/>
- <Glyph value="o"/>
- <Glyph value="p"/>
- <Glyph value="q"/>
- <Glyph value="r"/>
- <Glyph value="s"/>
- <Glyph value="t"/>
- <Glyph value="u"/>
- <Glyph value="v"/>
- <Glyph value="w"/>
- <Glyph value="x"/>
- <Glyph value="y"/>
- <Glyph value="z"/>
- </LookAheadCoverage>
- <!-- SubstCount=0 -->
- </ChainContextSubst>
- <ChainContextSubst index="2" Format="3">
- <!-- BacktrackGlyphCount=0 -->
- <!-- InputGlyphCount=3 -->
- <InputCoverage index="0">
+ <!-- SubTableCount=1 -->
+ <ChainContextSubst index="0" Format="2">
+ <Coverage>
<Glyph value="a"/>
- </InputCoverage>
- <InputCoverage index="1">
- <Glyph value="n"/>
- </InputCoverage>
- <InputCoverage index="2">
- <Glyph value="d"/>
- </InputCoverage>
- <!-- LookAheadGlyphCount=0 -->
- <!-- SubstCount=1 -->
- <SubstLookupRecord index="0">
- <SequenceIndex value="0"/>
- <LookupListIndex value="1"/>
- </SubstLookupRecord>
+ </Coverage>
+ <BacktrackClassDef>
+ <ClassDef glyph="a" class="1"/>
+ <ClassDef glyph="b" class="1"/>
+ <ClassDef glyph="c" class="1"/>
+ <ClassDef glyph="d" class="1"/>
+ <ClassDef glyph="e" class="1"/>
+ <ClassDef glyph="f" class="1"/>
+ <ClassDef glyph="g" class="1"/>
+ <ClassDef glyph="h" class="1"/>
+ <ClassDef glyph="i" class="1"/>
+ <ClassDef glyph="j" class="1"/>
+ <ClassDef glyph="k" class="1"/>
+ <ClassDef glyph="l" class="1"/>
+ <ClassDef glyph="m" class="1"/>
+ <ClassDef glyph="n" class="1"/>
+ <ClassDef glyph="o" class="1"/>
+ <ClassDef glyph="p" class="1"/>
+ <ClassDef glyph="q" class="1"/>
+ <ClassDef glyph="r" class="1"/>
+ <ClassDef glyph="s" class="1"/>
+ <ClassDef glyph="t" class="1"/>
+ <ClassDef glyph="u" class="1"/>
+ <ClassDef glyph="v" class="1"/>
+ <ClassDef glyph="w" class="1"/>
+ <ClassDef glyph="x" class="1"/>
+ <ClassDef glyph="y" class="1"/>
+ <ClassDef glyph="z" class="1"/>
+ </BacktrackClassDef>
+ <InputClassDef>
+ <ClassDef glyph="a" class="3"/>
+ <ClassDef glyph="d" class="2"/>
+ <ClassDef glyph="n" class="1"/>
+ </InputClassDef>
+ <LookAheadClassDef>
+ <ClassDef glyph="a" class="1"/>
+ <ClassDef glyph="b" class="1"/>
+ <ClassDef glyph="c" class="1"/>
+ <ClassDef glyph="d" class="1"/>
+ <ClassDef glyph="e" class="1"/>
+ <ClassDef glyph="f" class="1"/>
+ <ClassDef glyph="g" class="1"/>
+ <ClassDef glyph="h" class="1"/>
+ <ClassDef glyph="i" class="1"/>
+ <ClassDef glyph="j" class="1"/>
+ <ClassDef glyph="k" class="1"/>
+ <ClassDef glyph="l" class="1"/>
+ <ClassDef glyph="m" class="1"/>
+ <ClassDef glyph="n" class="1"/>
+ <ClassDef glyph="o" class="1"/>
+ <ClassDef glyph="p" class="1"/>
+ <ClassDef glyph="q" class="1"/>
+ <ClassDef glyph="r" class="1"/>
+ <ClassDef glyph="s" class="1"/>
+ <ClassDef glyph="t" class="1"/>
+ <ClassDef glyph="u" class="1"/>
+ <ClassDef glyph="v" class="1"/>
+ <ClassDef glyph="w" class="1"/>
+ <ClassDef glyph="x" class="1"/>
+ <ClassDef glyph="y" class="1"/>
+ <ClassDef glyph="z" class="1"/>
+ </LookAheadClassDef>
+ <!-- ChainSubClassSetCount=4 -->
+ <ChainSubClassSet index="0">
+ <!-- ChainSubClassRuleCount=0 -->
+ </ChainSubClassSet>
+ <ChainSubClassSet index="1">
+ <!-- ChainSubClassRuleCount=0 -->
+ </ChainSubClassSet>
+ <ChainSubClassSet index="2">
+ <!-- ChainSubClassRuleCount=0 -->
+ </ChainSubClassSet>
+ <ChainSubClassSet index="3">
+ <!-- ChainSubClassRuleCount=3 -->
+ <ChainSubClassRule index="0">
+ <!-- BacktrackGlyphCount=1 -->
+ <Backtrack index="0" value="1"/>
+ <!-- InputGlyphCount=3 -->
+ <Input index="0" value="1"/>
+ <Input index="1" value="2"/>
+ <!-- LookAheadGlyphCount=0 -->
+ <!-- SubstCount=0 -->
+ </ChainSubClassRule>
+ <ChainSubClassRule index="1">
+ <!-- BacktrackGlyphCount=0 -->
+ <!-- InputGlyphCount=3 -->
+ <Input index="0" value="1"/>
+ <Input index="1" value="2"/>
+ <!-- LookAheadGlyphCount=1 -->
+ <LookAhead index="0" value="1"/>
+ <!-- SubstCount=0 -->
+ </ChainSubClassRule>
+ <ChainSubClassRule index="2">
+ <!-- BacktrackGlyphCount=0 -->
+ <!-- InputGlyphCount=3 -->
+ <Input index="0" value="1"/>
+ <Input index="1" value="2"/>
+ <!-- LookAheadGlyphCount=0 -->
+ <!-- SubstCount=1 -->
+ <SubstLookupRecord index="0">
+ <SequenceIndex value="0"/>
+ <LookupListIndex value="1"/>
+ </SubstLookupRecord>
+ </ChainSubClassRule>
+ </ChainSubClassSet>
</ChainContextSubst>
</Lookup>
<Lookup index="1">
diff --git a/Tests/pens/cocoaPen_test.py b/Tests/pens/cocoaPen_test.py
new file mode 100644
index 00000000..51795e12
--- /dev/null
+++ b/Tests/pens/cocoaPen_test.py
@@ -0,0 +1,59 @@
+from fontTools.misc.py23 import *
+import unittest
+
+try:
+ from fontTools.pens.cocoaPen import CocoaPen
+ from AppKit import NSBezierPathElementMoveTo, NSBezierPathElementLineTo
+ from AppKit import NSBezierPathElementCurveTo, NSBezierPathElementClosePath
+
+ PATH_ELEMENTS = {
+ # NSBezierPathElement key desc
+ NSBezierPathElementMoveTo: 'moveto',
+ NSBezierPathElementLineTo: 'lineto',
+ NSBezierPathElementCurveTo: 'curveto',
+ NSBezierPathElementClosePath: 'close',
+ }
+
+ PYOBJC_AVAILABLE = True
+except ImportError:
+ PYOBJC_AVAILABLE = False
+
+
+def draw(pen):
+ pen.moveTo((50, 0))
+ pen.lineTo((50, 500))
+ pen.lineTo((200, 500))
+ pen.curveTo((350, 500), (450, 400), (450, 250))
+ pen.curveTo((450, 100), (350, 0), (200, 0))
+ pen.closePath()
+
+
+def cocoaPathToString(path):
+ num_elements = path.elementCount()
+ output = []
+ for i in range(num_elements - 1):
+ elem_type, elem_points = path.elementAtIndex_associatedPoints_(i)
+ elem_type = PATH_ELEMENTS[elem_type]
+ path_points = " ".join([f"{p.x} {p.y}" for p in elem_points])
+ output.append(f"{elem_type} {path_points}")
+ return " ".join(output)
+
+
+@unittest.skipUnless(PYOBJC_AVAILABLE, "pyobjc not installed")
+class CocoaPenTest(unittest.TestCase):
+ def test_draw(self):
+ pen = CocoaPen(None)
+ draw(pen)
+ self.assertEqual(
+ "moveto 50.0 0.0 lineto 50.0 500.0 lineto 200.0 500.0 curveto 350.0 500.0 450.0 400.0 450.0 250.0 curveto 450.0 100.0 350.0 0.0 200.0 0.0 close ",
+ cocoaPathToString(pen.path)
+ )
+
+ def test_empty(self):
+ pen = CocoaPen(None)
+ self.assertEqual("", cocoaPathToString(pen.path))
+
+
+if __name__ == '__main__':
+ import sys
+ sys.exit(unittest.main())
diff --git a/Tests/pens/quartzPen_test.py b/Tests/pens/quartzPen_test.py
new file mode 100644
index 00000000..12fbd292
--- /dev/null
+++ b/Tests/pens/quartzPen_test.py
@@ -0,0 +1,79 @@
+from fontTools.misc.py23 import *
+import unittest
+
+try:
+ from fontTools.pens.quartzPen import QuartzPen
+
+ from Quartz.CoreGraphics import CGPathApply
+ from Quartz.CoreGraphics import kCGPathElementMoveToPoint
+ from Quartz.CoreGraphics import kCGPathElementAddLineToPoint
+ from Quartz.CoreGraphics import kCGPathElementAddQuadCurveToPoint
+ from Quartz.CoreGraphics import kCGPathElementAddCurveToPoint
+ from Quartz.CoreGraphics import kCGPathElementCloseSubpath
+
+ PATH_ELEMENTS = {
+ # CG constant key desc num_points
+ kCGPathElementMoveToPoint: ('moveto', 1),
+ kCGPathElementAddLineToPoint: ('lineto', 1),
+ kCGPathElementAddCurveToPoint: ('curveto', 3),
+ kCGPathElementAddQuadCurveToPoint: ('qcurveto', 2),
+ kCGPathElementCloseSubpath: ('close', 0),
+ }
+
+ PYOBJC_AVAILABLE = True
+except ImportError:
+ PYOBJC_AVAILABLE = False
+
+
+def draw(pen):
+ pen.moveTo((50, 0))
+ pen.lineTo((50, 500))
+ pen.lineTo((200, 500))
+ pen.curveTo((350, 500), (450, 400), (450, 250))
+ pen.curveTo((450, 100), (350, 0), (200, 0))
+ pen.closePath()
+
+
+def quartzPathApplier(elements, element):
+ num_points = 0
+ elem_type = None
+ if element.type in PATH_ELEMENTS:
+ num_points = PATH_ELEMENTS[element.type][1]
+ elem_type = PATH_ELEMENTS[element.type][0]
+ elements.append((elem_type, element.points.as_tuple(num_points)))
+
+
+def quartzPathElements(path):
+ elements = []
+ CGPathApply(path, elements, quartzPathApplier)
+ return elements
+
+
+def quartzPathToString(path):
+ elements = quartzPathElements(path)
+ output = []
+ for element in elements:
+ elem_type, elem_points = element
+ path_points = " ".join([f"{p.x} {p.y}" for p in elem_points])
+ output.append(f"{elem_type} {path_points}")
+ return " ".join(output)
+
+
+@unittest.skipUnless(PYOBJC_AVAILABLE, "pyobjc not installed")
+class QuartzPenTest(unittest.TestCase):
+ def test_draw(self):
+ pen = QuartzPen(None)
+ draw(pen)
+ self.assertEqual(
+ "moveto 50.0 0.0 lineto 50.0 500.0 lineto 200.0 500.0 curveto 350.0 500.0 450.0 400.0 450.0 250.0 curveto 450.0 100.0 350.0 0.0 200.0 0.0 close ",
+ quartzPathToString(pen.path)
+ )
+
+ def test_empty(self):
+ pen = QuartzPen(None)
+ self.assertEqual("", quartzPathToString(pen.path))
+
+
+if __name__ == '__main__':
+ import sys
+ sys.exit(unittest.main())
diff --git a/Tests/subset/data/expect_layout_scripts.ttx b/Tests/subset/data/expect_layout_scripts.ttx
new file mode 100644
index 00000000..f3eea822
--- /dev/null
+++ b/Tests/subset/data/expect_layout_scripts.ttx
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont>
+
+ <GPOS>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=0 -->
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GPOS>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=2 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="arab"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="2"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=1 -->
+ <LangSysRecord index="0">
+ <LangSysTag value="URD "/>
+ <LangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=2 -->
+ <FeatureIndex index="0" value="1"/>
+ <FeatureIndex index="1" value="2"/>
+ </LangSys>
+ </LangSysRecord>
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="1">
+ <ScriptTag value="latn"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="2"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=1 -->
+ <LangSysRecord index="0">
+ <LangSysTag value="TRK "/>
+ <LangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=2 -->
+ <FeatureIndex index="0" value="0"/>
+ <FeatureIndex index="1" value="2"/>
+ </LangSys>
+ </LangSysRecord>
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=3 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="locl"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="2"/>
+ </Feature>
+ </FeatureRecord>
+ <FeatureRecord index="1">
+ <FeatureTag value="locl"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ <FeatureRecord index="2">
+ <FeatureTag value="numr"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="1"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=3 -->
+ <Lookup index="0">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="2">
+ <Substitution in="uni06F4" out="uni06F4.urd"/>
+ <Substitution in="uni06F6" out="uni06F6.urd"/>
+ <Substitution in="uni06F7" out="uni06F7.urd"/>
+ </SingleSubst>
+ </Lookup>
+ <Lookup index="1">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="1">
+ <Substitution in="uni06F0" out="uni06F0.numr"/>
+ <Substitution in="uni06F1" out="uni06F1.numr"/>
+ <Substitution in="uni06F2" out="uni06F2.numr"/>
+ <Substitution in="uni06F3" out="uni06F3.numr"/>
+ <Substitution in="uni06F4" out="uni06F4.numr"/>
+ <Substitution in="uni06F4.urd" out="uni06F4.urd.numr"/>
+ <Substitution in="uni06F5" out="uni06F5.numr"/>
+ <Substitution in="uni06F6" out="uni06F6.numr"/>
+ <Substitution in="uni06F6.urd" out="uni06F6.urd.numr"/>
+ <Substitution in="uni06F7" out="uni06F7.numr"/>
+ <Substitution in="uni06F7.urd" out="uni06F7.urd.numr"/>
+ <Substitution in="uni06F8" out="uni06F8.numr"/>
+ <Substitution in="uni06F9" out="uni06F9.numr"/>
+ </SingleSubst>
+ </Lookup>
+ <Lookup index="2">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="1">
+ <Substitution in="i" out="i.TRK"/>
+ </SingleSubst>
+ </Lookup>
+ </LookupList>
+ </GSUB>
+
+</ttFont>
diff --git a/Tests/subset/data/layout_scripts.ttx b/Tests/subset/data/layout_scripts.ttx
new file mode 100644
index 00000000..37b2fd81
--- /dev/null
+++ b/Tests/subset/data/layout_scripts.ttx
@@ -0,0 +1,997 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" ttLibVersion="4.17">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="i"/>
+ <GlyphID id="2" name="uni06F0"/>
+ <GlyphID id="3" name="uni06F1"/>
+ <GlyphID id="4" name="uni06F2"/>
+ <GlyphID id="5" name="uni06F3"/>
+ <GlyphID id="6" name="uni06F4"/>
+ <GlyphID id="7" name="uni06F5"/>
+ <GlyphID id="8" name="uni06F6"/>
+ <GlyphID id="9" name="uni06F7"/>
+ <GlyphID id="10" name="uni06F8"/>
+ <GlyphID id="11" name="uni06F9"/>
+ <GlyphID id="12" name="uni06F4.urd"/>
+ <GlyphID id="13" name="uni06F6.urd"/>
+ <GlyphID id="14" name="uni06F7.urd"/>
+ <GlyphID id="15" name="uni06F0.numr"/>
+ <GlyphID id="16" name="uni06F1.numr"/>
+ <GlyphID id="17" name="uni06F2.numr"/>
+ <GlyphID id="18" name="uni06F3.numr"/>
+ <GlyphID id="19" name="uni06F4.numr"/>
+ <GlyphID id="20" name="uni06F5.numr"/>
+ <GlyphID id="21" name="uni06F6.numr"/>
+ <GlyphID id="22" name="uni06F7.numr"/>
+ <GlyphID id="23" name="uni06F8.numr"/>
+ <GlyphID id="24" name="uni06F9.numr"/>
+ <GlyphID id="25" name="uni06F4.urd.numr"/>
+ <GlyphID id="26" name="uni06F6.urd.numr"/>
+ <GlyphID id="27" name="uni06F7.urd.numr"/>
+ <GlyphID id="28" name="i.TRK"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="0.114"/>
+ <checkSumAdjustment value="0xe87b6e18"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Fri May 7 21:08:01 2010"/>
+ <modified value="Thu Jan 1 00:00:00 1970"/>
+ <xMin value="-581"/>
+ <yMin value="-898"/>
+ <xMax value="11462"/>
+ <yMax value="1814"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="6"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1124"/>
+ <descent value="-634"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="11435"/>
+ <minLeftSideBearing value="-581"/>
+ <minRightSideBearing value="-970"/>
+ <xMaxExtent value="11462"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfHMetrics value="29"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="29"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="4"/>
+ <xAvgCharWidth value="456"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="260"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="5"/>
+ <bProportion value="0"/>
+ <bContrast value="0"/>
+ <bStrokeVariation value="0"/>
+ <bArmStyle value="0"/>
+ <bLetterForm value="0"/>
+ <bMidline value="0"/>
+ <bXHeight value="0"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00100000 00000001"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ALIF"/>
+ <fsSelection value="00000000 11000000"/>
+ <usFirstCharIndex value="105"/>
+ <usLastCharIndex value="1785"/>
+ <sTypoAscender value="1124"/>
+ <sTypoDescender value="-634"/>
+ <sTypoLineGap value="0"/>
+ <usWinAscent value="1814"/>
+ <usWinDescent value="897"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 11010011"/>
+ <ulCodePageRange2 value="00000000 00001000 00000000 00000000"/>
+ <sxHeight value="433"/>
+ <sCapHeight value="646"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="8"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright 2010-2020 The Amiri Project Authors (https://github.com/alif-type/amiri).
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Amiri
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 0.114;ALIF;Amiri-Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Amiri Regular
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 0.114
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ Amiri-Regular
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x69" name="i"/><!-- LATIN SMALL LETTER I -->
+ <map code="0x6f0" name="uni06F0"/><!-- EXTENDED ARABIC-INDIC DIGIT ZERO -->
+ <map code="0x6f1" name="uni06F1"/><!-- EXTENDED ARABIC-INDIC DIGIT ONE -->
+ <map code="0x6f2" name="uni06F2"/><!-- EXTENDED ARABIC-INDIC DIGIT TWO -->
+ <map code="0x6f3" name="uni06F3"/><!-- EXTENDED ARABIC-INDIC DIGIT THREE -->
+ <map code="0x6f4" name="uni06F4"/><!-- EXTENDED ARABIC-INDIC DIGIT FOUR -->
+ <map code="0x6f5" name="uni06F5"/><!-- EXTENDED ARABIC-INDIC DIGIT FIVE -->
+ <map code="0x6f6" name="uni06F6"/><!-- EXTENDED ARABIC-INDIC DIGIT SIX -->
+ <map code="0x6f7" name="uni06F7"/><!-- EXTENDED ARABIC-INDIC DIGIT SEVEN -->
+ <map code="0x6f8" name="uni06F8"/><!-- EXTENDED ARABIC-INDIC DIGIT EIGHT -->
+ <map code="0x6f9" name="uni06F9"/><!-- EXTENDED ARABIC-INDIC DIGIT NINE -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="0" platEncID="4" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x69" name="i"/><!-- LATIN SMALL LETTER I -->
+ <map code="0x6f0" name="uni06F0"/><!-- EXTENDED ARABIC-INDIC DIGIT ZERO -->
+ <map code="0x6f1" name="uni06F1"/><!-- EXTENDED ARABIC-INDIC DIGIT ONE -->
+ <map code="0x6f2" name="uni06F2"/><!-- EXTENDED ARABIC-INDIC DIGIT TWO -->
+ <map code="0x6f3" name="uni06F3"/><!-- EXTENDED ARABIC-INDIC DIGIT THREE -->
+ <map code="0x6f4" name="uni06F4"/><!-- EXTENDED ARABIC-INDIC DIGIT FOUR -->
+ <map code="0x6f5" name="uni06F5"/><!-- EXTENDED ARABIC-INDIC DIGIT FIVE -->
+ <map code="0x6f6" name="uni06F6"/><!-- EXTENDED ARABIC-INDIC DIGIT SIX -->
+ <map code="0x6f7" name="uni06F7"/><!-- EXTENDED ARABIC-INDIC DIGIT SEVEN -->
+ <map code="0x6f8" name="uni06F8"/><!-- EXTENDED ARABIC-INDIC DIGIT EIGHT -->
+ <map code="0x6f9" name="uni06F9"/><!-- EXTENDED ARABIC-INDIC DIGIT NINE -->
+ </cmap_format_12>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x69" name="i"/><!-- LATIN SMALL LETTER I -->
+ <map code="0x6f0" name="uni06F0"/><!-- EXTENDED ARABIC-INDIC DIGIT ZERO -->
+ <map code="0x6f1" name="uni06F1"/><!-- EXTENDED ARABIC-INDIC DIGIT ONE -->
+ <map code="0x6f2" name="uni06F2"/><!-- EXTENDED ARABIC-INDIC DIGIT TWO -->
+ <map code="0x6f3" name="uni06F3"/><!-- EXTENDED ARABIC-INDIC DIGIT THREE -->
+ <map code="0x6f4" name="uni06F4"/><!-- EXTENDED ARABIC-INDIC DIGIT FOUR -->
+ <map code="0x6f5" name="uni06F5"/><!-- EXTENDED ARABIC-INDIC DIGIT FIVE -->
+ <map code="0x6f6" name="uni06F6"/><!-- EXTENDED ARABIC-INDIC DIGIT SIX -->
+ <map code="0x6f7" name="uni06F7"/><!-- EXTENDED ARABIC-INDIC DIGIT SEVEN -->
+ <map code="0x6f8" name="uni06F8"/><!-- EXTENDED ARABIC-INDIC DIGIT EIGHT -->
+ <map code="0x6f9" name="uni06F9"/><!-- EXTENDED ARABIC-INDIC DIGIT NINE -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x69" name="i"/><!-- LATIN SMALL LETTER I -->
+ <map code="0x6f0" name="uni06F0"/><!-- EXTENDED ARABIC-INDIC DIGIT ZERO -->
+ <map code="0x6f1" name="uni06F1"/><!-- EXTENDED ARABIC-INDIC DIGIT ONE -->
+ <map code="0x6f2" name="uni06F2"/><!-- EXTENDED ARABIC-INDIC DIGIT TWO -->
+ <map code="0x6f3" name="uni06F3"/><!-- EXTENDED ARABIC-INDIC DIGIT THREE -->
+ <map code="0x6f4" name="uni06F4"/><!-- EXTENDED ARABIC-INDIC DIGIT FOUR -->
+ <map code="0x6f5" name="uni06F5"/><!-- EXTENDED ARABIC-INDIC DIGIT FIVE -->
+ <map code="0x6f6" name="uni06F6"/><!-- EXTENDED ARABIC-INDIC DIGIT SIX -->
+ <map code="0x6f7" name="uni06F7"/><!-- EXTENDED ARABIC-INDIC DIGIT SEVEN -->
+ <map code="0x6f8" name="uni06F8"/><!-- EXTENDED ARABIC-INDIC DIGIT EIGHT -->
+ <map code="0x6f9" name="uni06F9"/><!-- EXTENDED ARABIC-INDIC DIGIT NINE -->
+ </cmap_format_12>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-512"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="Amiri-Regular">
+ <version value="0.114"/>
+ <Copyright value="Copyright 2010-2020 The Amiri Project Authors https:github.comalif-typeamiri."/>
+ <FullName value="Amiri"/>
+ <FamilyName value="Amiri"/>
+ <Weight value="Regular"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-512"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="-581 -898 11462 1814"/>
+ <StrokeWidth value="0"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <Encoding name="StandardEncoding"/>
+ <Private>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="0"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="0"/>
+ <nominalWidthX value="253"/>
+ <Subrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ <CharString index="0">
+ 3 2 3 1 vhcurveto
+ endchar
+ </CharString>
+ <CharString index="1">
+ 177 113 -106 callgsubr
+ return
+ </CharString>
+ <CharString index="2">
+ 487 531 rmoveto
+ -5 -82 -21 -36 -38 10 -36 10 -16 18 5 25 5 25 1 18 -2 8 -2 8 -5 5 -8 1 -8 1 -4 -7 -3 -13 -14 -69 -26 -36 -40 -4 -29 -3 -23 4 -19 11 rrcurveto
+ -8 5 -24 31 -39 57 -17 26 -12 0 -6 -23 -25 -101 rcurveline
+ -3 -13 5 -16 14 -20 79 -117 45 -148 11 -178 1 -8 2 -6 4 -3 4 -3 4 0 6 2 6 2 3 4 2 7 20 79 -11 123 -42 169 39 -3 35 16 32 35 rrcurveto
+ 14 -11 17 -9 20 -6 63 -20 40 23 18 65 13 49 7 46 2 41 rrcurveto
+ 20 1 -6 9 -10 hhcurveto
+ -10 -5 -6 -12 -1 hvcurveto
+ endchar
+ </CharString>
+ <CharString index="3">
+ rmoveto
+ -45 13 -33 20 -23 28 -3 4 0 3 3 3 27 30 33 15 38 -1 rrcurveto
+ 28 20 -8 -13 13 hvcurveto
+ 5 -5 3 0 4 2 3 1 0 3 -1 6 -6 13 -11 16 -15 16 rrcurveto
+ 14 -13 -14 7 -14 hhcurveto
+ -30 -33 -21 -43 -37 hvcurveto
+ -15 -19 -12 -20 -7 -23 -3 -7 1 -9 3 -8 11 -25 31 -23 53 -19 -51 -45 -38 -53 -24 -60 -5 -12 -1 -6 5 -1 6 -3 7 4 7 10 26 40 32 36 34 30 rrcurveto
+ 37 33 37 24 37 16 10 4 7 8 4 13 16 50 rcurveline
+ 4 10 -5 3 -12 -4 -18 -7 -23 -14 -28 -22 -7 -5 -9 -2 -9 3 rrcurveto
+ endchar
+ </CharString>
+ <CharString index="4">
+ 311 -77 rmoveto
+ 21 89 26 81 29 73 29 73 39 74 45 76 rrcurveto
+ 6 11 2 9 8 vvcurveto
+ -6 97 rlineto
+ 9 -1 -2 4 -5 hhcurveto
+ -5 -5 -6 -10 -5 hvcurveto
+ -79 -149 -53 -135 -27 -121 -4 -19 -7 2 -7 21 -55 159 -61 140 -70 124 -11 20 -8 -8 -5 -35 -13 -81 rcurveline
+ -2 -10 1 -8 3 -6 57 -95 46 -93 38 -90 38 -90 20 -68 2 -45 rrcurveto
+ -7 3 -4 4 -3 vhcurveto
+ 4 -3 4 0 5 2 5 2 2 5 2 7 rrcurveto
+ endchar
+ </CharString>
+ <CharString index="5">
+ rmoveto
+ 19 69 -12 87 -41 106 -10 24 -4 14 2 3 rrcurveto
+ 10 10 11 5 12 hhcurveto
+ 31 25 -26 -51 20 hvcurveto
+ 2 -3 1 -2 3 -1 rrcurveto
+ 2 2 1 3 2 hvcurveto
+ 12 34 21 34 28 35 2 2 2 4 1 4 14 51 rcurveline
+ 3 0 2 -3 1 vhcurveto
+ -3 1 -2 -1 -4 -3 -24 -22 -21 -32 -16 -43 -22 49 -28 24 -36 -2 -32 -1 -21 -19 -12 -38 -12 -39 2 -39 13 -38 29 -80 17 -68 4 -55 rrcurveto
+ -6 3 -2 4 5 -107 callsubr
+ </CharString>
+ <CharString index="6">
+ 158 296 -95 callgsubr
+ </CharString>
+ <CharString index="7">
+ 136 657 rmoveto
+ -13 -53 -16 -49 -17 -44 -18 -43 -22 -44 -27 -46 rrcurveto
+ -4 -6 -1 -6 -5 vvcurveto
+ 3 -58 rlineto
+ -6 2 -2 3 3 3 3 6 3 vhcurveto
+ 48 90 31 81 17 72 2 12 4 -1 4 -13 33 -95 37 -84 42 -75 7 -12 4 5 3 21 8 49 rcurveline
+ 1 6 0 4 -2 4 -34 57 -28 56 -23 54 -22 54 -12 41 -2 27 rrcurveto
+ 4 -1 3 -3 2 vhcurveto
+ -2 1 -3 0 -3 -1 -3 -1 -1 -4 -1 -4 rrcurveto
+ endchar
+ </CharString>
+ <CharString index="8">
+ 220 500 rmoveto
+ -67 -86 -32 -66 2 -47 4 -86 75 -35 146 14 5 -82 22 -87 39 -91 15 -35 9 -2 6 33 18 105 rcurveline
+ 3 15 -3 16 -10 18 -32 59 -18 73 -3 86 -3 87 -16 66 -32 45 -39 56 -43 0 -46 -56 rrcurveto
+ 102 -152 rmoveto
+ 6 -19 -1 -13 -6 -6 rrcurveto
+ -2 -3 -3 -2 -5 hhcurveto
+ -50 -3 -36 6 -22 14 -16 10 -5 16 7 21 12 39 24 15 36 -10 30 -9 21 -22 11 -35 rrcurveto
+ endchar
+ </CharString>
+ <CharString index="9">
+ 53 654 -94 callgsubr
+ </CharString>
+ <CharString index="10">
+ 38 655 -88 callgsubr
+ </CharString>
+ <CharString index="11">
+ hhcurveto
+ 54 3 49 -4 45 -12 5 -1 4 0 2 1 54 31 rcurveline
+ 10 6 0 4 -10 3 -61 14 -61 3 -60 -9 57 83 42 104 25 126 1 7 0 5 -2 2 -2 2 -3 -1 -4 -4 -40 -41 rcurveline
+ -4 -3 -3 -6 -1 -7 -25 -113 -35 -98 -45 -84 rrcurveto
+ endchar
+ </CharString>
+ <CharString index="12">
+ 119 655 -85 callgsubr
+ </CharString>
+ <CharString index="13">
+ 4 -4 5 0 6 2 6 2 3 5 1 7 20 return
+ </CharString>
+ <CharString index="14">
+ -3 -13 4 -15 12 -19 return
+ </CharString>
+ </Subrs>
+ </Private>
+ <CharStrings>
+ <CharString name=".notdef">
+ 111 endchar
+ </CharString>
+ <CharString name="i">
+ 10 -106 callsubr
+ -94 466 -80 callgsubr
+ </CharString>
+ <CharString name="i.TRK">
+ 10 -106 callsubr
+ -94 466 -80 callgsubr
+ </CharString>
+ <CharString name="uni06F0">
+ 332 -84 callgsubr
+ </CharString>
+ <CharString name="uni06F0.numr">
+ 39 -82 callgsubr
+ </CharString>
+ <CharString name="uni06F1">
+ 332 -87 callgsubr
+ </CharString>
+ <CharString name="uni06F1.numr">
+ 39 -95 callsubr
+ </CharString>
+ <CharString name="uni06F2">
+ 332 -97 callgsubr
+ </CharString>
+ <CharString name="uni06F2.numr">
+ 39 -98 callsubr
+ </CharString>
+ <CharString name="uni06F3">
+ 332 -105 callsubr
+ </CharString>
+ <CharString name="uni06F3.numr">
+ 39 263 662 -107 callgsubr
+ </CharString>
+ <CharString name="uni06F4">
+ 332 175 515 rmoveto
+ -12 19 -10 8 -7 -1 -4 -2 -4 -5 -2 -10 -25 -105 rcurveline
+ -93 callsubr
+ 83 -128 46 -149 7 -168 rrcurveto
+ -7 3 -5 4 -4 vhcurveto
+ -94 callsubr
+ 98 -4 110 -26 122 26 -13 33 -5 38 3 63 5 49 28 34 54 9 14 1 10 -7 7 -6 5 -9 -3 -13 -11 rrcurveto
+ -21 -18 -39 -7 -56 3 -38 2 -39 18 -40 34 20 66 50 34 83 1 rrcurveto
+ 26 35 -15 -31 42 hvcurveto
+ 10 -7 6 0 5 7 3 5 -2 9 -7 14 -35 66 -40 33 -44 -3 -76 -5 -57 -50 -40 -93 -4 -11 -5 0 -5 11 -11 28 -19 35 -27 42 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="uni06F4.numr">
+ 39 76 651 rmoveto
+ -12 19 -8 1 -3 -15 -15 -63 rcurveline
+ -2 -7 2 -9 7 -12 50 -77 28 -89 4 -101 rrcurveto
+ -4 2 -3 2 -2 vhcurveto
+ 3 -3 3 0 3 1 rrcurveto
+ 4 2 2 3 4 vvcurveto
+ 12 59 -2 66 -16 73 16 -8 20 -3 22 2 38 3 30 17 20 32 5 8 1 6 -4 5 -4 3 -5 -2 -8 -7 -13 -11 -23 -4 -34 2 -22 1 -24 11 -24 20 rrcurveto
+ 12 40 30 20 50 1 rrcurveto
+ 16 21 -9 -19 25 hvcurveto
+ 6 -4 3 0 3 4 2 3 -1 6 -4 8 -21 40 -24 20 -27 -2 -45 -3 -34 -30 -24 -56 -3 -7 -3 0 -3 7 -6 17 -12 21 -16 25 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="uni06F4.urd">
+ 332 229 -83 rmoveto
+ 31 115 -20 145 -69 177 -16 40 -6 23 3 4 rrcurveto
+ 18 16 19 8 19 hhcurveto
+ 52 -1 42 -43 34 -84 2 -6 3 -3 5 -1 3 -1 3 2 3 5 21 57 34 57 47 57 3 4 3 6 2 7 23 85 rcurveline
+ 1 6 -1 3 -5 2 -4 1 -4 -2 -6 -5 -41 -36 -34 -53 -27 -73 -36 82 -48 40 -59 -3 -53 -2 -36 -32 -19 -62 -20 -65 2 -65 22 -64 49 -133 28 -114 6 -92 rrcurveto
+ -9 1 4 -4 8 hhcurveto
+ 8 5 3 6 2 hvcurveto
+ endchar
+ </CharString>
+ <CharString name="uni06F4.urd.numr">
+ 39 108 303 -102 callsubr
+ </CharString>
+ <CharString name="uni06F5">
+ 332 235 526 rmoveto
+ -12 12 -8 -2 -2 -16 -17 -121 rcurveline
+ -2 -15 3 -8 7 -4 8 -4 8 -5 7 -5 -75 -103 -42 -88 -8 -76 -11 -105 29 -55 68 -6 39 -3 34 17 31 36 16 -26 28 -10 40 7 54 9 33 60 13 110 rrcurveto
+ 5 39 -17 59 -39 78 -29 58 -63 75 -98 92 rrcurveto
+ 16 -184 rmoveto
+ 76 -52 58 -68 42 -83 6 -12 2 -10 -4 -10 -10 -27 -17 -15 -23 -3 -17 -2 -14 3 -12 8 -1 7 1 6 3 5 -1 6 -3 4 -4 2 -5 2 -5 -3 -6 -6 rrcurveto
+ -64 -62 -52 -8 -40 45 -20 23 2 44 25 64 15 38 27 48 41 56 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="uni06F5.numr">
+ 39 112 656 -99 callgsubr
+ </CharString>
+ <CharString name="uni06F6">
+ 332 331 285 rmoveto
+ -74 21 -56 34 -37 47 -5 6 0 5 5 5 45 50 54 25 63 -1 47 -1 34 -12 22 -23 7 -7 6 -1 6 3 5 3 1 5 -3 9 -9 22 -18 26 -26 28 rrcurveto
+ 23 -22 -22 11 -24 hhcurveto
+ -50 -55 -35 -72 -61 hvcurveto
+ -26 -31 -20 -33 -12 -38 -4 -13 1 -14 5 -13 18 -43 52 -37 88 -32 -85 -75 -62 -88 -41 -100 -8 -20 -1 -10 8 -3 10 -4 12 7 11 16 44 66 52 60 58 51 rrcurveto
+ 61 54 61 41 62 26 17 7 12 14 7 21 26 83 rcurveline
+ 6 17 -8 5 -20 -7 -30 -11 -38 -24 -47 -36 -12 -9 -14 -3 -16 5 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="uni06F6.numr">
+ 39 170 512 -104 callsubr
+ </CharString>
+ <CharString name="uni06F6.urd">
+ 332 -90 callgsubr
+ </CharString>
+ <CharString name="uni06F6.urd.numr">
+ 39 -97 callsubr
+ </CharString>
+ <CharString name="uni06F7">
+ 332 -103 callsubr
+ </CharString>
+ <CharString name="uni06F7.numr">
+ 39 -101 callsubr
+ </CharString>
+ <CharString name="uni06F7.urd">
+ 332 104 -50 rmoveto
+ -3 -6 -1 -5 2 -3 2 -3 4 -2 8 1 90 5 83 -7 75 -20 8 -2 6 0 4 2 89 51 rcurveline
+ 18 10 0 8 -18 4 -101 23 -101 5 -100 -15 95 139 69 174 42 210 2 11 0 8 -3 3 -4 4 -5 -2 -6 -6 -68 -68 rcurveline
+ -6 -6 -5 -10 -2 -12 -42 -188 -58 -163 -74 -140 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="uni06F7.urd.numr">
+ 39 33 312 rmoveto
+ -8 -4 3 -3 9 -96 callsubr
+ </CharString>
+ <CharString name="uni06F8">
+ 332 -98 callgsubr
+ </CharString>
+ <CharString name="uni06F8.numr">
+ 39 -100 callsubr
+ </CharString>
+ <CharString name="uni06F9">
+ 332 -99 callsubr
+ </CharString>
+ <CharString name="uni06F9.numr">
+ 39 -93 callgsubr
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ <CharString index="0">
+ rmoveto
+ -3 -50 -12 -21 -23 6 -22 6 -9 11 3 15 3 15 0 10 -1 5 -1 5 -3 3 -5 1 rrcurveto
+ -5 -2 -4 -8 -2 hvcurveto
+ -8 -41 -16 -22 -24 -2 -17 -2 -14 2 -12 7 -4 3 -15 19 -23 34 -10 15 -8 0 -3 -13 -15 -61 rcurveline
+ -2 -8 3 -9 8 -12 48 -71 27 -88 6 -107 1 -5 1 -4 3 -1 2 -2 2 0 4 1 4 1 1 3 2 4 12 47 -7 74 -25 101 23 -1 21 9 19 21 rrcurveto
+ 9 -6 10 -6 12 -3 38 -12 24 13 11 39 7 30 5 27 1 25 rrcurveto
+ 12 -3 5 -6 -6 -3 -3 -7 -1 vhcurveto
+ endchar
+ </CharString>
+ <CharString index="1">
+ rmoveto
+ 237 vlineto
+ -92 callgsubr
+ return
+ </CharString>
+ <CharString index="2">
+ vlineto
+ -29 0 -27 -5 -16 -102 callgsubr
+ -46 -77 callgsubr
+ vvcurveto
+ return
+ </CharString>
+ <CharString index="3">
+ rmoveto
+ -100 callgsubr
+ return
+ </CharString>
+ <CharString index="4">
+ -81 callgsubr
+ 49 0 -17 7 hvcurveto
+ 5 -12 0 return
+ </CharString>
+ <CharString index="5">
+ vhcurveto
+ -11 -3 -47 -74 callgsubr
+ 26 -79 callgsubr
+ 26 -78 callgsubr
+ return
+ </CharString>
+ <CharString index="6">
+ 5 5 -1 18 -4 5 rrcurveto
+ -12 return
+ </CharString>
+ <CharString index="7">
+ -27 22 -22 27 27 22 22 27 27 -22 22 -27 -27 -22 -22 -27 vhcurveto
+ return
+ </CharString>
+ <CharString index="8">
+ rmoveto
+ -7 7 -5 -1 -1 -10 -10 -73 rcurveline
+ -2 -9 2 -4 4 -3 5 -2 5 -3 4 -3 -45 -62 -25 -53 -5 -45 -6 -63 17 -33 41 -4 23 -2 21 10 18 22 10 -16 17 -6 24 5 32 5 20 36 8 66 rrcurveto
+ 3 23 -11 36 -23 47 -17 34 -38 45 -59 56 rrcurveto
+ 10 -111 rmoveto
+ 45 -31 35 -41 25 -50 4 -7 1 -6 -2 -6 -6 -16 -11 -9 -13 -2 -11 -1 -8 2 -7 5 -1 4 1 3 2 3 -1 4 -2 2 -2 2 -3 1 -3 -2 -4 -4 rrcurveto
+ -38 -37 -31 -5 -24 27 -12 14 1 27 15 38 9 23 16 29 25 33 rrcurveto
+ endchar
+ </CharString>
+ <CharString index="9">
+ 275 527 rmoveto
+ -21 -89 -27 -81 -29 -73 -29 -73 -38 -73 -45 -76 rrcurveto
+ -6 -11 -2 -10 -8 vvcurveto
+ 5 -97 rlineto
+ -9 1 3 -3 5 hhcurveto
+ 5 5 5 10 5 hvcurveto
+ 79 149 53 135 27 121 4 19 7 -2 7 -21 55 -159 61 -140 70 -124 11 -20 8 8 5 35 13 81 rcurveline
+ 2 10 -1 8 -3 6 -57 95 -46 93 -38 90 -38 90 -20 68 -2 45 rrcurveto
+ 7 -3 5 -4 3 vhcurveto
+ -4 3 -4 0 -5 -2 -5 -2 -2 -6 -2 -7 rrcurveto
+ endchar
+ </CharString>
+ <CharString index="10">
+ 137 -96 callgsubr
+ </CharString>
+ <CharString index="11">
+ 521 rmoveto
+ -25 -102 -3 -13 4 -15 12 -19 rlinecurve
+ 79 -124 46 -149 11 -172 1 -7 2 -5 4 -4 4 -4 5 0 6 2 6 2 3 5 1 7 20 99 -12 128 -42 158 79 -13 57 18 33 49 21 30 13 33 6 37 rrcurveto
+ 6 37 3 24 -3 7 rrcurveto
+ 7 -3 -6 4 -9 hhcurveto
+ -9 -6 -6 -12 -2 hvcurveto
+ -69 -9 -43 -36 -79 hhcurveto
+ -55 -44 32 62 -33 hvcurveto
+ -11 21 -9 10 -7 -2 -5 -1 -4 -6 -3 -13 rrcurveto
+ endchar
+ </CharString>
+ <CharString index="12">
+ rmoveto
+ 12 53 16 49 17 44 18 43 23 45 27 45 rrcurveto
+ 4 7 1 5 5 vvcurveto
+ -4 58 rlineto
+ 6 -2 2 -3 -3 -3 -3 -6 -3 vhcurveto
+ -47 -90 -32 -81 -16 -72 -2 -12 -5 1 -4 13 -33 95 -36 84 -42 75 -7 12 -5 -5 -3 -21 -8 -49 rcurveline
+ -1 -6 1 -4 2 -4 34 -57 27 -56 23 -54 23 -54 12 -41 1 -27 rrcurveto
+ -4 2 -2 2 -2 vhcurveto
+ 3 -2 2 0 3 1 3 2 1 3 2 4 rrcurveto
+ endchar
+ </CharString>
+ <CharString index="13">
+ rmoveto
+ -15 -62 -2 -7 3 -9 7 -12 rlinecurve
+ 47 -74 28 -90 7 -103 rrcurveto
+ -4 1 -3 3 -2 vhcurveto
+ 2 -3 3 0 4 1 3 2 2 3 1 4 12 59 -7 77 -26 95 48 -8 34 11 20 29 12 18 8 20 4 22 3 22 2 15 -2 4 rrcurveto
+ 4 -1 -4 3 -5 hhcurveto
+ -6 -3 -4 -7 -2 hvcurveto
+ -42 -5 -26 -21 -47 hhcurveto
+ -33 -27 19 37 -19 hvcurveto
+ -7 13 -5 6 -5 -1 -3 -1 -2 -4 -2 -7 rrcurveto
+ endchar
+ </CharString>
+ <CharString index="14">
+ 103 641 -91 callgsubr
+ </CharString>
+ <CharString index="15">
+ 10 6 47 1 7 vhcurveto
+ 5 -6 11 -5 vhcurveto
+ -39 -21 -50 -103 callgsubr
+ -26 -13 vvcurveto
+ -182 -105 callgsubr
+ return
+ </CharString>
+ <CharString index="16">
+ rmoveto
+ -40 -52 -19 -39 1 -28 2 -52 45 -21 88 8 3 -49 13 -52 23 -55 9 -21 6 -1 3 20 11 63 rcurveline
+ 2 9 -2 10 -6 10 -19 36 -11 44 -2 51 -1 52 -10 40 -19 27 -24 34 -25 0 -28 -34 rrcurveto
+ 61 -91 rmoveto
+ -16 5 -2 -9 -10 hhcurveto
+ -30 -2 -22 3 -13 9 -9 6 -3 9 4 13 7 23 14 9 22 -6 18 -5 13 -13 6 -21 rrcurveto
+ endchar
+ </CharString>
+ <CharString index="17">
+ 111 -89 callgsubr
+ </CharString>
+ <CharString index="18">
+ 522 rmoveto
+ -15 -79 -3 -13 4 -12 9 -10 rlinecurve
+ 50 -56 78 -14 105 27 rrcurveto
+ 1 1 0 0 hvcurveto
+ 3 -1 1 -4 -7 vvcurveto
+ -5 -150 31 -142 70 -132 15 -29 11 3 6 32 17 95 rcurveline
+ 3 17 -4 18 -9 17 -71 128 -29 128 13 130 2 16 -8 6 -18 -5 -109 -33 -75 12 -38 57 -19 28 -12 0 -5 -27 rrcurveto
+ endchar
+ </CharString>
+ <CharString index="19">
+ rmoveto
+ -9 -47 -2 -8 2 -7 6 -6 rlinecurve
+ 30 -34 46 -8 63 16 rrcurveto
+ 3 1 1 -3 -5 vvcurveto
+ -3 -90 19 -85 42 -80 9 -17 6 2 4 19 10 57 rcurveline
+ 2 10 -3 11 -5 10 -43 77 -17 77 8 78 1 9 -5 4 -11 -3 -65 -20 -45 7 -23 35 -11 16 -7 0 -3 -16 rrcurveto
+ endchar
+ </CharString>
+ <CharString index="20">
+ 246 -86 callgsubr
+ </CharString>
+ <CharString index="21">
+ 524 rmoveto
+ -34 -100 -5 -14 3 -17 11 -20 rlinecurve
+ 71 -126 35 -148 -2 -171 rrcurveto
+ -12 4 -6 9 -2 vhcurveto
+ 9 -2 5 5 4 10 23 69 4 99 -18 129 -13 92 -27 96 -39 100 -17 40 -14 6 -9 -28 rrcurveto
+ endchar
+ </CharString>
+ <CharString index="22">
+ rmoveto
+ -21 -60 -3 -8 2 -10 7 -12 rlinecurve
+ 42 -76 21 -89 -1 -102 rrcurveto
+ -7 2 -4 6 -1 vhcurveto
+ 5 -1 3 3 3 6 13 41 3 59 -11 78 -8 55 -16 58 -23 60 -11 24 -8 3 -5 -17 rrcurveto
+ endchar
+ </CharString>
+ <CharString index="23">
+ 251 -83 callgsubr
+ </CharString>
+ <CharString index="24">
+ 312 rmoveto
+ -38 -106 -5 -15 1 -10 8 -5 rlinecurve
+ 91 -53 17 -10 11 2 6 17 rlinecurve
+ 32 99 5 15 -3 11 -12 8 rlinecurve
+ -83 53 -9 6 -7 2 -5 -3 rlinecurve
+ -4 -1 -3 -4 -2 -6 rrcurveto
+ endchar
+ </CharString>
+ <CharString index="25">
+ 122 527 rmoveto
+ -23 -63 -3 -9 0 -6 5 -3 rlinecurve
+ 55 -32 10 -6 7 1 3 10 rlinecurve
+ 19 60 3 9 -1 6 -8 5 rlinecurve
+ -49 32 -9 6 -6 -1 -3 -9 rlinecurve
+ endchar
+ </CharString>
+ <CharString index="26">
+ -13 -50 -7 -4 -5 2 -19 2 -2 rrcurveto
+ 7 return
+ </CharString>
+ <CharString index="27">
+ -104 callgsubr
+ endchar
+ </CharString>
+ <CharString index="28">
+ 3 38 hhcurveto
+ 38 return
+ </CharString>
+ <CharString index="29">
+ -3 -2 40 hvcurveto
+ -101 callgsubr
+ return
+ </CharString>
+ <CharString index="30">
+ 5 11 -3 hvcurveto
+ -5 16 0 27 29 return
+ </CharString>
+ <CharString index="31">
+ 5 -5 rrcurveto
+ 2 40 return
+ </CharString>
+ <CharString index="32">
+ -5 -12 hhcurveto
+ -4 -5 -1 return
+ </CharString>
+ <CharString index="33">
+ -75 callgsubr
+ -18 -76 callgsubr
+ return
+ </CharString>
+ </GlobalSubrs>
+ </CFF>
+
+ <GDEF>
+ <Version value="0x00010000"/>
+ <GlyphClassDef Format="2">
+ <ClassDef glyph="i" class="1"/>
+ <ClassDef glyph="i.TRK" class="1"/>
+ <ClassDef glyph="uni06F0" class="1"/>
+ <ClassDef glyph="uni06F0.numr" class="1"/>
+ <ClassDef glyph="uni06F1" class="1"/>
+ <ClassDef glyph="uni06F1.numr" class="1"/>
+ <ClassDef glyph="uni06F2" class="1"/>
+ <ClassDef glyph="uni06F2.numr" class="1"/>
+ <ClassDef glyph="uni06F3" class="1"/>
+ <ClassDef glyph="uni06F3.numr" class="1"/>
+ <ClassDef glyph="uni06F4" class="1"/>
+ <ClassDef glyph="uni06F4.numr" class="1"/>
+ <ClassDef glyph="uni06F4.urd" class="1"/>
+ <ClassDef glyph="uni06F4.urd.numr" class="1"/>
+ <ClassDef glyph="uni06F5" class="1"/>
+ <ClassDef glyph="uni06F5.numr" class="1"/>
+ <ClassDef glyph="uni06F6" class="1"/>
+ <ClassDef glyph="uni06F6.numr" class="1"/>
+ <ClassDef glyph="uni06F6.urd" class="1"/>
+ <ClassDef glyph="uni06F6.urd.numr" class="1"/>
+ <ClassDef glyph="uni06F7" class="1"/>
+ <ClassDef glyph="uni06F7.numr" class="1"/>
+ <ClassDef glyph="uni06F7.urd" class="1"/>
+ <ClassDef glyph="uni06F7.urd.numr" class="1"/>
+ <ClassDef glyph="uni06F8" class="1"/>
+ <ClassDef glyph="uni06F8.numr" class="1"/>
+ <ClassDef glyph="uni06F9" class="1"/>
+ <ClassDef glyph="uni06F9.numr" class="1"/>
+ </GlyphClassDef>
+ </GDEF>
+
+ <GPOS>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GPOS>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=3 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="4"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="1">
+ <ScriptTag value="arab"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="4"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=3 -->
+ <LangSysRecord index="0">
+ <LangSysTag value="KSH "/>
+ <LangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=2 -->
+ <FeatureIndex index="0" value="0"/>
+ <FeatureIndex index="1" value="4"/>
+ </LangSys>
+ </LangSysRecord>
+ <LangSysRecord index="1">
+ <LangSysTag value="SND "/>
+ <LangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=2 -->
+ <FeatureIndex index="0" value="1"/>
+ <FeatureIndex index="1" value="4"/>
+ </LangSys>
+ </LangSysRecord>
+ <LangSysRecord index="2">
+ <LangSysTag value="URD "/>
+ <LangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=2 -->
+ <FeatureIndex index="0" value="3"/>
+ <FeatureIndex index="1" value="4"/>
+ </LangSys>
+ </LangSysRecord>
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="2">
+ <ScriptTag value="latn"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="4"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=1 -->
+ <LangSysRecord index="0">
+ <LangSysTag value="TRK "/>
+ <LangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=2 -->
+ <FeatureIndex index="0" value="2"/>
+ <FeatureIndex index="1" value="4"/>
+ </LangSys>
+ </LangSysRecord>
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=5 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="locl"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="1"/>
+ </Feature>
+ </FeatureRecord>
+ <FeatureRecord index="1">
+ <FeatureTag value="locl"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="2"/>
+ </Feature>
+ </FeatureRecord>
+ <FeatureRecord index="2">
+ <FeatureTag value="locl"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="4"/>
+ </Feature>
+ </FeatureRecord>
+ <FeatureRecord index="3">
+ <FeatureTag value="locl"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ <FeatureRecord index="4">
+ <FeatureTag value="numr"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="3"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=5 -->
+ <Lookup index="0">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="2">
+ <Substitution in="uni06F4" out="uni06F4.urd"/>
+ <Substitution in="uni06F6" out="uni06F6.urd"/>
+ <Substitution in="uni06F7" out="uni06F7.urd"/>
+ </SingleSubst>
+ </Lookup>
+ <Lookup index="1">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="2">
+ <Substitution in="uni06F4" out="uni06F4.urd"/>
+ <Substitution in="uni06F6" out="uni06F6.urd"/>
+ <Substitution in="uni06F7" out="uni06F7.urd"/>
+ </SingleSubst>
+ </Lookup>
+ <Lookup index="2">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="1">
+ <Substitution in="uni06F6" out="uni06F6.urd"/>
+ <Substitution in="uni06F7" out="uni06F7.urd"/>
+ </SingleSubst>
+ </Lookup>
+ <Lookup index="3">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="1">
+ <Substitution in="uni06F0" out="uni06F0.numr"/>
+ <Substitution in="uni06F1" out="uni06F1.numr"/>
+ <Substitution in="uni06F2" out="uni06F2.numr"/>
+ <Substitution in="uni06F3" out="uni06F3.numr"/>
+ <Substitution in="uni06F4" out="uni06F4.numr"/>
+ <Substitution in="uni06F4.urd" out="uni06F4.urd.numr"/>
+ <Substitution in="uni06F5" out="uni06F5.numr"/>
+ <Substitution in="uni06F6" out="uni06F6.numr"/>
+ <Substitution in="uni06F6.urd" out="uni06F6.urd.numr"/>
+ <Substitution in="uni06F7" out="uni06F7.numr"/>
+ <Substitution in="uni06F7.urd" out="uni06F7.urd.numr"/>
+ <Substitution in="uni06F8" out="uni06F8.numr"/>
+ <Substitution in="uni06F9" out="uni06F9.numr"/>
+ </SingleSubst>
+ </Lookup>
+ <Lookup index="4">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="1">
+ <Substitution in="i" out="i.TRK"/>
+ </SingleSubst>
+ </Lookup>
+ </LookupList>
+ </GSUB>
+
+ <hmtx>
+ <mtx name=".notdef" width="364" lsb="33"/>
+ <mtx name="i" width="263" lsb="32"/>
+ <mtx name="i.TRK" width="263" lsb="32"/>
+ <mtx name="uni06F0" width="585" lsb="210"/>
+ <mtx name="uni06F0.numr" width="292" lsb="97"/>
+ <mtx name="uni06F1" width="585" lsb="210"/>
+ <mtx name="uni06F1.numr" width="292" lsb="97"/>
+ <mtx name="uni06F2" width="585" lsb="111"/>
+ <mtx name="uni06F2.numr" width="292" lsb="37"/>
+ <mtx name="uni06F3" width="585" lsb="67"/>
+ <mtx name="uni06F3.numr" width="292" lsb="11"/>
+ <mtx name="uni06F4" width="585" lsb="110"/>
+ <mtx name="uni06F4.numr" width="292" lsb="37"/>
+ <mtx name="uni06F4.urd" width="585" lsb="100"/>
+ <mtx name="uni06F4.urd.numr" width="292" lsb="31"/>
+ <mtx name="uni06F5" width="585" lsb="100"/>
+ <mtx name="uni06F5.numr" width="292" lsb="31"/>
+ <mtx name="uni06F6" width="585" lsb="71"/>
+ <mtx name="uni06F6.numr" width="292" lsb="14"/>
+ <mtx name="uni06F6.urd" width="585" lsb="95"/>
+ <mtx name="uni06F6.urd.numr" width="292" lsb="28"/>
+ <mtx name="uni06F7" width="585" lsb="78"/>
+ <mtx name="uni06F7.numr" width="292" lsb="18"/>
+ <mtx name="uni06F7.urd" width="585" lsb="101"/>
+ <mtx name="uni06F7.urd.numr" width="292" lsb="31"/>
+ <mtx name="uni06F8" width="585" lsb="78"/>
+ <mtx name="uni06F8.numr" width="292" lsb="18"/>
+ <mtx name="uni06F9" width="585" lsb="123"/>
+ <mtx name="uni06F9.numr" width="292" lsb="45"/>
+ </hmtx>
+
+</ttFont>
diff --git a/Tests/subset/subset_test.py b/Tests/subset/subset_test.py
index 2cce9baf..0d2f9fe2 100644
--- a/Tests/subset/subset_test.py
+++ b/Tests/subset/subset_test.py
@@ -78,6 +78,16 @@ class SubsetTest(unittest.TestCase):
# Tests
# -----
+ def test_layout_scripts(self):
+ _, fontpath = self.compile_font(self.getpath("layout_scripts.ttx"), ".otf")
+ subsetpath = self.temp_path(".otf")
+ subset.main([fontpath, "--glyphs=*", "--layout-features=*",
+ "--layout-scripts=latn,arab.URD,arab.dflt",
+ "--output-file=%s" % subsetpath])
+ subsetfont = TTFont(subsetpath)
+ self.expect_ttx(subsetfont, self.getpath("expect_layout_scripts.ttx"),
+ ["GPOS", "GSUB"])
+
def test_no_notdef_outline_otf(self):
_, fontpath = self.compile_font(self.getpath("TestOTF-Regular.ttx"), ".otf")
subsetpath = self.temp_path(".otf")
diff --git a/Tests/ttLib/tables/C_O_L_R_test.py b/Tests/ttLib/tables/C_O_L_R_test.py
index 0a1d9df9..76e9e61a 100644
--- a/Tests/ttLib/tables/C_O_L_R_test.py
+++ b/Tests/ttLib/tables/C_O_L_R_test.py
@@ -2,26 +2,32 @@ from fontTools import ttLib
from fontTools.misc.testTools import getXML, parseXML
from fontTools.ttLib.tables.C_O_L_R_ import table_C_O_L_R_
+import binascii
import pytest
-COLR_V0_DATA = (
- b"\x00\x00" # Version (0)
- b"\x00\x01" # BaseGlyphRecordCount (1)
- b"\x00\x00\x00\x0e" # Offset to BaseGlyphRecordArray from beginning of table (14)
- b"\x00\x00\x00\x14" # Offset to LayerRecordArray from beginning of table (20)
- b"\x00\x03" # LayerRecordCount (3)
- b"\x00\x06" # BaseGlyphRecord[0].BaseGlyph (6)
- b"\x00\x00" # BaseGlyphRecord[0].FirstLayerIndex (0)
- b"\x00\x03" # BaseGlyphRecord[0].NumLayers (3)
- b"\x00\x07" # LayerRecord[0].LayerGlyph (7)
- b"\x00\x00" # LayerRecord[0].PaletteIndex (0)
- b"\x00\x08" # LayerRecord[1].LayerGlyph (8)
- b"\x00\x01" # LayerRecord[1].PaletteIndex (1)
- b"\x00\t" # LayerRecord[2].LayerGlyph (9)
- b"\x00\x02" # LayerRecord[3].PaletteIndex (2)
+COLR_V0_SAMPLE = (
+ (b"\x00\x00", "Version (0)"),
+ (b"\x00\x01", "BaseGlyphRecordCount (1)"),
+ (
+ b"\x00\x00\x00\x0e",
+ "Offset to BaseGlyphRecordArray from beginning of table (14)",
+ ),
+ (b"\x00\x00\x00\x14", "Offset to LayerRecordArray from beginning of table (20)"),
+ (b"\x00\x03", "LayerRecordCount (3)"),
+ (b"\x00\x06", "BaseGlyphRecord[0].BaseGlyph (6)"),
+ (b"\x00\x00", "BaseGlyphRecord[0].FirstLayerIndex (0)"),
+ (b"\x00\x03", "BaseGlyphRecord[0].NumLayers (3)"),
+ (b"\x00\x07", "LayerRecord[0].LayerGlyph (7)"),
+ (b"\x00\x00", "LayerRecord[0].PaletteIndex (0)"),
+ (b"\x00\x08", "LayerRecord[1].LayerGlyph (8)"),
+ (b"\x00\x01", "LayerRecord[1].PaletteIndex (1)"),
+ (b"\x00\t", "LayerRecord[2].LayerGlyph (9)"),
+ (b"\x00\x02", "LayerRecord[3].PaletteIndex (2)"),
)
+COLR_V0_DATA = b"".join(t[0] for t in COLR_V0_SAMPLE)
+
COLR_V0_XML = [
'<version value="0"/>',
@@ -37,6 +43,21 @@ def dump(table, ttFont=None):
print("\n".join(getXML(table.toXML, ttFont)))
+def diff_binary_fragments(font_bytes, expected_fragments):
+ pos = 0
+ prev_desc = ""
+ for expected_bytes, description in expected_fragments:
+ actual_bytes = font_bytes[pos : pos + len(expected_bytes)]
+ assert (
+ actual_bytes == expected_bytes
+ ), f'{description} (previous "{prev_desc}", bytes: {str(font_bytes[pos:pos+16])}'
+ pos += len(expected_bytes)
+ prev_desc = description
+ assert pos == len(
+ font_bytes
+ ), f"Leftover font bytes, used {pos} of {len(font_bytes)}"
+
+
@pytest.fixture
def font():
font = ttLib.TTFont()
@@ -48,7 +69,7 @@ class COLR_V0_Test(object):
def test_decompile_and_compile(self, font):
colr = table_C_O_L_R_()
colr.decompile(COLR_V0_DATA, font)
- assert colr.compile(font) == COLR_V0_DATA
+ diff_binary_fragments(colr.compile(font), COLR_V0_SAMPLE)
def test_decompile_and_dump_xml(self, font):
colr = table_C_O_L_R_()
@@ -62,145 +83,177 @@ class COLR_V0_Test(object):
for name, attrs, content in parseXML(COLR_V0_XML):
colr.fromXML(name, attrs, content, font)
- assert colr.compile(font) == COLR_V0_DATA
+ diff_binary_fragments(colr.compile(font), COLR_V0_SAMPLE)
+ def test_round_trip_xml(self, font):
+ colr = table_C_O_L_R_()
+ for name, attrs, content in parseXML(COLR_V0_XML):
+ colr.fromXML(name, attrs, content, font)
+ compiled = colr.compile(font)
-COLR_V1_DATA = (
- b"\x00\x01" # Version (1)
- b"\x00\x01" # BaseGlyphRecordCount (1)
- b"\x00\x00\x00\x1a" # Offset to BaseGlyphRecordArray from beginning of table (26)
- b"\x00\x00\x00 " # Offset to LayerRecordArray from beginning of table (32)
- b"\x00\x03" # LayerRecordCount (3)
- b"\x00\x00\x00," # Offset to BaseGlyphV1List from beginning of table (44)
- b"\x00\x00\x00\x81" # Offset to LayerV1List from beginning of table (129)
- b"\x00\x00\x00\x00" # Offset to VarStore (NULL)
- b"\x00\x06" # BaseGlyphRecord[0].BaseGlyph (6)
- b"\x00\x00" # BaseGlyphRecord[0].FirstLayerIndex (0)
- b"\x00\x03" # BaseGlyphRecord[0].NumLayers (3)
- b"\x00\x07" # LayerRecord[0].LayerGlyph (7)
- b"\x00\x00" # LayerRecord[0].PaletteIndex (0)
- b"\x00\x08" # LayerRecord[1].LayerGlyph (8)
- b"\x00\x01" # LayerRecord[1].PaletteIndex (1)
- b"\x00\t" # LayerRecord[2].LayerGlyph (9)
- b"\x00\x02" # LayerRecord[2].PaletteIndex (2)
- b"\x00\x00\x00\x02" # BaseGlyphV1List.BaseGlyphCount (2)
- b"\x00\n" # BaseGlyphV1List.BaseGlyphV1Record[0].BaseGlyph (10)
- b"\x00\x00\x00\x10" # Offset to Paint table from beginning of BaseGlyphV1List (16)
- b"\x00\x0e" # BaseGlyphV1List.BaseGlyphV1Record[1].BaseGlyph (14)
- b"\x00\x00\x00\x16" # Offset to Paint table from beginning of BaseGlyphV1List (22)
- b"\x01" # BaseGlyphV1Record[0].Paint.Format (1)
- b"\x03" # BaseGlyphV1Record[0].Paint.NumLayers (3)
- b"\x00\x00\x00\x00" # BaseGlyphV1Record[0].Paint.FirstLayerIndex (0)
- b"\x08" # BaseGlyphV1Record[1].Paint.Format (8)
- b"\x00\x00<" # Offset to SourcePaint from beginning of PaintComposite (60)
- b"\x03" # BaseGlyphV1Record[1].Paint.CompositeMode [SRC_OVER] (3)
- b"\x00\x00\x08" # Offset to BackdropPaint from beginning of PaintComposite (8)
- b"\x07" # BaseGlyphV1Record[1].Paint.BackdropPaint.Format (7)
- b"\x00\x004" # Offset to Paint from beginning of PaintTransform (52)
- b"\x00\x01\x00\x00" # Affine2x3.xx.value (1.0)
- b"\x00\x00\x00\x00"
- b"\x00\x00\x00\x00" # Affine2x3.xy.value (0.0)
- b"\x00\x00\x00\x00"
- b"\x00\x00\x00\x00" # Affine2x3.yx.value (0.0)
- b"\x00\x00\x00\x00"
- b"\x00\x01\x00\x00" # Affine2x3.yy.value (1.0)
- b"\x00\x00\x00\x00"
- b"\x01,\x00\x00" # Affine2x3.dx.value (300.0)
- b"\x00\x00\x00\x00"
- b"\x00\x00\x00\x00" # Affine2x3.dy.value (0.0)
- b"\x00\x00\x00\x00"
- b"\x06" # BaseGlyphV1Record[1].Paint.SourcePaint.Format (6)
- b"\x00\n" # BaseGlyphV1Record[1].Paint.SourcePaint.Glyph (10)
- b"\x00\x00\x00\x03" # LayerV1List.LayerCount (3)
- b"\x00\x00\x00\x10" # Offset to Paint table from beginning of LayerV1List (16)
- b"\x00\x00\x00\x1f" # Offset to Paint table from beginning of LayerV1List (31)
- b"\x00\x00\x00z" # Offset to Paint table from beginning of LayerV1List (122)
- b"\x05" # LayerV1List.Paint[0].Format (5)
- b"\x00\x00\x06" # Offset to Paint subtable from beginning of PaintGlyph (6)
- b"\x00\x0b" # LayerV1List.Paint[0].Glyph (11)
- b"\x02" # LayerV1List.Paint[0].Paint.Format (2)
- b"\x00\x02" # Paint.Color.PaletteIndex (2)
- b" \x00" # Paint.Color.Alpha.value (0.5)
- b"\x00\x00\x00\x00" # Paint.Color.Alpha.varIdx (0)
- b"\x05" # LayerV1List.Paint[1].Format (5)
- b"\x00\x00\x06" # Offset to Paint subtable from beginning of PaintGlyph (6)
- b"\x00\x0c" # LayerV1List.Paint[1].Glyph (12)
- b"\x03" # LayerV1List.Paint[1].Paint.Format (3)
- b"\x00\x00(" # Offset to ColorLine from beginning of PaintLinearGradient (40)
- b"\x00\x01" # Paint.x0.value (1)
- b"\x00\x00\x00\x00" # Paint.x0.varIdx (0)
- b"\x00\x02" # Paint.y0.value (2)
- b"\x00\x00\x00\x00" # Paint.y0.varIdx (0)
- b"\xff\xfd" # Paint.x1.value (-3)
- b"\x00\x00\x00\x00" # Paint.x1.varIdx (0)
- b"\xff\xfc" # Paint.y1.value (-4)
- b"\x00\x00\x00\x00" # Paint.y1.varIdx (0)
- b"\x00\x05" # Paint.x2.value (5)
- b"\x00\x00\x00\x00" # Paint.x2.varIdx (0)
- b"\x00\x06" # Paint.y2.value (6)
- b"\x00\x00\x00\x00" # Paint.y2.varIdx (0)
- b"\x01" # ColorLine.Extend (1 or "repeat")
- b"\x00\x03" # ColorLine.StopCount (3)
- b"\x00\x00" # ColorLine.ColorStop[0].StopOffset.value (0.0)
- b"\x00\x00\x00\x00" # ColorLine.ColorStop[0].StopOffset.varIdx (0)
- b"\x00\x03" # ColorLine.ColorStop[0].Color.PaletteIndex (3)
- b"@\x00" # ColorLine.ColorStop[0].Color.Alpha.value (1.0)
- b"\x00\x00\x00\x00" # ColorLine.ColorStop[0].Color.Alpha.varIdx (0)
- b" \x00" # ColorLine.ColorStop[1].StopOffset.value (0.5)
- b"\x00\x00\x00\x00" # ColorLine.ColorStop[1].StopOffset.varIdx (0)
- b"\x00\x04" # ColorLine.ColorStop[1].Color.PaletteIndex (4)
- b"@\x00" # ColorLine.ColorStop[1].Color.Alpha.value (1.0)
- b"\x00\x00\x00\x00" # ColorLine.ColorStop[1].Color.Alpha.varIdx (0)
- b"@\x00" # ColorLine.ColorStop[2].StopOffset.value (1.0)
- b"\x00\x00\x00\x00" # ColorLine.ColorStop[2].StopOffset.varIdx (0)
- b"\x00\x05" # ColorLine.ColorStop[2].Color.PaletteIndex (5)
- b"@\x00" # ColorLine.ColorStop[2].Color.Alpha.value (1.0)
- b"\x00\x00\x00\x00" # ColorLine.ColorStop[2].Color.Alpha.varIdx (0)
- b"\x05" # LayerV1List.Paint[2].Format (5)
- b"\x00\x00\x06" # Offset to Paint subtable from beginning of PaintGlyph (6)
- b"\x00\r" # LayerV1List.Paint[2].Glyph (13)
- b"\x07" # LayerV1List.Paint[2].Paint.Format (5)
- b"\x00\x004" # Offset to Paint subtable from beginning of PaintTransform (52)
- b"\xff\xf3\x00\x00" # Affine2x3.xx.value (-13)
- b"\x00\x00\x00\x00"
- b"\x00\x0e\x00\x00" # Affine2x3.xy.value (14)
- b"\x00\x00\x00\x00"
- b"\x00\x0f\x00\x00" # Affine2x3.yx.value (15)
- b"\x00\x00\x00\x00"
- b"\xff\xef\x00\x00" # Affine2x3.yy.value (-17)
- b"\x00\x00\x00\x00"
- b"\x00\x12\x00\x00" # Affine2x3.yy.value (18)
- b"\x00\x00\x00\x00"
- b"\x00\x13\x00\x00" # Affine2x3.yy.value (19)
- b"\x00\x00\x00\x00"
- b"\x04" # LayerV1List.Paint[2].Paint.Paint.Format (4)
- b"\x00\x00(" # Offset to ColorLine from beginning of PaintRadialGradient (40)
- b"\x00\x07" # Paint.x0.value (7)
- b"\x00\x00\x00\x00"
- b"\x00\x08" # Paint.y0.value (8)
- b"\x00\x00\x00\x00"
- b"\x00\t" # Paint.r0.value (9)
- b"\x00\x00\x00\x00"
- b"\x00\n" # Paint.x1.value (10)
- b"\x00\x00\x00\x00"
- b"\x00\x0b" # Paint.y1.value (11)
- b"\x00\x00\x00\x00"
- b"\x00\x0c" # Paint.r1.value (12)
- b"\x00\x00\x00\x00"
- b"\x00" # ColorLine.Extend (0 or "pad")
- b"\x00\x02" # ColorLine.StopCount (2)
- b"\x00\x00" # ColorLine.ColorStop[0].StopOffset.value (0.0)
- b"\x00\x00\x00\x00"
- b"\x00\x06" # ColorLine.ColorStop[0].Color.PaletteIndex (6)
- b"@\x00" # ColorLine.ColorStop[0].Color.Alpha.value (1.0)
- b"\x00\x00\x00\x00"
- b"@\x00" # ColorLine.ColorStop[1].StopOffset.value (1.0)
- b"\x00\x00\x00\x00"
- b"\x00\x07" # ColorLine.ColorStop[1].Color.PaletteIndex (7)
- b"\x19\x9a" # ColorLine.ColorStop[1].Color.Alpha.value (0.4)
- b"\x00\x00\x00\x00"
+ colr = table_C_O_L_R_()
+ colr.decompile(compiled, font)
+ assert getXML(colr.toXML, font) == COLR_V0_XML
+
+
+COLR_V1_SAMPLE = (
+ (b"\x00\x01", "Version (1)"),
+ (b"\x00\x01", "BaseGlyphRecordCount (1)"),
+ (
+ b"\x00\x00\x00\x1a",
+ "Offset to BaseGlyphRecordArray from beginning of table (26)",
+ ),
+ (b"\x00\x00\x00 ", "Offset to LayerRecordArray from beginning of table (32)"),
+ (b"\x00\x03", "LayerRecordCount (3)"),
+ (b"\x00\x00\x00,", "Offset to BaseGlyphV1List from beginning of table (44)"),
+ (b"\x00\x00\x00\x81", "Offset to LayerV1List from beginning of table (129)"),
+ (b"\x00\x00\x00\x00", "Offset to VarStore (NULL)"),
+ (b"\x00\x06", "BaseGlyphRecord[0].BaseGlyph (6)"),
+ (b"\x00\x00", "BaseGlyphRecord[0].FirstLayerIndex (0)"),
+ (b"\x00\x04", "BaseGlyphRecord[0].NumLayers (4)"),
+ (b"\x00\x07", "LayerRecord[0].LayerGlyph (7)"),
+ (b"\x00\x00", "LayerRecord[0].PaletteIndex (0)"),
+ (b"\x00\x08", "LayerRecord[1].LayerGlyph (8)"),
+ (b"\x00\x01", "LayerRecord[1].PaletteIndex (1)"),
+ (b"\x00\t", "LayerRecord[2].LayerGlyph (9)"),
+ (b"\x00\x02", "LayerRecord[2].PaletteIndex (2)"),
+ (b"\x00\x00\x00\x02", "BaseGlyphV1List.BaseGlyphCount (2)"),
+ (b"\x00\n", "BaseGlyphV1List.BaseGlyphV1Record[0].BaseGlyph (10)"),
+ (
+ b"\x00\x00\x00\x10",
+ "Offset to Paint table from beginning of BaseGlyphV1List (16)",
+ ),
+ (b"\x00\x0e", "BaseGlyphV1List.BaseGlyphV1Record[1].BaseGlyph (14)"),
+ (
+ b"\x00\x00\x00\x16",
+ "Offset to Paint table from beginning of BaseGlyphV1List (22)",
+ ),
+ (b"\x01", "BaseGlyphV1Record[0].Paint.Format (1)"),
+ (b"\x04", "BaseGlyphV1Record[0].Paint.NumLayers (4)"),
+ (b"\x00\x00\x00\x00", "BaseGlyphV1Record[0].Paint.FirstLayerIndex (0)"),
+ (b"\x0A", "BaseGlyphV1Record[1].Paint.Format (10)"),
+ (b"\x00\x00<", "Offset to SourcePaint from beginning of PaintComposite (60)"),
+ (b"\x03", "BaseGlyphV1Record[1].Paint.CompositeMode [SRC_OVER] (3)"),
+ (b"\x00\x00\x08", "Offset to BackdropPaint from beginning of PaintComposite (8)"),
+ (b"\x07", "BaseGlyphV1Record[1].Paint.BackdropPaint.Format (7)"),
+ (b"\x00\x00\x34", "Offset to Paint from beginning of PaintTransform (52)"),
+ (b"\x00\x01\x00\x00\x00\x00\x00\x00", "Affine2x3.xx.value (1.0)"),
+ (b"\x00\x00\x00\x00\x00\x00\x00\x00", "Affine2x3.xy.value (0.0)"),
+ (b"\x00\x00\x00\x00\x00\x00\x00\x00", "Affine2x3.yx.value (0.0)"),
+ (b"\x00\x01\x00\x00\x00\x00\x00\x00", "Affine2x3.yy.value (1.0)"),
+ (b"\x01\x2c\x00\x00\x00\x00\x00\x00", "Affine2x3.dx.value (300.0)"),
+ (b"\x00\x00\x00\x00\x00\x00\x00\x00", "Affine2x3.dy.value (0.0)"),
+ (b"\x06", "BaseGlyphV1Record[1].Paint.SourcePaint.Format (6)"),
+ (b"\x00\n", "BaseGlyphV1Record[1].Paint.SourcePaint.Glyph (10)"),
+ (b"\x00\x00\x00\x04", "LayerV1List.LayerCount (4)"),
+ (
+ b"\x00\x00\x00\x14",
+ "First Offset to Paint table from beginning of LayerV1List (20)",
+ ),
+ (
+ b"\x00\x00\x00\x1a",
+ "Second Offset to Paint table from beginning of LayerV1List (26)",
+ ),
+ (
+ b"\x00\x00\x00u",
+ "Third Offset to Paint table from beginning of LayerV1List (117)",
+ ),
+ (
+ b"\x00\x00\x00\xf6",
+ "Fourth Offset to Paint table from beginning of LayerV1List (246)",
+ ),
+ # PaintGlyph glyph00011
+ (b"\x05", "LayerV1List.Paint[0].Format (5)"),
+ (b"\x00\x01\x28", "Offset24 to Paint subtable from beginning of PaintGlyph (296)"),
+ (b"\x00\x0b", "LayerV1List.Paint[0].Glyph (glyph00011)"),
+ # PaintGlyph glyph00012
+ (b"\x05", "LayerV1List.Paint[1].Format (5)"),
+ (b"\x00\x00\x06", "Offset to Paint subtable from beginning of PaintGlyph (6)"),
+ (b"\x00\x0c", "LayerV1List.Paint[1].Glyph (glyph00012)"),
+ (b"\x03", "LayerV1List.Paint[1].Paint.Format (3)"),
+ (b"\x00\x00(", "Offset to ColorLine from beginning of PaintLinearGradient (40)"),
+ (b"\x00\x01", "Paint.x0.value (1)"),
+ (b"\x00\x00\x00\x00", "Paint.x0.varIdx (0)"),
+ (b"\x00\x02", "Paint.y0.value (2)"),
+ (b"\x00\x00\x00\x00", "Paint.y0.varIdx (0)"),
+ (b"\xff\xfd", "Paint.x1.value (-3)"),
+ (b"\x00\x00\x00\x00", "Paint.x1.varIdx (0)"),
+ (b"\xff\xfc", "Paint.y1.value (-4)"),
+ (b"\x00\x00\x00\x00", "Paint.y1.varIdx (0)"),
+ (b"\x00\x05", "Paint.x2.value (5)"),
+ (b"\x00\x00\x00\x00", "Paint.x2.varIdx (0)"),
+ (b"\x00\x06", "Paint.y2.value (6)"),
+ (b"\x00\x00\x00\x00", "Paint.y2.varIdx (0)"),
+ (b"\x01", "ColorLine.Extend (1; repeat)"),
+ (b"\x00\x03", "ColorLine.StopCount (3)"),
+ (b"\x00\x00", "ColorLine.ColorStop[0].StopOffset.value (0.0)"),
+ (b"\x00\x00\x00\x00", "ColorLine.ColorStop[0].StopOffset.varIdx (0)"),
+ (b"\x00\x03", "ColorLine.ColorStop[0].Color.PaletteIndex (3)"),
+ (b"@\x00", "ColorLine.ColorStop[0].Color.Alpha.value (1.0)"),
+ (b"\x00\x00\x00\x00", "ColorLine.ColorStop[0].Color.Alpha.varIdx (0)"),
+ (b" \x00", "ColorLine.ColorStop[1].StopOffset.value (0.5)"),
+ (b"\x00\x00\x00\x00", "ColorLine.ColorStop[1].StopOffset.varIdx (0)"),
+ (b"\x00\x04", "ColorLine.ColorStop[1].Color.PaletteIndex (4)"),
+ (b"@\x00", "ColorLine.ColorStop[1].Color.Alpha.value (1.0)"),
+ (b"\x00\x00\x00\x00", "ColorLine.ColorStop[1].Color.Alpha.varIdx (0)"),
+ (b"@\x00", "ColorLine.ColorStop[2].StopOffset.value (1.0)"),
+ (b"\x00\x00\x00\x00", "ColorLine.ColorStop[2].StopOffset.varIdx (0)"),
+ (b"\x00\x05", "ColorLine.ColorStop[2].Color.PaletteIndex (5)"),
+ (b"@\x00", "ColorLine.ColorStop[2].Color.Alpha.value (1.0)"),
+ (b"\x00\x00\x00\x00", "ColorLine.ColorStop[2].Color.Alpha.varIdx (0)"),
+ # PaintGlyph glyph00013
+ (b"\x05", "LayerV1List.Paint[2].Format (5)"),
+ (b"\x00\x00\x06", "Offset to Paint subtable from beginning of PaintGlyph (6)"),
+ (b"\x00\r", "LayerV1List.Paint[2].Glyph (13)"),
+ (b"\x07", "LayerV1List.Paint[2].Paint.Format (5)"),
+ (b"\x00\x00\x34", "Offset to Paint subtable from beginning of PaintTransform (52)"),
+ (b"\xff\xf3\x00\x00\x00\x00\x00\x00", "Affine2x3.xx.value (-13)"),
+ (b"\x00\x0e\x00\x00\x00\x00\x00\x00", "Affine2x3.xy.value (14)"),
+ (b"\x00\x0f\x00\x00\x00\x00\x00\x00", "Affine2x3.yx.value (15)"),
+ (b"\xff\xef\x00\x00\x00\x00\x00\x00", "Affine2x3.yy.value (-17)"),
+ (b"\x00\x12\x00\x00\x00\x00\x00\x00", "Affine2x3.yy.value (18)"),
+ (b"\x00\x13\x00\x00\x00\x00\x00\x00", "Affine2x3.yy.value (19)"),
+ (b"\x04", "LayerV1List.Paint[2].Paint.Paint.Format (4)"),
+ (b"\x00\x00(", "Offset to ColorLine from beginning of PaintRadialGradient (40)"),
+ (b"\x00\x07\x00\x00\x00\x00", "Paint.x0.value (7)"),
+ (b"\x00\x08\x00\x00\x00\x00", "Paint.y0.value (8)"),
+ (b"\x00\t\x00\x00\x00\x00", "Paint.r0.value (9)"),
+ (b"\x00\n\x00\x00\x00\x00", "Paint.x1.value (10)"),
+ (b"\x00\x0b\x00\x00\x00\x00", "Paint.y1.value (11)"),
+ (b"\x00\x0c\x00\x00\x00\x00", "Paint.r1.value (12)"),
+ (b"\x00", "ColorLine.Extend (0; pad)"),
+ (b"\x00\x02", "ColorLine.StopCount (2)"),
+ (b"\x00\x00\x00\x00\x00\x00", "ColorLine.ColorStop[0].StopOffset.value (0.0)"),
+ (b"\x00\x06", "ColorLine.ColorStop[0].Color.PaletteIndex (6)"),
+ (b"@\x00\x00\x00\x00\x00", "ColorLine.ColorStop[0].Color.Alpha.value (1.0)"),
+ (b"@\x00\x00\x00\x00\x00", "ColorLine.ColorStop[1].StopOffset.value (1.0)"),
+ (b"\x00\x07", "ColorLine.ColorStop[1].Color.PaletteIndex (7)"),
+ (b"\x19\x9a\x00\x00\x00\x00", "ColorLine.ColorStop[1].Color.Alpha.value (0.4)"),
+ # PaintRotate
+ (b"\x08", "LayerV1List.Paint[3].Format (8)"),
+ (b"\x00\x00\x1c", "Offset to Paint subtable from beginning of PaintRotate (28)"),
+ (b"\x00\x2d\x00\x00\x00\x00\x00\x00", "angle.value (45)"),
+ (b"\x00\xff\x00\x00\x00\x00\x00\x00", "centerX.value (255)"),
+ (b"\x01\x00\x00\x00\x00\x00\x00\x00", "centerY.value (256)"),
+ # PaintSkew
+ (b"\x09", "LayerV1List.Paint[3].Format (9)"),
+ (b"\x00\x00\x24", "Offset to Paint subtable from beginning of PaintSkew (36)"),
+ (b"\xff\xf5\x00\x00\x00\x00\x00\x00", "xSkewAngle (-11)"),
+ (b"\x00\x05\x00\x00\x00\x00\x00\x00", "ySkewAngle (5)"),
+ (b"\x00\xfd\x00\x00\x00\x00\x00\x00", "centerX.value (253)"),
+ (b"\x00\xfe\x00\x00\x00\x00\x00\x00", "centerY.value (254)"),
+ # PaintGlyph
+ (b"\x05", "LayerV1List.Paint[2].Format (5)"),
+ (b"\x00\x00\x06", "Offset to Paint subtable from beginning of PaintGlyph (6)"),
+ (b"\x00\x0b", "LayerV1List.Paint[2].Glyph (11)"),
+ # PaintSolid
+ (b"\x02", "LayerV1List.Paint[0].Paint.Format (2)"),
+ (b"\x00\x02", "Paint.Color.PaletteIndex (2)"),
+ (b" \x00", "Paint.Color.Alpha.value (0.5)"),
+ (b"\x00\x00\x00\x00", "Paint.Color.Alpha.varIdx (0)"),
)
+COLR_V1_DATA = b"".join(t[0] for t in COLR_V1_SAMPLE)
COLR_V1_XML = [
'<Version value="1"/>',
@@ -209,7 +262,7 @@ COLR_V1_XML = [
' <BaseGlyphRecord index="0">',
' <BaseGlyph value="glyph00006"/>',
' <FirstLayerIndex value="0"/>',
- ' <NumLayers value="3"/>',
+ ' <NumLayers value="4"/>',
" </BaseGlyphRecord>",
"</BaseGlyphRecordArray>",
"<LayerRecordArray>",
@@ -232,13 +285,13 @@ COLR_V1_XML = [
' <BaseGlyphV1Record index="0">',
' <BaseGlyph value="glyph00010"/>',
' <Paint Format="1"><!-- PaintColrLayers -->',
- ' <NumLayers value="3"/>',
+ ' <NumLayers value="4"/>',
' <FirstLayerIndex value="0"/>',
" </Paint>",
" </BaseGlyphV1Record>",
' <BaseGlyphV1Record index="1">',
' <BaseGlyph value="glyph00014"/>',
- ' <Paint Format="8"><!-- PaintComposite -->',
+ ' <Paint Format="10"><!-- PaintComposite -->',
' <SourcePaint Format="6"><!-- PaintColrGlyph -->',
' <Glyph value="glyph00010"/>',
" </SourcePaint>",
@@ -260,7 +313,7 @@ COLR_V1_XML = [
" </BaseGlyphV1Record>",
"</BaseGlyphV1List>",
"<LayerV1List>",
- " <!-- LayerCount=3 -->",
+ " <!-- LayerCount=4 -->",
' <Paint index="0" Format="5"><!-- PaintGlyph -->',
' <Paint Format="2"><!-- PaintSolid -->',
" <Color>",
@@ -345,6 +398,26 @@ COLR_V1_XML = [
" </Paint>",
' <Glyph value="glyph00013"/>',
" </Paint>",
+ ' <Paint index="3" Format="8"><!-- PaintRotate -->',
+ ' <Paint Format="9"><!-- PaintSkew -->',
+ ' <Paint Format="5"><!-- PaintGlyph -->',
+ ' <Paint Format="2"><!-- PaintSolid -->',
+ " <Color>",
+ ' <PaletteIndex value="2"/>',
+ ' <Alpha value="0.5"/>',
+ " </Color>",
+ " </Paint>",
+ ' <Glyph value="glyph00011"/>',
+ " </Paint>",
+ ' <xSkewAngle value="-11.0"/>',
+ ' <ySkewAngle value="5.0"/>',
+ ' <centerX value="253.0"/>',
+ ' <centerY value="254.0"/>',
+ " </Paint>",
+ ' <angle value="45.0"/>',
+ ' <centerX value="255.0"/>',
+ ' <centerY value="256.0"/>',
+ " </Paint>",
"</LayerV1List>",
]
@@ -353,7 +426,7 @@ class COLR_V1_Test(object):
def test_decompile_and_compile(self, font):
colr = table_C_O_L_R_()
colr.decompile(COLR_V1_DATA, font)
- assert colr.compile(font) == COLR_V1_DATA
+ diff_binary_fragments(colr.compile(font), COLR_V1_SAMPLE)
def test_decompile_and_dump_xml(self, font):
colr = table_C_O_L_R_()
@@ -366,5 +439,14 @@ class COLR_V1_Test(object):
colr = table_C_O_L_R_()
for name, attrs, content in parseXML(COLR_V1_XML):
colr.fromXML(name, attrs, content, font)
+ diff_binary_fragments(colr.compile(font), COLR_V1_SAMPLE)
- assert colr.compile(font) == COLR_V1_DATA
+ def test_round_trip_xml(self, font):
+ colr = table_C_O_L_R_()
+ for name, attrs, content in parseXML(COLR_V1_XML):
+ colr.fromXML(name, attrs, content, font)
+ compiled = colr.compile(font)
+
+ colr = table_C_O_L_R_()
+ colr.decompile(compiled, font)
+ assert getXML(colr.toXML, font) == COLR_V1_XML
diff --git a/Tests/ttLib/woff2_test.py b/Tests/ttLib/woff2_test.py
index 2651e808..661fd448 100644
--- a/Tests/ttLib/woff2_test.py
+++ b/Tests/ttLib/woff2_test.py
@@ -21,7 +21,10 @@ import pytest
haveBrotli = False
try:
- import brotli
+ try:
+ import brotlicffi as brotli
+ except ImportError:
+ import brotli
haveBrotli = True
except ImportError:
pass
diff --git a/Tests/ttx/ttx_test.py b/Tests/ttx/ttx_test.py
index 753cc9ce..3d4c3f92 100644
--- a/Tests/ttx/ttx_test.py
+++ b/Tests/ttx/ttx_test.py
@@ -18,7 +18,10 @@ try:
except ImportError:
zopfli = None
try:
- import brotli
+ try:
+ import brotlicffi as brotli
+ except ImportError:
+ import brotli
except ImportError:
brotli = None
diff --git a/Tests/ufoLib/UFO3_test.py b/Tests/ufoLib/UFO3_test.py
index bed527db..c4218023 100644
--- a/Tests/ufoLib/UFO3_test.py
+++ b/Tests/ufoLib/UFO3_test.py
@@ -3940,6 +3940,26 @@ class UFO3WriteLayersTestCase(unittest.TestCase):
result = list(writer.getGlyphSet("layer 2", defaultLayer=False).keys())
self.assertEqual(expected, result)
+ def testGetGlyphSetNoContents(self):
+ self.makeUFO()
+ os.remove(os.path.join(self.ufoPath, "glyphs.layer 1", "contents.plist"))
+
+ reader = UFOReader(self.ufoPath, validate=True)
+ with self.assertRaises(GlifLibError):
+ reader.getGlyphSet("layer 1")
+
+ writer = UFOWriter(self.ufoPath, validate=True)
+ with self.assertRaises(GlifLibError):
+ writer.getGlyphSet("layer 1", defaultLayer=False, expectContentsFile=True)
+
+ # There's a separate code path for < v3 UFOs.
+ with open(os.path.join(self.ufoPath, "metainfo.plist"), "wb") as f:
+ plistlib.dump(dict(creator="test", formatVersion=2), f)
+ os.remove(os.path.join(self.ufoPath, "glyphs", "contents.plist"))
+ writer = UFOWriter(self.ufoPath, validate=True, formatVersion=2)
+ with self.assertRaises(GlifLibError):
+ writer.getGlyphSet(expectContentsFile=True)
+
# make a new font with two layers
def testNewFontOneLayer(self):
diff --git a/Tests/ufoLib/glifLib_test.py b/Tests/ufoLib/glifLib_test.py
index 4c8d587c..3af0256c 100644
--- a/Tests/ufoLib/glifLib_test.py
+++ b/Tests/ufoLib/glifLib_test.py
@@ -54,6 +54,16 @@ class GlyphSetTests(unittest.TestCase):
added, removed,
"%s.glif file differs after round tripping" % glyphName)
+ def testContentsExist(self):
+ with self.assertRaises(GlifLibError):
+ GlyphSet(
+ self.dstDir,
+ ufoFormatVersion=2,
+ validateRead=True,
+ validateWrite=True,
+ expectContentsFile=True,
+ )
+
def testRebuildContents(self):
gset = GlyphSet(GLYPHSETDIR, validateRead=True, validateWrite=True)
contents = gset.contents
diff --git a/Tests/ufoLib/testdata/TestFont1 (UFO3).ufoz b/Tests/ufoLib/testdata/TestFont1 (UFO3).ufoz
new file mode 100644
index 00000000..d78d494f
--- /dev/null
+++ b/Tests/ufoLib/testdata/TestFont1 (UFO3).ufoz
Binary files differ
diff --git a/Tests/varLib/data/test_results/InterpolateLayoutGPOS_7_diff.ttx b/Tests/varLib/data/test_results/InterpolateLayoutGPOS_7_diff.ttx
index 8112d0f6..ea1fa7e6 100644
--- a/Tests/varLib/data/test_results/InterpolateLayoutGPOS_7_diff.ttx
+++ b/Tests/varLib/data/test_results/InterpolateLayoutGPOS_7_diff.ttx
@@ -86,26 +86,28 @@
<LookupType value="7"/>
<LookupFlag value="0"/>
<!-- SubTableCount=1 -->
- <ContextPos index="0" Format="3">
- <!-- GlyphCount=3 -->
- <!-- PosCount=2 -->
- <Coverage index="0" Format="1">
+ <ContextPos index="0" Format="1">
+ <Coverage Format="1">
<Glyph value="A"/>
</Coverage>
- <Coverage index="1" Format="1">
- <Glyph value="a"/>
- </Coverage>
- <Coverage index="2" Format="1">
- <Glyph value="uni0303"/>
- </Coverage>
- <PosLookupRecord index="0">
- <SequenceIndex value="0"/>
- <LookupListIndex value="0"/>
- </PosLookupRecord>
- <PosLookupRecord index="1">
- <SequenceIndex value="2"/>
- <LookupListIndex value="1"/>
- </PosLookupRecord>
+ <!-- PosRuleSetCount=1 -->
+ <PosRuleSet index="0">
+ <!-- PosRuleCount=1 -->
+ <PosRule index="0">
+ <!-- GlyphCount=3 -->
+ <!-- PosCount=2 -->
+ <Input index="0" value="a"/>
+ <Input index="1" value="uni0303"/>
+ <PosLookupRecord index="0">
+ <SequenceIndex value="0"/>
+ <LookupListIndex value="0"/>
+ </PosLookupRecord>
+ <PosLookupRecord index="1">
+ <SequenceIndex value="2"/>
+ <LookupListIndex value="1"/>
+ </PosLookupRecord>
+ </PosRule>
+ </PosRuleSet>
</ContextPos>
</Lookup>
</LookupList>
diff --git a/Tests/varLib/data/test_results/InterpolateLayoutGPOS_7_same.ttx b/Tests/varLib/data/test_results/InterpolateLayoutGPOS_7_same.ttx
index f56b0503..1ad81185 100644
--- a/Tests/varLib/data/test_results/InterpolateLayoutGPOS_7_same.ttx
+++ b/Tests/varLib/data/test_results/InterpolateLayoutGPOS_7_same.ttx
@@ -86,26 +86,28 @@
<LookupType value="7"/>
<LookupFlag value="0"/>
<!-- SubTableCount=1 -->
- <ContextPos index="0" Format="3">
- <!-- GlyphCount=3 -->
- <!-- PosCount=2 -->
- <Coverage index="0" Format="1">
+ <ContextPos index="0" Format="1">
+ <Coverage Format="1">
<Glyph value="A"/>
</Coverage>
- <Coverage index="1" Format="1">
- <Glyph value="a"/>
- </Coverage>
- <Coverage index="2" Format="1">
- <Glyph value="uni0303"/>
- </Coverage>
- <PosLookupRecord index="0">
- <SequenceIndex value="0"/>
- <LookupListIndex value="0"/>
- </PosLookupRecord>
- <PosLookupRecord index="1">
- <SequenceIndex value="2"/>
- <LookupListIndex value="1"/>
- </PosLookupRecord>
+ <!-- PosRuleSetCount=1 -->
+ <PosRuleSet index="0">
+ <!-- PosRuleCount=1 -->
+ <PosRule index="0">
+ <!-- GlyphCount=3 -->
+ <!-- PosCount=2 -->
+ <Input index="0" value="a"/>
+ <Input index="1" value="uni0303"/>
+ <PosLookupRecord index="0">
+ <SequenceIndex value="0"/>
+ <LookupListIndex value="0"/>
+ </PosLookupRecord>
+ <PosLookupRecord index="1">
+ <SequenceIndex value="2"/>
+ <LookupListIndex value="1"/>
+ </PosLookupRecord>
+ </PosRule>
+ </PosRuleSet>
</ContextPos>
</Lookup>
</LookupList>
diff --git a/Tests/varLib/varLib_test.py b/Tests/varLib/varLib_test.py
index dfc10c34..da1f94f4 100644
--- a/Tests/varLib/varLib_test.py
+++ b/Tests/varLib/varLib_test.py
@@ -45,10 +45,15 @@ class BuildTest(unittest.TestCase):
if self.tempdir:
shutil.rmtree(self.tempdir)
- @staticmethod
- def get_test_input(test_file_or_folder):
- path, _ = os.path.split(__file__)
- return os.path.join(path, "data", test_file_or_folder)
+ def get_test_input(self, test_file_or_folder, copy=False):
+ parent_dir = os.path.dirname(__file__)
+ path = os.path.join(parent_dir, "data", test_file_or_folder)
+ if copy:
+ copied_path = os.path.join(self.tempdir, test_file_or_folder)
+ shutil.copy2(path, copied_path)
+ return copied_path
+ else:
+ return path
@staticmethod
def get_test_output(test_file_or_folder):
@@ -314,11 +319,12 @@ class BuildTest(unittest.TestCase):
)
def test_varlib_nonmarking_CFF2(self):
- ds_path = self.get_test_input('TestNonMarkingCFF2.designspace')
+ self.temp_dir()
+
+ ds_path = self.get_test_input('TestNonMarkingCFF2.designspace', copy=True)
ttx_dir = self.get_test_input("master_non_marking_cff2")
expected_ttx_path = self.get_test_output("TestNonMarkingCFF2.ttx")
- self.temp_dir()
for path in self.get_file_list(ttx_dir, '.ttx', 'TestNonMarkingCFF2_'):
self.compile_font(path, ".otf", self.tempdir)
@@ -336,11 +342,12 @@ class BuildTest(unittest.TestCase):
self.expect_ttx(varfont, expected_ttx_path, tables)
def test_varlib_build_CFF2(self):
- ds_path = self.get_test_input('TestCFF2.designspace')
+ self.temp_dir()
+
+ ds_path = self.get_test_input('TestCFF2.designspace', copy=True)
ttx_dir = self.get_test_input("master_cff2")
expected_ttx_path = self.get_test_output("BuildTestCFF2.ttx")
- self.temp_dir()
for path in self.get_file_list(ttx_dir, '.ttx', 'TestCFF2_'):
self.compile_font(path, ".otf", self.tempdir)
@@ -358,11 +365,12 @@ class BuildTest(unittest.TestCase):
self.expect_ttx(varfont, expected_ttx_path, tables)
def test_varlib_build_CFF2_from_CFF2(self):
- ds_path = self.get_test_input('TestCFF2Input.designspace')
+ self.temp_dir()
+
+ ds_path = self.get_test_input('TestCFF2Input.designspace', copy=True)
ttx_dir = self.get_test_input("master_cff2_input")
expected_ttx_path = self.get_test_output("BuildTestCFF2.ttx")
- self.temp_dir()
for path in self.get_file_list(ttx_dir, '.ttx', 'TestCFF2_'):
self.compile_font(path, ".otf", self.tempdir)
@@ -380,11 +388,12 @@ class BuildTest(unittest.TestCase):
self.expect_ttx(varfont, expected_ttx_path, tables)
def test_varlib_build_sparse_CFF2(self):
- ds_path = self.get_test_input('TestSparseCFF2VF.designspace')
+ self.temp_dir()
+
+ ds_path = self.get_test_input('TestSparseCFF2VF.designspace', copy=True)
ttx_dir = self.get_test_input("master_sparse_cff2")
expected_ttx_path = self.get_test_output("TestSparseCFF2VF.ttx")
- self.temp_dir()
for path in self.get_file_list(ttx_dir, '.ttx', 'MasterSet_Kanji-'):
self.compile_font(path, ".otf", self.tempdir)
@@ -402,11 +411,12 @@ class BuildTest(unittest.TestCase):
self.expect_ttx(varfont, expected_ttx_path, tables)
def test_varlib_build_vpal(self):
- ds_path = self.get_test_input('test_vpal.designspace')
+ self.temp_dir()
+
+ ds_path = self.get_test_input('test_vpal.designspace', copy=True)
ttx_dir = self.get_test_input("master_vpal_test")
expected_ttx_path = self.get_test_output("test_vpal.ttx")
- self.temp_dir()
for path in self.get_file_list(ttx_dir, '.ttx', 'master_vpal_test_'):
self.compile_font(path, ".otf", self.tempdir)
@@ -494,11 +504,12 @@ class BuildTest(unittest.TestCase):
self.expect_ttx(varfont, expected_ttx_path, tables)
def test_varlib_build_from_ttf_paths(self):
- ds_path = self.get_test_input("Build.designspace")
+ self.temp_dir()
+
+ ds_path = self.get_test_input("Build.designspace", copy=True)
ttx_dir = self.get_test_input("master_ttx_interpolatable_ttf")
expected_ttx_path = self.get_test_output("BuildMain.ttx")
- self.temp_dir()
for path in self.get_file_list(ttx_dir, '.ttx', 'TestFamily-'):
self.compile_font(path, ".ttf", self.tempdir)
@@ -643,12 +654,13 @@ class BuildTest(unittest.TestCase):
assert all(tag in mvar_tags for tag in fontTools.varLib.mvar.MVAR_ENTRIES)
def test_varlib_build_VVAR_CFF2(self):
- ds_path = self.get_test_input('TestVVAR.designspace')
+ self.temp_dir()
+
+ ds_path = self.get_test_input('TestVVAR.designspace', copy=True)
ttx_dir = self.get_test_input("master_vvar_cff2")
expected_ttx_name = 'TestVVAR'
suffix = '.otf'
- self.temp_dir()
for path in self.get_file_list(ttx_dir, '.ttx', 'TestVVAR'):
font, savepath = self.compile_font(path, suffix, self.tempdir)
@@ -668,12 +680,13 @@ class BuildTest(unittest.TestCase):
self.check_ttx_dump(varfont, expected_ttx_path, tables, suffix)
def test_varlib_build_BASE(self):
- ds_path = self.get_test_input('TestBASE.designspace')
+ self.temp_dir()
+
+ ds_path = self.get_test_input('TestBASE.designspace', copy=True)
ttx_dir = self.get_test_input("master_base_test")
expected_ttx_name = 'TestBASE'
suffix = '.otf'
- self.temp_dir()
for path in self.get_file_list(ttx_dir, '.ttx', 'TestBASE'):
font, savepath = self.compile_font(path, suffix, self.tempdir)