Home | History | Annotate | Download | only in tools
      1 <html>
      2 <head>
      3 <div height="0" hidden="true">
      4 
      5 <div id="issue3651_7">
      6 seg=1 {{{68.1999969f, 74.8000031f}, {68.4444427f, 74.8000031f}, {68.6888885f, 74.8039017f}, {68.9333344f, 74.8078003f}}}
      7 seg=2 {{{68.9333344f, 74.8078003f}, {69.422226f, 74.8155975f}, {69.9111099f, 74.8233948f}, {70.4000015f, 74.8000031f}}}
      8 seg=3 {{{70.4000015f, 74.8000031f}, {70.7796326f, 74.7818375f}, {71.1592636f, 74.7372665f}, {71.5388947f, 74.6926956f}}}
      9 seg=4 {{{71.5388947f, 74.6926956f}, {71.8925934f, 74.6511688f}, {72.2462997f, 74.609642f}, {72.5999985f, 74.5894699f}}}
     10 seg=5 {{{72.5999985f, 74.5894699f}, {73.1301117f, 74.5592346f}, {73.6602249f, 74.5564957f}, {74.1903381f, 74.5537567f}}}
     11 seg=6 {{{74.1903381f, 74.5537567f}, {74.3935623f, 74.5527115f}, {74.5967789f, 74.5516663f}, {74.8000031f, 74.5490646f}}}
     12 seg=7 {{{74.8000031f, 74.5490646f}, {75.0211792f, 74.5462341f}, {75.242363f, 74.5398636f}, {75.4635391f, 74.5335007f}}}
     13 seg=8 {{{75.4635391f, 74.5335007f}, {75.9756927f, 74.5187607f}, {76.4878464f, 74.5040207f}, {77, 74.5332108f}}}
     14 seg=9 {{{77, 74.5332108f}, {77.3702316f, 74.5543137f}, {77.7404709f, 74.610733f}, {78.1107025f, 74.66716f}}}
     15 seg=10 {{{78.1107025f, 74.66716f}, {78.4738007f, 74.722496f}, {78.8368988f, 74.777832f}, {79.1999969f, 74.7998505f}}}
     16 seg=11 {{{79.1999969f, 74.7998505f}, {79.689003f, 74.8295059f}, {80.1780014f, 74.819664f}, {80.6670074f, 74.8098221f}}}
     17 seg=12 {{{80.6670074f, 74.8098221f}, {80.9113388f, 74.8049088f}, {81.1556702f, 74.7999954f}, {81.4000015f, 74.8000031f}}}
     18 seg=13 {{{81.4000015f, 74.8000031f}, {81.6438522f, 74.8000107f}, {81.8877106f, 74.8010635f}, {82.1315613f, 74.8021164f}}}
     19 seg=14 {{{82.1315613f, 74.8021164f}, {82.6210403f, 74.8042297f}, {83.1105194f, 74.8063507f}, {83.5999985f, 74.8000031f}}}
     20 seg=15 {{{83.5999985f, 74.8000031f}, {83.9259109f, 74.7957764f}, {84.2518234f, 74.7840347f}, {84.5777359f, 74.7722931f}}}
     21 seg=16 {{{84.5777359f, 74.7722931f}, {84.9851608f, 74.7576141f}, {85.3925781f, 74.7429352f}, {85.8000031f, 74.7429352f}}}
     22 seg=17 {{{85.8000031f, 74.7429352f}, {86.2074203f, 74.7429352f}, {86.6148453f, 74.7576141f}, {87.0222626f, 74.7722931f}}}
     23 seg=18 {{{87.0222626f, 74.7722931f}, {87.348175f, 74.7840347f}, {87.6740875f, 74.7957764f}, {88, 74.8000031f}}}
     24 seg=19 {{{88, 74.8000031f}, {88.1576462f, 74.8020477f}, {88.3152924f, 74.8048859f}, {88.4729385f, 74.8077316f}}}
     25 seg=20 {{{88.4729385f, 74.8077316f}, {89.0486221f, 74.8181076f}, {89.6243134f, 74.8284836f}, {90.1999969f, 74.8000031f}}}
     26 seg=21 {{{90.1999969f, 74.8000031f}, {90.5620499f, 74.7820892f}, {90.9241028f, 74.7369537f}, {91.2861557f, 74.6918182f}}}
     27 seg=22 {{{91.2861557f, 74.6918182f}, {91.6574402f, 74.6455307f}, {92.028717f, 74.5992432f}, {92.4000015f, 74.5823135f}}}
     28 seg=23 {{{92.4000015f, 74.5823135f}, {92.9111481f, 74.5590057f}, {93.4223022f, 74.5721283f}, {93.9334488f, 74.5852509f}}}
     29 seg=24 {{{93.9334488f, 74.5852509f}, {94.155632f, 74.59095f}, {94.3778152f, 74.5966568f}, {94.5999985f, 74.5993652f}}}
     30 seg=25 {{{94.5999985f, 74.5993652f}, {94.8669891f, 74.602623f}, {95.1339798f, 74.6110153f}, {95.4009705f, 74.6194f}}}
     31 seg=26 {{{95.4009705f, 74.6194f}, {95.8673172f, 74.6340485f}, {96.3336563f, 74.6486969f}, {96.8000031f, 74.6360168f}}}
     32 seg=27 {{{96.8000031f, 74.6360168f}, {97.2396164f, 74.624054f}, {97.6792297f, 74.5860596f}, {98.1188431f, 74.5480652f}}}
     33 seg=28 {{{98.1188431f, 74.5480652f}, {98.4125595f, 74.5226822f}, {98.7062836f, 74.4972992f}, {99, 74.4796829f}}}
     34 seg=29 {{{99, 74.4796829f}, {99.7333298f, 74.4356995f}, {100.466667f, 74.3924866f}, {101.199997f, 74.3721085f}}}
     35 seg=30 {{{101.199997f, 74.3721085f}, {101.6632f, 74.3592453f}, {102.126396f, 74.3594589f}, {102.5896f, 74.3596725f}}}
     36 seg=31 {{{102.5896f, 74.3596725f}, {102.859734f, 74.3597946f}, {103.129868f, 74.3599167f}, {103.400002f, 74.3574448f}}}
     37 seg=32 {{{103.400002f, 74.3574448f}, {103.499123f, 74.3565369f}, {103.598244f, 74.3556519f}, {103.697365f, 74.3547668f}}}
     38 seg=33 {{{103.697365f, 74.3547668f}, {104.331573f, 74.3491211f}, {104.96579f, 74.3434753f}, {105.599998f, 74.3318787f}}}
     39 seg=34 {{{105.599998f, 74.3318787f}, {105.951164f, 74.3254547f}, {106.30233f, 74.3153458f}, {106.653496f, 74.3052368f}}}
     40 seg=35 {{{106.653496f, 74.3052368f}, {107.035667f, 74.2942352f}, {107.417831f, 74.2832336f}, {107.800003f, 74.2769852f}}}
     41 seg=36 {{{107.800003f, 74.2769852f}, {107.904305f, 74.2752838f}, {108.008606f, 74.2734833f}, {108.112907f, 74.2716827f}}}
     42 seg=37 {{{108.112907f, 74.2716827f}, {108.741936f, 74.2608261f}, {109.370972f, 74.2499771f}, {110, 74.2599411f}}}
     43 seg=38 {{{110, 74.2599411f}, {110.73333f, 74.2715607f}, {111.466667f, 74.3080215f}, {112.199997f, 74.3467178f}}}
     44 seg=39 {{{112.199997f, 74.3467178f}, {112.524193f, 74.3638306f}, {112.848389f, 74.3887024f}, {113.172585f, 74.4135742f}}}
     45 seg=40 {{{113.172585f, 74.4135742f}, {113.581726f, 74.4449615f}, {113.99086f, 74.4763565f}, {114.400002f, 74.4921417f}}}
     46 seg=41 {{{114.400002f, 74.4921417f}, {115.133331f, 74.5204391f}, {115.866669f, 74.5265198f}, {116.599998f, 74.5165176f}}}
     47 seg=42 {{{116.599998f, 74.5165176f}, {117.013039f, 74.5108871f}, {117.426071f, 74.4911652f}, {117.839111f, 74.4714432f}}}
     48 seg=43 {{{117.839111f, 74.4714432f}, {118.159409f, 74.4561462f}, {118.479706f, 74.4408493f}, {118.800003f, 74.4321289f}}}
     49 seg=44 {{{118.800003f, 74.4321289f}, {118.915619f, 74.428978f}, {119.031235f, 74.4256439f}, {119.146851f, 74.4223099f}}}
     50 seg=45 {{{119.146851f, 74.4223099f}, {119.764565f, 74.4045105f}, {120.382286f, 74.3867035f}, {121, 74.3966675f}}}
     51 seg=46 {{{121, 74.3966675f}, {121.552635f, 74.405571f}, {122.105278f, 74.4385529f}, {122.657913f, 74.4715347f}}}
     52 seg=47 {{{122.657913f, 74.4715347f}, {122.838608f, 74.4823227f}, {123.019302f, 74.4931107f}, {123.199997f, 74.5030518f}}}
     53 seg=48 {{{123.199997f, 74.5030518f}, {123.480431f, 74.5184784f}, {123.760864f, 74.5394821f}, {124.041298f, 74.5604858f}}}
     54 seg=49 {{{124.041298f, 74.5604858f}, {124.494202f, 74.5943985f}, {124.947098f, 74.6283112f}, {125.400002f, 74.6387558f}}}
     55 seg=50 {{{125.400002f, 74.6387558f}, {126.133331f, 74.6556625f}, {126.866669f, 74.6397476f}, {127.599998f, 74.6044846f}}}
     56 seg=51 {{{127.599998f, 74.6044846f}, {128.17691f, 74.5767441f}, {128.75383f, 74.5233994f}, {129.33075f, 74.4700623f}}}
     57 seg=52 {{{129.33075f, 74.4700623f}, {129.487167f, 74.4555969f}, {129.643585f, 74.4411316f}, {129.800003f, 74.4271774f}}}
     58 seg=53 {{{129.800003f, 74.4271774f}, {130.08493f, 74.4017639f}, {130.369843f, 74.3696442f}, {130.65477f, 74.3375244f}}}
     59 seg=54 {{{130.65477f, 74.3375244f}, {131.10318f, 74.2869797f}, {131.55159f, 74.2364349f}, {132, 74.2120285f}}}
     60 seg=55 {{{132, 74.2120285f}, {132.682098f, 74.1748962f}, {133.364182f, 74.1806335f}, {134.04628f, 74.1863708f}}}
     61 seg=56 {{{134.04628f, 74.1863708f}, {134.199997f, 74.1876526f}}}
     62 seg=57 {{{134.199997f, 74.1876526f}, {134.740479f, 74.1920013f}, {135.28096f, 74.2102814f}, {135.821426f, 74.2285538f}}}
     63 seg=58 {{{135.821426f, 74.2285538f}, {136.014282f, 74.2350769f}, {136.207138f, 74.2416f}, {136.399994f, 74.2474899f}}}
     64 seg=59 {{{136.399994f, 74.2474899f}, {136.723831f, 74.2573776f}, {137.047668f, 74.2692032f}, {137.371506f, 74.2810364f}}}
     65 seg=60 {{{137.371506f, 74.2810364f}, {137.781006f, 74.2959976f}, {138.190506f, 74.3109589f}, {138.600006f, 74.3219833f}}}
     66 seg=61 {{{138.600006f, 74.3219833f}, {138.775055f, 74.3266983f}, {138.950119f, 74.3321457f}, {139.125183f, 74.3375931f}}}
     67 seg=62 {{{139.125183f, 74.3375931f}, {139.683456f, 74.3549652f}, {140.24173f, 74.3723373f}, {140.800003f, 74.3659744f}}}
     68 seg=63 {{{140.800003f, 74.3659744f}, {141.173523f, 74.3617172f}, {141.547028f, 74.3401871f}, {141.920547f, 74.3186493f}}}
     69 seg=64 {{{141.920547f, 74.3186493f}, {142.280365f, 74.297905f}, {142.640182f, 74.2771606f}, {143, 74.2718658f}}}
     70 seg=65 {{{143, 74.2718658f}, {143.733337f, 74.2610703f}, {144.46666f, 74.2575989f}, {145.199997f, 74.3011856f}}}
     71 seg=66 {{{145.199997f, 74.3011856f}, {145.574966f, 74.3234711f}, {145.949936f, 74.3711548f}, {146.32489f, 74.4188385f}}}
     72 seg=67 {{{146.32489f, 74.4188385f}, {146.683258f, 74.4644165f}, {147.041626f, 74.5099869f}, {147.399994f, 74.5333862f}}}
     73 seg=68 {{{147.399994f, 74.5333862f}, {148.133331f, 74.5812607f}, {148.866669f, 74.6018982f}, {149.600006f, 74.5884552f}}}
     74 seg=69 {{{149.600006f, 74.5884552f}, {149.982086f, 74.5814514f}, {150.364182f, 74.5504913f}, {150.746277f, 74.5195313f}}}
     75 seg=70 {{{150.746277f, 74.5195313f}, {151.097519f, 74.491066f}, {151.448761f, 74.4626007f}, {151.800003f, 74.4527512f}}}
     76 seg=71 {{{151.800003f, 74.4527512f}, {152.343307f, 74.4375076f}, {152.886597f, 74.4468765f}, {153.429901f, 74.4562454f}}}
     77 seg=72 {{{153.429901f, 74.4562454f}, {153.619934f, 74.4595261f}, {153.809967f, 74.4627991f}, {154, 74.4650269f}}}
     78 seg=73 {{{154, 74.4650269f}, {154.295746f, 74.4684906f}, {154.591476f, 74.4761581f}, {154.887222f, 74.4838257f}}}
     79 seg=74 {{{154.887222f, 74.4838257f}, {155.324814f, 74.4951782f}, {155.762405f, 74.5065308f}, {156.199997f, 74.5042419f}}}
     80 seg=75 {{{156.199997f, 74.5042419f}, {156.559143f, 74.5023651f}, {156.918289f, 74.487793f}, {157.27742f, 74.4732208f}}}
     81 seg=76 {{{157.27742f, 74.4732208f}, {157.651611f, 74.4580307f}, {158.025803f, 74.4428406f}, {158.399994f, 74.4420166f}}}
     82 seg=77 {{{158.399994f, 74.4420166f}, {159.133331f, 74.4403992f}, {159.866669f, 74.448494f}, {160.600006f, 74.4945221f}}}
     83 seg=78 {{{160.600006f, 74.4945221f}, {160.952393f, 74.5166473f}, {161.304794f, 74.5602722f}, {161.657196f, 74.6038971f}}}
     84 seg=79 {{{161.657196f, 74.6038971f}, {162.038132f, 74.6510468f}, {162.419067f, 74.698204f}, {162.800003f, 74.7182007f}}}
     85 seg=80 {{{162.800003f, 74.7182007f}, {163.53334f, 74.7566986f}, {164.266663f, 74.7636337f}, {165, 74.7255325f}}}
     86 seg=81 {{{165, 74.7255325f}, {165.356293f, 74.7070236f}, {165.712585f, 74.65802f}, {166.068878f, 74.6090164f}}}
     87 seg=82 {{{166.068878f, 74.6090164f}, {166.445923f, 74.5571594f}, {166.822952f, 74.5053024f}, {167.199997f, 74.4895782f}}}
     88 seg=83 {{{167.199997f, 74.4895782f}, {167.933334f, 74.4590073f}, {168.666672f, 74.4903488f}, {169.399994f, 74.5420837f}}}
     89 seg=84 {{{169.399994f, 74.5420837f}, {169.752808f, 74.5669785f}, {170.105621f, 74.6176682f}, {170.458435f, 74.6683578f}}}
     90 seg=85 {{{170.458435f, 74.6683578f}, {170.838959f, 74.7230225f}, {171.219482f, 74.7776947f}, {171.600006f, 74.8000031f}}}
     91 seg=86 {{{171.600006f, 74.8000031f}, {172.333328f, 74.8429871f}, {173.066666f, 74.8376999f}, {173.800003f, 74.8000031f}}}
     92 seg=87 {{{173.800003f, 74.8000031f}, {174.500809f, 74.7639694f}, {175.201599f, 74.6750717f}, {175.902405f, 74.5861664f}}}
     93 seg=88 {{{175.902405f, 74.5861664f}, {176, 74.5737915f}}}
     94 seg=89 {{{176, 74.5737915f}, {176.306427f, 74.5349655f}, {176.612839f, 74.4810333f}, {176.919266f, 74.4270935f}}}
     95 seg=90 {{{176.919266f, 74.4270935f}, {177.346176f, 74.3519516f}, {177.773087f, 74.2768097f}, {178.199997f, 74.2425385f}}}
     96 seg=91 {{{178.199997f, 74.2425385f}, {178.933334f, 74.18367f}, {179.666672f, 74.1942673f}, {180.399994f, 74.2205505f}}}
     97 seg=92 {{{180.399994f, 74.2205505f}, {180.822174f, 74.2356796f}, {181.244354f, 74.2772751f}, {181.666534f, 74.3188705f}}}
     98 seg=93 {{{181.666534f, 74.3188705f}, {181.977692f, 74.3495255f}, {182.288849f, 74.3801804f}, {182.600006f, 74.400238f}}}
     99 seg=94 {{{182.600006f, 74.400238f}, {183.153549f, 74.435936f}, {183.707108f, 74.4587555f}, {184.260666f, 74.481575f}}}
    100 seg=95 {{{184.260666f, 74.481575f}, {184.440445f, 74.4889832f}, {184.620224f, 74.4963913f}, {184.800003f, 74.5042419f}}}
    101 seg=96 {{{184.800003f, 74.5042419f}, {185.53334f, 74.5362625f}, {186.266663f, 74.5669022f}, {187, 74.5923843f}}}
    102 seg=97 {{{187, 74.5923843f}, {187.218643f, 74.5999832f}, {187.437286f, 74.6105118f}, {187.65593f, 74.6210403f}}}
    103 seg=98 {{{187.65593f, 74.6210403f}, {188.170624f, 74.6458359f}, {188.685303f, 74.6706314f}, {189.199997f, 74.6571732f}}}
    104 seg=99 {{{189.199997f, 74.6571732f}, {189.560562f, 74.6477432f}, {189.921127f, 74.6077042f}, {190.281693f, 74.5676651f}}}
    105 seg=100 {{{190.281693f, 74.5676651f}, {190.654465f, 74.526268f}, {191.027237f, 74.4848709f}, {191.399994f, 74.4773026f}}}
    106 seg=101 {{{191.399994f, 74.4773026f}, {191.942627f, 74.4662857f}, {192.48526f, 74.5001678f}, {193.027893f, 74.5340576f}}}
    107 seg=102 {{{193.027893f, 74.5340576f}, {193.218597f, 74.5459671f}, {193.409302f, 74.5578766f}, {193.600006f, 74.5678329f}}}
    108 seg=103 {{{193.600006f, 74.5678329f}, {193.897125f, 74.5833511f}, {194.19426f, 74.6063919f}, {194.491394f, 74.6294403f}}}
    109 seg=104 {{{194.491394f, 74.6294403f}, {194.927597f, 74.663269f}, {195.3638f, 74.6970978f}, {195.800003f, 74.7071152f}}}
    110 seg=105 {{{195.800003f, 74.7071152f}, {196.363327f, 74.7200546f}, {196.926636f, 74.7021637f}, {197.48996f, 74.6842728f}}}
    111 seg=106 {{{197.48996f, 74.6842728f}, {197.659973f, 74.6788712f}, {197.829987f, 74.6734695f}, {198, 74.6689148f}}}
    112 seg=107 {{{198, 74.6689148f}, {198.539948f, 74.6544571f}, {199.07988f, 74.6331635f}, {199.619827f, 74.6118698f}}}
    113 seg=108 {{{199.619827f, 74.6118698f}, {199.813217f, 74.6042404f}, {200.006607f, 74.596611f}, {200.199997f, 74.5892944f}}}
    114 seg=109 {{{200.199997f, 74.5892944f}, {200.468765f, 74.5791321f}, {200.737534f, 74.5671921f}, {201.006287f, 74.5552597f}}}
    115 seg=110 {{{201.006287f, 74.5552597f}, {201.470856f, 74.5346298f}, {201.935425f, 74.5139999f}, {202.399994f, 74.5025177f}}}
    116 seg=111 {{{202.399994f, 74.5025177f}, {202.888885f, 74.4904327f}, {203.377777f, 74.4879456f}, {203.866669f, 74.4854507f}}}
    117 seg=112 {{{203.866669f, 74.4854507f}, {204.111115f, 74.4842072f}, {204.35556f, 74.4829636f}, {204.600006f, 74.4805222f}}}
    118 seg=113 {{{204.600006f, 74.4805222f}, {204.84462f, 74.4780731f}, {205.089233f, 74.476059f}, {205.333847f, 74.4740448f}}}
    119 seg=114 {{{205.333847f, 74.4740448f}, {205.822556f, 74.4700241f}, {206.311279f, 74.4659958f}, {206.800003f, 74.4585342f}}}
    120 seg=115 {{{206.800003f, 74.4585342f}, {207.53334f, 74.4473343f}, {208.266663f, 74.4324722f}, {209, 74.413353f}}}
    121 seg=116 {{{209, 74.413353f}, {209.350708f, 74.404213f}, {209.701416f, 74.3919983f}, {210.052124f, 74.3797836f}}}
    122 seg=117 {{{210.052124f, 74.3797836f}, {210.434753f, 74.3664627f}, {210.817368f, 74.3531418f}, {211.199997f, 74.3438034f}}}
    123 seg=118 {{{211.199997f, 74.3438034f}, {211.933334f, 74.3259048f}, {212.666672f, 74.3128586f}, {213.399994f, 74.305954f}}}
    124 seg=119 {{{213.399994f, 74.305954f}, {214.133331f, 74.2990494f}, {214.866669f, 74.2958145f}, {215.600006f, 74.3023758f}}}
    125 seg=120 {{{215.600006f, 74.3023758f}, {216.076187f, 74.3066406f}, {216.552383f, 74.317627f}, {217.02858f, 74.3286133f}}}
    126 seg=121 {{{217.02858f, 74.3286133f}, {217.285721f, 74.334549f}, {217.542862f, 74.340477f}, {217.800003f, 74.3453522f}}}
    127 seg=122 {{{217.800003f, 74.3453522f}, {218.041779f, 74.3499298f}, {218.283554f, 74.358696f}, {218.52533f, 74.3674622f}}}
    128 seg=123 {{{218.52533f, 74.3674622f}, {219.016891f, 74.3852844f}, {219.508438f, 74.4031067f}, {220, 74.3857574f}}}
    129 seg=124 {{{220, 74.3857574f}, {220.409988f, 74.3712845f}, {220.819977f, 74.3263474f}, {221.229965f, 74.2814102f}}}
    130 seg=125 {{{221.229965f, 74.2814102f}, {221.553314f, 74.2459717f}, {221.876648f, 74.2105331f}, {222.199997f, 74.190033f}}}
    131 seg=126 {{{222.199997f, 74.190033f}, {222.933334f, 74.1435471f}, {223.666672f, 74.1037674f}, {224.399994f, 74.1068344f}}}
    132 seg=127 {{{224.399994f, 74.1068344f}, {224.885803f, 74.1088638f}, {225.371613f, 74.1381073f}, {225.857422f, 74.1673508f}}}
    133 seg=128 {{{225.857422f, 74.1673508f}, {226.10495f, 74.182251f}, {226.352478f, 74.1971512f}, {226.600006f, 74.2084503f}}}
    134 seg=129 {{{226.600006f, 74.2084503f}, {226.839722f, 74.2193909f}, {227.079437f, 74.2324677f}, {227.319153f, 74.2455521f}}}
    135 seg=130 {{{227.319153f, 74.2455521f}, {227.812759f, 74.2724838f}, {228.306381f, 74.2994156f}, {228.800003f, 74.3076782f}}}
    136 seg=131 {{{228.800003f, 74.3076782f}, {229.309921f, 74.3162155f}, {229.819824f, 74.3054352f}, {230.329742f, 74.2946548f}}}
    137 seg=132 {{{230.329742f, 74.2946548f}, {230.553162f, 74.2899323f}, {230.776581f, 74.2852097f}, {231, 74.2821121f}}}
    138 seg=133 {{{231, 74.2821121f}, {231.290405f, 74.2780838f}, {231.580811f, 74.2724228f}, {231.871216f, 74.2667542f}}}
    139 seg=134 {{{231.871216f, 74.2667542f}, {232.314148f, 74.2581177f}, {232.757065f, 74.2494812f}, {233.199997f, 74.2466507f}}}
    140 seg=135 {{{233.199997f, 74.2466507f}, {233.343719f, 74.2457352f}, {233.487442f, 74.2448959f}, {233.631165f, 74.2442474f}}}
    141 seg=136 {{{233.631165f, 74.2442474f}, {234.220779f, 74.2415924f}, {234.810394f, 74.2421951f}, {235.399994f, 74.2539825f}}}
    142 seg=137 {{{235.399994f, 74.2539825f}, {235.845032f, 74.2628784f}, {236.29007f, 74.2817612f}, {236.735107f, 74.3006439f}}}
    143 seg=138 {{{236.735107f, 74.3006439f}, {237.023407f, 74.3128738f}, {237.311707f, 74.3251038f}, {237.600006f, 74.3346176f}}}
    144 seg=139 {{{237.600006f, 74.3346176f}, {238.333328f, 74.3588257f}, {239.066666f, 74.3803329f}, {239.800003f, 74.3992233f}}}
    145 seg=140 {{{239.800003f, 74.3992233f}, {240.082169f, 74.4064941f}, {240.364334f, 74.4108353f}, {240.6465f, 74.4151764f}}}
    146 seg=141 {{{240.6465f, 74.4151764f}, {241.097672f, 74.4221191f}, {241.548828f, 74.4290695f}, {242, 74.4479828f}}}
    147 seg=142 {{{242, 74.4479828f}, {242.416458f, 74.4654388f}, {242.832916f, 74.4942093f}, {243.249374f, 74.5229874f}}}
    148 seg=143 {{{243.249374f, 74.5229874f}, {243.566254f, 74.5448837f}, {243.883118f, 74.5667801f}, {244.199997f, 74.5836868f}}}
    149 seg=144 {{{244.199997f, 74.5836868f}, {244.933334f, 74.6228104f}, {245.666672f, 74.6546402f}, {246.399994f, 74.6827393f}}}
    150 seg=145 {{{246.399994f, 74.6827393f}, {247.133331f, 74.7108383f}, {247.866669f, 74.7327499f}, {248.600006f, 74.7522964f}}}
    151 seg=146 {{{248.600006f, 74.7522964f}, {248.714218f, 74.7553406f}}}
    152 seg=147 {{{248.714218f, 74.7553406f}, {249.40947f, 74.7739029f}, {250.104736f, 74.7924576f}, {250.800003f, 74.8000031f}}}
    153 seg=148 {{{250.800003f, 74.8000031f}, {251.288895f, 74.8053055f}, {251.777771f, 74.8035355f}, {252.266663f, 74.8017731f}}}
    154 seg=149 {{{252.266663f, 74.8017731f}, {252.511108f, 74.8008881f}, {252.755554f, 74.8000031f}, {253, 74.8000031f}}}
    155 seg=150 {{{253, 74.8000031f}, {68.1999969f, 74.8000031f}}}
    156 op union
    157 seg=151 {{{68.1999969f, 74.8000031f}, {68.4444427f, 74.8000031f}, {68.6888885f, 74.7961044f}, {68.9333344f, 74.7922058f}}}
    158 seg=152 {{{68.9333344f, 74.7922058f}, {69.422226f, 74.7844086f}, {69.9111099f, 74.7766113f}, {70.4000015f, 74.8000031f}}}
    159 seg=153 {{{70.4000015f, 74.8000031f}, {70.7796326f, 74.8181686f}, {71.1592636f, 74.8627396f}, {71.5388947f, 74.9073105f}}}
    160 seg=154 {{{71.5388947f, 74.9073105f}, {71.8925934f, 74.9488373f}, {72.2462997f, 74.9903641f}, {72.5999985f, 75.0105362f}}}
    161 seg=155 {{{72.5999985f, 75.0105362f}, {73.1301117f, 75.0407715f}, {73.6602249f, 75.0435104f}, {74.1903381f, 75.0462494f}}}
    162 seg=156 {{{74.1903381f, 75.0462494f}, {74.3935623f, 75.0472946f}, {74.5967789f, 75.0483398f}, {74.8000031f, 75.0509415f}}}
    163 seg=157 {{{74.8000031f, 75.0509415f}, {75.0211792f, 75.053772f}, {75.242363f, 75.0601425f}, {75.4635391f, 75.0665054f}}}
    164 seg=158 {{{75.4635391f, 75.0665054f}, {75.9756927f, 75.0812454f}, {76.4878464f, 75.0959854f}, {77, 75.0667953f}}}
    165 seg=159 {{{77, 75.0667953f}, {77.3702316f, 75.0456924f}, {77.7404709f, 74.9892731f}, {78.1107025f, 74.9328461f}}}
    166 seg=160 {{{78.1107025f, 74.9328461f}, {78.4738007f, 74.8775101f}, {78.8368988f, 74.8221741f}, {79.1999969f, 74.8001556f}}}
    167 seg=161 {{{79.1999969f, 74.8001556f}, {79.689003f, 74.7705002f}, {80.1780014f, 74.7803421f}, {80.6670074f, 74.790184f}}}
    168 seg=162 {{{80.6670074f, 74.790184f}, {80.9113388f, 74.7950974f}, {81.1556702f, 74.8000107f}, {81.4000015f, 74.8000031f}}}
    169 seg=163 {{{81.4000015f, 74.8000031f}, {81.6438522f, 74.7999954f}, {81.8877106f, 74.7989426f}, {82.1315613f, 74.7978897f}}}
    170 seg=164 {{{82.1315613f, 74.7978897f}, {82.6210403f, 74.7957764f}, {83.1105194f, 74.7936554f}, {83.5999985f, 74.8000031f}}}
    171 seg=165 {{{83.5999985f, 74.8000031f}, {83.9259109f, 74.8042297f}, {84.2518234f, 74.8159714f}, {84.5777359f, 74.827713f}}}
    172 seg=166 {{{84.5777359f, 74.827713f}, {84.9851608f, 74.842392f}, {85.3925781f, 74.8570709f}, {85.8000031f, 74.8570709f}}}
    173 seg=167 {{{85.8000031f, 74.8570709f}, {86.2074203f, 74.8570709f}, {86.6148453f, 74.842392f}, {87.0222626f, 74.827713f}}}
    174 seg=168 {{{87.0222626f, 74.827713f}, {87.348175f, 74.8159714f}, {87.6740875f, 74.8042297f}, {88, 74.8000031f}}}
    175 seg=169 {{{88, 74.8000031f}, {88.1576462f, 74.7979584f}, {88.3152924f, 74.7951202f}, {88.4729385f, 74.7922745f}}}
    176 seg=170 {{{88.4729385f, 74.7922745f}, {89.0486221f, 74.7818985f}, {89.6243134f, 74.7715225f}, {90.1999969f, 74.8000031f}}}
    177 seg=171 {{{90.1999969f, 74.8000031f}, {90.5620499f, 74.8179169f}, {90.9241028f, 74.8630524f}, {91.2861557f, 74.9081879f}}}
    178 seg=172 {{{91.2861557f, 74.9081879f}, {91.6574402f, 74.9544754f}, {92.028717f, 75.0007629f}, {92.4000015f, 75.0176926f}}}
    179 seg=173 {{{92.4000015f, 75.0176926f}, {92.9111481f, 75.0410004f}, {93.4223022f, 75.0278778f}, {93.9334488f, 75.0147552f}}}
    180 seg=174 {{{93.9334488f, 75.0147552f}, {94.155632f, 75.0090561f}, {94.3778152f, 75.0033493f}, {94.5999985f, 75.0006409f}}}
    181 seg=175 {{{94.5999985f, 75.0006409f}, {94.8669891f, 74.9973831f}, {95.1339798f, 74.9889908f}, {95.4009705f, 74.9806061f}}}
    182 seg=176 {{{95.4009705f, 74.9806061f}, {95.8673172f, 74.9659576f}, {96.3336563f, 74.9513092f}, {96.8000031f, 74.9639893f}}}
    183 seg=177 {{{96.8000031f, 74.9639893f}, {97.2396164f, 74.9759521f}, {97.6792297f, 75.0139465f}, {98.1188431f, 75.0519409f}}}
    184 seg=178 {{{98.1188431f, 75.0519409f}, {98.4125595f, 75.0773239f}, {98.7062836f, 75.1027069f}, {99, 75.1203232f}}}
    185 seg=179 {{{99, 75.1203232f}, {99.7333298f, 75.1643066f}, {100.466667f, 75.2075195f}, {101.199997f, 75.2278976f}}}
    186 seg=180 {{{101.199997f, 75.2278976f}, {101.6632f, 75.2407608f}, {102.126396f, 75.2405472f}, {102.5896f, 75.2403336f}}}
    187 seg=181 {{{102.5896f, 75.2403336f}, {102.859734f, 75.2402115f}, {103.129868f, 75.2400894f}, {103.400002f, 75.2425613f}}}
    188 seg=182 {{{103.400002f, 75.2425613f}, {103.499123f, 75.2434692f}, {103.598244f, 75.2443542f}, {103.697365f, 75.2452393f}}}
    189 seg=183 {{{103.697365f, 75.2452393f}, {104.331573f, 75.250885f}, {104.96579f, 75.2565308f}, {105.599998f, 75.2681274f}}}
    190 seg=184 {{{105.599998f, 75.2681274f}, {105.951164f, 75.2745514f}, {106.30233f, 75.2846603f}, {106.653496f, 75.2947693f}}}
    191 seg=185 {{{106.653496f, 75.2947693f}, {107.035667f, 75.3057709f}, {107.417831f, 75.3167725f}, {107.800003f, 75.3230209f}}}
    192 seg=186 {{{107.800003f, 75.3230209f}, {107.904305f, 75.3247223f}, {108.008606f, 75.3265228f}, {108.112907f, 75.3283234f}}}
    193 seg=187 {{{108.112907f, 75.3283234f}, {108.741936f, 75.33918f}, {109.370972f, 75.350029f}, {110, 75.340065f}}}
    194 seg=188 {{{110, 75.340065f}, {110.73333f, 75.3284454f}, {111.466667f, 75.2919846f}, {112.199997f, 75.2532883f}}}
    195 seg=189 {{{112.199997f, 75.2532883f}, {112.524193f, 75.2361755f}, {112.848389f, 75.2113037f}, {113.172585f, 75.1864319f}}}
    196 seg=190 {{{113.172585f, 75.1864319f}, {113.581726f, 75.1550446f}, {113.99086f, 75.1236496f}, {114.400002f, 75.1078644f}}}
    197 seg=191 {{{114.400002f, 75.1078644f}, {115.133331f, 75.079567f}, {115.866669f, 75.0734863f}, {116.599998f, 75.0834885f}}}
    198 seg=192 {{{116.599998f, 75.0834885f}, {117.013039f, 75.089119f}, {117.426071f, 75.1088409f}, {117.839111f, 75.1285629f}}}
    199 seg=193 {{{117.839111f, 75.1285629f}, {118.159409f, 75.1438599f}, {118.479706f, 75.1591568f}, {118.800003f, 75.1678772f}}}
    200 seg=194 {{{118.800003f, 75.1678772f}, {118.915619f, 75.1710281f}, {119.031235f, 75.1743622f}, {119.146851f, 75.1776962f}}}
    201 seg=195 {{{119.146851f, 75.1776962f}, {119.764565f, 75.1954956f}, {120.382286f, 75.2133026f}, {121, 75.2033386f}}}
    202 seg=196 {{{121, 75.2033386f}, {121.552635f, 75.1944351f}, {122.105278f, 75.1614532f}, {122.657913f, 75.1284714f}}}
    203 seg=197 {{{122.657913f, 75.1284714f}, {122.838608f, 75.1176834f}, {123.019302f, 75.1068954f}, {123.199997f, 75.0969543f}}}
    204 seg=198 {{{123.199997f, 75.0969543f}, {123.480431f, 75.0815277f}, {123.760864f, 75.060524f}, {124.041298f, 75.0395203f}}}
    205 seg=199 {{{124.041298f, 75.0395203f}, {124.494202f, 75.0056076f}, {124.947098f, 74.9716949f}, {125.400002f, 74.9612503f}}}
    206 seg=200 {{{125.400002f, 74.9612503f}, {126.133331f, 74.9443436f}, {126.866669f, 74.9602585f}, {127.599998f, 74.9955215f}}}
    207 seg=201 {{{127.599998f, 74.9955215f}, {128.17691f, 75.023262f}, {128.75383f, 75.0766068f}, {129.33075f, 75.1299438f}}}
    208 seg=202 {{{129.33075f, 75.1299438f}, {129.487167f, 75.1444092f}, {129.643585f, 75.1588745f}, {129.800003f, 75.1728287f}}}
    209 seg=203 {{{129.800003f, 75.1728287f}, {130.08493f, 75.1982422f}, {130.369843f, 75.2303619f}, {130.65477f, 75.2624817f}}}
    210 seg=204 {{{130.65477f, 75.2624817f}, {131.10318f, 75.3130264f}, {131.55159f, 75.3635712f}, {132, 75.3879776f}}}
    211 seg=205 {{{132, 75.3879776f}, {132.682098f, 75.4251099f}, {133.364182f, 75.4193726f}, {134.04628f, 75.4136353f}}}
    212 seg=206 {{{134.04628f, 75.4136353f}, {134.199997f, 75.4123535f}}}
    213 seg=207 {{{134.199997f, 75.4123535f}, {134.740479f, 75.4080048f}, {135.28096f, 75.3897247f}, {135.821426f, 75.3714523f}}}
    214 seg=208 {{{135.821426f, 75.3714523f}, {136.014282f, 75.3649292f}, {136.207138f, 75.3584061f}, {136.399994f, 75.3525162f}}}
    215 seg=209 {{{136.399994f, 75.3525162f}, {136.723831f, 75.3426285f}, {137.047668f, 75.3308029f}, {137.371506f, 75.3189697f}}}
    216 seg=210 {{{137.371506f, 75.3189697f}, {137.781006f, 75.3040085f}, {138.190506f, 75.2890472f}, {138.600006f, 75.2780228f}}}
    217 seg=211 {{{138.600006f, 75.2780228f}, {138.775055f, 75.2733078f}, {138.950119f, 75.2678604f}, {139.125183f, 75.262413f}}}
    218 seg=212 {{{139.125183f, 75.262413f}, {139.683456f, 75.2450409f}, {140.24173f, 75.2276688f}, {140.800003f, 75.2340317f}}}
    219 seg=213 {{{140.800003f, 75.2340317f}, {141.173523f, 75.2382889f}, {141.547028f, 75.259819f}, {141.920547f, 75.2813568f}}}
    220 seg=214 {{{141.920547f, 75.2813568f}, {142.280365f, 75.3021011f}, {142.640182f, 75.3228455f}, {143, 75.3281403f}}}
    221 seg=215 {{{143, 75.3281403f}, {143.733337f, 75.3389359f}, {144.46666f, 75.3424072f}, {145.199997f, 75.2988205f}}}
    222 seg=216 {{{145.199997f, 75.2988205f}, {145.574966f, 75.276535f}, {145.949936f, 75.2288513f}, {146.32489f, 75.1811676f}}}
    223 seg=217 {{{146.32489f, 75.1811676f}, {146.683258f, 75.1355896f}, {147.041626f, 75.0900192f}, {147.399994f, 75.0666199f}}}
    224 seg=218 {{{147.399994f, 75.0666199f}, {148.133331f, 75.0187454f}, {148.866669f, 74.9981079f}, {149.600006f, 75.0115509f}}}
    225 seg=219 {{{149.600006f, 75.0115509f}, {149.982086f, 75.0185547f}, {150.364182f, 75.0495148f}, {150.746277f, 75.0804749f}}}
    226 seg=220 {{{150.746277f, 75.0804749f}, {151.097519f, 75.1089401f}, {151.448761f, 75.1374054f}, {151.800003f, 75.1472549f}}}
    227 seg=221 {{{151.800003f, 75.1472549f}, {152.343307f, 75.1624985f}, {152.886597f, 75.1531296f}, {153.429901f, 75.1437607f}}}
    228 seg=222 {{{153.429901f, 75.1437607f}, {153.619934f, 75.14048f}, {153.809967f, 75.137207f}, {154, 75.1349792f}}}
    229 seg=223 {{{154, 75.1349792f}, {154.295746f, 75.1315155f}, {154.591476f, 75.123848f}, {154.887222f, 75.1161804f}}}
    230 seg=224 {{{154.887222f, 75.1161804f}, {155.324814f, 75.1048279f}, {155.762405f, 75.0934753f}, {156.199997f, 75.0957642f}}}
    231 seg=225 {{{156.199997f, 75.0957642f}, {156.559143f, 75.097641f}, {156.918289f, 75.1122131f}, {157.27742f, 75.1267853f}}}
    232 seg=226 {{{157.27742f, 75.1267853f}, {157.651611f, 75.1419754f}, {158.025803f, 75.1571655f}, {158.399994f, 75.1579895f}}}
    233 seg=227 {{{158.399994f, 75.1579895f}, {159.133331f, 75.1596069f}, {159.866669f, 75.1515121f}, {160.600006f, 75.105484f}}}
    234 seg=228 {{{160.600006f, 75.105484f}, {160.952393f, 75.0833588f}, {161.304794f, 75.0397339f}, {161.657196f, 74.996109f}}}
    235 seg=229 {{{161.657196f, 74.996109f}, {162.038132f, 74.9489594f}, {162.419067f, 74.9018021f}, {162.800003f, 74.8818054f}}}
    236 seg=230 {{{162.800003f, 74.8818054f}, {163.53334f, 74.8433075f}, {164.266663f, 74.8363724f}, {165, 74.8744736f}}}
    237 seg=231 {{{165, 74.8744736f}, {165.356293f, 74.8929825f}, {165.712585f, 74.9419861f}, {166.068878f, 74.9909897f}}}
    238 seg=232 {{{166.068878f, 74.9909897f}, {166.445923f, 75.0428467f}, {166.822952f, 75.0947037f}, {167.199997f, 75.1104279f}}}
    239 seg=233 {{{167.199997f, 75.1104279f}, {167.933334f, 75.1409988f}, {168.666672f, 75.1096573f}, {169.399994f, 75.0579224f}}}
    240 seg=234 {{{169.399994f, 75.0579224f}, {169.752808f, 75.0330276f}, {170.105621f, 74.982338f}, {170.458435f, 74.9316483f}}}
    241 seg=235 {{{170.458435f, 74.9316483f}, {170.838959f, 74.8769836f}, {171.219482f, 74.8223114f}, {171.600006f, 74.8000031f}}}
    242 seg=236 {{{171.600006f, 74.8000031f}, {172.333328f, 74.757019f}, {173.066666f, 74.7623062f}, {173.800003f, 74.8000031f}}}
    243 seg=237 {{{173.800003f, 74.8000031f}, {174.500809f, 74.8360367f}, {175.201599f, 74.9249344f}, {175.902405f, 75.0138397f}}}
    244 seg=238 {{{175.902405f, 75.0138397f}, {176, 75.0262146f}}}
    245 seg=239 {{{176, 75.0262146f}, {176.306427f, 75.0650406f}, {176.612839f, 75.1189728f}, {176.919266f, 75.1729126f}}}
    246 seg=240 {{{176.919266f, 75.1729126f}, {177.346176f, 75.2480545f}, {177.773087f, 75.3231964f}, {178.199997f, 75.3574677f}}}
    247 seg=241 {{{178.199997f, 75.3574677f}, {178.933334f, 75.4163361f}, {179.666672f, 75.4057388f}, {180.399994f, 75.3794556f}}}
    248 seg=242 {{{180.399994f, 75.3794556f}, {180.822174f, 75.3643265f}, {181.244354f, 75.322731f}, {181.666534f, 75.2811356f}}}
    249 seg=243 {{{181.666534f, 75.2811356f}, {181.977692f, 75.2504807f}, {182.288849f, 75.2198257f}, {182.600006f, 75.1997681f}}}
    250 seg=244 {{{182.600006f, 75.1997681f}, {183.153549f, 75.1640701f}, {183.707108f, 75.1412506f}, {184.260666f, 75.1184311f}}}
    251 seg=245 {{{184.260666f, 75.1184311f}, {184.440445f, 75.1110229f}, {184.620224f, 75.1036148f}, {184.800003f, 75.0957642f}}}
    252 seg=246 {{{184.800003f, 75.0957642f}, {185.53334f, 75.0637436f}, {186.266663f, 75.0331039f}, {187, 75.0076218f}}}
    253 seg=247 {{{187, 75.0076218f}, {187.218643f, 75.0000229f}, {187.437286f, 74.9894943f}, {187.65593f, 74.9789658f}}}
    254 seg=248 {{{187.65593f, 74.9789658f}, {188.170624f, 74.9541702f}, {188.685303f, 74.9293747f}, {189.199997f, 74.9428329f}}}
    255 seg=249 {{{189.199997f, 74.9428329f}, {189.560562f, 74.9522629f}, {189.921127f, 74.9923019f}, {190.281693f, 75.032341f}}}
    256 seg=250 {{{190.281693f, 75.032341f}, {190.654465f, 75.0737381f}, {191.027237f, 75.1151352f}, {191.399994f, 75.1227036f}}}
    257 seg=251 {{{191.399994f, 75.1227036f}, {191.942627f, 75.1337204f}, {192.48526f, 75.0998383f}, {193.027893f, 75.0659485f}}}
    258 seg=252 {{{193.027893f, 75.0659485f}, {193.218597f, 75.054039f}, {193.409302f, 75.0421295f}, {193.600006f, 75.0321732f}}}
    259 seg=253 {{{193.600006f, 75.0321732f}, {193.897125f, 75.016655f}, {194.19426f, 74.9936142f}, {194.491394f, 74.9705658f}}}
    260 seg=254 {{{194.491394f, 74.9705658f}, {194.927597f, 74.9367371f}, {195.3638f, 74.9029083f}, {195.800003f, 74.8928909f}}}
    261 seg=255 {{{195.800003f, 74.8928909f}, {196.363327f, 74.8799515f}, {196.926636f, 74.8978424f}, {197.48996f, 74.9157333f}}}
    262 seg=256 {{{197.48996f, 74.9157333f}, {197.659973f, 74.9211349f}, {197.829987f, 74.9265366f}, {198, 74.9310913f}}}
    263 seg=257 {{{198, 74.9310913f}, {198.539948f, 74.945549f}, {199.07988f, 74.9668427f}, {199.619827f, 74.9881363f}}}
    264 seg=258 {{{199.619827f, 74.9881363f}, {199.813217f, 74.9957657f}, {200.006607f, 75.0033951f}, {200.199997f, 75.0107117f}}}
    265 seg=259 {{{200.199997f, 75.0107117f}, {200.468765f, 75.020874f}, {200.737534f, 75.032814f}, {201.006287f, 75.0447464f}}}
    266 seg=260 {{{201.006287f, 75.0447464f}, {201.470856f, 75.0653763f}, {201.935425f, 75.0860062f}, {202.399994f, 75.0974884f}}}
    267 seg=261 {{{202.399994f, 75.0974884f}, {202.888885f, 75.1095734f}, {203.377777f, 75.1120605f}, {203.866669f, 75.1145554f}}}
    268 seg=262 {{{203.866669f, 75.1145554f}, {204.111115f, 75.115799f}, {204.35556f, 75.1170425f}, {204.600006f, 75.1194839f}}}
    269 seg=263 {{{204.600006f, 75.1194839f}, {204.84462f, 75.121933f}, {205.089233f, 75.1239471f}, {205.333847f, 75.1259613f}}}
    270 seg=264 {{{205.333847f, 75.1259613f}, {205.822556f, 75.129982f}, {206.311279f, 75.1340103f}, {206.800003f, 75.1414719f}}}
    271 seg=265 {{{206.800003f, 75.1414719f}, {207.53334f, 75.1526718f}, {208.266663f, 75.1675339f}, {209, 75.1866531f}}}
    272 seg=266 {{{209, 75.1866531f}, {209.350708f, 75.1957932f}, {209.701416f, 75.2080078f}, {210.052124f, 75.2202225f}}}
    273 seg=267 {{{210.052124f, 75.2202225f}, {210.434753f, 75.2335434f}, {210.817368f, 75.2468643f}, {211.199997f, 75.2562027f}}}
    274 seg=268 {{{211.199997f, 75.2562027f}, {211.933334f, 75.2741013f}, {212.666672f, 75.2871475f}, {213.399994f, 75.2940521f}}}
    275 seg=269 {{{213.399994f, 75.2940521f}, {214.133331f, 75.3009567f}, {214.866669f, 75.3041916f}, {215.600006f, 75.2976303f}}}
    276 seg=270 {{{215.600006f, 75.2976303f}, {216.076187f, 75.2933655f}, {216.552383f, 75.2823792f}, {217.02858f, 75.2713928f}}}
    277 seg=271 {{{217.02858f, 75.2713928f}, {217.285721f, 75.2654572f}, {217.542862f, 75.2595291f}, {217.800003f, 75.2546539f}}}
    278 seg=272 {{{217.800003f, 75.2546539f}, {218.041779f, 75.2500763f}, {218.283554f, 75.2413101f}, {218.52533f, 75.2325439f}}}
    279 seg=273 {{{218.52533f, 75.2325439f}, {219.016891f, 75.2147217f}, {219.508438f, 75.1968994f}, {220, 75.2142487f}}}
    280 seg=274 {{{220, 75.2142487f}, {220.409988f, 75.2287216f}, {220.819977f, 75.2736588f}, {221.229965f, 75.3185959f}}}
    281 seg=275 {{{221.229965f, 75.3185959f}, {221.553314f, 75.3540344f}, {221.876648f, 75.389473f}, {222.199997f, 75.4099731f}}}
    282 seg=276 {{{222.199997f, 75.4099731f}, {222.933334f, 75.456459f}, {223.666672f, 75.4962387f}, {224.399994f, 75.4931717f}}}
    283 seg=277 {{{224.399994f, 75.4931717f}, {224.885803f, 75.4911423f}, {225.371613f, 75.4618988f}, {225.857422f, 75.4326553f}}}
    284 seg=278 {{{225.857422f, 75.4326553f}, {226.10495f, 75.4177551f}, {226.352478f, 75.4028549f}, {226.600006f, 75.3915558f}}}
    285 seg=279 {{{226.600006f, 75.3915558f}, {226.839722f, 75.3806152f}, {227.079437f, 75.3675385f}, {227.319153f, 75.354454f}}}
    286 seg=280 {{{227.319153f, 75.354454f}, {227.812759f, 75.3275223f}, {228.306381f, 75.3005905f}, {228.800003f, 75.2923279f}}}
    287 seg=281 {{{228.800003f, 75.2923279f}, {229.309921f, 75.2837906f}, {229.819824f, 75.2945709f}, {230.329742f, 75.3053513f}}}
    288 seg=282 {{{230.329742f, 75.3053513f}, {230.553162f, 75.3100739f}, {230.776581f, 75.3147964f}, {231, 75.317894f}}}
    289 seg=283 {{{231, 75.317894f}, {231.290405f, 75.3219223f}, {231.580811f, 75.3275833f}, {231.871216f, 75.333252f}}}
    290 seg=284 {{{231.871216f, 75.333252f}, {232.314148f, 75.3418884f}, {232.757065f, 75.3505249f}, {233.199997f, 75.3533554f}}}
    291 seg=285 {{{233.199997f, 75.3533554f}, {233.933334f, 75.3580399f}, {234.666672f, 75.3606873f}, {235.399994f, 75.3460236f}}}
    292 seg=286 {{{235.399994f, 75.3460236f}, {235.845032f, 75.3371277f}, {236.29007f, 75.3182449f}, {236.735107f, 75.2993622f}}}
    293 seg=287 {{{236.735107f, 75.2993622f}, {237.023407f, 75.2871323f}, {237.311707f, 75.2749023f}, {237.600006f, 75.2653885f}}}
    294 seg=288 {{{237.600006f, 75.2653885f}, {238.333328f, 75.2411804f}, {239.066666f, 75.2196732f}, {239.800003f, 75.2007828f}}}
    295 seg=289 {{{239.800003f, 75.2007828f}, {240.082169f, 75.193512f}, {240.364334f, 75.1891708f}, {240.6465f, 75.1848297f}}}
    296 seg=290 {{{240.6465f, 75.1848297f}, {241.097672f, 75.177887f}, {241.548828f, 75.1709366f}, {242, 75.1520233f}}}
    297 seg=291 {{{242, 75.1520233f}, {242.416458f, 75.1345673f}, {242.832916f, 75.1057968f}, {243.249374f, 75.0770187f}}}
    298 seg=292 {{{243.249374f, 75.0770187f}, {243.566254f, 75.0551224f}, {243.883118f, 75.033226f}, {244.199997f, 75.0163193f}}}
    299 seg=293 {{{244.199997f, 75.0163193f}, {244.933334f, 74.9771957f}, {245.666672f, 74.9453659f}, {246.399994f, 74.9172668f}}}
    300 seg=294 {{{246.399994f, 74.9172668f}, {247.133331f, 74.8891678f}, {247.866669f, 74.8672562f}, {248.600006f, 74.8477097f}}}
    301 seg=295 {{{248.600006f, 74.8477097f}, {248.714218f, 74.8446655f}}}
    302 seg=296 {{{248.714218f, 74.8446655f}, {249.40947f, 74.8261032f}, {250.104736f, 74.8075485f}, {250.800003f, 74.8000031f}}}
    303 seg=297 {{{250.800003f, 74.8000031f}, {251.288895f, 74.7947006f}, {251.777771f, 74.7964706f}, {252.266663f, 74.798233f}}}
    304 seg=298 {{{252.266663f, 74.798233f}, {252.511108f, 74.799118f}, {252.755554f, 74.8000031f}, {253, 74.8000031f}}}
    305 seg=299 {{{253, 74.8000031f}, {68.1999969f, 74.8000031f}}}
    306 debugShowCubicIntersection wtTs[0]=1 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.8039017}, {68.9333344,74.8078003}}} {{68.9333344,74.8078003}} wnTs[0]=0 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}}
    307 debugShowCubicLineIntersection wtTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.8039017}, {68.9333344,74.8078003}}} {{68.1999969,74.8000031}} wnTs[0]=1 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    308 debugShowCubicIntersection wtTs[0]=1 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}}
    309 debugShowCubicLineIntersection wtTs[0]=1 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    310 SkOpSegment::addT insert t=0.988095214 segID=150 spanID=599
    311 debugShowCubicIntersection wtTs[0]=1 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}} {{71.5388947,74.6926956}} wnTs[0]=0 {{{71.5388947,74.6926956}, {71.8925934,74.6511688}, {72.2462997,74.609642}, {72.5999985,74.5894699}}}
    312 debugShowCubicLineIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    313 debugShowCubicIntersection wtTs[0]=1 {{{71.5388947,74.6926956}, {71.8925934,74.6511688}, {72.2462997,74.609642}, {72.5999985,74.5894699}}} {{72.5999985,74.5894699}} wnTs[0]=0 {{{72.5999985,74.5894699}, {73.1301117,74.5592346}, {73.6602249,74.5564957}, {74.1903381,74.5537567}}}
    314 debugShowCubicIntersection wtTs[0]=1 {{{72.5999985,74.5894699}, {73.1301117,74.5592346}, {73.6602249,74.5564957}, {74.1903381,74.5537567}}} {{74.1903381,74.5537567}} wnTs[0]=0 {{{74.1903381,74.5537567}, {74.3935623,74.5527115}, {74.5967789,74.5516663}, {74.8000031,74.5490646}}}
    315 debugShowCubicIntersection wtTs[0]=1 {{{74.1903381,74.5537567}, {74.3935623,74.5527115}, {74.5967789,74.5516663}, {74.8000031,74.5490646}}} {{74.8000031,74.5490646}} wnTs[0]=0 {{{74.8000031,74.5490646}, {75.0211792,74.5462341}, {75.242363,74.5398636}, {75.4635391,74.5335007}}}
    316 debugShowCubicIntersection wtTs[0]=1 {{{74.8000031,74.5490646}, {75.0211792,74.5462341}, {75.242363,74.5398636}, {75.4635391,74.5335007}}} {{75.4635391,74.5335007}} wnTs[0]=0 {{{75.4635391,74.5335007}, {75.9756927,74.5187607}, {76.4878464,74.5040207}, {77,74.5332108}}}
    317 debugShowCubicIntersection wtTs[0]=1 {{{75.4635391,74.5335007}, {75.9756927,74.5187607}, {76.4878464,74.5040207}, {77,74.5332108}}} {{77,74.5332108}} wnTs[0]=0 {{{77,74.5332108}, {77.3702316,74.5543137}, {77.7404709,74.610733}, {78.1107025,74.66716}}}
    318 debugShowCubicIntersection wtTs[0]=1 {{{77,74.5332108}, {77.3702316,74.5543137}, {77.7404709,74.610733}, {78.1107025,74.66716}}} {{78.1107025,74.66716}} wnTs[0]=0 {{{78.1107025,74.66716}, {78.4738007,74.722496}, {78.8368988,74.777832}, {79.1999969,74.7998505}}}
    319 debugShowCubicIntersection wtTs[0]=1 {{{78.1107025,74.66716}, {78.4738007,74.722496}, {78.8368988,74.777832}, {79.1999969,74.7998505}}} {{79.1999969,74.7998505}} wnTs[0]=0 {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}}
    320 debugShowCubicIntersection wtTs[0]=1 {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{80.6670074,74.8098221}} wnTs[0]=0 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}}
    321 debugShowCubicLineIntersection wtTs[0]=0.0017190524 {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{79.2025223,74.8000031}} wnTs[0]=0.940463 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    322 SkOpSegment::addT insert t=0.0017190524 segID=11 spanID=600
    323 SkOpSegment::addT insert t=0.940462545 segID=150 spanID=601
    324 debugShowCubicIntersection wtTs[0]=1 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{81.4000015,74.8000031}} wnTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}}
    325 debugShowCubicLineIntersection wtTs[0]=0.99844881 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{81.3988647,74.8000031}} wtTs[1]=1 {{81.4000015,74.8000031}} wnTs[0]=0.928578 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.928571405
    326 SkOpSegment::addT insert t=0.99844881 segID=12 spanID=602
    327 SkOpSegment::addT insert t=0.928577558 segID=150 spanID=603
    328 SkOpSegment::addT insert t=0.928571405 segID=150 spanID=604
    329 debugShowCubicIntersection wtTs[0]=1 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{82.1315613,74.8021164}} wnTs[0]=0 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}}
    330 debugShowCubicLineIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{81.4000015,74.8000031}} wnTs[0]=0.928571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    331 debugShowCubicIntersection wtTs[0]=1 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}}
    332 debugShowCubicLineIntersection wtTs[0]=1 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    333 SkOpSegment::addT insert t=0.91666666 segID=150 spanID=605
    334 debugShowCubicIntersection wtTs[0]=1 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}} {{84.5777359,74.7722931}} wnTs[0]=0 {{{84.5777359,74.7722931}, {84.9851608,74.7576141}, {85.3925781,74.7429352}, {85.8000031,74.7429352}}}
    335 debugShowCubicLineIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    336 debugShowCubicIntersection wtTs[0]=1 {{{84.5777359,74.7722931}, {84.9851608,74.7576141}, {85.3925781,74.7429352}, {85.8000031,74.7429352}}} {{85.8000031,74.7429352}} wnTs[0]=0 {{{85.8000031,74.7429352}, {86.2074203,74.7429352}, {86.6148453,74.7576141}, {87.0222626,74.7722931}}}
    337 debugShowCubicIntersection wtTs[0]=1 {{{85.8000031,74.7429352}, {86.2074203,74.7429352}, {86.6148453,74.7576141}, {87.0222626,74.7722931}}} {{87.0222626,74.7722931}} wnTs[0]=0 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}}
    338 debugShowCubicIntersection wtTs[0]=1 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}}
    339 debugShowCubicLineIntersection wtTs[0]=1 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    340 SkOpSegment::addT insert t=0.892857128 segID=150 spanID=606
    341 debugShowCubicIntersection wtTs[0]=1 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{88.4729385,74.8077316}} wnTs[0]=0 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}}
    342 debugShowCubicLineIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    343 debugShowCubicIntersection wtTs[0]=1 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}}
    344 debugShowCubicLineIntersection wtTs[0]=1 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    345 SkOpSegment::addT insert t=0.880952383 segID=150 spanID=607
    346 debugShowCubicIntersection wtTs[0]=1 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}} {{91.2861557,74.6918182}} wnTs[0]=0 {{{91.2861557,74.6918182}, {91.6574402,74.6455307}, {92.028717,74.5992432}, {92.4000015,74.5823135}}}
    347 debugShowCubicLineIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    348 debugShowCubicIntersection wtTs[0]=1 {{{91.2861557,74.6918182}, {91.6574402,74.6455307}, {92.028717,74.5992432}, {92.4000015,74.5823135}}} {{92.4000015,74.5823135}} wnTs[0]=0 {{{92.4000015,74.5823135}, {92.9111481,74.5590057}, {93.4223022,74.5721283}, {93.9334488,74.5852509}}}
    349 debugShowCubicIntersection wtTs[0]=1 {{{92.4000015,74.5823135}, {92.9111481,74.5590057}, {93.4223022,74.5721283}, {93.9334488,74.5852509}}} {{93.9334488,74.5852509}} wnTs[0]=0 {{{93.9334488,74.5852509}, {94.155632,74.59095}, {94.3778152,74.5966568}, {94.5999985,74.5993652}}}
    350 debugShowCubicIntersection wtTs[0]=1 {{{93.9334488,74.5852509}, {94.155632,74.59095}, {94.3778152,74.5966568}, {94.5999985,74.5993652}}} {{94.5999985,74.5993652}} wnTs[0]=0 {{{94.5999985,74.5993652}, {94.8669891,74.602623}, {95.1339798,74.6110153}, {95.4009705,74.6194}}}
    351 debugShowCubicIntersection wtTs[0]=1 {{{94.5999985,74.5993652}, {94.8669891,74.602623}, {95.1339798,74.6110153}, {95.4009705,74.6194}}} {{95.4009705,74.6194}} wnTs[0]=0 {{{95.4009705,74.6194}, {95.8673172,74.6340485}, {96.3336563,74.6486969}, {96.8000031,74.6360168}}}
    352 debugShowCubicIntersection wtTs[0]=1 {{{95.4009705,74.6194}, {95.8673172,74.6340485}, {96.3336563,74.6486969}, {96.8000031,74.6360168}}} {{96.8000031,74.6360168}} wnTs[0]=0 {{{96.8000031,74.6360168}, {97.2396164,74.624054}, {97.6792297,74.5860596}, {98.1188431,74.5480652}}}
    353 debugShowCubicIntersection wtTs[0]=1 {{{96.8000031,74.6360168}, {97.2396164,74.624054}, {97.6792297,74.5860596}, {98.1188431,74.5480652}}} {{98.1188431,74.5480652}} wnTs[0]=0 {{{98.1188431,74.5480652}, {98.4125595,74.5226822}, {98.7062836,74.4972992}, {99,74.4796829}}}
    354 debugShowCubicIntersection wtTs[0]=1 {{{98.1188431,74.5480652}, {98.4125595,74.5226822}, {98.7062836,74.4972992}, {99,74.4796829}}} {{99,74.4796829}} wnTs[0]=0 {{{99,74.4796829}, {99.7333298,74.4356995}, {100.466667,74.3924866}, {101.199997,74.3721085}}}
    355 debugShowCubicIntersection wtTs[0]=1 {{{99,74.4796829}, {99.7333298,74.4356995}, {100.466667,74.3924866}, {101.199997,74.3721085}}} {{101.199997,74.3721085}} wnTs[0]=0 {{{101.199997,74.3721085}, {101.6632,74.3592453}, {102.126396,74.3594589}, {102.5896,74.3596725}}}
    356 debugShowCubicIntersection wtTs[0]=1 {{{101.199997,74.3721085}, {101.6632,74.3592453}, {102.126396,74.3594589}, {102.5896,74.3596725}}} {{102.5896,74.3596725}} wnTs[0]=0 {{{102.5896,74.3596725}, {102.859734,74.3597946}, {103.129868,74.3599167}, {103.400002,74.3574448}}}
    357 debugShowCubicIntersection wtTs[0]=1 {{{102.5896,74.3596725}, {102.859734,74.3597946}, {103.129868,74.3599167}, {103.400002,74.3574448}}} {{103.400002,74.3574448}} wnTs[0]=0 {{{103.400002,74.3574448}, {103.499123,74.3565369}, {103.598244,74.3556519}, {103.697365,74.3547668}}}
    358 debugShowCubicIntersection wtTs[0]=1 {{{103.400002,74.3574448}, {103.499123,74.3565369}, {103.598244,74.3556519}, {103.697365,74.3547668}}} {{103.697365,74.3547668}} wnTs[0]=0 {{{103.697365,74.3547668}, {104.331573,74.3491211}, {104.96579,74.3434753}, {105.599998,74.3318787}}}
    359 debugShowCubicIntersection wtTs[0]=1 {{{103.697365,74.3547668}, {104.331573,74.3491211}, {104.96579,74.3434753}, {105.599998,74.3318787}}} {{105.599998,74.3318787}} wnTs[0]=0 {{{105.599998,74.3318787}, {105.951164,74.3254547}, {106.30233,74.3153458}, {106.653496,74.3052368}}}
    360 debugShowCubicIntersection wtTs[0]=1 {{{105.599998,74.3318787}, {105.951164,74.3254547}, {106.30233,74.3153458}, {106.653496,74.3052368}}} {{106.653496,74.3052368}} wnTs[0]=0 {{{106.653496,74.3052368}, {107.035667,74.2942352}, {107.417831,74.2832336}, {107.800003,74.2769852}}}
    361 debugShowCubicIntersection wtTs[0]=1 {{{106.653496,74.3052368}, {107.035667,74.2942352}, {107.417831,74.2832336}, {107.800003,74.2769852}}} {{107.800003,74.2769852}} wnTs[0]=0 {{{107.800003,74.2769852}, {107.904305,74.2752838}, {108.008606,74.2734833}, {108.112907,74.2716827}}}
    362 debugShowCubicIntersection wtTs[0]=1 {{{107.800003,74.2769852}, {107.904305,74.2752838}, {108.008606,74.2734833}, {108.112907,74.2716827}}} {{108.112907,74.2716827}} wnTs[0]=0 {{{108.112907,74.2716827}, {108.741936,74.2608261}, {109.370972,74.2499771}, {110,74.2599411}}}
    363 debugShowCubicIntersection wtTs[0]=1 {{{108.112907,74.2716827}, {108.741936,74.2608261}, {109.370972,74.2499771}, {110,74.2599411}}} {{110,74.2599411}} wnTs[0]=0 {{{110,74.2599411}, {110.73333,74.2715607}, {111.466667,74.3080215}, {112.199997,74.3467178}}}
    364 debugShowCubicIntersection wtTs[0]=1 {{{110,74.2599411}, {110.73333,74.2715607}, {111.466667,74.3080215}, {112.199997,74.3467178}}} {{112.199997,74.3467178}} wnTs[0]=0 {{{112.199997,74.3467178}, {112.524193,74.3638306}, {112.848389,74.3887024}, {113.172585,74.4135742}}}
    365 debugShowCubicIntersection wtTs[0]=1 {{{112.199997,74.3467178}, {112.524193,74.3638306}, {112.848389,74.3887024}, {113.172585,74.4135742}}} {{113.172585,74.4135742}} wnTs[0]=0 {{{113.172585,74.4135742}, {113.581726,74.4449615}, {113.99086,74.4763565}, {114.400002,74.4921417}}}
    366 debugShowCubicIntersection wtTs[0]=1 {{{113.172585,74.4135742}, {113.581726,74.4449615}, {113.99086,74.4763565}, {114.400002,74.4921417}}} {{114.400002,74.4921417}} wnTs[0]=0 {{{114.400002,74.4921417}, {115.133331,74.5204391}, {115.866669,74.5265198}, {116.599998,74.5165176}}}
    367 debugShowCubicIntersection wtTs[0]=1 {{{114.400002,74.4921417}, {115.133331,74.5204391}, {115.866669,74.5265198}, {116.599998,74.5165176}}} {{116.599998,74.5165176}} wnTs[0]=0 {{{116.599998,74.5165176}, {117.013039,74.5108871}, {117.426071,74.4911652}, {117.839111,74.4714432}}}
    368 debugShowCubicIntersection wtTs[0]=1 {{{116.599998,74.5165176}, {117.013039,74.5108871}, {117.426071,74.4911652}, {117.839111,74.4714432}}} {{117.839111,74.4714432}} wnTs[0]=0 {{{117.839111,74.4714432}, {118.159409,74.4561462}, {118.479706,74.4408493}, {118.800003,74.4321289}}}
    369 debugShowCubicIntersection wtTs[0]=1 {{{117.839111,74.4714432}, {118.159409,74.4561462}, {118.479706,74.4408493}, {118.800003,74.4321289}}} {{118.800003,74.4321289}} wnTs[0]=0 {{{118.800003,74.4321289}, {118.915619,74.428978}, {119.031235,74.4256439}, {119.146851,74.4223099}}}
    370 debugShowCubicIntersection wtTs[0]=1 {{{118.800003,74.4321289}, {118.915619,74.428978}, {119.031235,74.4256439}, {119.146851,74.4223099}}} {{119.146851,74.4223099}} wnTs[0]=0 {{{119.146851,74.4223099}, {119.764565,74.4045105}, {120.382286,74.3867035}, {121,74.3966675}}}
    371 debugShowCubicIntersection wtTs[0]=1 {{{119.146851,74.4223099}, {119.764565,74.4045105}, {120.382286,74.3867035}, {121,74.3966675}}} {{121,74.3966675}} wnTs[0]=0 {{{121,74.3966675}, {121.552635,74.405571}, {122.105278,74.4385529}, {122.657913,74.4715347}}}
    372 debugShowCubicIntersection wtTs[0]=1 {{{121,74.3966675}, {121.552635,74.405571}, {122.105278,74.4385529}, {122.657913,74.4715347}}} {{122.657913,74.4715347}} wnTs[0]=0 {{{122.657913,74.4715347}, {122.838608,74.4823227}, {123.019302,74.4931107}, {123.199997,74.5030518}}}
    373 debugShowCubicIntersection wtTs[0]=1 {{{122.657913,74.4715347}, {122.838608,74.4823227}, {123.019302,74.4931107}, {123.199997,74.5030518}}} {{123.199997,74.5030518}} wnTs[0]=0 {{{123.199997,74.5030518}, {123.480431,74.5184784}, {123.760864,74.5394821}, {124.041298,74.5604858}}}
    374 debugShowCubicIntersection wtTs[0]=1 {{{123.199997,74.5030518}, {123.480431,74.5184784}, {123.760864,74.5394821}, {124.041298,74.5604858}}} {{124.041298,74.5604858}} wnTs[0]=0 {{{124.041298,74.5604858}, {124.494202,74.5943985}, {124.947098,74.6283112}, {125.400002,74.6387558}}}
    375 debugShowCubicIntersection wtTs[0]=1 {{{124.041298,74.5604858}, {124.494202,74.5943985}, {124.947098,74.6283112}, {125.400002,74.6387558}}} {{125.400002,74.6387558}} wnTs[0]=0 {{{125.400002,74.6387558}, {126.133331,74.6556625}, {126.866669,74.6397476}, {127.599998,74.6044846}}}
    376 debugShowCubicIntersection wtTs[0]=1 {{{125.400002,74.6387558}, {126.133331,74.6556625}, {126.866669,74.6397476}, {127.599998,74.6044846}}} {{127.599998,74.6044846}} wnTs[0]=0 {{{127.599998,74.6044846}, {128.17691,74.5767441}, {128.75383,74.5233994}, {129.33075,74.4700623}}}
    377 debugShowCubicIntersection wtTs[0]=1 {{{127.599998,74.6044846}, {128.17691,74.5767441}, {128.75383,74.5233994}, {129.33075,74.4700623}}} {{129.33075,74.4700623}} wnTs[0]=0 {{{129.33075,74.4700623}, {129.487167,74.4555969}, {129.643585,74.4411316}, {129.800003,74.4271774}}}
    378 debugShowCubicIntersection wtTs[0]=1 {{{129.33075,74.4700623}, {129.487167,74.4555969}, {129.643585,74.4411316}, {129.800003,74.4271774}}} {{129.800003,74.4271774}} wnTs[0]=0 {{{129.800003,74.4271774}, {130.08493,74.4017639}, {130.369843,74.3696442}, {130.65477,74.3375244}}}
    379 debugShowCubicIntersection wtTs[0]=1 {{{129.800003,74.4271774}, {130.08493,74.4017639}, {130.369843,74.3696442}, {130.65477,74.3375244}}} {{130.65477,74.3375244}} wnTs[0]=0 {{{130.65477,74.3375244}, {131.10318,74.2869797}, {131.55159,74.2364349}, {132,74.2120285}}}
    380 debugShowCubicIntersection wtTs[0]=1 {{{130.65477,74.3375244}, {131.10318,74.2869797}, {131.55159,74.2364349}, {132,74.2120285}}} {{132,74.2120285}} wnTs[0]=0 {{{132,74.2120285}, {132.682098,74.1748962}, {133.364182,74.1806335}, {134.04628,74.1863708}}}
    381 debugShowCubicLineIntersection wtTs[0]=1 {{{132,74.2120285}, {132.682098,74.1748962}, {133.364182,74.1806335}, {134.04628,74.1863708}}} {{134.04628,74.1863708}} wnTs[0]=0 {{{134.04628,74.1863708}, {134.199997,74.1876526}}}
    382 debugShowCubicLineIntersection wtTs[0]=0 {{{134.199997,74.1876526}, {134.740479,74.1920013}, {135.28096,74.2102814}, {135.821426,74.2285538}}} {{134.199997,74.1876526}} wnTs[0]=1 {{{134.04628,74.1863708}, {134.199997,74.1876526}}}
    383 debugShowCubicIntersection wtTs[0]=1 {{{134.199997,74.1876526}, {134.740479,74.1920013}, {135.28096,74.2102814}, {135.821426,74.2285538}}} {{135.821426,74.2285538}} wnTs[0]=0 {{{135.821426,74.2285538}, {136.014282,74.2350769}, {136.207138,74.2416}, {136.399994,74.2474899}}}
    384 debugShowCubicIntersection wtTs[0]=1 {{{135.821426,74.2285538}, {136.014282,74.2350769}, {136.207138,74.2416}, {136.399994,74.2474899}}} {{136.399994,74.2474899}} wnTs[0]=0 {{{136.399994,74.2474899}, {136.723831,74.2573776}, {137.047668,74.2692032}, {137.371506,74.2810364}}}
    385 debugShowCubicIntersection wtTs[0]=1 {{{136.399994,74.2474899}, {136.723831,74.2573776}, {137.047668,74.2692032}, {137.371506,74.2810364}}} {{137.371506,74.2810364}} wnTs[0]=0 {{{137.371506,74.2810364}, {137.781006,74.2959976}, {138.190506,74.3109589}, {138.600006,74.3219833}}}
    386 debugShowCubicIntersection wtTs[0]=1 {{{137.371506,74.2810364}, {137.781006,74.2959976}, {138.190506,74.3109589}, {138.600006,74.3219833}}} {{138.600006,74.3219833}} wnTs[0]=0 {{{138.600006,74.3219833}, {138.775055,74.3266983}, {138.950119,74.3321457}, {139.125183,74.3375931}}}
    387 debugShowCubicIntersection wtTs[0]=1 {{{138.600006,74.3219833}, {138.775055,74.3266983}, {138.950119,74.3321457}, {139.125183,74.3375931}}} {{139.125183,74.3375931}} wnTs[0]=0 {{{139.125183,74.3375931}, {139.683456,74.3549652}, {140.24173,74.3723373}, {140.800003,74.3659744}}}
    388 debugShowCubicIntersection wtTs[0]=1 {{{139.125183,74.3375931}, {139.683456,74.3549652}, {140.24173,74.3723373}, {140.800003,74.3659744}}} {{140.800003,74.3659744}} wnTs[0]=0 {{{140.800003,74.3659744}, {141.173523,74.3617172}, {141.547028,74.3401871}, {141.920547,74.3186493}}}
    389 debugShowCubicIntersection wtTs[0]=1 {{{140.800003,74.3659744}, {141.173523,74.3617172}, {141.547028,74.3401871}, {141.920547,74.3186493}}} {{141.920547,74.3186493}} wnTs[0]=0 {{{141.920547,74.3186493}, {142.280365,74.297905}, {142.640182,74.2771606}, {143,74.2718658}}}
    390 debugShowCubicIntersection wtTs[0]=1 {{{141.920547,74.3186493}, {142.280365,74.297905}, {142.640182,74.2771606}, {143,74.2718658}}} {{143,74.2718658}} wnTs[0]=0 {{{143,74.2718658}, {143.733337,74.2610703}, {144.46666,74.2575989}, {145.199997,74.3011856}}}
    391 debugShowCubicIntersection wtTs[0]=1 {{{143,74.2718658}, {143.733337,74.2610703}, {144.46666,74.2575989}, {145.199997,74.3011856}}} {{145.199997,74.3011856}} wnTs[0]=0 {{{145.199997,74.3011856}, {145.574966,74.3234711}, {145.949936,74.3711548}, {146.32489,74.4188385}}}
    392 debugShowCubicIntersection wtTs[0]=1 {{{145.199997,74.3011856}, {145.574966,74.3234711}, {145.949936,74.3711548}, {146.32489,74.4188385}}} {{146.32489,74.4188385}} wnTs[0]=0 {{{146.32489,74.4188385}, {146.683258,74.4644165}, {147.041626,74.5099869}, {147.399994,74.5333862}}}
    393 debugShowCubicIntersection wtTs[0]=1 {{{146.32489,74.4188385}, {146.683258,74.4644165}, {147.041626,74.5099869}, {147.399994,74.5333862}}} {{147.399994,74.5333862}} wnTs[0]=0 {{{147.399994,74.5333862}, {148.133331,74.5812607}, {148.866669,74.6018982}, {149.600006,74.5884552}}}
    394 debugShowCubicIntersection wtTs[0]=1 {{{147.399994,74.5333862}, {148.133331,74.5812607}, {148.866669,74.6018982}, {149.600006,74.5884552}}} {{149.600006,74.5884552}} wnTs[0]=0 {{{149.600006,74.5884552}, {149.982086,74.5814514}, {150.364182,74.5504913}, {150.746277,74.5195313}}}
    395 debugShowCubicIntersection wtTs[0]=1 {{{149.600006,74.5884552}, {149.982086,74.5814514}, {150.364182,74.5504913}, {150.746277,74.5195313}}} {{150.746277,74.5195313}} wnTs[0]=0 {{{150.746277,74.5195313}, {151.097519,74.491066}, {151.448761,74.4626007}, {151.800003,74.4527512}}}
    396 debugShowCubicIntersection wtTs[0]=1 {{{150.746277,74.5195313}, {151.097519,74.491066}, {151.448761,74.4626007}, {151.800003,74.4527512}}} {{151.800003,74.4527512}} wnTs[0]=0 {{{151.800003,74.4527512}, {152.343307,74.4375076}, {152.886597,74.4468765}, {153.429901,74.4562454}}}
    397 debugShowCubicIntersection wtTs[0]=1 {{{151.800003,74.4527512}, {152.343307,74.4375076}, {152.886597,74.4468765}, {153.429901,74.4562454}}} {{153.429901,74.4562454}} wnTs[0]=0 {{{153.429901,74.4562454}, {153.619934,74.4595261}, {153.809967,74.4627991}, {154,74.4650269}}}
    398 debugShowCubicIntersection wtTs[0]=1 {{{153.429901,74.4562454}, {153.619934,74.4595261}, {153.809967,74.4627991}, {154,74.4650269}}} {{154,74.4650269}} wnTs[0]=0 {{{154,74.4650269}, {154.295746,74.4684906}, {154.591476,74.4761581}, {154.887222,74.4838257}}}
    399 debugShowCubicIntersection wtTs[0]=1 {{{154,74.4650269}, {154.295746,74.4684906}, {154.591476,74.4761581}, {154.887222,74.4838257}}} {{154.887222,74.4838257}} wnTs[0]=0 {{{154.887222,74.4838257}, {155.324814,74.4951782}, {155.762405,74.5065308}, {156.199997,74.5042419}}}
    400 debugShowCubicIntersection wtTs[0]=1 {{{154.887222,74.4838257}, {155.324814,74.4951782}, {155.762405,74.5065308}, {156.199997,74.5042419}}} {{156.199997,74.5042419}} wnTs[0]=0 {{{156.199997,74.5042419}, {156.559143,74.5023651}, {156.918289,74.487793}, {157.27742,74.4732208}}}
    401 debugShowCubicIntersection wtTs[0]=1 {{{156.199997,74.5042419}, {156.559143,74.5023651}, {156.918289,74.487793}, {157.27742,74.4732208}}} {{157.27742,74.4732208}} wnTs[0]=0 {{{157.27742,74.4732208}, {157.651611,74.4580307}, {158.025803,74.4428406}, {158.399994,74.4420166}}}
    402 debugShowCubicIntersection wtTs[0]=1 {{{157.27742,74.4732208}, {157.651611,74.4580307}, {158.025803,74.4428406}, {158.399994,74.4420166}}} {{158.399994,74.4420166}} wnTs[0]=0 {{{158.399994,74.4420166}, {159.133331,74.4403992}, {159.866669,74.448494}, {160.600006,74.4945221}}}
    403 debugShowCubicIntersection wtTs[0]=1 {{{158.399994,74.4420166}, {159.133331,74.4403992}, {159.866669,74.448494}, {160.600006,74.4945221}}} {{160.600006,74.4945221}} wnTs[0]=0 {{{160.600006,74.4945221}, {160.952393,74.5166473}, {161.304794,74.5602722}, {161.657196,74.6038971}}}
    404 debugShowCubicIntersection wtTs[0]=1 {{{160.600006,74.4945221}, {160.952393,74.5166473}, {161.304794,74.5602722}, {161.657196,74.6038971}}} {{161.657196,74.6038971}} wnTs[0]=0 {{{161.657196,74.6038971}, {162.038132,74.6510468}, {162.419067,74.698204}, {162.800003,74.7182007}}}
    405 debugShowCubicIntersection wtTs[0]=1 {{{161.657196,74.6038971}, {162.038132,74.6510468}, {162.419067,74.698204}, {162.800003,74.7182007}}} {{162.800003,74.7182007}} wnTs[0]=0 {{{162.800003,74.7182007}, {163.53334,74.7566986}, {164.266663,74.7636337}, {165,74.7255325}}}
    406 debugShowCubicIntersection wtTs[0]=1 {{{162.800003,74.7182007}, {163.53334,74.7566986}, {164.266663,74.7636337}, {165,74.7255325}}} {{165,74.7255325}} wnTs[0]=0 {{{165,74.7255325}, {165.356293,74.7070236}, {165.712585,74.65802}, {166.068878,74.6090164}}}
    407 debugShowCubicIntersection wtTs[0]=1 {{{165,74.7255325}, {165.356293,74.7070236}, {165.712585,74.65802}, {166.068878,74.6090164}}} {{166.068878,74.6090164}} wnTs[0]=0 {{{166.068878,74.6090164}, {166.445923,74.5571594}, {166.822952,74.5053024}, {167.199997,74.4895782}}}
    408 debugShowCubicIntersection wtTs[0]=1 {{{166.068878,74.6090164}, {166.445923,74.5571594}, {166.822952,74.5053024}, {167.199997,74.4895782}}} {{167.199997,74.4895782}} wnTs[0]=0 {{{167.199997,74.4895782}, {167.933334,74.4590073}, {168.666672,74.4903488}, {169.399994,74.5420837}}}
    409 debugShowCubicIntersection wtTs[0]=1 {{{167.199997,74.4895782}, {167.933334,74.4590073}, {168.666672,74.4903488}, {169.399994,74.5420837}}} {{169.399994,74.5420837}} wnTs[0]=0 {{{169.399994,74.5420837}, {169.752808,74.5669785}, {170.105621,74.6176682}, {170.458435,74.6683578}}}
    410 debugShowCubicIntersection wtTs[0]=1 {{{169.399994,74.5420837}, {169.752808,74.5669785}, {170.105621,74.6176682}, {170.458435,74.6683578}}} {{170.458435,74.6683578}} wnTs[0]=0 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}}
    411 debugShowCubicIntersection wtTs[0]=1 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}}
    412 debugShowCubicLineIntersection wtTs[0]=1 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    413 SkOpSegment::addT insert t=0.44047615 segID=150 spanID=608
    414 debugShowCubicIntersection wtTs[0]=1 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{173.800003,74.8000031}} wnTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}}
    415 debugShowCubicLineIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wtTs[1]=1 {{173.800003,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.428571405
    416 SkOpSegment::addT insert t=0.428571405 segID=150 spanID=609
    417 debugShowCubicLineIntersection wtTs[0]=1 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}} {{175.902405,74.5861664}} wnTs[0]=0 {{{175.902405,74.5861664}, {176,74.5737915}}}
    418 debugShowCubicLineIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}} {{173.800003,74.8000031}} wnTs[0]=0.428571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    419 debugShowCubicLineIntersection wtTs[0]=0 {{{176,74.5737915}, {176.306427,74.5349655}, {176.612839,74.4810333}, {176.919266,74.4270935}}} {{176,74.5737915}} wnTs[0]=1 {{{175.902405,74.5861664}, {176,74.5737915}}}
    420 debugShowCubicIntersection wtTs[0]=1 {{{176,74.5737915}, {176.306427,74.5349655}, {176.612839,74.4810333}, {176.919266,74.4270935}}} {{176.919266,74.4270935}} wnTs[0]=0 {{{176.919266,74.4270935}, {177.346176,74.3519516}, {177.773087,74.2768097}, {178.199997,74.2425385}}}
    421 debugShowCubicIntersection wtTs[0]=1 {{{176.919266,74.4270935}, {177.346176,74.3519516}, {177.773087,74.2768097}, {178.199997,74.2425385}}} {{178.199997,74.2425385}} wnTs[0]=0 {{{178.199997,74.2425385}, {178.933334,74.18367}, {179.666672,74.1942673}, {180.399994,74.2205505}}}
    422 debugShowCubicIntersection wtTs[0]=1 {{{178.199997,74.2425385}, {178.933334,74.18367}, {179.666672,74.1942673}, {180.399994,74.2205505}}} {{180.399994,74.2205505}} wnTs[0]=0 {{{180.399994,74.2205505}, {180.822174,74.2356796}, {181.244354,74.2772751}, {181.666534,74.3188705}}}
    423 debugShowCubicIntersection wtTs[0]=1 {{{180.399994,74.2205505}, {180.822174,74.2356796}, {181.244354,74.2772751}, {181.666534,74.3188705}}} {{181.666534,74.3188705}} wnTs[0]=0 {{{181.666534,74.3188705}, {181.977692,74.3495255}, {182.288849,74.3801804}, {182.600006,74.400238}}}
    424 debugShowCubicIntersection wtTs[0]=1 {{{181.666534,74.3188705}, {181.977692,74.3495255}, {182.288849,74.3801804}, {182.600006,74.400238}}} {{182.600006,74.400238}} wnTs[0]=0 {{{182.600006,74.400238}, {183.153549,74.435936}, {183.707108,74.4587555}, {184.260666,74.481575}}}
    425 debugShowCubicIntersection wtTs[0]=1 {{{182.600006,74.400238}, {183.153549,74.435936}, {183.707108,74.4587555}, {184.260666,74.481575}}} {{184.260666,74.481575}} wnTs[0]=0 {{{184.260666,74.481575}, {184.440445,74.4889832}, {184.620224,74.4963913}, {184.800003,74.5042419}}}
    426 debugShowCubicIntersection wtTs[0]=1 {{{184.260666,74.481575}, {184.440445,74.4889832}, {184.620224,74.4963913}, {184.800003,74.5042419}}} {{184.800003,74.5042419}} wnTs[0]=0 {{{184.800003,74.5042419}, {185.53334,74.5362625}, {186.266663,74.5669022}, {187,74.5923843}}}
    427 debugShowCubicIntersection wtTs[0]=1 {{{184.800003,74.5042419}, {185.53334,74.5362625}, {186.266663,74.5669022}, {187,74.5923843}}} {{187,74.5923843}} wnTs[0]=0 {{{187,74.5923843}, {187.218643,74.5999832}, {187.437286,74.6105118}, {187.65593,74.6210403}}}
    428 debugShowCubicIntersection wtTs[0]=1 {{{187,74.5923843}, {187.218643,74.5999832}, {187.437286,74.6105118}, {187.65593,74.6210403}}} {{187.65593,74.6210403}} wnTs[0]=0 {{{187.65593,74.6210403}, {188.170624,74.6458359}, {188.685303,74.6706314}, {189.199997,74.6571732}}}
    429 debugShowCubicIntersection wtTs[0]=1 {{{187.65593,74.6210403}, {188.170624,74.6458359}, {188.685303,74.6706314}, {189.199997,74.6571732}}} {{189.199997,74.6571732}} wnTs[0]=0 {{{189.199997,74.6571732}, {189.560562,74.6477432}, {189.921127,74.6077042}, {190.281693,74.5676651}}}
    430 debugShowCubicIntersection wtTs[0]=1 {{{189.199997,74.6571732}, {189.560562,74.6477432}, {189.921127,74.6077042}, {190.281693,74.5676651}}} {{190.281693,74.5676651}} wnTs[0]=0 {{{190.281693,74.5676651}, {190.654465,74.526268}, {191.027237,74.4848709}, {191.399994,74.4773026}}}
    431 debugShowCubicIntersection wtTs[0]=1 {{{190.281693,74.5676651}, {190.654465,74.526268}, {191.027237,74.4848709}, {191.399994,74.4773026}}} {{191.399994,74.4773026}} wnTs[0]=0 {{{191.399994,74.4773026}, {191.942627,74.4662857}, {192.48526,74.5001678}, {193.027893,74.5340576}}}
    432 debugShowCubicIntersection wtTs[0]=1 {{{191.399994,74.4773026}, {191.942627,74.4662857}, {192.48526,74.5001678}, {193.027893,74.5340576}}} {{193.027893,74.5340576}} wnTs[0]=0 {{{193.027893,74.5340576}, {193.218597,74.5459671}, {193.409302,74.5578766}, {193.600006,74.5678329}}}
    433 debugShowCubicIntersection wtTs[0]=1 {{{193.027893,74.5340576}, {193.218597,74.5459671}, {193.409302,74.5578766}, {193.600006,74.5678329}}} {{193.600006,74.5678329}} wnTs[0]=0 {{{193.600006,74.5678329}, {193.897125,74.5833511}, {194.19426,74.6063919}, {194.491394,74.6294403}}}
    434 debugShowCubicIntersection wtTs[0]=1 {{{193.600006,74.5678329}, {193.897125,74.5833511}, {194.19426,74.6063919}, {194.491394,74.6294403}}} {{194.491394,74.6294403}} wnTs[0]=0 {{{194.491394,74.6294403}, {194.927597,74.663269}, {195.3638,74.6970978}, {195.800003,74.7071152}}}
    435 debugShowCubicIntersection wtTs[0]=1 {{{194.491394,74.6294403}, {194.927597,74.663269}, {195.3638,74.6970978}, {195.800003,74.7071152}}} {{195.800003,74.7071152}} wnTs[0]=0 {{{195.800003,74.7071152}, {196.363327,74.7200546}, {196.926636,74.7021637}, {197.48996,74.6842728}}}
    436 debugShowCubicIntersection wtTs[0]=1 {{{195.800003,74.7071152}, {196.363327,74.7200546}, {196.926636,74.7021637}, {197.48996,74.6842728}}} {{197.48996,74.6842728}} wnTs[0]=0 {{{197.48996,74.6842728}, {197.659973,74.6788712}, {197.829987,74.6734695}, {198,74.6689148}}}
    437 debugShowCubicIntersection wtTs[0]=1 {{{197.48996,74.6842728}, {197.659973,74.6788712}, {197.829987,74.6734695}, {198,74.6689148}}} {{198,74.6689148}} wnTs[0]=0 {{{198,74.6689148}, {198.539948,74.6544571}, {199.07988,74.6331635}, {199.619827,74.6118698}}}
    438 debugShowCubicIntersection wtTs[0]=1 {{{198,74.6689148}, {198.539948,74.6544571}, {199.07988,74.6331635}, {199.619827,74.6118698}}} {{199.619827,74.6118698}} wnTs[0]=0 {{{199.619827,74.6118698}, {199.813217,74.6042404}, {200.006607,74.596611}, {200.199997,74.5892944}}}
    439 debugShowCubicIntersection wtTs[0]=1 {{{199.619827,74.6118698}, {199.813217,74.6042404}, {200.006607,74.596611}, {200.199997,74.5892944}}} {{200.199997,74.5892944}} wnTs[0]=0 {{{200.199997,74.5892944}, {200.468765,74.5791321}, {200.737534,74.5671921}, {201.006287,74.5552597}}}
    440 debugShowCubicIntersection wtTs[0]=1 {{{200.199997,74.5892944}, {200.468765,74.5791321}, {200.737534,74.5671921}, {201.006287,74.5552597}}} {{201.006287,74.5552597}} wnTs[0]=0 {{{201.006287,74.5552597}, {201.470856,74.5346298}, {201.935425,74.5139999}, {202.399994,74.5025177}}}
    441 debugShowCubicIntersection wtTs[0]=1 {{{201.006287,74.5552597}, {201.470856,74.5346298}, {201.935425,74.5139999}, {202.399994,74.5025177}}} {{202.399994,74.5025177}} wnTs[0]=0 {{{202.399994,74.5025177}, {202.888885,74.4904327}, {203.377777,74.4879456}, {203.866669,74.4854507}}}
    442 debugShowCubicIntersection wtTs[0]=1 {{{202.399994,74.5025177}, {202.888885,74.4904327}, {203.377777,74.4879456}, {203.866669,74.4854507}}} {{203.866669,74.4854507}} wnTs[0]=0 {{{203.866669,74.4854507}, {204.111115,74.4842072}, {204.35556,74.4829636}, {204.600006,74.4805222}}}
    443 debugShowCubicIntersection wtTs[0]=1 {{{203.866669,74.4854507}, {204.111115,74.4842072}, {204.35556,74.4829636}, {204.600006,74.4805222}}} {{204.600006,74.4805222}} wnTs[0]=0 {{{204.600006,74.4805222}, {204.84462,74.4780731}, {205.089233,74.476059}, {205.333847,74.4740448}}}
    444 debugShowCubicIntersection wtTs[0]=1 {{{204.600006,74.4805222}, {204.84462,74.4780731}, {205.089233,74.476059}, {205.333847,74.4740448}}} {{205.333847,74.4740448}} wnTs[0]=0 {{{205.333847,74.4740448}, {205.822556,74.4700241}, {206.311279,74.4659958}, {206.800003,74.4585342}}}
    445 debugShowCubicIntersection wtTs[0]=1 {{{205.333847,74.4740448}, {205.822556,74.4700241}, {206.311279,74.4659958}, {206.800003,74.4585342}}} {{206.800003,74.4585342}} wnTs[0]=0 {{{206.800003,74.4585342}, {207.53334,74.4473343}, {208.266663,74.4324722}, {209,74.413353}}}
    446 debugShowCubicIntersection wtTs[0]=1 {{{206.800003,74.4585342}, {207.53334,74.4473343}, {208.266663,74.4324722}, {209,74.413353}}} {{209,74.413353}} wnTs[0]=0 {{{209,74.413353}, {209.350708,74.404213}, {209.701416,74.3919983}, {210.052124,74.3797836}}}
    447 debugShowCubicIntersection wtTs[0]=1 {{{209,74.413353}, {209.350708,74.404213}, {209.701416,74.3919983}, {210.052124,74.3797836}}} {{210.052124,74.3797836}} wnTs[0]=0 {{{210.052124,74.3797836}, {210.434753,74.3664627}, {210.817368,74.3531418}, {211.199997,74.3438034}}}
    448 debugShowCubicIntersection wtTs[0]=1 {{{210.052124,74.3797836}, {210.434753,74.3664627}, {210.817368,74.3531418}, {211.199997,74.3438034}}} {{211.199997,74.3438034}} wnTs[0]=0 {{{211.199997,74.3438034}, {211.933334,74.3259048}, {212.666672,74.3128586}, {213.399994,74.305954}}}
    449 debugShowCubicIntersection wtTs[0]=1 {{{211.199997,74.3438034}, {211.933334,74.3259048}, {212.666672,74.3128586}, {213.399994,74.305954}}} {{213.399994,74.305954}} wnTs[0]=0 {{{213.399994,74.305954}, {214.133331,74.2990494}, {214.866669,74.2958145}, {215.600006,74.3023758}}}
    450 debugShowCubicIntersection wtTs[0]=1 {{{213.399994,74.305954}, {214.133331,74.2990494}, {214.866669,74.2958145}, {215.600006,74.3023758}}} {{215.600006,74.3023758}} wnTs[0]=0 {{{215.600006,74.3023758}, {216.076187,74.3066406}, {216.552383,74.317627}, {217.02858,74.3286133}}}
    451 debugShowCubicIntersection wtTs[0]=1 {{{215.600006,74.3023758}, {216.076187,74.3066406}, {216.552383,74.317627}, {217.02858,74.3286133}}} {{217.02858,74.3286133}} wnTs[0]=0 {{{217.02858,74.3286133}, {217.285721,74.334549}, {217.542862,74.340477}, {217.800003,74.3453522}}}
    452 debugShowCubicIntersection wtTs[0]=1 {{{217.02858,74.3286133}, {217.285721,74.334549}, {217.542862,74.340477}, {217.800003,74.3453522}}} {{217.800003,74.3453522}} wnTs[0]=0 {{{217.800003,74.3453522}, {218.041779,74.3499298}, {218.283554,74.358696}, {218.52533,74.3674622}}}
    453 debugShowCubicIntersection wtTs[0]=1 {{{217.800003,74.3453522}, {218.041779,74.3499298}, {218.283554,74.358696}, {218.52533,74.3674622}}} {{218.52533,74.3674622}} wnTs[0]=0 {{{218.52533,74.3674622}, {219.016891,74.3852844}, {219.508438,74.4031067}, {220,74.3857574}}}
    454 debugShowCubicIntersection wtTs[0]=1 {{{218.52533,74.3674622}, {219.016891,74.3852844}, {219.508438,74.4031067}, {220,74.3857574}}} {{220,74.3857574}} wnTs[0]=0 {{{220,74.3857574}, {220.409988,74.3712845}, {220.819977,74.3263474}, {221.229965,74.2814102}}}
    455 debugShowCubicIntersection wtTs[0]=1 {{{220,74.3857574}, {220.409988,74.3712845}, {220.819977,74.3263474}, {221.229965,74.2814102}}} {{221.229965,74.2814102}} wnTs[0]=0 {{{221.229965,74.2814102}, {221.553314,74.2459717}, {221.876648,74.2105331}, {222.199997,74.190033}}}
    456 debugShowCubicIntersection wtTs[0]=1 {{{221.229965,74.2814102}, {221.553314,74.2459717}, {221.876648,74.2105331}, {222.199997,74.190033}}} {{222.199997,74.190033}} wnTs[0]=0 {{{222.199997,74.190033}, {222.933334,74.1435471}, {223.666672,74.1037674}, {224.399994,74.1068344}}}
    457 debugShowCubicIntersection wtTs[0]=1 {{{222.199997,74.190033}, {222.933334,74.1435471}, {223.666672,74.1037674}, {224.399994,74.1068344}}} {{224.399994,74.1068344}} wnTs[0]=0 {{{224.399994,74.1068344}, {224.885803,74.1088638}, {225.371613,74.1381073}, {225.857422,74.1673508}}}
    458 debugShowCubicIntersection wtTs[0]=1 {{{224.399994,74.1068344}, {224.885803,74.1088638}, {225.371613,74.1381073}, {225.857422,74.1673508}}} {{225.857422,74.1673508}} wnTs[0]=0 {{{225.857422,74.1673508}, {226.10495,74.182251}, {226.352478,74.1971512}, {226.600006,74.2084503}}}
    459 debugShowCubicIntersection wtTs[0]=1 {{{225.857422,74.1673508}, {226.10495,74.182251}, {226.352478,74.1971512}, {226.600006,74.2084503}}} {{226.600006,74.2084503}} wnTs[0]=0 {{{226.600006,74.2084503}, {226.839722,74.2193909}, {227.079437,74.2324677}, {227.319153,74.2455521}}}
    460 debugShowCubicIntersection wtTs[0]=1 {{{226.600006,74.2084503}, {226.839722,74.2193909}, {227.079437,74.2324677}, {227.319153,74.2455521}}} {{227.319153,74.2455521}} wnTs[0]=0 {{{227.319153,74.2455521}, {227.812759,74.2724838}, {228.306381,74.2994156}, {228.800003,74.3076782}}}
    461 debugShowCubicIntersection wtTs[0]=1 {{{227.319153,74.2455521}, {227.812759,74.2724838}, {228.306381,74.2994156}, {228.800003,74.3076782}}} {{228.800003,74.3076782}} wnTs[0]=0 {{{228.800003,74.3076782}, {229.309921,74.3162155}, {229.819824,74.3054352}, {230.329742,74.2946548}}}
    462 debugShowCubicIntersection wtTs[0]=1 {{{228.800003,74.3076782}, {229.309921,74.3162155}, {229.819824,74.3054352}, {230.329742,74.2946548}}} {{230.329742,74.2946548}} wnTs[0]=0 {{{230.329742,74.2946548}, {230.553162,74.2899323}, {230.776581,74.2852097}, {231,74.2821121}}}
    463 debugShowCubicIntersection wtTs[0]=1 {{{230.329742,74.2946548}, {230.553162,74.2899323}, {230.776581,74.2852097}, {231,74.2821121}}} {{231,74.2821121}} wnTs[0]=0 {{{231,74.2821121}, {231.290405,74.2780838}, {231.580811,74.2724228}, {231.871216,74.2667542}}}
    464 debugShowCubicIntersection wtTs[0]=1 {{{231,74.2821121}, {231.290405,74.2780838}, {231.580811,74.2724228}, {231.871216,74.2667542}}} {{231.871216,74.2667542}} wnTs[0]=0 {{{231.871216,74.2667542}, {232.314148,74.2581177}, {232.757065,74.2494812}, {233.199997,74.2466507}}}
    465 debugShowCubicIntersection wtTs[0]=1 {{{231.871216,74.2667542}, {232.314148,74.2581177}, {232.757065,74.2494812}, {233.199997,74.2466507}}} {{233.199997,74.2466507}} wnTs[0]=0 {{{233.199997,74.2466507}, {233.343719,74.2457352}, {233.487442,74.2448959}, {233.631165,74.2442474}}}
    466 debugShowCubicIntersection wtTs[0]=1 {{{233.199997,74.2466507}, {233.343719,74.2457352}, {233.487442,74.2448959}, {233.631165,74.2442474}}} {{233.631165,74.2442474}} wnTs[0]=0 {{{233.631165,74.2442474}, {234.220779,74.2415924}, {234.810394,74.2421951}, {235.399994,74.2539825}}}
    467 debugShowCubicIntersection wtTs[0]=1 {{{233.631165,74.2442474}, {234.220779,74.2415924}, {234.810394,74.2421951}, {235.399994,74.2539825}}} {{235.399994,74.2539825}} wnTs[0]=0 {{{235.399994,74.2539825}, {235.845032,74.2628784}, {236.29007,74.2817612}, {236.735107,74.3006439}}}
    468 debugShowCubicIntersection wtTs[0]=1 {{{235.399994,74.2539825}, {235.845032,74.2628784}, {236.29007,74.2817612}, {236.735107,74.3006439}}} {{236.735107,74.3006439}} wnTs[0]=0 {{{236.735107,74.3006439}, {237.023407,74.3128738}, {237.311707,74.3251038}, {237.600006,74.3346176}}}
    469 debugShowCubicIntersection wtTs[0]=1 {{{236.735107,74.3006439}, {237.023407,74.3128738}, {237.311707,74.3251038}, {237.600006,74.3346176}}} {{237.600006,74.3346176}} wnTs[0]=0 {{{237.600006,74.3346176}, {238.333328,74.3588257}, {239.066666,74.3803329}, {239.800003,74.3992233}}}
    470 debugShowCubicIntersection wtTs[0]=1 {{{237.600006,74.3346176}, {238.333328,74.3588257}, {239.066666,74.3803329}, {239.800003,74.3992233}}} {{239.800003,74.3992233}} wnTs[0]=0 {{{239.800003,74.3992233}, {240.082169,74.4064941}, {240.364334,74.4108353}, {240.6465,74.4151764}}}
    471 debugShowCubicIntersection wtTs[0]=1 {{{239.800003,74.3992233}, {240.082169,74.4064941}, {240.364334,74.4108353}, {240.6465,74.4151764}}} {{240.6465,74.4151764}} wnTs[0]=0 {{{240.6465,74.4151764}, {241.097672,74.4221191}, {241.548828,74.4290695}, {242,74.4479828}}}
    472 debugShowCubicIntersection wtTs[0]=1 {{{240.6465,74.4151764}, {241.097672,74.4221191}, {241.548828,74.4290695}, {242,74.4479828}}} {{242,74.4479828}} wnTs[0]=0 {{{242,74.4479828}, {242.416458,74.4654388}, {242.832916,74.4942093}, {243.249374,74.5229874}}}
    473 debugShowCubicIntersection wtTs[0]=1 {{{242,74.4479828}, {242.416458,74.4654388}, {242.832916,74.4942093}, {243.249374,74.5229874}}} {{243.249374,74.5229874}} wnTs[0]=0 {{{243.249374,74.5229874}, {243.566254,74.5448837}, {243.883118,74.5667801}, {244.199997,74.5836868}}}
    474 debugShowCubicIntersection wtTs[0]=1 {{{243.249374,74.5229874}, {243.566254,74.5448837}, {243.883118,74.5667801}, {244.199997,74.5836868}}} {{244.199997,74.5836868}} wnTs[0]=0 {{{244.199997,74.5836868}, {244.933334,74.6228104}, {245.666672,74.6546402}, {246.399994,74.6827393}}}
    475 debugShowCubicIntersection wtTs[0]=1 {{{244.199997,74.5836868}, {244.933334,74.6228104}, {245.666672,74.6546402}, {246.399994,74.6827393}}} {{246.399994,74.6827393}} wnTs[0]=0 {{{246.399994,74.6827393}, {247.133331,74.7108383}, {247.866669,74.7327499}, {248.600006,74.7522964}}}
    476 debugShowCubicLineIntersection wtTs[0]=1 {{{246.399994,74.6827393}, {247.133331,74.7108383}, {247.866669,74.7327499}, {248.600006,74.7522964}}} {{248.600006,74.7522964}} wnTs[0]=0 {{{248.600006,74.7522964}, {248.714218,74.7553406}}}
    477 debugShowCubicLineIntersection wtTs[0]=0 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{248.714218,74.7553406}} wnTs[0]=1 {{{248.600006,74.7522964}, {248.714218,74.7553406}}}
    478 debugShowCubicIntersection wtTs[0]=1 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}}
    479 debugShowCubicLineIntersection wtTs[0]=1 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    480 SkOpSegment::addT insert t=0.0119047452 segID=150 spanID=610
    481 debugShowCubicIntersection wtTs[0]=1 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{252.266663,74.8017731}} wnTs[0]=0 {{{252.266663,74.8017731}, {252.511108,74.8008881}, {252.755554,74.8000031}, {253,74.8000031}}}
    482 debugShowCubicLineIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    483 debugShowCubicLineIntersection wtTs[0]=1 {{{252.266663,74.8017731}, {252.511108,74.8008881}, {252.755554,74.8000031}, {253,74.8000031}}} {{253,74.8000031}} wnTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    484 debugShowCubicIntersection wtTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.8039017}, {68.9333344,74.8078003}}} {{68.1999969,74.8000031}} wnTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.7961044}, {68.9333344,74.7922058}}}
    485 debugShowCubicIntersection no intersect {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.8039017}, {68.9333344,74.8078003}}} {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}}
    486 debugShowCubicLineIntersection wtTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.8039017}, {68.9333344,74.8078003}}} {{68.1999969,74.8000031}} wnTs[0]=1 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    487 debugShowCubicIntersection no intersect {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.7961044}, {68.9333344,74.7922058}}}
    488 debugShowCubicIntersection wtTs[0]=1 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=1 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}}
    489 debugShowCubicIntersection wtTs[0]=1 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}}
    490 debugShowCubicLineIntersection wtTs[0]=1 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    491 SkOpSegment::addT insert t=0.988095214 segID=299 spanID=611
    492 debugShowCubicIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}} {{70.4000015,74.8000031}} wnTs[0]=1 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}}
    493 debugShowCubicIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}} {{70.4000015,74.8000031}} wnTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}}
    494 debugShowCubicLineIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    495 debugShowCubicIntersection no intersect {{{78.1107025,74.66716}, {78.4738007,74.722496}, {78.8368988,74.777832}, {79.1999969,74.7998505}}} {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}}
    496 debugShowCubicIntersection no intersect {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{{78.1107025,74.9328461}, {78.4738007,74.8775101}, {78.8368988,74.8221741}, {79.1999969,74.8001556}}}
    497 debugShowCubicIntersection wtTs[0]=0.00172605823 {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{79.2025299,74.8000031}} wnTs[0]=0.00172606 {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}}
    498 SkOpSegment::addT alias t=0.00172605823 segID=11 spanID=600
    499 SkOpSegment::addT insert t=0.00172605823 segID=161 spanID=612
    500 debugShowCubicIntersection no intersect {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}}
    501 debugShowCubicLineIntersection wtTs[0]=0.0017190524 {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{79.2025223,74.8000031}} wnTs[0]=0.940463 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    502 SkOpSegment::addT insert t=0.940462545 segID=299 spanID=613
    503 debugShowCubicIntersection no intersect {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}}
    504 debugShowCubicIntersection wtTs[0]=1 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{81.4000015,74.8000031}} wnTs[0]=1 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}}
    505 debugShowCubicIntersection wtTs[0]=1 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{81.4000015,74.8000031}} wnTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}}
    506 debugShowCubicLineIntersection wtTs[0]=0.99844881 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{81.3988647,74.8000031}} wtTs[1]=1 {{81.4000015,74.8000031}} wnTs[0]=0.928578 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.928571405
    507 SkOpSegment::addT insert t=0.928577558 segID=299 spanID=614
    508 SkOpSegment::addT insert t=0.928571405 segID=299 spanID=615
    509 debugShowCubicIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{81.4000015,74.8000031}} wnTs[0]=1 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}}
    510 debugShowCubicIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{81.4000015,74.8000031}} wnTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}}
    511 debugShowCubicIntersection no intersect {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}}
    512 debugShowCubicLineIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{81.4000015,74.8000031}} wnTs[0]=0.928571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    513 debugShowCubicIntersection no intersect {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}}
    514 debugShowCubicIntersection wtTs[0]=1 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=1 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}}
    515 debugShowCubicIntersection wtTs[0]=1 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}}
    516 debugShowCubicLineIntersection wtTs[0]=1 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    517 SkOpSegment::addT insert t=0.91666666 segID=299 spanID=616
    518 debugShowCubicIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}} {{83.5999985,74.8000031}} wnTs[0]=1 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}}
    519 debugShowCubicIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}} {{83.5999985,74.8000031}} wnTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}}
    520 debugShowCubicLineIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    521 debugShowCubicIntersection wtTs[0]=1 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=1 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}}
    522 debugShowCubicIntersection wtTs[0]=1 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}}
    523 debugShowCubicLineIntersection wtTs[0]=1 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    524 SkOpSegment::addT insert t=0.892857128 segID=299 spanID=617
    525 debugShowCubicIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{88,74.8000031}} wnTs[0]=1 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}}
    526 debugShowCubicIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{88,74.8000031}} wnTs[0]=0 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}}
    527 debugShowCubicIntersection no intersect {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}}
    528 debugShowCubicLineIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    529 debugShowCubicIntersection no intersect {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}}
    530 debugShowCubicIntersection wtTs[0]=1 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=1 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}}
    531 debugShowCubicIntersection wtTs[0]=1 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}}
    532 debugShowCubicLineIntersection wtTs[0]=1 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    533 SkOpSegment::addT insert t=0.880952383 segID=299 spanID=618
    534 debugShowCubicIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}} {{90.1999969,74.8000031}} wnTs[0]=1 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}}
    535 debugShowCubicIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}} {{90.1999969,74.8000031}} wnTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}}
    536 debugShowCubicLineIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    537 debugShowCubicIntersection wtTs[0]=1 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=1 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}}
    538 debugShowCubicIntersection wtTs[0]=1 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}}
    539 debugShowCubicLineIntersection wtTs[0]=1 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    540 SkOpSegment::addT insert t=0.44047615 segID=299 spanID=619
    541 debugShowCubicIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=1 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}}
    542 debugShowCubicIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wtTs[1]=1 {{173.800003,74.8000031}} wnTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}} wnTs[1]=1
    543 debugShowCubicIntersection wtTs[0]=1 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{173.800003,74.8000031}} wnTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}}
    544 debugShowCubicLineIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wtTs[1]=1 {{173.800003,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.428571405
    545 SkOpSegment::addT insert t=0.428571405 segID=299 spanID=620
    546 debugShowCubicIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}} {{173.800003,74.8000031}} wnTs[0]=1 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}}
    547 debugShowCubicIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}} {{173.800003,74.8000031}} wnTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}}
    548 debugShowCubicLineIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}} {{173.800003,74.8000031}} wnTs[0]=0.428571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    549 debugShowCubicIntersection wtTs[0]=1 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=1 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}}
    550 debugShowCubicIntersection wtTs[0]=1 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}}
    551 debugShowCubicLineIntersection wtTs[0]=1 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    552 SkOpSegment::addT insert t=0.0119047452 segID=299 spanID=621
    553 debugShowCubicIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{250.800003,74.8000031}} wnTs[0]=1 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}}
    554 debugShowCubicIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{250.800003,74.8000031}} wnTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}}
    555 debugShowCubicIntersection no intersect {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{{252.266663,74.798233}, {252.511108,74.799118}, {252.755554,74.8000031}, {253,74.8000031}}}
    556 debugShowCubicLineIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    557 debugShowCubicIntersection no intersect {{{252.266663,74.8017731}, {252.511108,74.8008881}, {252.755554,74.8000031}, {253,74.8000031}}} {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}}
    558 debugShowCubicIntersection wtTs[0]=1 {{{252.266663,74.8017731}, {252.511108,74.8008881}, {252.755554,74.8000031}, {253,74.8000031}}} {{253,74.8000031}} wnTs[0]=1 {{{252.266663,74.798233}, {252.511108,74.799118}, {252.755554,74.8000031}, {253,74.8000031}}}
    559 debugShowCubicLineIntersection wtTs[0]=1 {{{252.266663,74.8017731}, {252.511108,74.8008881}, {252.755554,74.8000031}, {253,74.8000031}}} {{253,74.8000031}} wnTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    560 debugShowCubicLineIntersection wtTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.7961044}, {68.9333344,74.7922058}}} {{68.1999969,74.8000031}} wnTs[0]=1 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    561 debugShowCubicLineIntersection wtTs[0]=1 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    562 debugShowCubicLineIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    563 debugShowCubicLineIntersection wtTs[0]=0.0017190524 {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}} {{79.2025223,74.8000031}} wnTs[0]=0.940463 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    564 SkOpSegment::addT alias t=0.0017190524 segID=161 spanID=612
    565 debugShowCubicLineIntersection wtTs[0]=0.99844881 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}} {{81.3988647,74.8000031}} wtTs[1]=1 {{81.4000015,74.8000031}} wnTs[0]=0.928578 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.928571405
    566 SkOpSegment::addT insert t=0.99844881 segID=162 spanID=622
    567 debugShowCubicLineIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}} {{81.4000015,74.8000031}} wnTs[0]=0.928571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    568 debugShowCubicLineIntersection wtTs[0]=1 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    569 debugShowCubicLineIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    570 debugShowCubicLineIntersection wtTs[0]=1 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    571 debugShowCubicLineIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    572 debugShowCubicLineIntersection wtTs[0]=1 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    573 debugShowCubicLineIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    574 debugShowCubicLineIntersection wtTs[0]=1 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    575 debugShowCubicLineIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wtTs[1]=1 {{173.800003,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.428571405
    576 debugShowCubicLineIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}} {{173.800003,74.8000031}} wnTs[0]=0.428571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    577 debugShowCubicLineIntersection wtTs[0]=1 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    578 debugShowCubicLineIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    579 debugShowCubicLineIntersection wtTs[0]=1 {{{252.266663,74.798233}, {252.511108,74.799118}, {252.755554,74.8000031}, {253,74.8000031}}} {{253,74.8000031}} wnTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    580 debugShowLineIntersection wtTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}} {{253,74.8000031}} wtTs[1]=1 {{68.1999969,74.8000031}} wnTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=1
    581 debugShowCubicIntersection wtTs[0]=1 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.7961044}, {68.9333344,74.7922058}}} {{68.9333344,74.7922058}} wnTs[0]=0 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}}
    582 debugShowCubicLineIntersection wtTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.7961044}, {68.9333344,74.7922058}}} {{68.1999969,74.8000031}} wnTs[0]=1 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    583 debugShowCubicIntersection wtTs[0]=1 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}}
    584 debugShowCubicLineIntersection wtTs[0]=1 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    585 debugShowCubicIntersection wtTs[0]=1 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}} {{71.5388947,74.9073105}} wnTs[0]=0 {{{71.5388947,74.9073105}, {71.8925934,74.9488373}, {72.2462997,74.9903641}, {72.5999985,75.0105362}}}
    586 debugShowCubicLineIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    587 debugShowCubicIntersection wtTs[0]=1 {{{71.5388947,74.9073105}, {71.8925934,74.9488373}, {72.2462997,74.9903641}, {72.5999985,75.0105362}}} {{72.5999985,75.0105362}} wnTs[0]=0 {{{72.5999985,75.0105362}, {73.1301117,75.0407715}, {73.6602249,75.0435104}, {74.1903381,75.0462494}}}
    588 debugShowCubicIntersection wtTs[0]=1 {{{72.5999985,75.0105362}, {73.1301117,75.0407715}, {73.6602249,75.0435104}, {74.1903381,75.0462494}}} {{74.1903381,75.0462494}} wnTs[0]=0 {{{74.1903381,75.0462494}, {74.3935623,75.0472946}, {74.5967789,75.0483398}, {74.8000031,75.0509415}}}
    589 debugShowCubicIntersection wtTs[0]=1 {{{74.1903381,75.0462494}, {74.3935623,75.0472946}, {74.5967789,75.0483398}, {74.8000031,75.0509415}}} {{74.8000031,75.0509415}} wnTs[0]=0 {{{74.8000031,75.0509415}, {75.0211792,75.053772}, {75.242363,75.0601425}, {75.4635391,75.0665054}}}
    590 debugShowCubicIntersection wtTs[0]=1 {{{74.8000031,75.0509415}, {75.0211792,75.053772}, {75.242363,75.0601425}, {75.4635391,75.0665054}}} {{75.4635391,75.0665054}} wnTs[0]=0 {{{75.4635391,75.0665054}, {75.9756927,75.0812454}, {76.4878464,75.0959854}, {77,75.0667953}}}
    591 debugShowCubicIntersection wtTs[0]=1 {{{75.4635391,75.0665054}, {75.9756927,75.0812454}, {76.4878464,75.0959854}, {77,75.0667953}}} {{77,75.0667953}} wnTs[0]=0 {{{77,75.0667953}, {77.3702316,75.0456924}, {77.7404709,74.9892731}, {78.1107025,74.9328461}}}
    592 debugShowCubicIntersection wtTs[0]=1 {{{77,75.0667953}, {77.3702316,75.0456924}, {77.7404709,74.9892731}, {78.1107025,74.9328461}}} {{78.1107025,74.9328461}} wnTs[0]=0 {{{78.1107025,74.9328461}, {78.4738007,74.8775101}, {78.8368988,74.8221741}, {79.1999969,74.8001556}}}
    593 debugShowCubicIntersection wtTs[0]=1 {{{78.1107025,74.9328461}, {78.4738007,74.8775101}, {78.8368988,74.8221741}, {79.1999969,74.8001556}}} {{79.1999969,74.8001556}} wnTs[0]=0 {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}}
    594 debugShowCubicIntersection wtTs[0]=1 {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}} {{80.6670074,74.790184}} wnTs[0]=0 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}}
    595 debugShowCubicLineIntersection wtTs[0]=0.0017190524 {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}} {{79.2025223,74.8000031}} wnTs[0]=0.940463 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    596 debugShowCubicIntersection wtTs[0]=1 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}} {{81.4000015,74.8000031}} wnTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}}
    597 debugShowCubicLineIntersection wtTs[0]=0.99844881 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}} {{81.3988647,74.8000031}} wtTs[1]=1 {{81.4000015,74.8000031}} wnTs[0]=0.928578 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.928571405
    598 debugShowCubicIntersection wtTs[0]=1 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}} {{82.1315613,74.7978897}} wnTs[0]=0 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}}
    599 debugShowCubicLineIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}} {{81.4000015,74.8000031}} wnTs[0]=0.928571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    600 debugShowCubicIntersection wtTs[0]=1 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}}
    601 debugShowCubicLineIntersection wtTs[0]=1 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    602 debugShowCubicIntersection wtTs[0]=1 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}} {{84.5777359,74.827713}} wnTs[0]=0 {{{84.5777359,74.827713}, {84.9851608,74.842392}, {85.3925781,74.8570709}, {85.8000031,74.8570709}}}
    603 debugShowCubicLineIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    604 debugShowCubicIntersection wtTs[0]=1 {{{84.5777359,74.827713}, {84.9851608,74.842392}, {85.3925781,74.8570709}, {85.8000031,74.8570709}}} {{85.8000031,74.8570709}} wnTs[0]=0 {{{85.8000031,74.8570709}, {86.2074203,74.8570709}, {86.6148453,74.842392}, {87.0222626,74.827713}}}
    605 debugShowCubicIntersection wtTs[0]=1 {{{85.8000031,74.8570709}, {86.2074203,74.8570709}, {86.6148453,74.842392}, {87.0222626,74.827713}}} {{87.0222626,74.827713}} wnTs[0]=0 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}}
    606 debugShowCubicIntersection wtTs[0]=1 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}}
    607 debugShowCubicLineIntersection wtTs[0]=1 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    608 debugShowCubicIntersection wtTs[0]=1 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}} {{88.4729385,74.7922745}} wnTs[0]=0 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}}
    609 debugShowCubicLineIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    610 debugShowCubicIntersection wtTs[0]=1 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}}
    611 debugShowCubicLineIntersection wtTs[0]=1 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    612 debugShowCubicIntersection wtTs[0]=1 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}} {{91.2861557,74.9081879}} wnTs[0]=0 {{{91.2861557,74.9081879}, {91.6574402,74.9544754}, {92.028717,75.0007629}, {92.4000015,75.0176926}}}
    613 debugShowCubicLineIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    614 debugShowCubicIntersection wtTs[0]=1 {{{91.2861557,74.9081879}, {91.6574402,74.9544754}, {92.028717,75.0007629}, {92.4000015,75.0176926}}} {{92.4000015,75.0176926}} wnTs[0]=0 {{{92.4000015,75.0176926}, {92.9111481,75.0410004}, {93.4223022,75.0278778}, {93.9334488,75.0147552}}}
    615 debugShowCubicIntersection wtTs[0]=1 {{{92.4000015,75.0176926}, {92.9111481,75.0410004}, {93.4223022,75.0278778}, {93.9334488,75.0147552}}} {{93.9334488,75.0147552}} wnTs[0]=0 {{{93.9334488,75.0147552}, {94.155632,75.0090561}, {94.3778152,75.0033493}, {94.5999985,75.0006409}}}
    616 debugShowCubicIntersection wtTs[0]=1 {{{93.9334488,75.0147552}, {94.155632,75.0090561}, {94.3778152,75.0033493}, {94.5999985,75.0006409}}} {{94.5999985,75.0006409}} wnTs[0]=0 {{{94.5999985,75.0006409}, {94.8669891,74.9973831}, {95.1339798,74.9889908}, {95.4009705,74.9806061}}}
    617 debugShowCubicIntersection wtTs[0]=1 {{{94.5999985,75.0006409}, {94.8669891,74.9973831}, {95.1339798,74.9889908}, {95.4009705,74.9806061}}} {{95.4009705,74.9806061}} wnTs[0]=0 {{{95.4009705,74.9806061}, {95.8673172,74.9659576}, {96.3336563,74.9513092}, {96.8000031,74.9639893}}}
    618 debugShowCubicIntersection wtTs[0]=1 {{{95.4009705,74.9806061}, {95.8673172,74.9659576}, {96.3336563,74.9513092}, {96.8000031,74.9639893}}} {{96.8000031,74.9639893}} wnTs[0]=0 {{{96.8000031,74.9639893}, {97.2396164,74.9759521}, {97.6792297,75.0139465}, {98.1188431,75.0519409}}}
    619 debugShowCubicIntersection wtTs[0]=1 {{{96.8000031,74.9639893}, {97.2396164,74.9759521}, {97.6792297,75.0139465}, {98.1188431,75.0519409}}} {{98.1188431,75.0519409}} wnTs[0]=0 {{{98.1188431,75.0519409}, {98.4125595,75.0773239}, {98.7062836,75.1027069}, {99,75.1203232}}}
    620 debugShowCubicIntersection wtTs[0]=1 {{{98.1188431,75.0519409}, {98.4125595,75.0773239}, {98.7062836,75.1027069}, {99,75.1203232}}} {{99,75.1203232}} wnTs[0]=0 {{{99,75.1203232}, {99.7333298,75.1643066}, {100.466667,75.2075195}, {101.199997,75.2278976}}}
    621 debugShowCubicIntersection wtTs[0]=1 {{{99,75.1203232}, {99.7333298,75.1643066}, {100.466667,75.2075195}, {101.199997,75.2278976}}} {{101.199997,75.2278976}} wnTs[0]=0 {{{101.199997,75.2278976}, {101.6632,75.2407608}, {102.126396,75.2405472}, {102.5896,75.2403336}}}
    622 debugShowCubicIntersection wtTs[0]=1 {{{101.199997,75.2278976}, {101.6632,75.2407608}, {102.126396,75.2405472}, {102.5896,75.2403336}}} {{102.5896,75.2403336}} wnTs[0]=0 {{{102.5896,75.2403336}, {102.859734,75.2402115}, {103.129868,75.2400894}, {103.400002,75.2425613}}}
    623 debugShowCubicIntersection wtTs[0]=1 {{{102.5896,75.2403336}, {102.859734,75.2402115}, {103.129868,75.2400894}, {103.400002,75.2425613}}} {{103.400002,75.2425613}} wnTs[0]=0 {{{103.400002,75.2425613}, {103.499123,75.2434692}, {103.598244,75.2443542}, {103.697365,75.2452393}}}
    624 debugShowCubicIntersection wtTs[0]=1 {{{103.400002,75.2425613}, {103.499123,75.2434692}, {103.598244,75.2443542}, {103.697365,75.2452393}}} {{103.697365,75.2452393}} wnTs[0]=0 {{{103.697365,75.2452393}, {104.331573,75.250885}, {104.96579,75.2565308}, {105.599998,75.2681274}}}
    625 debugShowCubicIntersection wtTs[0]=1 {{{103.697365,75.2452393}, {104.331573,75.250885}, {104.96579,75.2565308}, {105.599998,75.2681274}}} {{105.599998,75.2681274}} wnTs[0]=0 {{{105.599998,75.2681274}, {105.951164,75.2745514}, {106.30233,75.2846603}, {106.653496,75.2947693}}}
    626 debugShowCubicIntersection wtTs[0]=1 {{{105.599998,75.2681274}, {105.951164,75.2745514}, {106.30233,75.2846603}, {106.653496,75.2947693}}} {{106.653496,75.2947693}} wnTs[0]=0 {{{106.653496,75.2947693}, {107.035667,75.3057709}, {107.417831,75.3167725}, {107.800003,75.3230209}}}
    627 debugShowCubicIntersection wtTs[0]=1 {{{106.653496,75.2947693}, {107.035667,75.3057709}, {107.417831,75.3167725}, {107.800003,75.3230209}}} {{107.800003,75.3230209}} wnTs[0]=0 {{{107.800003,75.3230209}, {107.904305,75.3247223}, {108.008606,75.3265228}, {108.112907,75.3283234}}}
    628 debugShowCubicIntersection wtTs[0]=1 {{{107.800003,75.3230209}, {107.904305,75.3247223}, {108.008606,75.3265228}, {108.112907,75.3283234}}} {{108.112907,75.3283234}} wnTs[0]=0 {{{108.112907,75.3283234}, {108.741936,75.33918}, {109.370972,75.350029}, {110,75.340065}}}
    629 debugShowCubicIntersection wtTs[0]=1 {{{108.112907,75.3283234}, {108.741936,75.33918}, {109.370972,75.350029}, {110,75.340065}}} {{110,75.340065}} wnTs[0]=0 {{{110,75.340065}, {110.73333,75.3284454}, {111.466667,75.2919846}, {112.199997,75.2532883}}}
    630 debugShowCubicIntersection wtTs[0]=1 {{{110,75.340065}, {110.73333,75.3284454}, {111.466667,75.2919846}, {112.199997,75.2532883}}} {{112.199997,75.2532883}} wnTs[0]=0 {{{112.199997,75.2532883}, {112.524193,75.2361755}, {112.848389,75.2113037}, {113.172585,75.1864319}}}
    631 debugShowCubicIntersection wtTs[0]=1 {{{112.199997,75.2532883}, {112.524193,75.2361755}, {112.848389,75.2113037}, {113.172585,75.1864319}}} {{113.172585,75.1864319}} wnTs[0]=0 {{{113.172585,75.1864319}, {113.581726,75.1550446}, {113.99086,75.1236496}, {114.400002,75.1078644}}}
    632 debugShowCubicIntersection wtTs[0]=1 {{{113.172585,75.1864319}, {113.581726,75.1550446}, {113.99086,75.1236496}, {114.400002,75.1078644}}} {{114.400002,75.1078644}} wnTs[0]=0 {{{114.400002,75.1078644}, {115.133331,75.079567}, {115.866669,75.0734863}, {116.599998,75.0834885}}}
    633 debugShowCubicIntersection wtTs[0]=1 {{{114.400002,75.1078644}, {115.133331,75.079567}, {115.866669,75.0734863}, {116.599998,75.0834885}}} {{116.599998,75.0834885}} wnTs[0]=0 {{{116.599998,75.0834885}, {117.013039,75.089119}, {117.426071,75.1088409}, {117.839111,75.1285629}}}
    634 debugShowCubicIntersection wtTs[0]=1 {{{116.599998,75.0834885}, {117.013039,75.089119}, {117.426071,75.1088409}, {117.839111,75.1285629}}} {{117.839111,75.1285629}} wnTs[0]=0 {{{117.839111,75.1285629}, {118.159409,75.1438599}, {118.479706,75.1591568}, {118.800003,75.1678772}}}
    635 debugShowCubicIntersection wtTs[0]=1 {{{117.839111,75.1285629}, {118.159409,75.1438599}, {118.479706,75.1591568}, {118.800003,75.1678772}}} {{118.800003,75.1678772}} wnTs[0]=0 {{{118.800003,75.1678772}, {118.915619,75.1710281}, {119.031235,75.1743622}, {119.146851,75.1776962}}}
    636 debugShowCubicIntersection wtTs[0]=1 {{{118.800003,75.1678772}, {118.915619,75.1710281}, {119.031235,75.1743622}, {119.146851,75.1776962}}} {{119.146851,75.1776962}} wnTs[0]=0 {{{119.146851,75.1776962}, {119.764565,75.1954956}, {120.382286,75.2133026}, {121,75.2033386}}}
    637 debugShowCubicIntersection wtTs[0]=1 {{{119.146851,75.1776962}, {119.764565,75.1954956}, {120.382286,75.2133026}, {121,75.2033386}}} {{121,75.2033386}} wnTs[0]=0 {{{121,75.2033386}, {121.552635,75.1944351}, {122.105278,75.1614532}, {122.657913,75.1284714}}}
    638 debugShowCubicIntersection wtTs[0]=1 {{{121,75.2033386}, {121.552635,75.1944351}, {122.105278,75.1614532}, {122.657913,75.1284714}}} {{122.657913,75.1284714}} wnTs[0]=0 {{{122.657913,75.1284714}, {122.838608,75.1176834}, {123.019302,75.1068954}, {123.199997,75.0969543}}}
    639 debugShowCubicIntersection wtTs[0]=1 {{{122.657913,75.1284714}, {122.838608,75.1176834}, {123.019302,75.1068954}, {123.199997,75.0969543}}} {{123.199997,75.0969543}} wnTs[0]=0 {{{123.199997,75.0969543}, {123.480431,75.0815277}, {123.760864,75.060524}, {124.041298,75.0395203}}}
    640 debugShowCubicIntersection wtTs[0]=1 {{{123.199997,75.0969543}, {123.480431,75.0815277}, {123.760864,75.060524}, {124.041298,75.0395203}}} {{124.041298,75.0395203}} wnTs[0]=0 {{{124.041298,75.0395203}, {124.494202,75.0056076}, {124.947098,74.9716949}, {125.400002,74.9612503}}}
    641 debugShowCubicIntersection wtTs[0]=1 {{{124.041298,75.0395203}, {124.494202,75.0056076}, {124.947098,74.9716949}, {125.400002,74.9612503}}} {{125.400002,74.9612503}} wnTs[0]=0 {{{125.400002,74.9612503}, {126.133331,74.9443436}, {126.866669,74.9602585}, {127.599998,74.9955215}}}
    642 debugShowCubicIntersection wtTs[0]=1 {{{125.400002,74.9612503}, {126.133331,74.9443436}, {126.866669,74.9602585}, {127.599998,74.9955215}}} {{127.599998,74.9955215}} wnTs[0]=0 {{{127.599998,74.9955215}, {128.17691,75.023262}, {128.75383,75.0766068}, {129.33075,75.1299438}}}
    643 debugShowCubicIntersection wtTs[0]=1 {{{127.599998,74.9955215}, {128.17691,75.023262}, {128.75383,75.0766068}, {129.33075,75.1299438}}} {{129.33075,75.1299438}} wnTs[0]=0 {{{129.33075,75.1299438}, {129.487167,75.1444092}, {129.643585,75.1588745}, {129.800003,75.1728287}}}
    644 debugShowCubicIntersection wtTs[0]=1 {{{129.33075,75.1299438}, {129.487167,75.1444092}, {129.643585,75.1588745}, {129.800003,75.1728287}}} {{129.800003,75.1728287}} wnTs[0]=0 {{{129.800003,75.1728287}, {130.08493,75.1982422}, {130.369843,75.2303619}, {130.65477,75.2624817}}}
    645 debugShowCubicIntersection wtTs[0]=1 {{{129.800003,75.1728287}, {130.08493,75.1982422}, {130.369843,75.2303619}, {130.65477,75.2624817}}} {{130.65477,75.2624817}} wnTs[0]=0 {{{130.65477,75.2624817}, {131.10318,75.3130264}, {131.55159,75.3635712}, {132,75.3879776}}}
    646 debugShowCubicIntersection wtTs[0]=1 {{{130.65477,75.2624817}, {131.10318,75.3130264}, {131.55159,75.3635712}, {132,75.3879776}}} {{132,75.3879776}} wnTs[0]=0 {{{132,75.3879776}, {132.682098,75.4251099}, {133.364182,75.4193726}, {134.04628,75.4136353}}}
    647 debugShowCubicLineIntersection wtTs[0]=1 {{{132,75.3879776}, {132.682098,75.4251099}, {133.364182,75.4193726}, {134.04628,75.4136353}}} {{134.04628,75.4136353}} wnTs[0]=0 {{{134.04628,75.4136353}, {134.199997,75.4123535}}}
    648 debugShowCubicLineIntersection wtTs[0]=0 {{{134.199997,75.4123535}, {134.740479,75.4080048}, {135.28096,75.3897247}, {135.821426,75.3714523}}} {{134.199997,75.4123535}} wnTs[0]=1 {{{134.04628,75.4136353}, {134.199997,75.4123535}}}
    649 debugShowCubicIntersection wtTs[0]=1 {{{134.199997,75.4123535}, {134.740479,75.4080048}, {135.28096,75.3897247}, {135.821426,75.3714523}}} {{135.821426,75.3714523}} wnTs[0]=0 {{{135.821426,75.3714523}, {136.014282,75.3649292}, {136.207138,75.3584061}, {136.399994,75.3525162}}}
    650 debugShowCubicIntersection wtTs[0]=1 {{{135.821426,75.3714523}, {136.014282,75.3649292}, {136.207138,75.3584061}, {136.399994,75.3525162}}} {{136.399994,75.3525162}} wnTs[0]=0 {{{136.399994,75.3525162}, {136.723831,75.3426285}, {137.047668,75.3308029}, {137.371506,75.3189697}}}
    651 debugShowCubicIntersection wtTs[0]=1 {{{136.399994,75.3525162}, {136.723831,75.3426285}, {137.047668,75.3308029}, {137.371506,75.3189697}}} {{137.371506,75.3189697}} wnTs[0]=0 {{{137.371506,75.3189697}, {137.781006,75.3040085}, {138.190506,75.2890472}, {138.600006,75.2780228}}}
    652 debugShowCubicIntersection wtTs[0]=1 {{{137.371506,75.3189697}, {137.781006,75.3040085}, {138.190506,75.2890472}, {138.600006,75.2780228}}} {{138.600006,75.2780228}} wnTs[0]=0 {{{138.600006,75.2780228}, {138.775055,75.2733078}, {138.950119,75.2678604}, {139.125183,75.262413}}}
    653 debugShowCubicIntersection wtTs[0]=1 {{{138.600006,75.2780228}, {138.775055,75.2733078}, {138.950119,75.2678604}, {139.125183,75.262413}}} {{139.125183,75.262413}} wnTs[0]=0 {{{139.125183,75.262413}, {139.683456,75.2450409}, {140.24173,75.2276688}, {140.800003,75.2340317}}}
    654 debugShowCubicIntersection wtTs[0]=1 {{{139.125183,75.262413}, {139.683456,75.2450409}, {140.24173,75.2276688}, {140.800003,75.2340317}}} {{140.800003,75.2340317}} wnTs[0]=0 {{{140.800003,75.2340317}, {141.173523,75.2382889}, {141.547028,75.259819}, {141.920547,75.2813568}}}
    655 debugShowCubicIntersection wtTs[0]=1 {{{140.800003,75.2340317}, {141.173523,75.2382889}, {141.547028,75.259819}, {141.920547,75.2813568}}} {{141.920547,75.2813568}} wnTs[0]=0 {{{141.920547,75.2813568}, {142.280365,75.3021011}, {142.640182,75.3228455}, {143,75.3281403}}}
    656 debugShowCubicIntersection wtTs[0]=1 {{{141.920547,75.2813568}, {142.280365,75.3021011}, {142.640182,75.3228455}, {143,75.3281403}}} {{143,75.3281403}} wnTs[0]=0 {{{143,75.3281403}, {143.733337,75.3389359}, {144.46666,75.3424072}, {145.199997,75.2988205}}}
    657 debugShowCubicIntersection wtTs[0]=1 {{{143,75.3281403}, {143.733337,75.3389359}, {144.46666,75.3424072}, {145.199997,75.2988205}}} {{145.199997,75.2988205}} wnTs[0]=0 {{{145.199997,75.2988205}, {145.574966,75.276535}, {145.949936,75.2288513}, {146.32489,75.1811676}}}
    658 debugShowCubicIntersection wtTs[0]=1 {{{145.199997,75.2988205}, {145.574966,75.276535}, {145.949936,75.2288513}, {146.32489,75.1811676}}} {{146.32489,75.1811676}} wnTs[0]=0 {{{146.32489,75.1811676}, {146.683258,75.1355896}, {147.041626,75.0900192}, {147.399994,75.0666199}}}
    659 debugShowCubicIntersection wtTs[0]=1 {{{146.32489,75.1811676}, {146.683258,75.1355896}, {147.041626,75.0900192}, {147.399994,75.0666199}}} {{147.399994,75.0666199}} wnTs[0]=0 {{{147.399994,75.0666199}, {148.133331,75.0187454}, {148.866669,74.9981079}, {149.600006,75.0115509}}}
    660 debugShowCubicIntersection wtTs[0]=1 {{{147.399994,75.0666199}, {148.133331,75.0187454}, {148.866669,74.9981079}, {149.600006,75.0115509}}} {{149.600006,75.0115509}} wnTs[0]=0 {{{149.600006,75.0115509}, {149.982086,75.0185547}, {150.364182,75.0495148}, {150.746277,75.0804749}}}
    661 debugShowCubicIntersection wtTs[0]=1 {{{149.600006,75.0115509}, {149.982086,75.0185547}, {150.364182,75.0495148}, {150.746277,75.0804749}}} {{150.746277,75.0804749}} wnTs[0]=0 {{{150.746277,75.0804749}, {151.097519,75.1089401}, {151.448761,75.1374054}, {151.800003,75.1472549}}}
    662 debugShowCubicIntersection wtTs[0]=1 {{{150.746277,75.0804749}, {151.097519,75.1089401}, {151.448761,75.1374054}, {151.800003,75.1472549}}} {{151.800003,75.1472549}} wnTs[0]=0 {{{151.800003,75.1472549}, {152.343307,75.1624985}, {152.886597,75.1531296}, {153.429901,75.1437607}}}
    663 debugShowCubicIntersection wtTs[0]=1 {{{151.800003,75.1472549}, {152.343307,75.1624985}, {152.886597,75.1531296}, {153.429901,75.1437607}}} {{153.429901,75.1437607}} wnTs[0]=0 {{{153.429901,75.1437607}, {153.619934,75.14048}, {153.809967,75.137207}, {154,75.1349792}}}
    664 debugShowCubicIntersection wtTs[0]=1 {{{153.429901,75.1437607}, {153.619934,75.14048}, {153.809967,75.137207}, {154,75.1349792}}} {{154,75.1349792}} wnTs[0]=0 {{{154,75.1349792}, {154.295746,75.1315155}, {154.591476,75.123848}, {154.887222,75.1161804}}}
    665 debugShowCubicIntersection wtTs[0]=1 {{{154,75.1349792}, {154.295746,75.1315155}, {154.591476,75.123848}, {154.887222,75.1161804}}} {{154.887222,75.1161804}} wnTs[0]=0 {{{154.887222,75.1161804}, {155.324814,75.1048279}, {155.762405,75.0934753}, {156.199997,75.0957642}}}
    666 debugShowCubicIntersection wtTs[0]=1 {{{154.887222,75.1161804}, {155.324814,75.1048279}, {155.762405,75.0934753}, {156.199997,75.0957642}}} {{156.199997,75.0957642}} wnTs[0]=0 {{{156.199997,75.0957642}, {156.559143,75.097641}, {156.918289,75.1122131}, {157.27742,75.1267853}}}
    667 debugShowCubicIntersection wtTs[0]=1 {{{156.199997,75.0957642}, {156.559143,75.097641}, {156.918289,75.1122131}, {157.27742,75.1267853}}} {{157.27742,75.1267853}} wnTs[0]=0 {{{157.27742,75.1267853}, {157.651611,75.1419754}, {158.025803,75.1571655}, {158.399994,75.1579895}}}
    668 debugShowCubicIntersection wtTs[0]=1 {{{157.27742,75.1267853}, {157.651611,75.1419754}, {158.025803,75.1571655}, {158.399994,75.1579895}}} {{158.399994,75.1579895}} wnTs[0]=0 {{{158.399994,75.1579895}, {159.133331,75.1596069}, {159.866669,75.1515121}, {160.600006,75.105484}}}
    669 debugShowCubicIntersection wtTs[0]=1 {{{158.399994,75.1579895}, {159.133331,75.1596069}, {159.866669,75.1515121}, {160.600006,75.105484}}} {{160.600006,75.105484}} wnTs[0]=0 {{{160.600006,75.105484}, {160.952393,75.0833588}, {161.304794,75.0397339}, {161.657196,74.996109}}}
    670 debugShowCubicIntersection wtTs[0]=1 {{{160.600006,75.105484}, {160.952393,75.0833588}, {161.304794,75.0397339}, {161.657196,74.996109}}} {{161.657196,74.996109}} wnTs[0]=0 {{{161.657196,74.996109}, {162.038132,74.9489594}, {162.419067,74.9018021}, {162.800003,74.8818054}}}
    671 debugShowCubicIntersection wtTs[0]=1 {{{161.657196,74.996109}, {162.038132,74.9489594}, {162.419067,74.9018021}, {162.800003,74.8818054}}} {{162.800003,74.8818054}} wnTs[0]=0 {{{162.800003,74.8818054}, {163.53334,74.8433075}, {164.266663,74.8363724}, {165,74.8744736}}}
    672 debugShowCubicIntersection wtTs[0]=1 {{{162.800003,74.8818054}, {163.53334,74.8433075}, {164.266663,74.8363724}, {165,74.8744736}}} {{165,74.8744736}} wnTs[0]=0 {{{165,74.8744736}, {165.356293,74.8929825}, {165.712585,74.9419861}, {166.068878,74.9909897}}}
    673 debugShowCubicIntersection wtTs[0]=1 {{{165,74.8744736}, {165.356293,74.8929825}, {165.712585,74.9419861}, {166.068878,74.9909897}}} {{166.068878,74.9909897}} wnTs[0]=0 {{{166.068878,74.9909897}, {166.445923,75.0428467}, {166.822952,75.0947037}, {167.199997,75.1104279}}}
    674 debugShowCubicIntersection wtTs[0]=1 {{{166.068878,74.9909897}, {166.445923,75.0428467}, {166.822952,75.0947037}, {167.199997,75.1104279}}} {{167.199997,75.1104279}} wnTs[0]=0 {{{167.199997,75.1104279}, {167.933334,75.1409988}, {168.666672,75.1096573}, {169.399994,75.0579224}}}
    675 debugShowCubicIntersection wtTs[0]=1 {{{167.199997,75.1104279}, {167.933334,75.1409988}, {168.666672,75.1096573}, {169.399994,75.0579224}}} {{169.399994,75.0579224}} wnTs[0]=0 {{{169.399994,75.0579224}, {169.752808,75.0330276}, {170.105621,74.982338}, {170.458435,74.9316483}}}
    676 debugShowCubicIntersection wtTs[0]=1 {{{169.399994,75.0579224}, {169.752808,75.0330276}, {170.105621,74.982338}, {170.458435,74.9316483}}} {{170.458435,74.9316483}} wnTs[0]=0 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}}
    677 debugShowCubicIntersection wtTs[0]=1 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}}
    678 debugShowCubicLineIntersection wtTs[0]=1 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    679 debugShowCubicIntersection wtTs[0]=1 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}} {{173.800003,74.8000031}} wnTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}}
    680 debugShowCubicLineIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wtTs[1]=1 {{173.800003,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.428571405
    681 debugShowCubicLineIntersection wtTs[0]=1 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}} {{175.902405,75.0138397}} wnTs[0]=0 {{{175.902405,75.0138397}, {176,75.0262146}}}
    682 debugShowCubicLineIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}} {{173.800003,74.8000031}} wnTs[0]=0.428571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    683 debugShowCubicLineIntersection wtTs[0]=0 {{{176,75.0262146}, {176.306427,75.0650406}, {176.612839,75.1189728}, {176.919266,75.1729126}}} {{176,75.0262146}} wnTs[0]=1 {{{175.902405,75.0138397}, {176,75.0262146}}}
    684 debugShowCubicIntersection wtTs[0]=1 {{{176,75.0262146}, {176.306427,75.0650406}, {176.612839,75.1189728}, {176.919266,75.1729126}}} {{176.919266,75.1729126}} wnTs[0]=0 {{{176.919266,75.1729126}, {177.346176,75.2480545}, {177.773087,75.3231964}, {178.199997,75.3574677}}}
    685 debugShowCubicIntersection wtTs[0]=1 {{{176.919266,75.1729126}, {177.346176,75.2480545}, {177.773087,75.3231964}, {178.199997,75.3574677}}} {{178.199997,75.3574677}} wnTs[0]=0 {{{178.199997,75.3574677}, {178.933334,75.4163361}, {179.666672,75.4057388}, {180.399994,75.3794556}}}
    686 debugShowCubicIntersection wtTs[0]=1 {{{178.199997,75.3574677}, {178.933334,75.4163361}, {179.666672,75.4057388}, {180.399994,75.3794556}}} {{180.399994,75.3794556}} wnTs[0]=0 {{{180.399994,75.3794556}, {180.822174,75.3643265}, {181.244354,75.322731}, {181.666534,75.2811356}}}
    687 debugShowCubicIntersection wtTs[0]=1 {{{180.399994,75.3794556}, {180.822174,75.3643265}, {181.244354,75.322731}, {181.666534,75.2811356}}} {{181.666534,75.2811356}} wnTs[0]=0 {{{181.666534,75.2811356}, {181.977692,75.2504807}, {182.288849,75.2198257}, {182.600006,75.1997681}}}
    688 debugShowCubicIntersection wtTs[0]=1 {{{181.666534,75.2811356}, {181.977692,75.2504807}, {182.288849,75.2198257}, {182.600006,75.1997681}}} {{182.600006,75.1997681}} wnTs[0]=0 {{{182.600006,75.1997681}, {183.153549,75.1640701}, {183.707108,75.1412506}, {184.260666,75.1184311}}}
    689 debugShowCubicIntersection wtTs[0]=1 {{{182.600006,75.1997681}, {183.153549,75.1640701}, {183.707108,75.1412506}, {184.260666,75.1184311}}} {{184.260666,75.1184311}} wnTs[0]=0 {{{184.260666,75.1184311}, {184.440445,75.1110229}, {184.620224,75.1036148}, {184.800003,75.0957642}}}
    690 debugShowCubicIntersection wtTs[0]=1 {{{184.260666,75.1184311}, {184.440445,75.1110229}, {184.620224,75.1036148}, {184.800003,75.0957642}}} {{184.800003,75.0957642}} wnTs[0]=0 {{{184.800003,75.0957642}, {185.53334,75.0637436}, {186.266663,75.0331039}, {187,75.0076218}}}
    691 debugShowCubicIntersection wtTs[0]=1 {{{184.800003,75.0957642}, {185.53334,75.0637436}, {186.266663,75.0331039}, {187,75.0076218}}} {{187,75.0076218}} wnTs[0]=0 {{{187,75.0076218}, {187.218643,75.0000229}, {187.437286,74.9894943}, {187.65593,74.9789658}}}
    692 debugShowCubicIntersection wtTs[0]=1 {{{187,75.0076218}, {187.218643,75.0000229}, {187.437286,74.9894943}, {187.65593,74.9789658}}} {{187.65593,74.9789658}} wnTs[0]=0 {{{187.65593,74.9789658}, {188.170624,74.9541702}, {188.685303,74.9293747}, {189.199997,74.9428329}}}
    693 debugShowCubicIntersection wtTs[0]=1 {{{187.65593,74.9789658}, {188.170624,74.9541702}, {188.685303,74.9293747}, {189.199997,74.9428329}}} {{189.199997,74.9428329}} wnTs[0]=0 {{{189.199997,74.9428329}, {189.560562,74.9522629}, {189.921127,74.9923019}, {190.281693,75.032341}}}
    694 debugShowCubicIntersection wtTs[0]=1 {{{189.199997,74.9428329}, {189.560562,74.9522629}, {189.921127,74.9923019}, {190.281693,75.032341}}} {{190.281693,75.032341}} wnTs[0]=0 {{{190.281693,75.032341}, {190.654465,75.0737381}, {191.027237,75.1151352}, {191.399994,75.1227036}}}
    695 debugShowCubicIntersection wtTs[0]=1 {{{190.281693,75.032341}, {190.654465,75.0737381}, {191.027237,75.1151352}, {191.399994,75.1227036}}} {{191.399994,75.1227036}} wnTs[0]=0 {{{191.399994,75.1227036}, {191.942627,75.1337204}, {192.48526,75.0998383}, {193.027893,75.0659485}}}
    696 debugShowCubicIntersection wtTs[0]=1 {{{191.399994,75.1227036}, {191.942627,75.1337204}, {192.48526,75.0998383}, {193.027893,75.0659485}}} {{193.027893,75.0659485}} wnTs[0]=0 {{{193.027893,75.0659485}, {193.218597,75.054039}, {193.409302,75.0421295}, {193.600006,75.0321732}}}
    697 debugShowCubicIntersection wtTs[0]=1 {{{193.027893,75.0659485}, {193.218597,75.054039}, {193.409302,75.0421295}, {193.600006,75.0321732}}} {{193.600006,75.0321732}} wnTs[0]=0 {{{193.600006,75.0321732}, {193.897125,75.016655}, {194.19426,74.9936142}, {194.491394,74.9705658}}}
    698 debugShowCubicIntersection wtTs[0]=1 {{{193.600006,75.0321732}, {193.897125,75.016655}, {194.19426,74.9936142}, {194.491394,74.9705658}}} {{194.491394,74.9705658}} wnTs[0]=0 {{{194.491394,74.9705658}, {194.927597,74.9367371}, {195.3638,74.9029083}, {195.800003,74.8928909}}}
    699 debugShowCubicIntersection wtTs[0]=1 {{{194.491394,74.9705658}, {194.927597,74.9367371}, {195.3638,74.9029083}, {195.800003,74.8928909}}} {{195.800003,74.8928909}} wnTs[0]=0 {{{195.800003,74.8928909}, {196.363327,74.8799515}, {196.926636,74.8978424}, {197.48996,74.9157333}}}
    700 debugShowCubicIntersection wtTs[0]=1 {{{195.800003,74.8928909}, {196.363327,74.8799515}, {196.926636,74.8978424}, {197.48996,74.9157333}}} {{197.48996,74.9157333}} wnTs[0]=0 {{{197.48996,74.9157333}, {197.659973,74.9211349}, {197.829987,74.9265366}, {198,74.9310913}}}
    701 debugShowCubicIntersection wtTs[0]=1 {{{197.48996,74.9157333}, {197.659973,74.9211349}, {197.829987,74.9265366}, {198,74.9310913}}} {{198,74.9310913}} wnTs[0]=0 {{{198,74.9310913}, {198.539948,74.945549}, {199.07988,74.9668427}, {199.619827,74.9881363}}}
    702 debugShowCubicIntersection wtTs[0]=1 {{{198,74.9310913}, {198.539948,74.945549}, {199.07988,74.9668427}, {199.619827,74.9881363}}} {{199.619827,74.9881363}} wnTs[0]=0 {{{199.619827,74.9881363}, {199.813217,74.9957657}, {200.006607,75.0033951}, {200.199997,75.0107117}}}
    703 debugShowCubicIntersection wtTs[0]=1 {{{199.619827,74.9881363}, {199.813217,74.9957657}, {200.006607,75.0033951}, {200.199997,75.0107117}}} {{200.199997,75.0107117}} wnTs[0]=0 {{{200.199997,75.0107117}, {200.468765,75.020874}, {200.737534,75.032814}, {201.006287,75.0447464}}}
    704 debugShowCubicIntersection wtTs[0]=1 {{{200.199997,75.0107117}, {200.468765,75.020874}, {200.737534,75.032814}, {201.006287,75.0447464}}} {{201.006287,75.0447464}} wnTs[0]=0 {{{201.006287,75.0447464}, {201.470856,75.0653763}, {201.935425,75.0860062}, {202.399994,75.0974884}}}
    705 debugShowCubicIntersection wtTs[0]=1 {{{201.006287,75.0447464}, {201.470856,75.0653763}, {201.935425,75.0860062}, {202.399994,75.0974884}}} {{202.399994,75.0974884}} wnTs[0]=0 {{{202.399994,75.0974884}, {202.888885,75.1095734}, {203.377777,75.1120605}, {203.866669,75.1145554}}}
    706 debugShowCubicIntersection wtTs[0]=1 {{{202.399994,75.0974884}, {202.888885,75.1095734}, {203.377777,75.1120605}, {203.866669,75.1145554}}} {{203.866669,75.1145554}} wnTs[0]=0 {{{203.866669,75.1145554}, {204.111115,75.115799}, {204.35556,75.1170425}, {204.600006,75.1194839}}}
    707 debugShowCubicIntersection wtTs[0]=1 {{{203.866669,75.1145554}, {204.111115,75.115799}, {204.35556,75.1170425}, {204.600006,75.1194839}}} {{204.600006,75.1194839}} wnTs[0]=0 {{{204.600006,75.1194839}, {204.84462,75.121933}, {205.089233,75.1239471}, {205.333847,75.1259613}}}
    708 debugShowCubicIntersection wtTs[0]=1 {{{204.600006,75.1194839}, {204.84462,75.121933}, {205.089233,75.1239471}, {205.333847,75.1259613}}} {{205.333847,75.1259613}} wnTs[0]=0 {{{205.333847,75.1259613}, {205.822556,75.129982}, {206.311279,75.1340103}, {206.800003,75.1414719}}}
    709 debugShowCubicIntersection wtTs[0]=1 {{{205.333847,75.1259613}, {205.822556,75.129982}, {206.311279,75.1340103}, {206.800003,75.1414719}}} {{206.800003,75.1414719}} wnTs[0]=0 {{{206.800003,75.1414719}, {207.53334,75.1526718}, {208.266663,75.1675339}, {209,75.1866531}}}
    710 debugShowCubicIntersection wtTs[0]=1 {{{206.800003,75.1414719}, {207.53334,75.1526718}, {208.266663,75.1675339}, {209,75.1866531}}} {{209,75.1866531}} wnTs[0]=0 {{{209,75.1866531}, {209.350708,75.1957932}, {209.701416,75.2080078}, {210.052124,75.2202225}}}
    711 debugShowCubicIntersection wtTs[0]=1 {{{209,75.1866531}, {209.350708,75.1957932}, {209.701416,75.2080078}, {210.052124,75.2202225}}} {{210.052124,75.2202225}} wnTs[0]=0 {{{210.052124,75.2202225}, {210.434753,75.2335434}, {210.817368,75.2468643}, {211.199997,75.2562027}}}
    712 debugShowCubicIntersection wtTs[0]=1 {{{210.052124,75.2202225}, {210.434753,75.2335434}, {210.817368,75.2468643}, {211.199997,75.2562027}}} {{211.199997,75.2562027}} wnTs[0]=0 {{{211.199997,75.2562027}, {211.933334,75.2741013}, {212.666672,75.2871475}, {213.399994,75.2940521}}}
    713 debugShowCubicIntersection wtTs[0]=1 {{{211.199997,75.2562027}, {211.933334,75.2741013}, {212.666672,75.2871475}, {213.399994,75.2940521}}} {{213.399994,75.2940521}} wnTs[0]=0 {{{213.399994,75.2940521}, {214.133331,75.3009567}, {214.866669,75.3041916}, {215.600006,75.2976303}}}
    714 debugShowCubicIntersection wtTs[0]=1 {{{213.399994,75.2940521}, {214.133331,75.3009567}, {214.866669,75.3041916}, {215.600006,75.2976303}}} {{215.600006,75.2976303}} wnTs[0]=0 {{{215.600006,75.2976303}, {216.076187,75.2933655}, {216.552383,75.2823792}, {217.02858,75.2713928}}}
    715 debugShowCubicIntersection wtTs[0]=1 {{{215.600006,75.2976303}, {216.076187,75.2933655}, {216.552383,75.2823792}, {217.02858,75.2713928}}} {{217.02858,75.2713928}} wnTs[0]=0 {{{217.02858,75.2713928}, {217.285721,75.2654572}, {217.542862,75.2595291}, {217.800003,75.2546539}}}
    716 debugShowCubicIntersection wtTs[0]=1 {{{217.02858,75.2713928}, {217.285721,75.2654572}, {217.542862,75.2595291}, {217.800003,75.2546539}}} {{217.800003,75.2546539}} wnTs[0]=0 {{{217.800003,75.2546539}, {218.041779,75.2500763}, {218.283554,75.2413101}, {218.52533,75.2325439}}}
    717 debugShowCubicIntersection wtTs[0]=1 {{{217.800003,75.2546539}, {218.041779,75.2500763}, {218.283554,75.2413101}, {218.52533,75.2325439}}} {{218.52533,75.2325439}} wnTs[0]=0 {{{218.52533,75.2325439}, {219.016891,75.2147217}, {219.508438,75.1968994}, {220,75.2142487}}}
    718 debugShowCubicIntersection wtTs[0]=1 {{{218.52533,75.2325439}, {219.016891,75.2147217}, {219.508438,75.1968994}, {220,75.2142487}}} {{220,75.2142487}} wnTs[0]=0 {{{220,75.2142487}, {220.409988,75.2287216}, {220.819977,75.2736588}, {221.229965,75.3185959}}}
    719 debugShowCubicIntersection wtTs[0]=1 {{{220,75.2142487}, {220.409988,75.2287216}, {220.819977,75.2736588}, {221.229965,75.3185959}}} {{221.229965,75.3185959}} wnTs[0]=0 {{{221.229965,75.3185959}, {221.553314,75.3540344}, {221.876648,75.389473}, {222.199997,75.4099731}}}
    720 debugShowCubicIntersection wtTs[0]=1 {{{221.229965,75.3185959}, {221.553314,75.3540344}, {221.876648,75.389473}, {222.199997,75.4099731}}} {{222.199997,75.4099731}} wnTs[0]=0 {{{222.199997,75.4099731}, {222.933334,75.456459}, {223.666672,75.4962387}, {224.399994,75.4931717}}}
    721 debugShowCubicIntersection wtTs[0]=1 {{{222.199997,75.4099731}, {222.933334,75.456459}, {223.666672,75.4962387}, {224.399994,75.4931717}}} {{224.399994,75.4931717}} wnTs[0]=0 {{{224.399994,75.4931717}, {224.885803,75.4911423}, {225.371613,75.4618988}, {225.857422,75.4326553}}}
    722 debugShowCubicIntersection wtTs[0]=1 {{{224.399994,75.4931717}, {224.885803,75.4911423}, {225.371613,75.4618988}, {225.857422,75.4326553}}} {{225.857422,75.4326553}} wnTs[0]=0 {{{225.857422,75.4326553}, {226.10495,75.4177551}, {226.352478,75.4028549}, {226.600006,75.3915558}}}
    723 debugShowCubicIntersection wtTs[0]=1 {{{225.857422,75.4326553}, {226.10495,75.4177551}, {226.352478,75.4028549}, {226.600006,75.3915558}}} {{226.600006,75.3915558}} wnTs[0]=0 {{{226.600006,75.3915558}, {226.839722,75.3806152}, {227.079437,75.3675385}, {227.319153,75.354454}}}
    724 debugShowCubicIntersection wtTs[0]=1 {{{226.600006,75.3915558}, {226.839722,75.3806152}, {227.079437,75.3675385}, {227.319153,75.354454}}} {{227.319153,75.354454}} wnTs[0]=0 {{{227.319153,75.354454}, {227.812759,75.3275223}, {228.306381,75.3005905}, {228.800003,75.2923279}}}
    725 debugShowCubicIntersection wtTs[0]=1 {{{227.319153,75.354454}, {227.812759,75.3275223}, {228.306381,75.3005905}, {228.800003,75.2923279}}} {{228.800003,75.2923279}} wnTs[0]=0 {{{228.800003,75.2923279}, {229.309921,75.2837906}, {229.819824,75.2945709}, {230.329742,75.3053513}}}
    726 debugShowCubicIntersection wtTs[0]=1 {{{228.800003,75.2923279}, {229.309921,75.2837906}, {229.819824,75.2945709}, {230.329742,75.3053513}}} {{230.329742,75.3053513}} wnTs[0]=0 {{{230.329742,75.3053513}, {230.553162,75.3100739}, {230.776581,75.3147964}, {231,75.317894}}}
    727 debugShowCubicIntersection wtTs[0]=1 {{{230.329742,75.3053513}, {230.553162,75.3100739}, {230.776581,75.3147964}, {231,75.317894}}} {{231,75.317894}} wnTs[0]=0 {{{231,75.317894}, {231.290405,75.3219223}, {231.580811,75.3275833}, {231.871216,75.333252}}}
    728 debugShowCubicIntersection wtTs[0]=1 {{{231,75.317894}, {231.290405,75.3219223}, {231.580811,75.3275833}, {231.871216,75.333252}}} {{231.871216,75.333252}} wnTs[0]=0 {{{231.871216,75.333252}, {232.314148,75.3418884}, {232.757065,75.3505249}, {233.199997,75.3533554}}}
    729 debugShowCubicIntersection wtTs[0]=1 {{{231.871216,75.333252}, {232.314148,75.3418884}, {232.757065,75.3505249}, {233.199997,75.3533554}}} {{233.199997,75.3533554}} wnTs[0]=0 {{{233.199997,75.3533554}, {233.933334,75.3580399}, {234.666672,75.3606873}, {235.399994,75.3460236}}}
    730 debugShowCubicIntersection wtTs[0]=1 {{{233.199997,75.3533554}, {233.933334,75.3580399}, {234.666672,75.3606873}, {235.399994,75.3460236}}} {{235.399994,75.3460236}} wnTs[0]=0 {{{235.399994,75.3460236}, {235.845032,75.3371277}, {236.29007,75.3182449}, {236.735107,75.2993622}}}
    731 debugShowCubicIntersection wtTs[0]=1 {{{235.399994,75.3460236}, {235.845032,75.3371277}, {236.29007,75.3182449}, {236.735107,75.2993622}}} {{236.735107,75.2993622}} wnTs[0]=0 {{{236.735107,75.2993622}, {237.023407,75.2871323}, {237.311707,75.2749023}, {237.600006,75.2653885}}}
    732 debugShowCubicIntersection wtTs[0]=1 {{{236.735107,75.2993622}, {237.023407,75.2871323}, {237.311707,75.2749023}, {237.600006,75.2653885}}} {{237.600006,75.2653885}} wnTs[0]=0 {{{237.600006,75.2653885}, {238.333328,75.2411804}, {239.066666,75.2196732}, {239.800003,75.2007828}}}
    733 debugShowCubicIntersection wtTs[0]=1 {{{237.600006,75.2653885}, {238.333328,75.2411804}, {239.066666,75.2196732}, {239.800003,75.2007828}}} {{239.800003,75.2007828}} wnTs[0]=0 {{{239.800003,75.2007828}, {240.082169,75.193512}, {240.364334,75.1891708}, {240.6465,75.1848297}}}
    734 debugShowCubicIntersection wtTs[0]=1 {{{239.800003,75.2007828}, {240.082169,75.193512}, {240.364334,75.1891708}, {240.6465,75.1848297}}} {{240.6465,75.1848297}} wnTs[0]=0 {{{240.6465,75.1848297}, {241.097672,75.177887}, {241.548828,75.1709366}, {242,75.1520233}}}
    735 debugShowCubicIntersection wtTs[0]=1 {{{240.6465,75.1848297}, {241.097672,75.177887}, {241.548828,75.1709366}, {242,75.1520233}}} {{242,75.1520233}} wnTs[0]=0 {{{242,75.1520233}, {242.416458,75.1345673}, {242.832916,75.1057968}, {243.249374,75.0770187}}}
    736 debugShowCubicIntersection wtTs[0]=1 {{{242,75.1520233}, {242.416458,75.1345673}, {242.832916,75.1057968}, {243.249374,75.0770187}}} {{243.249374,75.0770187}} wnTs[0]=0 {{{243.249374,75.0770187}, {243.566254,75.0551224}, {243.883118,75.033226}, {244.199997,75.0163193}}}
    737 debugShowCubicIntersection wtTs[0]=1 {{{243.249374,75.0770187}, {243.566254,75.0551224}, {243.883118,75.033226}, {244.199997,75.0163193}}} {{244.199997,75.0163193}} wnTs[0]=0 {{{244.199997,75.0163193}, {244.933334,74.9771957}, {245.666672,74.9453659}, {246.399994,74.9172668}}}
    738 debugShowCubicIntersection wtTs[0]=1 {{{244.199997,75.0163193}, {244.933334,74.9771957}, {245.666672,74.9453659}, {246.399994,74.9172668}}} {{246.399994,74.9172668}} wnTs[0]=0 {{{246.399994,74.9172668}, {247.133331,74.8891678}, {247.866669,74.8672562}, {248.600006,74.8477097}}}
    739 debugShowCubicLineIntersection wtTs[0]=1 {{{246.399994,74.9172668}, {247.133331,74.8891678}, {247.866669,74.8672562}, {248.600006,74.8477097}}} {{248.600006,74.8477097}} wnTs[0]=0 {{{248.600006,74.8477097}, {248.714218,74.8446655}}}
    740 debugShowCubicLineIntersection wtTs[0]=0 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}} {{248.714218,74.8446655}} wnTs[0]=1 {{{248.600006,74.8477097}, {248.714218,74.8446655}}}
    741 debugShowCubicIntersection wtTs[0]=1 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}}
    742 debugShowCubicLineIntersection wtTs[0]=1 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    743 debugShowCubicIntersection wtTs[0]=1 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}} {{252.266663,74.798233}} wnTs[0]=0 {{{252.266663,74.798233}, {252.511108,74.799118}, {252.755554,74.8000031}, {253,74.8000031}}}
    744 debugShowCubicLineIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    745 debugShowCubicLineIntersection wtTs[0]=1 {{{252.266663,74.798233}, {252.511108,74.799118}, {252.755554,74.8000031}, {253,74.8000031}}} {{253,74.8000031}} wnTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}}
    746 SkOpSegment::addT insert t=0.928577558 segID=299 spanID=623
    747 SkOpSegment::addT insert t=0.99844881 segID=12 spanID=624
    748 </div>
    749 
    750 </div>
    751 
    752 <script type="text/javascript">
    753 
    754 var testDivs = [
    755     issue3651_7,
    756 
    757 ];
    758 
    759 var decimal_places = 3; // make this 3 to show more precision
    760 
    761 var tests = [];
    762 var testLines = [];
    763 var testTitles = [];
    764 var testIndex = 0;
    765 var ctx;
    766 
    767 var xmin, xmax, focusXmin, focusXmax;
    768 var ymin, ymax, focusYmin, focusYmax;
    769 var scale;
    770 var mouseX, mouseY;
    771 var srcLeft, srcTop;
    772 var screenWidth, screenHeight;
    773 var drawnPts, drawnLines, drawnQuads, drawnConics, drawnCubics;
    774 var curveT = 0;
    775 
    776 var pt_labels = 2;
    777 var collect_bounds = false;
    778 var control_lines = 0;
    779 var curve_t = false;
    780 var debug_xy = 1;
    781 var focus_enabled = false;
    782 var focus_on_selection = false;
    783 var step_limit = 0;
    784 var draw_active = false;
    785 var draw_add = false;
    786 var draw_angle = 0;
    787 var draw_coincidence = false;
    788 var draw_deriviatives = 0;
    789 var draw_hints = false;
    790 var draw_id = false;
    791 var draw_intersection = 0;
    792 var draw_intersectT = false;
    793 var draw_legend = true;
    794 var draw_log = false;
    795 var draw_mark = false;
    796 var draw_midpoint = false;
    797 var draw_op = 0;
    798 var draw_sequence = false;
    799 var draw_sort = 0;
    800 var draw_top = false;
    801 var draw_path = 3;
    802 var draw_computed = 0;
    803 var retina_scale = !!window.devicePixelRatio;
    804 
    805 var activeCount = 0;
    806 var addCount = 0;
    807 var angleCount = 0;
    808 var coinCount = 0;
    809 var opCount = 0;
    810 var sectCount = 0;
    811 var sortCount = 0;
    812 var topCount = 0;
    813 var markCount = 0;
    814 var activeMax = 0;
    815 var addMax = 0;
    816 var angleMax = 0;
    817 var coinMax = 0;
    818 var sectMax = 0;
    819 var sectMax2 = 0;
    820 var sortMax = 0;
    821 var topMax = 0;
    822 var markMax = 0;
    823 var opMax = 0;
    824 var stepMax = 0;
    825 var lastIndex = 0;
    826 var hasPath = false;
    827 var hasComputedPath = false;
    828 var angleBetween = false;
    829 var afterIndex = 0;
    830 
    831 var firstActiveSpan = -1;
    832 var logStart = -1;
    833 var logRange = 0;
    834 
    835 var SPAN_ID = 0;
    836 var SPAN_X1 = SPAN_ID + 1;
    837 var SPAN_Y1 = SPAN_X1 + 1;
    838 var SPAN_X2 = SPAN_Y1 + 1;
    839 var SPAN_Y2 = SPAN_X2 + 1;
    840 
    841 var SPAN_L_T = SPAN_Y2 + 1;
    842 var SPAN_L_TX = SPAN_L_T + 1;
    843 var SPAN_L_TY = SPAN_L_TX + 1;
    844 var SPAN_L_TEND = SPAN_L_TY + 1;
    845 var SPAN_L_OTHER = SPAN_L_TEND + 1;
    846 var SPAN_L_OTHERT = SPAN_L_OTHER + 1;
    847 var SPAN_L_OTHERI = SPAN_L_OTHERT + 1;
    848 var SPAN_L_SUM = SPAN_L_OTHERI + 1;
    849 var SPAN_L_VAL = SPAN_L_SUM + 1;
    850 var SPAN_L_OPP = SPAN_L_VAL + 1;
    851 
    852 var SPAN_X3 = SPAN_Y2 + 1;
    853 var SPAN_Y3 = SPAN_X3 + 1;
    854 
    855 var SPAN_Q_T = SPAN_Y3 + 1;
    856 var SPAN_Q_TX = SPAN_Q_T + 1;
    857 var SPAN_Q_TY = SPAN_Q_TX + 1;
    858 var SPAN_Q_TEND = SPAN_Q_TY + 1;
    859 var SPAN_Q_OTHER = SPAN_Q_TEND + 1;
    860 var SPAN_Q_OTHERT = SPAN_Q_OTHER + 1;
    861 var SPAN_Q_OTHERI = SPAN_Q_OTHERT + 1;
    862 var SPAN_Q_SUM = SPAN_Q_OTHERI + 1;
    863 var SPAN_Q_VAL = SPAN_Q_SUM + 1;
    864 var SPAN_Q_OPP = SPAN_Q_VAL + 1;
    865 
    866 var SPAN_K_W = SPAN_Y3 + 1;
    867 var SPAN_K_T = SPAN_K_W + 1;
    868 var SPAN_K_TX = SPAN_K_T + 1;
    869 var SPAN_K_TY = SPAN_K_TX + 1;
    870 var SPAN_K_TEND = SPAN_K_TY + 1;
    871 var SPAN_K_OTHER = SPAN_K_TEND + 1;
    872 var SPAN_K_OTHERT = SPAN_K_OTHER + 1;
    873 var SPAN_K_OTHERI = SPAN_K_OTHERT + 1;
    874 var SPAN_K_SUM = SPAN_K_OTHERI + 1;
    875 var SPAN_K_VAL = SPAN_K_SUM + 1;
    876 var SPAN_K_OPP = SPAN_K_VAL + 1;
    877 
    878 var SPAN_X4 = SPAN_Y3 + 1;
    879 var SPAN_Y4 = SPAN_X4 + 1;
    880 
    881 var SPAN_C_T = SPAN_Y4 + 1;
    882 var SPAN_C_TX = SPAN_C_T + 1;
    883 var SPAN_C_TY = SPAN_C_TX + 1;
    884 var SPAN_C_TEND = SPAN_C_TY + 1;
    885 var SPAN_C_OTHER = SPAN_C_TEND + 1;
    886 var SPAN_C_OTHERT = SPAN_C_OTHER + 1;
    887 var SPAN_C_OTHERI = SPAN_C_OTHERT + 1;
    888 var SPAN_C_SUM = SPAN_C_OTHERI + 1;
    889 var SPAN_C_VAL = SPAN_C_SUM + 1;
    890 var SPAN_C_OPP = SPAN_C_VAL + 1;
    891 
    892 var ACTIVE_LINE_SPAN =        1;
    893 var ACTIVE_QUAD_SPAN =        ACTIVE_LINE_SPAN + 1;
    894 var ACTIVE_CONIC_SPAN =       ACTIVE_QUAD_SPAN + 1;
    895 var ACTIVE_CUBIC_SPAN =       ACTIVE_CONIC_SPAN + 1;
    896 
    897 var ADD_MOVETO =              ACTIVE_CUBIC_SPAN + 1;
    898 var ADD_LINETO =              ADD_MOVETO + 1;
    899 var ADD_QUADTO =              ADD_LINETO + 1;
    900 var ADD_CONICTO =             ADD_QUADTO + 1;
    901 var ADD_CUBICTO =             ADD_CONICTO + 1;
    902 var ADD_CLOSE =               ADD_CUBICTO + 1;
    903 var ADD_FILL =                ADD_CLOSE + 1;
    904 
    905 var PATH_LINE =               ADD_FILL + 1;
    906 var PATH_QUAD =               PATH_LINE + 1;
    907 var PATH_CONIC =              PATH_QUAD + 1;
    908 var PATH_CUBIC =              PATH_CONIC + 1;
    909 
    910 var INTERSECT_LINE =          PATH_CUBIC + 1;
    911 var INTERSECT_LINE_2 =        INTERSECT_LINE + 1;
    912 var INTERSECT_LINE_NO =       INTERSECT_LINE_2 + 1;
    913 var INTERSECT_QUAD_LINE =     INTERSECT_LINE_NO + 1;
    914 var INTERSECT_QUAD_LINE_2 =   INTERSECT_QUAD_LINE + 1;
    915 var INTERSECT_QUAD_LINE_NO =  INTERSECT_QUAD_LINE_2 + 1;
    916 var INTERSECT_QUAD =          INTERSECT_QUAD_LINE_NO + 1;
    917 var INTERSECT_QUAD_2 =        INTERSECT_QUAD + 1;
    918 var INTERSECT_QUAD_NO =       INTERSECT_QUAD_2 + 1;
    919 var INTERSECT_CONIC_LINE =    INTERSECT_QUAD_NO + 1;
    920 var INTERSECT_CONIC_LINE_2 =  INTERSECT_CONIC_LINE + 1;
    921 var INTERSECT_CONIC_LINE_NO = INTERSECT_CONIC_LINE_2 + 1;
    922 var INTERSECT_CONIC =         INTERSECT_CONIC_LINE_NO + 1;
    923 var INTERSECT_CONIC_2 =       INTERSECT_CONIC + 1;
    924 var INTERSECT_CONIC_NO =      INTERSECT_CONIC_2 + 1;
    925 var INTERSECT_SELF_CUBIC =    INTERSECT_CONIC_NO + 1;
    926 var INTERSECT_SELF_CUBIC_NO = INTERSECT_SELF_CUBIC + 1;
    927 var INTERSECT_CUBIC_LINE =    INTERSECT_SELF_CUBIC_NO + 1;
    928 var INTERSECT_CUBIC_LINE_2 =  INTERSECT_CUBIC_LINE + 1;
    929 var INTERSECT_CUBIC_LINE_3 =  INTERSECT_CUBIC_LINE_2 + 1;
    930 var INTERSECT_CUBIC_LINE_NO = INTERSECT_CUBIC_LINE_3 + 1;
    931 var INTERSECT_CUBIC_QUAD =    INTERSECT_CUBIC_LINE_NO + 1;
    932 var INTERSECT_CUBIC_QUAD_2 =  INTERSECT_CUBIC_QUAD + 1;
    933 var INTERSECT_CUBIC_QUAD_3 =  INTERSECT_CUBIC_QUAD_2 + 1;
    934 var INTERSECT_CUBIC_QUAD_4 =  INTERSECT_CUBIC_QUAD_3 + 1;
    935 var INTERSECT_CUBIC_QUAD_NO = INTERSECT_CUBIC_QUAD_4 + 1;
    936 var INTERSECT_CUBIC =         INTERSECT_CUBIC_QUAD_NO + 1;
    937 var INTERSECT_CUBIC_2 =       INTERSECT_CUBIC + 1;
    938 var INTERSECT_CUBIC_3 =       INTERSECT_CUBIC_2 + 1;
    939 var INTERSECT_CUBIC_4 =       INTERSECT_CUBIC_3 + 1;
    940 // FIXME: add cubic 5- 9
    941 var INTERSECT_CUBIC_NO =      INTERSECT_CUBIC_4 + 1;
    942 
    943 var SORT_UNARY =              INTERSECT_CUBIC_NO + 1;
    944 var SORT_BINARY =             SORT_UNARY + 1;
    945 
    946 var OP_DIFFERENCE =           SORT_BINARY + 1;
    947 var OP_INTERSECT =            OP_DIFFERENCE + 1;
    948 var OP_UNION =                OP_INTERSECT + 1;
    949 var OP_XOR =                  OP_UNION + 1;
    950 
    951 var MARK_LINE =               OP_XOR + 1;
    952 var MARK_QUAD =               MARK_LINE + 1;
    953 var MARK_CONIC =              MARK_QUAD + 1;
    954 var MARK_CUBIC =              MARK_CONIC + 1;
    955 var MARK_DONE_LINE =          MARK_CUBIC + 1;
    956 var MARK_DONE_QUAD =          MARK_DONE_LINE + 1;
    957 var MARK_DONE_CONIC =         MARK_DONE_QUAD + 1;
    958 var MARK_DONE_CUBIC =         MARK_DONE_CONIC + 1;
    959 var MARK_UNSORTABLE_LINE =    MARK_DONE_CUBIC + 1;
    960 var MARK_UNSORTABLE_QUAD =    MARK_UNSORTABLE_LINE + 1;
    961 var MARK_UNSORTABLE_CONIC =   MARK_UNSORTABLE_QUAD + 1;
    962 var MARK_UNSORTABLE_CUBIC =   MARK_UNSORTABLE_CONIC + 1;
    963 var MARK_SIMPLE_LINE =        MARK_UNSORTABLE_CUBIC + 1;
    964 var MARK_SIMPLE_QUAD =        MARK_SIMPLE_LINE + 1;
    965 var MARK_SIMPLE_CONIC =       MARK_SIMPLE_QUAD + 1;
    966 var MARK_SIMPLE_CUBIC =       MARK_SIMPLE_CONIC + 1;
    967 var MARK_SIMPLE_DONE_LINE =   MARK_SIMPLE_CUBIC + 1;
    968 var MARK_SIMPLE_DONE_QUAD =   MARK_SIMPLE_DONE_LINE + 1;
    969 var MARK_SIMPLE_DONE_CONIC =  MARK_SIMPLE_DONE_QUAD + 1;
    970 var MARK_SIMPLE_DONE_CUBIC =  MARK_SIMPLE_DONE_CONIC + 1;
    971 var MARK_DONE_UNARY_LINE =    MARK_SIMPLE_DONE_CUBIC + 1;
    972 var MARK_DONE_UNARY_QUAD =    MARK_DONE_UNARY_LINE + 1;
    973 var MARK_DONE_UNARY_CONIC =   MARK_DONE_UNARY_QUAD + 1;
    974 var MARK_DONE_UNARY_CUBIC =   MARK_DONE_UNARY_CONIC + 1;
    975 var MARK_ANGLE_LAST =         MARK_DONE_UNARY_CUBIC + 1;
    976 
    977 var COMPUTED_SET_1 =          MARK_ANGLE_LAST + 1;
    978 var COMPUTED_SET_2 =          COMPUTED_SET_1 + 1;
    979 
    980 var ANGLE_AFTER =             COMPUTED_SET_2 + 1;
    981 var ANGLE_AFTERPART =         ANGLE_AFTER + 1;
    982 
    983 var ACTIVE_OP =               ANGLE_AFTERPART + 1;
    984 
    985 var COIN_MAIN_SPAN =          ACTIVE_OP + 1;
    986 var COIN_OPP_SPAN =           COIN_MAIN_SPAN + 1;
    987 
    988 var FRAG_TYPE_LAST =          COIN_OPP_SPAN;
    989 
    990 var REC_TYPE_UNKNOWN = -1;
    991 var REC_TYPE_PATH = 0;
    992 var REC_TYPE_PATH2 = 1;
    993 var REC_TYPE_SECT = 2;
    994 var REC_TYPE_ACTIVE = 3;
    995 var REC_TYPE_ADD = 4;
    996 var REC_TYPE_SORT = 5;
    997 var REC_TYPE_OP = 6;
    998 var REC_TYPE_MARK = 7;
    999 var REC_TYPE_COMPUTED = 8;
   1000 var REC_TYPE_COIN = 9;
   1001 var REC_TYPE_ANGLE = 10;
   1002 var REC_TYPE_ACTIVE_OP = 11;
   1003 var REC_TYPE_AFTERPART = 12;
   1004 var REC_TYPE_TOP = 13;
   1005 var REC_TYPE_COINCIDENCE = 14;
   1006 var REC_TYPE_LAST = REC_TYPE_COINCIDENCE;
   1007 
   1008 function strs_to_nums(strs) {
   1009     var result = [];
   1010     for (var idx = 1; idx < strs.length; ++idx) {
   1011         var str = strs[idx];
   1012         var num = parseFloat(str);
   1013         if (isNaN(num)) {
   1014             result.push(str);
   1015         } else {
   1016             result.push(num);
   1017         }
   1018     }
   1019     return result;
   1020 }
   1021 
   1022 function filter_str_by(id, str, regex, array) {
   1023     if (regex.test(str)) {
   1024         var strs = regex.exec(str);
   1025         var result = strs_to_nums(strs);
   1026         array.push(id);
   1027         array.push(result);
   1028         return true;
   1029     }
   1030     return false;
   1031 }
   1032 
   1033 function construct_regexp2(pattern) {
   1034     var escape = pattern.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
   1035     escape = escape.replace(/UNSORTABLE/g, "\\*\\*\\* UNSORTABLE \\*\\*\\*");
   1036     escape = escape.replace(/CUBIC_VAL/g, "\\(P_VAL P_VAL P_VAL P_VAL\\)");
   1037     escape = escape.replace(/CONIC_VAL/g, "\\(P_VAL P_VAL P_VAL W_VAL\\)");
   1038     escape = escape.replace(/QUAD_VAL/g, "\\(P_VAL P_VAL P_VAL\\)");
   1039     escape = escape.replace(/LINE_VAL/g, "\\(P_VAL P_VAL\\)");
   1040     escape = escape.replace(/FILL_TYPE/g, "SkPath::k[a-zA-Z]+_FillType");
   1041     escape = escape.replace(/PTR_VAL/g, "0x[0-9A-F]+");
   1042     escape = escape.replace(/PT_VAL/g, "\\(P_VAL\\)");
   1043     escape = escape.replace(/P_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?, ?(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?");
   1044     escape = escape.replace(/T_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)");
   1045     escape = escape.replace(/W_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?");
   1046     escape = escape.replace(/PATH/g, "pathB?");
   1047     escape = escape.replace(/IDX/g, "(-?\\d+)");
   1048     escape = escape.replace(/NUM/g, "(-?\\d+)");
   1049     escape = escape.replace(/OPT/g, "(\\?|-?\\d+)");
   1050     return new RegExp(escape, 'i');
   1051 }
   1052 
   1053 function construct_regexp2c(pattern) {
   1054     var escape = pattern.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
   1055     escape = escape.replace(/UNSORTABLE/g, "\\*\\*\\* UNSORTABLE \\*\\*\\*");
   1056     escape = escape.replace(/CUBIC_VAL/g, "(?:\\$\\d = )?\\{\\{\\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}\\}\\}");
   1057     escape = escape.replace(/CONIC_VAL/g, "(?:\\$\\d = )?\\{\\{\\{\\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}\\}\\}, W_VAL\\}");
   1058     escape = escape.replace(/QUAD_VAL/g, "(?:\\$\\d = )?\\{\\{\\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}\\}\\}");
   1059     escape = escape.replace(/LINE_VAL/g, "(?:\\$\\d = )?\\{\\{\\{P_VAL\\}, \\{P_VAL\\}\\}\\}");
   1060     escape = escape.replace(/FILL_TYPE/g, "SkPath::k[a-zA-Z]+_FillType");
   1061     escape = escape.replace(/PTR_VAL/g, "0x[0-9A-F]+");
   1062     escape = escape.replace(/PT_VAL/g, "\\{\\{P_VAL\\}\\}");
   1063     escape = escape.replace(/P_VAL/g, "(?:f?[xX] = )?(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?, *(?: f?[yY] = )?(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?");
   1064     escape = escape.replace(/T_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)");
   1065     escape = escape.replace(/W_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?");
   1066     escape = escape.replace(/OPER/g, "[a-z]+");
   1067     escape = escape.replace(/PATH/g, "pathB?");
   1068     escape = escape.replace(/T_F/g, "([TF])");
   1069     escape = escape.replace(/IDX/g, "(-?\\d+)");
   1070     escape = escape.replace(/NUM/g, "(-?\\d+)");
   1071     escape = escape.replace(/OPT/g, "(\\?|-?\\d+)");
   1072     return new RegExp(escape, 'i');
   1073 }
   1074 
   1075 function match_regexp(str, lineNo, array, id, pattern) {
   1076     var regex = construct_regexp2(pattern);
   1077     if (filter_str_by(id, str, regex, array)) {
   1078         return true;
   1079     }
   1080     regex = construct_regexp2c(pattern);
   1081     return filter_str_by(id, str, regex, array);
   1082 }
   1083 
   1084 function endsWith(str, suffix) {
   1085     return str.indexOf(suffix, str.length - suffix.length) !== -1;
   1086 }
   1087 
   1088 function parse_all(test) {
   1089     var lines = test.match(/[^\r\n]+/g);
   1090     var records = []; // a rec can be the original paths, a set of intersections, a set of active spans, a sort, or a path add
   1091     var record = [];
   1092     var recType = REC_TYPE_UNKNOWN;
   1093     var lastLineNo;
   1094     var moveX, moveY;
   1095     for (var lineNo = 0; lineNo < lines.length; ++lineNo) {
   1096         var line = lines[lineNo];
   1097         if (line.length == 0) {
   1098             continue;
   1099         }
   1100         var opStart = "SkOpSegment::";
   1101         if (line.lastIndexOf(opStart, 0) === 0) {
   1102             line = line.substr(opStart.length);
   1103         }
   1104         var angleStart = "SkOpAngle::";
   1105         if (line.lastIndexOf(angleStart, 0) === 0) {
   1106             line = line.substr(angleStart.length);
   1107         }
   1108         var coinStart = "SkOpCoincidence::";
   1109         if (line.lastIndexOf(coinStart, 0) === 0) {
   1110             line = line.substr(coinStart.length);
   1111         }
   1112         var type = line.lastIndexOf("debugShowActiveSpans", 0) === 0 ? REC_TYPE_ACTIVE
   1113                 : line.lastIndexOf("debugShowCoincidence", 0) === 0 ? REC_TYPE_COINCIDENCE
   1114                 : line.lastIndexOf("((SkOpSegment*)", 0) === 0 ? REC_TYPE_PATH2
   1115                 : line.lastIndexOf("debugShowTs", 0) === 0 ? REC_TYPE_COIN 
   1116                 : line.lastIndexOf("afterPart", 0) === 0 ? REC_TYPE_AFTERPART
   1117                 : line.lastIndexOf("debugShow", 0) === 0 ? REC_TYPE_SECT
   1118                 : line.lastIndexOf("activeOp", 0) === 0 ? REC_TYPE_ACTIVE_OP
   1119                 : line.lastIndexOf("computed", 0) === 0 ? REC_TYPE_COMPUTED
   1120                 : line.lastIndexOf("debugOne", 0) === 0 ? REC_TYPE_SORT
   1121                 : line.lastIndexOf("dumpOne", 0) === 0 ? REC_TYPE_SORT
   1122                 : line.lastIndexOf("findTop", 0) === 0 ? REC_TYPE_TOP
   1123                 : line.lastIndexOf("pathB.", 0) === 0 ? REC_TYPE_ADD
   1124                 : line.lastIndexOf("path.", 0) === 0 ? REC_TYPE_ADD
   1125                 : line.lastIndexOf("after", 0) === 0 ? REC_TYPE_ANGLE
   1126                 : line.lastIndexOf("mark", 0) === 0 ? REC_TYPE_MARK
   1127                 : line.lastIndexOf("  {{", 0) === 0 ? REC_TYPE_COMPUTED
   1128                 : line.lastIndexOf("seg=", 0) === 0 ? REC_TYPE_PATH
   1129                 : line.lastIndexOf("op", 0) === 0 ? REC_TYPE_OP
   1130                 : line.lastIndexOf("$", 0) === 0 ? REC_TYPE_PATH
   1131                 : REC_TYPE_UNKNOWN;
   1132         if (recType != type || recType == REC_TYPE_ADD || recType == REC_TYPE_SECT
   1133                 || recType == REC_TYPE_ACTIVE_OP || recType == REC_TYPE_ANGLE) {
   1134             if (recType != REC_TYPE_UNKNOWN) {
   1135                 records.push(recType);
   1136                 records.push(lastLineNo);
   1137                 records.push(record);
   1138             }
   1139             record = [];
   1140             recType = type;
   1141             lastLineNo = lineNo;
   1142         }
   1143         var found = false;
   1144         switch (recType) {
   1145             case REC_TYPE_ACTIVE:
   1146                 found = match_regexp(line, lineNo, record, ACTIVE_LINE_SPAN, "debugShowActiveSpans" +
   1147 " id=IDX LINE_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT windValue=IDX"
   1148                 ) || match_regexp(line, lineNo, record, ACTIVE_QUAD_SPAN, "debugShowActiveSpans" +
   1149 " id=IDX QUAD_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT windValue=IDX"
   1150                 ) || match_regexp(line, lineNo, record, ACTIVE_CONIC_SPAN, "debugShowActiveSpans" +
   1151 " id=IDX CONIC_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT windValue=IDX"
   1152                 ) || match_regexp(line, lineNo, record, ACTIVE_CUBIC_SPAN, "debugShowActiveSpans" +
   1153 " id=IDX CUBIC_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT windValue=IDX"
   1154                 ) || match_regexp(line, lineNo, record, ACTIVE_LINE_SPAN, "debugShowActiveSpans" +
   1155 " id=IDX LINE_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT oppSum=OPT windValue=IDX oppValue=NUM"
   1156                 ) || match_regexp(line, lineNo, record, ACTIVE_QUAD_SPAN, "debugShowActiveSpans" +
   1157 " id=IDX QUAD_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT oppSum=OPT windValue=IDX oppValue=NUM"
   1158                 ) || match_regexp(line, lineNo, record, ACTIVE_CONIC_SPAN, "debugShowActiveSpans" +
   1159 " id=IDX CONIC_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT oppSum=OPT windValue=IDX oppValue=NUM"
   1160                 ) || match_regexp(line, lineNo, record, ACTIVE_CUBIC_SPAN, "debugShowActiveSpans" +
   1161 " id=IDX CUBIC_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT oppSum=OPT windValue=IDX oppValue=NUM"
   1162                 );
   1163                 break;
   1164             case REC_TYPE_ACTIVE_OP:
   1165                 found = match_regexp(line, lineNo, record, ACTIVE_OP, "activeOp" +
   1166 " id=IDX t=T_VAL tEnd=T_VAL op=OPER miFrom=NUM miTo=NUM suFrom=NUM suTo=NUM result=IDX"
   1167                 );
   1168                 break;
   1169             case REC_TYPE_ADD:
   1170                 if (match_regexp(line, lineNo, record, ADD_MOVETO, "PATH.moveTo(P_VAL);")) {
   1171                     moveX = record[1][0];
   1172                     moveY = record[1][1];
   1173                     found = true;
   1174                 } else if (match_regexp(line, lineNo, record, ADD_LINETO, "PATH.lineTo(P_VAL);")) {
   1175                     record[1].unshift(moveY);
   1176                     record[1].unshift(moveX);
   1177                     moveX = record[1][2];
   1178                     moveY = record[1][3];
   1179                     found = true;
   1180                 } else if (match_regexp(line, lineNo, record, ADD_QUADTO, "PATH.quadTo(P_VAL, P_VAL);")) {
   1181                     record[1].unshift(moveY);
   1182                     record[1].unshift(moveX);
   1183                     moveX = record[1][4];
   1184                     moveY = record[1][5];
   1185                     found = true;
   1186                 } else if (match_regexp(line, lineNo, record, ADD_CONICTO, "PATH.conicTo(P_VAL, P_VAL, T_VAL);")) {
   1187                     record[1].unshift(moveY);
   1188                     record[1].unshift(moveX);
   1189                     moveX = record[1][4];
   1190                     moveY = record[1][5];
   1191                     found = true;
   1192                 } else if (match_regexp(line, lineNo, record, ADD_CUBICTO, "PATH.cubicTo(P_VAL, P_VAL, P_VAL);")) {
   1193                     record[1].unshift(moveY);
   1194                     record[1].unshift(moveX);
   1195                     moveX = record[1][6];
   1196                     moveY = record[1][7];
   1197                     found = true;
   1198                 } else if (match_regexp(line, lineNo, record, ADD_FILL, "PATH.setFillType(FILL_TYPE);")) {
   1199                     found = true;
   1200                 } else {
   1201                     found = match_regexp(line, lineNo, record, ADD_CLOSE, "PATH.close();");
   1202                 }
   1203                 break;
   1204             case REC_TYPE_AFTERPART:
   1205                 found = match_regexp(line, lineNo, record, PATH_LINE, "afterPart LINE_VAL")
   1206                     || match_regexp(line, lineNo, record, PATH_QUAD, "afterPart QUAD_VAL")
   1207                     || match_regexp(line, lineNo, record, PATH_CONIC, "afterPart CONIC_VAL")
   1208                     || match_regexp(line, lineNo, record, PATH_CUBIC, "afterPart CUBIC_VAL")
   1209                 break;
   1210             case REC_TYPE_ANGLE:
   1211                 found = match_regexp(line, lineNo, record, ANGLE_AFTER, "after " +
   1212 "[IDX/IDX] NUM/NUM tStart=T_VAL tEnd=T_VAL < [IDX/IDX] NUM/NUM tStart=T_VAL tEnd=T_VAL < [IDX/IDX] NUM/NUM tStart=T_VAL tEnd=T_VAL  T_F IDX");
   1213                 break;
   1214             case REC_TYPE_COIN:
   1215                 found = true;
   1216                 break;
   1217             case REC_TYPE_COINCIDENCE:
   1218                 found = match_regexp(line, lineNo, record, COIN_MAIN_SPAN, "debugShowCoincidence" +
   1219 " + id=IDX t=T_VAL tEnd=T_VAL"
   1220                 ) || match_regexp(line, lineNo, record, COIN_OPP_SPAN, "debugShowCoincidence" +
   1221 " - id=IDX t=T_VAL tEnd=T_VAL"
   1222                 );
   1223                 break;
   1224             case REC_TYPE_COMPUTED:
   1225                 found = line ==  "computed quadratics given"
   1226                   || match_regexp(line, lineNo, record, COMPUTED_SET_1, "computed quadratics set 1"
   1227                 ) || match_regexp(line, lineNo, record, COMPUTED_SET_2, "computed quadratics set 2"
   1228                 ) || match_regexp(line, lineNo, record, PATH_QUAD, "  QUAD_VAL,"
   1229                 ) || match_regexp(line, lineNo, record, PATH_CONIC, "  CONIC_VAL,"
   1230                 ) || match_regexp(line, lineNo, record, PATH_CUBIC, "  CUBIC_VAL,"
   1231                 );
   1232                 break;
   1233             case REC_TYPE_PATH:
   1234                 found = match_regexp(line, lineNo, record, PATH_LINE, "seg=IDX LINE_VAL"
   1235                 ) || match_regexp(line, lineNo, record, PATH_QUAD, "seg=IDX QUAD_VAL"
   1236                 ) || match_regexp(line, lineNo, record, PATH_CONIC, "seg=IDX CONIC_VAL"
   1237                 ) || match_regexp(line, lineNo, record, PATH_CUBIC, "seg=IDX CUBIC_VAL"
   1238                 );
   1239                 break;
   1240             case REC_TYPE_PATH2:
   1241                 found = match_regexp(line, lineNo, record, PATH_LINE, "((SkOpSegment*) PTR_VAL) [IDX] {LINE_VAL}"
   1242                 ) || match_regexp(line, lineNo, record, PATH_QUAD, "((SkOpSegment*) PTR_VAL) [IDX] {QUAD_VAL}"
   1243                 ) || match_regexp(line, lineNo, record, PATH_CONIC, "((SkOpSegment*) PTR_VAL) [IDX] {CONIC_VAL}"
   1244                 ) || match_regexp(line, lineNo, record, PATH_CUBIC, "((SkOpSegment*) PTR_VAL) [IDX] {CUBIC_VAL}"
   1245                 );
   1246                 break;
   1247             case REC_TYPE_SECT:
   1248                 found = match_regexp(line, lineNo, record, INTERSECT_LINE, "debugShowLineIntersection" +
   1249 " wtTs[0]=T_VAL LINE_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL"
   1250                 ) || match_regexp(line, lineNo, record, INTERSECT_LINE_2, "debugShowLineIntersection" +
   1251 " wtTs[0]=T_VAL LINE_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL"
   1252                 ) || match_regexp(line, lineNo, record, INTERSECT_LINE_NO, "debugShowLineIntersection" +
   1253 " no intersect LINE_VAL LINE_VAL"
   1254                 ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_LINE, "debugShowQuadLineIntersection" +
   1255 " wtTs[0]=T_VAL QUAD_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL"
   1256                 ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_LINE_2, "debugShowQuadLineIntersection" +
   1257 " wtTs[0]=T_VAL QUAD_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL"
   1258                 ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_LINE_NO, "debugShowQuadLineIntersection" +
   1259 " no intersect QUAD_VAL LINE_VAL"
   1260                 ) || match_regexp(line, lineNo, record, INTERSECT_QUAD, "debugShowQuadIntersection" +
   1261 " wtTs[0]=T_VAL QUAD_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL"
   1262                 ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_2, "debugShowQuadIntersection" +
   1263 " wtTs[0]=T_VAL QUAD_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL wnTs[1]=T_VAL"
   1264                 ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_NO, "debugShowQuadIntersection" +
   1265 " no intersect QUAD_VAL QUAD_VAL"
   1266                 ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_LINE, "debugShowConicLineIntersection" +
   1267 " wtTs[0]=T_VAL CONIC_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL"
   1268                 ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_LINE_2, "debugShowConicLineIntersection" +
   1269 " wtTs[0]=T_VAL CONIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL"
   1270                 ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_LINE_NO, "debugShowConicLineIntersection" +
   1271 " no intersect CONIC_VAL LINE_VAL"
   1272                 ) || match_regexp(line, lineNo, record, INTERSECT_CONIC, "debugShowConicIntersection" +
   1273 " wtTs[0]=T_VAL CONIC_VAL PT_VAL wnTs[0]=T_VAL CONIC_VAL"
   1274                 ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_2, "debugShowConicIntersection" +
   1275 " wtTs[0]=T_VAL CONIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL CONIC_VAL wnTs[1]=T_VAL"
   1276                 ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_NO, "debugShowConicIntersection" +
   1277 " no intersect CONIC_VAL CONIC_VAL"
   1278                 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_LINE, "debugShowCubicLineIntersection" +
   1279 " wtTs[0]=T_VAL CUBIC_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL"
   1280                 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_LINE_2, "debugShowCubicLineIntersection" +
   1281 " wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL"
   1282                 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_LINE_3, "debugShowCubicLineIntersection" +
   1283 " wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wtTs[2]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL wnTs[2]=T_VAL"
   1284                 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_LINE_NO, "debugShowCubicLineIntersection" +
   1285 " no intersect CUBIC_VAL LINE_VAL"
   1286                 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD, "debugShowCubicQuadIntersection" +
   1287 " wtTs[0]=T_VAL CUBIC_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL"
   1288                 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD_2, "debugShowCubicQuadIntersection" +
   1289 " wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL wnTs[1]=T_VAL"
   1290                 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD_3, "debugShowCubicQuadIntersection" +
   1291 " wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wtTs[2]=T_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL wnTs[1]=T_VAL wnTs[2]=T_VAL"
   1292                 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD_4, "debugShowCubicQuadIntersection" +
   1293 " wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wtTs[2]=T_VAL wtTs[3]=T_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL wnTs[1]=T_VAL wnTs[2]=T_VAL wnTs[3]=T_VAL"
   1294                 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD_NO, "debugShowCubicQuadIntersection" +
   1295 " no intersect CUBIC_VAL QUAD_VAL"
   1296                 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC, "debugShowCubicIntersection" +
   1297 " wtTs[0]=T_VAL CUBIC_VAL PT_VAL wnTs[0]=T_VAL CUBIC_VAL"
   1298                 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_2, "debugShowCubicIntersection" +
   1299 " wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL CUBIC_VAL wnTs[1]=T_VAL"
   1300                 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_3, "debugShowCubicIntersection" +
   1301 " wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wtTs[2]=T_VAL PT_VAL wnTs[0]=T_VAL CUBIC_VAL wnTs[1]=T_VAL wnTs[2]=T_VAL"
   1302                 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_4, "debugShowCubicIntersection" +
   1303 " wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wtTs[2]=T_VAL PT_VAL wtTs[3]=T_VAL PT_VAL wnTs[0]=T_VAL CUBIC_VAL wnTs[1]=T_VAL wnTs[2]=T_VAL wnTs[3]=T_VAL"
   1304                 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_NO, "debugShowCubicIntersection" +
   1305 " no intersect CUBIC_VAL CUBIC_VAL"
   1306                 ) || match_regexp(line, lineNo, record, INTERSECT_SELF_CUBIC, "debugShowCubicIntersection" +
   1307 " wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL"
   1308                 ) || match_regexp(line, lineNo, record, INTERSECT_SELF_CUBIC_NO, "debugShowCubicIntersection" +
   1309 " no self intersect CUBIC_VAL"
   1310                 );
   1311                 break;
   1312             case REC_TYPE_SORT:
   1313                 var hasDone = / done/.test(line);
   1314                 var hasUnorderable = / unorderable/.test(line);
   1315                 var hasSmall = / small/.test(line);
   1316                 var hasTiny = / tiny/.test(line);
   1317                 var hasOperand = / operand/.test(line);
   1318                 var hasStop = / stop/.test(line);
   1319                 line.replace(/[ a-z]+$/, "");
   1320                 found = match_regexp(line, lineNo, record, SORT_UNARY, "debugOne" +
   1321 " [IDX/IDX] next=IDX/IDX sect=IDX/IDX  s=T_VAL [IDX] e=T_VAL [IDX] sgn=NUM windVal=IDX windSum=OPT"
   1322                 ) || match_regexp(line, lineNo, record, SORT_BINARY, "debugOne" +
   1323 " [IDX/IDX] next=IDX/IDX sect=IDX/IDX  s=T_VAL [IDX] e=T_VAL [IDX] sgn=NUM windVal=IDX windSum=OPT oppVal=IDX oppSum=OPT"
   1324                 ) || match_regexp(line, lineNo, record, SORT_UNARY, "dumpOne" +
   1325 " [IDX/IDX] next=IDX/IDX sect=NUM/NUM  s=T_VAL [IDX] e=T_VAL [IDX] sgn=NUM windVal=IDX windSum=OPT"
   1326                 ) || match_regexp(line, lineNo, record, SORT_BINARY, "dumpOne" +
   1327 " [IDX/IDX] next=IDX/IDX sect=NUM/NUM  s=T_VAL [IDX] e=T_VAL [IDX] sgn=NUM windVal=IDX windSum=OPT oppVal=IDX oppSum=OPT"
   1328                 );
   1329                 if (found) {
   1330                     record[1].push(hasDone);
   1331                     record[1].push(hasUnorderable);
   1332                     record[1].push(hasSmall);
   1333                     record[1].push(hasTiny);
   1334                     record[1].push(hasOperand);
   1335                     record[1].push(hasStop);
   1336                 }
   1337                 break;
   1338             case REC_TYPE_TOP:
   1339                 found = match_regexp(line, lineNo, record, ACTIVE_OP, "findTop" +
   1340 " id=IDX s=T_VAL e=T_VAL cw=NUM swap=NUM inflections=NUM monotonic=NUM"
   1341                 ) || match_regexp(line, lineNo, record, ACTIVE_OP, "findTop" +
   1342 " id=IDX s=T_VAL e=T_VAL (-) cw=NUM swap=NUM inflections=NUM monotonic=NUM"
   1343                 ) || match_regexp(line, lineNo, record, ACTIVE_OP, "findTop" +
   1344 " id=IDX s=T_VAL e=T_VAL (+) cw=NUM swap=NUM inflections=NUM monotonic=NUM"
   1345                 );
   1346                 break;
   1347             case REC_TYPE_MARK:
   1348                 found = match_regexp(line, lineNo, record, MARK_LINE, "markWinding" +
   1349 " id=IDX LINE_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX"
   1350                 ) || match_regexp(line, lineNo, record, MARK_QUAD, "markWinding" +
   1351 " id=IDX QUAD_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX"
   1352                 ) || match_regexp(line, lineNo, record, MARK_CONIC, "markWinding" +
   1353 " id=IDX CONIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX"
   1354                 ) || match_regexp(line, lineNo, record, MARK_CUBIC, "markWinding" +
   1355 " id=IDX CUBIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX"
   1356                 ) || match_regexp(line, lineNo, record, MARK_DONE_LINE, "markDone" +
   1357 " id=IDX LINE_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=OPT newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX oppValue=OPT"
   1358                 ) || match_regexp(line, lineNo, record, MARK_DONE_QUAD, "markDone" +
   1359 " id=IDX QUAD_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=OPT newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX oppValue=OPT"
   1360                 ) || match_regexp(line, lineNo, record, MARK_DONE_CONIC, "markDone" +
   1361 " id=IDX CONIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=OPT newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX oppValue=OPT"
   1362                 ) || match_regexp(line, lineNo, record, MARK_DONE_CUBIC, "markDone" +
   1363 " id=IDX CUBIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=OPT newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX oppValue=OPT"
   1364                 ) || match_regexp(line, lineNo, record, MARK_SIMPLE_LINE, "markWinding" +
   1365 " id=IDX LINE_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM windSum=OPT windValue=IDX"
   1366                 ) || match_regexp(line, lineNo, record, MARK_SIMPLE_QUAD, "markWinding" +
   1367 " id=IDX QUAD_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM windSum=OPT windValue=IDX"
   1368                 ) || match_regexp(line, lineNo, record, MARK_SIMPLE_CONIC, "markWinding" +
   1369 " id=IDX CONIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM windSum=OPT windValue=IDX"
   1370                 ) || match_regexp(line, lineNo, record, MARK_SIMPLE_CUBIC, "markWinding" +
   1371 " id=IDX CUBIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM windSum=OPT windValue=IDX"
   1372                 ) || match_regexp(line, lineNo, record, MARK_ANGLE_LAST, "markAngle" +
   1373 " last segment=IDX span=IDX"
   1374                 ) || match_regexp(line, lineNo, record, MARK_ANGLE_LAST, "markAngle" +
   1375 " last segment=IDX span=IDX windSum=OPT");
   1376                 break;
   1377             case REC_TYPE_OP:
   1378                 if (line.lastIndexOf("oppSign oppSign=", 0) === 0
   1379                         || line.lastIndexOf("operator<", 0) === 0) {
   1380                     found = true;
   1381                     break;
   1382                 }
   1383                 found = match_regexp(line, lineNo, record, OP_DIFFERENCE, "op diff"
   1384                 ) || match_regexp(line, lineNo, record, OP_INTERSECT, "op intersect"
   1385                 ) || match_regexp(line, lineNo, record, OP_INTERSECT, "op sect"
   1386                 ) || match_regexp(line, lineNo, record, OP_UNION, "op union"
   1387                 ) || match_regexp(line, lineNo, record, OP_XOR, "op xor"
   1388                 );
   1389                 break;
   1390             case REC_TYPE_UNKNOWN:
   1391                 found = true;
   1392                 break;
   1393         }
   1394         if (!found) {
   1395             console.log(line + " [" + lineNo + "] of type " + type + " not found");
   1396         }
   1397     }
   1398     if (recType != REC_TYPE_UNKNOWN) {
   1399         records.push(recType);
   1400         records.push(lastLineNo);
   1401         records.push(record);
   1402     }
   1403     if (records.length >= 1) {
   1404         tests[testIndex] = records;
   1405         testLines[testIndex] = lines;
   1406     }
   1407 }
   1408 
   1409 function init(test) {
   1410     var canvas = document.getElementById('canvas');
   1411     if (!canvas.getContext) return;
   1412     ctx = canvas.getContext('2d');
   1413     var resScale = retina_scale && window.devicePixelRatio ? window.devicePixelRatio : 1;
   1414     var unscaledWidth = window.innerWidth - 20;
   1415     var unscaledHeight = window.innerHeight - 20;
   1416     screenWidth = unscaledWidth;
   1417     screenHeight = unscaledHeight;
   1418     canvas.width = unscaledWidth * resScale;
   1419     canvas.height = unscaledHeight * resScale;
   1420     canvas.style.width = unscaledWidth + 'px';
   1421     canvas.style.height = unscaledHeight + 'px';
   1422     if (resScale != 1) {
   1423         ctx.scale(resScale, resScale);
   1424     }
   1425     xmin = Infinity;
   1426     xmax = -Infinity;
   1427     ymin = Infinity;
   1428     ymax = -Infinity;
   1429     hasPath = hasComputedPath = false;
   1430     firstActiveSpan = -1;
   1431     for (var tIndex = 0; tIndex < test.length; tIndex += 3) {
   1432         var recType = test[tIndex];
   1433         if (!typeof recType == 'number' || recType < REC_TYPE_UNKNOWN || recType > REC_TYPE_LAST) {
   1434             console.log("unknown rec type: " + recType);
   1435             throw "stop execution";
   1436         }
   1437         var records = test[tIndex + 2];
   1438         for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
   1439             var fragType = records[recordIndex];
   1440             if (!typeof fragType == 'number' || fragType < 1 || fragType > FRAG_TYPE_LAST) {
   1441                 console.log("unknown in range frag type: " + fragType);
   1442                 throw "stop execution";
   1443             }
   1444             var frags = records[recordIndex + 1];
   1445             var first = 0;
   1446             var last = -1;
   1447             var first2 = 0;
   1448             var last2 = 0;
   1449             switch (recType) {
   1450                 case REC_TYPE_COMPUTED:
   1451                     if (fragType == COMPUTED_SET_1 || fragType == COMPUTED_SET_2) {
   1452                         break;
   1453                     }
   1454                     hasComputedPath = true;
   1455                 case REC_TYPE_PATH:
   1456                     first = 1;
   1457                     switch (fragType) {
   1458                         case PATH_LINE:
   1459                             last = 5;
   1460                             break;
   1461                         case PATH_CONIC:
   1462                         case PATH_QUAD:
   1463                             last = 7;
   1464                             break;
   1465                         case PATH_CUBIC:
   1466                             last = 9;
   1467                             break;
   1468                         default:
   1469                             console.log("unknown " + (recType == REC_TYPE_PATH ? "REC_TYPE_PATH" 
   1470                                     : "REC_TYPE_COMPUTED") + " frag type:" + fragType);
   1471                             throw "stop execution";
   1472                     }
   1473                     if (recType == REC_TYPE_PATH) {
   1474                         hasPath = true;
   1475                     }
   1476                     break;
   1477                 case REC_TYPE_PATH2:
   1478                     first = 1;
   1479                     switch (fragType) {
   1480                         case PATH_LINE:
   1481                             last = 5;
   1482                             break;
   1483                         case PATH_CONIC:
   1484                         case PATH_QUAD:
   1485                             last = 7;
   1486                             break;
   1487                         case PATH_CUBIC:
   1488                             last = 9;
   1489                             break;
   1490                         default:
   1491                             console.log("unknown " + (recType == REC_TYPE_PATH2 ? "REC_TYPE_PATH2" 
   1492                                     : "REC_TYPE_COMPUTED") + " frag type:" + fragType);
   1493                             throw "stop execution";
   1494                     }
   1495                     if (recType == REC_TYPE_PATH2) {
   1496                         hasPath = true;
   1497                     }
   1498                     break;
   1499                 case REC_TYPE_ACTIVE:
   1500                     if (firstActiveSpan < 0) {
   1501                         firstActiveSpan = tIndex;
   1502                     }
   1503                     first = 1;
   1504                     switch (fragType) {
   1505                         case ACTIVE_LINE_SPAN:
   1506                             last = 5;
   1507                             break;
   1508                         case ACTIVE_CONIC_SPAN:
   1509                         case ACTIVE_QUAD_SPAN:
   1510                             last = 7;
   1511                             break;
   1512                         case ACTIVE_CUBIC_SPAN:
   1513                             last = 9;
   1514                             break;
   1515                         default:
   1516                             console.log("unknown REC_TYPE_ACTIVE frag type: " + fragType);
   1517                             throw "stop execution";
   1518                     }
   1519                     break;
   1520                 case REC_TYPE_ADD:
   1521                     switch (fragType) {
   1522                         case ADD_MOVETO:
   1523                             break;
   1524                         case ADD_LINETO:
   1525                             last = 4;
   1526                             break;
   1527                         case ADD_CONICTO:
   1528                         case ADD_QUADTO:
   1529                             last = 6;
   1530                             break;
   1531                         case ADD_CUBICTO:
   1532                             last = 8;
   1533                             break;
   1534                         case ADD_CLOSE:
   1535                         case ADD_FILL:
   1536                             break;
   1537                         default:
   1538                             console.log("unknown REC_TYPE_ADD frag type: " + fragType);
   1539                             throw "stop execution";
   1540                     }
   1541                     break;
   1542                 case REC_TYPE_AFTERPART:
   1543                     switch (fragType) {
   1544                         case PATH_LINE:
   1545                             last = 4;
   1546                             break;
   1547                         case PATH_CONIC:
   1548                         case PATH_QUAD:
   1549                             last = 6;
   1550                             break;
   1551                         case PATH_CUBIC:
   1552                             last = 8;
   1553                             break;
   1554                         default:
   1555                             console.log("unknown REC_TYPE_ACTIVEPART frag type: " + fragType);
   1556                             throw "stop execution";
   1557                     }
   1558                     break;
   1559                 case REC_TYPE_SECT:
   1560                     switch (fragType) {
   1561                         case INTERSECT_LINE:
   1562                             first = 1; last = 5; first2 = 8; last2 = 12;
   1563                             break;
   1564                         case INTERSECT_LINE_2:
   1565                             first = 1; last = 5; first2 = 11; last2 = 15;
   1566                             break;
   1567                         case INTERSECT_LINE_NO:
   1568                             first = 0; last = 4; first2 = 4; last2 = 8;
   1569                             break;
   1570                         case INTERSECT_CONIC_LINE:
   1571                             first = 1; last = 7; first2 = 11; last2 = 15;
   1572                             break;
   1573                         case INTERSECT_QUAD_LINE:
   1574                             first = 1; last = 7; first2 = 10; last2 = 14;
   1575                             break;
   1576                         case INTERSECT_CONIC_LINE_2:
   1577                             first = 1; last = 7; first2 = 14; last2 = 18;
   1578                             break;
   1579                         case INTERSECT_QUAD_LINE_2:
   1580                             first = 1; last = 7; first2 = 13; last2 = 17;
   1581                             break;
   1582                         case INTERSECT_CONIC_LINE_NO:
   1583                             first = 0; last = 6; first2 = 7; last2 = 11;
   1584                             break;
   1585                         case INTERSECT_QUAD_LINE_NO:
   1586                             first = 0; last = 6; first2 = 6; last2 = 10;
   1587                             break;
   1588                         case INTERSECT_CONIC:
   1589                             first = 1; last = 7; first2 = 11; last2 = 17;
   1590                             break;
   1591                         case INTERSECT_QUAD:
   1592                             first = 1; last = 7; first2 = 10; last2 = 16;
   1593                             break;
   1594                         case INTERSECT_CONIC_2:
   1595                             first = 1; last = 7; first2 = 14; last2 = 20;
   1596                             break;
   1597                         case INTERSECT_QUAD_2:
   1598                             first = 1; last = 7; first2 = 13; last2 = 19;
   1599                             break;
   1600                         case INTERSECT_CONIC_NO:
   1601                             first = 0; last = 6; first2 = 7; last2 = 13;
   1602                             break;
   1603                         case INTERSECT_QUAD_NO:
   1604                             first = 0; last = 6; first2 = 6; last2 = 12;
   1605                             break;
   1606                         case INTERSECT_SELF_CUBIC:
   1607                             first = 1; last = 9;
   1608                             break;
   1609                         case INTERSECT_SELF_CUBIC_NO:
   1610                             first = 0; last = 8;
   1611                             break;
   1612                         case INTERSECT_CUBIC_LINE:
   1613                             first = 1; last = 9; first2 = 12; last2 = 16;
   1614                             break;
   1615                         case INTERSECT_CUBIC_LINE_2:
   1616                             first = 1; last = 9; first2 = 15; last2 = 19;
   1617                             break;
   1618                         case INTERSECT_CUBIC_LINE_3:
   1619                             first = 1; last = 9; first2 = 18; last2 = 22;
   1620                             break;
   1621                         case INTERSECT_CUBIC_LINE_NO:
   1622                             first = 0; last = 8; first2 = 8; last2 = 12;
   1623                             break;
   1624                         case INTERSECT_CUBIC_QUAD:
   1625                             first = 1; last = 9; first2 = 12; last2 = 18;
   1626                             break;
   1627                         case INTERSECT_CUBIC_QUAD_2:
   1628                             first = 1; last = 9; first2 = 15; last2 = 21;
   1629                             break;
   1630                         case INTERSECT_CUBIC_QUAD_3:
   1631                             first = 1; last = 9; first2 = 18; last2 = 24;
   1632                             break;
   1633                         case INTERSECT_CUBIC_QUAD_4:
   1634                             first = 1; last = 9; first2 = 21; last2 = 27;
   1635                             break;
   1636                         case INTERSECT_CUBIC_QUAD_NO:
   1637                             first = 0; last = 8; first2 = 8; last2 = 14;
   1638                             break;
   1639                         case INTERSECT_CUBIC:
   1640                             first = 1; last = 9; first2 = 12; last2 = 20;
   1641                             break;
   1642                         case INTERSECT_CUBIC_2:
   1643                             first = 1; last = 9; first2 = 15; last2 = 23;
   1644                             break;
   1645                         case INTERSECT_CUBIC_3:
   1646                             first = 1; last = 9; first2 = 18; last2 = 26;
   1647                             break;
   1648                         case INTERSECT_CUBIC_4:
   1649                             first = 1; last = 9; first2 = 21; last2 = 29;
   1650                             break;
   1651                         case INTERSECT_CUBIC_NO:
   1652                             first = 0; last = 8; first2 = 8; last2 = 16;
   1653                             break;
   1654                         default:
   1655                             console.log("unknown REC_TYPE_SECT frag type: " + fragType);
   1656                             throw "stop execution";
   1657                     }
   1658                     break;
   1659                 default:
   1660                     continue;
   1661             }
   1662             for (var idx = first; idx < last; idx += 2) {
   1663                 xmin = Math.min(xmin, frags[idx]);
   1664                 xmax = Math.max(xmax, frags[idx]);
   1665                 ymin = Math.min(ymin, frags[idx + 1]);
   1666                 ymax = Math.max(ymax, frags[idx + 1]);
   1667             }
   1668             for (var idx = first2; idx < last2; idx += 2) {
   1669                 xmin = Math.min(xmin, frags[idx]);
   1670                 xmax = Math.max(xmax, frags[idx]);
   1671                 ymin = Math.min(ymin, frags[idx + 1]);
   1672                 ymax = Math.max(ymax, frags[idx + 1]);
   1673             }
   1674         }
   1675     }
   1676     var angleBounds = [Infinity, Infinity, -Infinity, -Infinity];
   1677     for (var tIndex = 0; tIndex < test.length; tIndex += 3) {
   1678         var recType = test[tIndex];
   1679         var records = test[tIndex + 2];
   1680         for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
   1681             var fragType = records[recordIndex];
   1682             var frags = records[recordIndex + 1];
   1683             switch (recType) {
   1684                 case REC_TYPE_ACTIVE_OP:
   1685                     if (!draw_op) {
   1686                         break;
   1687                     }
   1688                     {
   1689                         var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
   1690                         curve_extremes(curve, angleBounds);
   1691                     }
   1692                     break;
   1693                 case REC_TYPE_ANGLE:
   1694                     if (!draw_angle) {
   1695                         break;
   1696                     }
   1697                     {
   1698                         var curve = curvePartialByID(test, frags[0], frags[4], frags[5]);
   1699                         curve_extremes(curve, angleBounds);
   1700                         curve = curvePartialByID(test, frags[6], frags[10], frags[11]);
   1701                         curve_extremes(curve, angleBounds);
   1702                         curve = curvePartialByID(test, frags[12], frags[16], frags[17]);
   1703                     }
   1704                     break;
   1705                 case REC_TYPE_COINCIDENCE:
   1706                     if (!draw_coincidence) {
   1707                         break;
   1708                     }
   1709                     {
   1710                         var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
   1711                         curve_extremes(curve, angleBounds);
   1712                     }
   1713                     break;
   1714                 case REC_TYPE_SORT:
   1715                     if (!draw_sort) {
   1716                         break;
   1717                     }
   1718                     if (fragType == SORT_UNARY || fragType == SORT_BINARY) {
   1719                         var curve = curvePartialByID(test, frags[0], frags[6], frags[8]);
   1720                         curve_extremes(curve, angleBounds);
   1721                     }
   1722                     break;
   1723                 case REC_TYPE_TOP:
   1724                     if (!draw_top) {
   1725                         break;
   1726                     }
   1727                     {
   1728                         var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
   1729                         curve_extremes(curve, angleBounds);
   1730                     }
   1731                     break;
   1732             }
   1733         }
   1734     }
   1735     xmin = Math.min(xmin, angleBounds[0]);
   1736     ymin = Math.min(ymin, angleBounds[1]);
   1737     xmax = Math.max(xmax, angleBounds[2]);
   1738     ymax = Math.max(ymax, angleBounds[3]);
   1739     setScale(xmin, xmax, ymin, ymax);
   1740     if (hasPath == false && hasComputedPath == true && !draw_computed) {
   1741         draw_computed = 7; // show quadratics, conics, and cubics
   1742     }
   1743     if (hasPath == true && hasComputedPath == false && draw_computed) {
   1744         draw_computed = 0;
   1745     }
   1746 }
   1747 
   1748 function curveByID(test, id) {
   1749     var tIndex = -3;
   1750     while ((tIndex += 3) < test.length) {
   1751         var recType = test[tIndex];
   1752         if (recType == REC_TYPE_OP) {
   1753             continue;
   1754         }
   1755         if (recType != REC_TYPE_PATH) {
   1756             return [];
   1757         }
   1758         var records = test[tIndex + 2];
   1759         for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
   1760             var fragType = records[recordIndex];
   1761             var frags = records[recordIndex + 1];
   1762             if (frags[0] == id) {
   1763                 switch (fragType) {
   1764                     case PATH_LINE:
   1765                         return [frags[1], frags[2], frags[3], frags[4]];
   1766                     case PATH_QUAD:
   1767                         return [frags[1], frags[2], frags[3], frags[4],
   1768                                 frags[5], frags[6]];
   1769                     case PATH_CONIC:
   1770                         return [frags[1], frags[2], frags[3], frags[4],
   1771                                 frags[5], frags[6], frags[7]];
   1772                     case PATH_CUBIC:
   1773                         return [frags[1], frags[2], frags[3], frags[4],
   1774                                 frags[5], frags[6], frags[7], frags[8]];
   1775                 }
   1776             }
   1777         }
   1778     }
   1779     return [];
   1780 }
   1781 
   1782 function curvePartialByID(test, id, t0, t1) {
   1783     var tIndex = -3;
   1784     while ((tIndex += 3) < test.length) {
   1785         var recType = test[tIndex];
   1786         if (recType == REC_TYPE_OP) {
   1787             continue;
   1788         }
   1789         if (recType != REC_TYPE_PATH) {
   1790             return [];
   1791         }
   1792         var records = test[tIndex + 2];
   1793         for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
   1794             var fragType = records[recordIndex];
   1795             var frags = records[recordIndex + 1];
   1796             if (frags[0] == id) {
   1797                 switch (fragType) {
   1798                     case PATH_LINE:
   1799                         return linePartial(frags[1], frags[2], frags[3], frags[4], t0, t1);
   1800                     case PATH_QUAD:
   1801                         return quadPartial(frags[1], frags[2], frags[3], frags[4],
   1802                                 frags[5], frags[6], t0, t1);
   1803                     case PATH_CONIC:
   1804                         return conicPartial(frags[1], frags[2], frags[3], frags[4],
   1805                                 frags[5], frags[6], frags[7], t0, t1);
   1806                     case PATH_CUBIC:
   1807                         return cubicPartial(frags[1], frags[2], frags[3], frags[4],
   1808                                 frags[5], frags[6], frags[7], frags[8], t0, t1);
   1809                 }
   1810             }
   1811         }
   1812     }
   1813     return [];
   1814 }
   1815 
   1816 function idByCurve(test, frag, type) {
   1817     var tIndex = 0;
   1818     while (tIndex < test.length) {
   1819         var recType = test[tIndex];
   1820         if (recType != REC_TYPE_PATH) {
   1821             ++tIndex;
   1822             continue;
   1823         }
   1824         var records = test[tIndex + 2];
   1825         for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
   1826             var fragType = records[recordIndex];
   1827             var frags = records[recordIndex + 1];
   1828             if (frag.length != frags.length - 1) {
   1829                 continue;
   1830             }
   1831             switch (fragType) {
   1832                 case PATH_LINE:
   1833                     if (frag[0] != frags[1] || frag[1] != frags[2]
   1834                             || frag[2] != frags[3] || frag[3] != frags[4]) {
   1835                         continue;
   1836                     }
   1837                     return frags[0];
   1838                 case PATH_QUAD:
   1839                     if (frag[0] != frags[1] || frag[1] != frags[2]
   1840                             || frag[2] != frags[3] || frag[3] != frags[4]
   1841                             || frag[4] != frags[5] || frag[5] != frags[6]) {
   1842                         continue;
   1843                     }
   1844                     return frags[0];
   1845                 case PATH_CONIC:
   1846                     if (frag[0] != frags[1] || frag[1] != frags[2]
   1847                             || frag[2] != frags[3] || frag[3] != frags[4]
   1848                             || frag[4] != frags[5] || frag[5] != frags[6]
   1849                             || frag[6] != frags[7]) {
   1850                         continue;
   1851                     }
   1852                     return frags[0];
   1853                 case PATH_CUBIC:
   1854                     if (frag[0] != frags[1] || frag[1] != frags[2]
   1855                             || frag[2] != frags[3] || frag[3] != frags[4]
   1856                             || frag[4] != frags[5] || frag[5] != frags[6]
   1857                             || frag[6] != frags[7] || frag[7] != frags[8]) {
   1858                         continue;
   1859                     }
   1860                     return frags[0];
   1861             }
   1862         }
   1863         ++tIndex;
   1864     }
   1865     return -1;
   1866 }
   1867 
   1868 function curve_extremes(curve, bounds) {
   1869     var length = curve.length == 7 ? 6 : curve.length;
   1870     for (var index = 0; index < curve.length; index += 2) {
   1871         var x = curve[index];
   1872         var y = curve[index + 1];
   1873         bounds[0] = Math.min(bounds[0], x);
   1874         bounds[1] = Math.min(bounds[1], y);
   1875         bounds[2] = Math.max(bounds[2], x);
   1876         bounds[3] = Math.max(bounds[3], y);
   1877     }
   1878 }
   1879 
   1880 function setScale(x0, x1, y0, y1) {
   1881     var srcWidth = x1 - x0;
   1882     var srcHeight = y1 - y0;
   1883     var usableWidth = screenWidth;
   1884     var xDigits = Math.ceil(Math.log(Math.abs(xmax)) / Math.log(10));
   1885     var yDigits = Math.ceil(Math.log(Math.abs(ymax)) / Math.log(10));
   1886     usableWidth -= (xDigits + yDigits) * 10;
   1887     usableWidth -= decimal_places * 10;
   1888     if (draw_legend) {
   1889         usableWidth -= 40;
   1890     }
   1891     var hscale = usableWidth / srcWidth;
   1892     var vscale = screenHeight / srcHeight;
   1893     scale = Math.min(hscale, vscale);
   1894     var invScale = 1 / scale;
   1895     var sxmin = x0 - invScale * 5;
   1896     var symin = y0 - invScale * 10;
   1897     var sxmax = x1 + invScale * (6 * decimal_places + 10);
   1898     var symax = y1 + invScale * 10;
   1899     srcWidth = sxmax - sxmin;
   1900     srcHeight = symax - symin;
   1901     hscale = usableWidth / srcWidth;
   1902     vscale = screenHeight / srcHeight;
   1903     scale = Math.min(hscale, vscale);
   1904     srcLeft = sxmin;
   1905     srcTop = symin;
   1906 }
   1907 
   1908 function drawArc(curve, op, from, to) {
   1909     var type = PATH_LINE + (curve.length / 2 - 2);
   1910     var pt = pointAtT(curve, type, op ? 0.4 : 0.6);
   1911     var dy = pt.y - curve[1];
   1912     var dx = pt.x - curve[0];
   1913     var dist = Math.sqrt(dy * dy + dx * dx);
   1914     var _dist = dist * scale;
   1915     var angle = Math.atan2(dy, dx);
   1916     var _px = (curve[0] - srcLeft) * scale;
   1917     var _py = (curve[1] - srcTop) * scale;
   1918     var divisor = 4;
   1919     var endDist;
   1920     do {
   1921         var ends = [];
   1922         for (var index = -1; index <= 1; index += 2) {
   1923             var px = Math.cos(index * Math.PI / divisor);
   1924             var py = Math.sin(index * Math.PI / divisor);
   1925             ends.push(px);
   1926             ends.push(py);
   1927         }
   1928         var endDx = (ends[2] - ends[0]) * scale * dist;
   1929         var endDy = (ends[3] - ends[1]) * scale * dist;
   1930         endDist = Math.sqrt(endDx * endDx + endDy * endDy);
   1931         if (endDist < 100) {
   1932             break;
   1933         }
   1934         divisor *= 2;
   1935     } while (true);
   1936     if (endDist < 30) {
   1937         return;
   1938     }
   1939     if (op) {
   1940         divisor *= 2;
   1941     }
   1942     ctx.strokeStyle = op ? "rgba(210,0,45, 0.4)" : "rgba(90,90,90, 0.5)";
   1943     ctx.beginPath();
   1944     ctx.arc(_px, _py, _dist, angle - Math.PI / divisor, angle + Math.PI / divisor, false);
   1945     ctx.stroke();
   1946     var saveAlign = ctx.textAlign;
   1947     var saveStyle = ctx.fillStyle;
   1948     var saveFont = ctx.font;
   1949     ctx.textAlign = "center";
   1950     ctx.fillStyle = "black";
   1951     ctx.font = "normal 24px Arial";
   1952     divisor *= 0.8;
   1953     for (var index = -1; index <= 1; index += 2) {
   1954         var px = curve[0] + Math.cos(angle + index * Math.PI / divisor) * dist;
   1955         var py = curve[1] + Math.sin(angle + index * Math.PI / divisor) * dist;
   1956         var _px = (px - srcLeft) * scale;
   1957         var _py = (py - srcTop) * scale;
   1958         ctx.fillText(index < 0 ? to.toString() : from.toString(), _px, _py + 8);
   1959     }
   1960     ctx.textAlign = saveAlign;
   1961     ctx.fillStyle = saveStyle;
   1962     ctx.font = saveFont;
   1963 }
   1964 
   1965 function drawPoint(px, py, end) {
   1966     var length = drawnPts.length == 7 ? 6 : drawnPts.length;
   1967     for (var pts = 0; pts < length; pts += 2) {
   1968         var x = drawnPts[pts];
   1969         var y = drawnPts[pts + 1];
   1970         if (px == x && py == y) {
   1971             return;
   1972         }
   1973     }
   1974     drawnPts.push(px);
   1975     drawnPts.push(py);
   1976     var label = px.toFixed(decimal_places) + ", " + py.toFixed(decimal_places);
   1977     var _px = (px - srcLeft) * scale;
   1978     var _py = (py - srcTop) * scale;
   1979     ctx.beginPath();
   1980     ctx.arc(_px, _py, 3, 0, Math.PI*2, true);
   1981     ctx.closePath();
   1982     if (end) {
   1983         ctx.fill();
   1984     } else {
   1985         ctx.stroke();
   1986     }
   1987     if (debug_xy) {
   1988         ctx.textAlign = "left";
   1989         ctx.fillText(label, _px + 5, _py);
   1990     }
   1991 }
   1992 
   1993 function coordCount(curveType) {
   1994     switch (curveType) {
   1995         case PATH_LINE:
   1996             return 4;
   1997         case PATH_QUAD:
   1998             return 6;
   1999         case PATH_CONIC:
   2000             return 6;
   2001         case PATH_CUBIC:
   2002             return 8;
   2003     }
   2004     return -1;
   2005 }
   2006 
   2007 function drawPoints(ptArray, curveType, drawControls) {
   2008     var count = coordCount(curveType);
   2009     for (var idx = 0; idx < count; idx += 2) {
   2010         if (!drawControls && idx != 0 && idx != count - 2) {
   2011             continue;
   2012         }
   2013         drawPoint(ptArray[idx], ptArray[idx + 1], idx == 0 || idx == count - 2);
   2014     }
   2015 }
   2016 
   2017 function drawControlLines(curve, curveType, drawEnd) {
   2018     if (curveType == PATH_LINE) {
   2019         return;
   2020     }
   2021     ctx.strokeStyle = "rgba(0,0,0, 0.3)";
   2022     drawLine(curve[0], curve[1], curve[2], curve[3]);
   2023     drawLine(curve[2], curve[3], curve[4], curve[5]);
   2024     if (curveType == PATH_CUBIC) {
   2025         drawLine(curve[4], curve[5], curve[6], curve[7]);
   2026         if (drawEnd > 1) {
   2027             drawLine(curve[6], curve[7], curve[0], curve[1]);
   2028             if (drawEnd > 2) {
   2029                 drawLine(curve[0], curve[1], curve[4], curve[5]);
   2030                 drawLine(curve[6], curve[7], curve[2], curve[3]);
   2031             }
   2032         }
   2033     } else if (drawEnd > 1) {
   2034         drawLine(curve[4], curve[5], curve[0], curve[1]);
   2035     }
   2036 }
   2037 
   2038 function pointAtT(curve, curveType, t) {
   2039     var xy = {};
   2040     switch (curveType) {
   2041         case PATH_LINE:
   2042             var a = 1 - t;
   2043             var b = t;
   2044             xy.x = a * curve[0] + b * curve[2];
   2045             xy.y = a * curve[1] + b * curve[3];
   2046             break;
   2047         case PATH_QUAD:
   2048             var one_t = 1 - t;
   2049             var a = one_t * one_t;
   2050             var b = 2 * one_t * t;
   2051             var c = t * t;
   2052             xy.x = a * curve[0] + b * curve[2] + c * curve[4];
   2053             xy.y = a * curve[1] + b * curve[3] + c * curve[5];
   2054             break;
   2055         case PATH_CONIC:
   2056             var one_t = 1 - t;
   2057             var a = one_t * one_t;
   2058             var b = 2 * one_t * t;
   2059             var c = t * t;
   2060             xy.x = a * curve[0] + b * curve[2] * curve[6] + c * curve[4];
   2061             xy.y = a * curve[1] + b * curve[3] * curve[6] + c * curve[5];
   2062             var d = a + b * curve[6] + c;
   2063             xy.x /= d;
   2064             xy.y /= d;
   2065             break;
   2066         case PATH_CUBIC:
   2067             var one_t = 1 - t;
   2068             var one_t2 = one_t * one_t;
   2069             var a = one_t2 * one_t;
   2070             var b = 3 * one_t2 * t;
   2071             var t2 = t * t;
   2072             var c = 3 * one_t * t2;
   2073             var d = t2 * t;
   2074             xy.x = a * curve[0] + b * curve[2] + c * curve[4] + d * curve[6];
   2075             xy.y = a * curve[1] + b * curve[3] + c * curve[5] + d * curve[7];
   2076             break;
   2077     }
   2078     return xy;
   2079 }
   2080     
   2081 function drawPointAtT(curve, curveType) {
   2082     var x, y;
   2083     var xy = pointAtT(curve, curveType, curveT);
   2084     drawPoint(xy.x, xy.y, true);
   2085     if (!draw_intersectT) {
   2086         return;
   2087     }
   2088     ctx.fillStyle = "red";
   2089     drawTAtPointUp(xy.x, xy.y, curveT);
   2090 }
   2091 
   2092 function drawTAtPointUp(px, py, t) {
   2093     var label = t.toFixed(decimal_places);
   2094     var _px = (px - srcLeft)* scale;
   2095     var _py = (py - srcTop) * scale;
   2096     ctx.fillText(label, _px + 5, _py - 10);
   2097 }
   2098 
   2099 function drawTAtPointDown(px, py, t) {
   2100     var label = t.toFixed(decimal_places);
   2101     var _px = (px - srcLeft)* scale;
   2102     var _py = (py - srcTop) * scale;
   2103     ctx.fillText(label, _px + 5, _py + 10);
   2104 }
   2105 
   2106 function alreadyDrawnLine(x1, y1, x2, y2) {
   2107     if (collect_bounds) {
   2108         if (focus_enabled) {
   2109             focusXmin = Math.min(focusXmin, x1, x2);
   2110             focusYmin = Math.min(focusYmin, y1, y2);
   2111             focusXmax = Math.max(focusXmax, x1, x2);
   2112             focusYmax = Math.max(focusYmax, y1, y2);
   2113         }
   2114         return true;
   2115     }
   2116     for (var pts = 0; pts < drawnLines.length; pts += 4) {
   2117         if (x1 == drawnLines[pts] && y1 == drawnLines[pts + 1]
   2118                 && x2 == drawnLines[pts + 2] && y2 == drawnLines[pts + 3]) {
   2119             return true;
   2120         }
   2121     }
   2122     drawnLines.push(x1);
   2123     drawnLines.push(y1);
   2124     drawnLines.push(x2);
   2125     drawnLines.push(y2);
   2126     return false;
   2127 }
   2128 
   2129 function drawLine(x1, y1, x2, y2) {
   2130     if (alreadyDrawnLine(x1, y1, x2, y2)) {
   2131         return;
   2132     }
   2133     ctx.beginPath();
   2134     ctx.moveTo((x1 - srcLeft) * scale,
   2135             (y1 - srcTop) * scale);
   2136     ctx.lineTo((x2 - srcLeft) * scale,
   2137             (y2 - srcTop) * scale);
   2138     ctx.stroke();
   2139 }
   2140 
   2141 function linePartial(x1, y1, x2, y2, t1, t2) {
   2142     var dx = x1 - x2;
   2143     var dy = y1 - y2;
   2144     var array = [
   2145         x1 - t1 * dx,
   2146         y1 - t1 * dy,
   2147         x1 - t2 * dx,
   2148         y1 - t2 * dy
   2149     ];
   2150     return array;
   2151 }
   2152 
   2153 function drawLinePartial(x1, y1, x2, y2, t1, t2) {
   2154     var a = linePartial(x1, y1, x2, y2, t1, t2);
   2155     var ax = a[0];
   2156     var ay = a[1];
   2157     var bx = a[2];
   2158     var by = a[3];
   2159     if (alreadyDrawnLine(ax, ay, bx, by)) {
   2160         return;
   2161     }
   2162     ctx.beginPath();
   2163     ctx.moveTo((ax - srcLeft) * scale,
   2164             (ay - srcTop) * scale);
   2165     ctx.lineTo((bx - srcLeft) * scale,
   2166             (by - srcTop) * scale);
   2167     ctx.stroke();
   2168 }
   2169 
   2170 function alreadyDrawnQuad(x1, y1, x2, y2, x3, y3) {
   2171     if (collect_bounds) {
   2172         if (focus_enabled) {
   2173             focusXmin = Math.min(focusXmin, x1, x2, x3);
   2174             focusYmin = Math.min(focusYmin, y1, y2, y3);
   2175             focusXmax = Math.max(focusXmax, x1, x2, x3);
   2176             focusYmax = Math.max(focusYmax, y1, y2, y3);
   2177         }
   2178         return true;
   2179     }
   2180     for (var pts = 0; pts < drawnQuads.length; pts += 6) {
   2181         if (x1 == drawnQuads[pts] && y1 == drawnQuads[pts + 1]
   2182                 && x2 == drawnQuads[pts + 2] && y2 == drawnQuads[pts + 3]
   2183                 && x3 == drawnQuads[pts + 4] && y3 == drawnQuads[pts + 5]) {
   2184             return true;
   2185         }
   2186     }
   2187     drawnQuads.push(x1);
   2188     drawnQuads.push(y1);
   2189     drawnQuads.push(x2);
   2190     drawnQuads.push(y2);
   2191     drawnQuads.push(x3);
   2192     drawnQuads.push(y3);
   2193     return false;
   2194 }
   2195 
   2196 function drawQuad(x1, y1, x2, y2, x3, y3) {
   2197     if (alreadyDrawnQuad(x1, y1, x2, y2, x3, y3)) {
   2198         return;
   2199     }
   2200     ctx.beginPath();
   2201     ctx.moveTo((x1 - srcLeft) * scale,
   2202             (y1 - srcTop) * scale);
   2203     ctx.quadraticCurveTo((x2 - srcLeft) * scale,
   2204             (y2 - srcTop) * scale,
   2205             (x3 - srcLeft) * scale,
   2206             (y3 - srcTop) * scale);
   2207     ctx.stroke();
   2208 }
   2209 
   2210 function interp(A, B, t) {
   2211     return A + (B - A) * t;
   2212 }
   2213 
   2214 function interp_quad_coords(x1, x2, x3, t)
   2215 {
   2216     var ab = interp(x1, x2, t);
   2217     var bc = interp(x2, x3, t);
   2218     var abc = interp(ab, bc, t);
   2219     return abc;
   2220 }
   2221 
   2222 function quadPartial(x1, y1, x2, y2, x3, y3, t1, t2) {
   2223     var ax = interp_quad_coords(x1, x2, x3, t1);
   2224     var ay = interp_quad_coords(y1, y2, y3, t1);
   2225     var dx = interp_quad_coords(x1, x2, x3, (t1 + t2) / 2);
   2226     var dy = interp_quad_coords(y1, y2, y3, (t1 + t2) / 2);
   2227     var cx = interp_quad_coords(x1, x2, x3, t2);
   2228     var cy = interp_quad_coords(y1, y2, y3, t2);
   2229     var bx = 2*dx - (ax + cx)/2;
   2230     var by = 2*dy - (ay + cy)/2;
   2231     var array = [
   2232         ax, ay, bx, by, cx, cy
   2233     ];
   2234     return array;
   2235 }
   2236 
   2237 function drawQuadPartial(x1, y1, x2, y2, x3, y3, t1, t2) {
   2238     var a = quadPartial(x1, y1, x2, y2, x3, y3, t1, t2);
   2239     var ax = a[0];
   2240     var ay = a[1];
   2241     var bx = a[2];
   2242     var by = a[3];
   2243     var cx = a[4];
   2244     var cy = a[5];
   2245     if (alreadyDrawnQuad(ax, ay, bx, by, cx, cy)) {
   2246         return;
   2247     }
   2248     ctx.beginPath();
   2249     ctx.moveTo((ax - srcLeft) * scale,
   2250             (ay - srcTop) * scale);
   2251     ctx.quadraticCurveTo((bx - srcLeft) * scale,
   2252             (by - srcTop) * scale,
   2253             (cx - srcLeft) * scale,
   2254             (cy - srcTop) * scale);
   2255     ctx.stroke();
   2256 }
   2257 
   2258 function alreadyDrawnConic(x1, y1, x2, y2, x3, y3, w) {
   2259     if (collect_bounds) {
   2260         if (focus_enabled) {
   2261             focusXmin = Math.min(focusXmin, x1, x2, x3);
   2262             focusYmin = Math.min(focusYmin, y1, y2, y3);
   2263             focusXmax = Math.max(focusXmax, x1, x2, x3);
   2264             focusYmax = Math.max(focusYmax, y1, y2, y3);
   2265         }
   2266         return true;
   2267     }
   2268     for (var pts = 0; pts < drawnConics.length; pts += 8) {
   2269         if (x1 == drawnConics[pts] && y1 == drawnCubics[pts + 1]
   2270                 && x2 == drawnCubics[pts + 2] && y2 == drawnCubics[pts + 3] 
   2271                 && x3 == drawnCubics[pts + 4] && y3 == drawnCubics[pts + 5] 
   2272                 && w == drawnCubics[pts + 6]) {
   2273             return true;
   2274         }
   2275     }
   2276     drawnConics.push(x1);
   2277     drawnConics.push(y1);
   2278     drawnConics.push(x2);
   2279     drawnConics.push(y2);
   2280     drawnConics.push(x3);
   2281     drawnConics.push(y3);
   2282     drawnCubics.push(w);
   2283     return false;
   2284 }
   2285 
   2286 var kMaxConicToQuadPOW2 = 5;
   2287 
   2288 function computeQuadPOW2(curve, tol) {
   2289     var a = curve[6] - 1;
   2290     var k = a / (4 * (2 + a));
   2291     var x = k * (curve[0] - 2 * curve[2] + curve[4]);
   2292     var y = k * (curve[1] - 2 * curve[3] + curve[5]);
   2293 
   2294     var error = Math.sqrt(x * x + y * y);
   2295     var pow2;
   2296     for (pow2 = 0; pow2 < kMaxConicToQuadPOW2; ++pow2) {
   2297         if (error <= tol) {
   2298             break;
   2299         }
   2300         error *= 0.25;
   2301     }
   2302     return pow2;
   2303 }
   2304 
   2305 function subdivide_w_value(w) {
   2306     return Math.sqrt(0.5 + w * 0.5);
   2307 }
   2308 
   2309 function chop(curve, part1, part2) {
   2310     var w = curve[6];
   2311     var scale = 1 / (1 + w);
   2312     part1[0] = curve[0];
   2313     part1[1] = curve[1];
   2314     part1[2] = (curve[0] + curve[2] * w) * scale;
   2315     part1[3] = (curve[1] + curve[3] * w) * scale;
   2316     part1[4] = part2[0] = (curve[0] + (curve[2] * w) * 2 + curve[4]) * scale * 0.5;
   2317     part1[5] = part2[1] = (curve[1] + (curve[3] * w) * 2 + curve[5]) * scale * 0.5;
   2318     part2[2] = (curve[2] * w + curve[4]) * scale;
   2319     part2[3] = (curve[3] * w + curve[5]) * scale;
   2320     part2[4] = curve[4];
   2321     part2[5] = curve[5];
   2322     part1[6] = part2[6] = subdivide_w_value(w);
   2323 }
   2324 
   2325 function subdivide(curve, level, pts) {
   2326     if (0 == level) {
   2327         pts.push(curve[2]);
   2328         pts.push(curve[3]);
   2329         pts.push(curve[4]);
   2330         pts.push(curve[5]);
   2331     } else {
   2332         var part1 = [], part2 = [];
   2333         chop(curve, part1, part2);
   2334         --level;
   2335         subdivide(part1, level, pts);
   2336         subdivide(part2, level, pts);
   2337     }
   2338 }
   2339 
   2340 function chopIntoQuadsPOW2(curve, pow2, pts) {
   2341     subdivide(curve, pow2, pts);
   2342     return 1 << pow2;
   2343 }
   2344 
   2345 function drawConicWithQuads(x1, y1, x2, y2, x3, y3, w) {
   2346     if (alreadyDrawnConic(x1, y1, x2, y2, x3, y3, w)) {
   2347         return;
   2348     }
   2349     ctx.beginPath();
   2350     ctx.moveTo((x1 - srcLeft) * scale,
   2351             (y1 - srcTop) * scale);
   2352     var tol = 1 / scale;
   2353     var curve = [x1, y1, x2, y2, x3, y3, w];
   2354     var pow2 = computeQuadPOW2(curve, tol);
   2355     var pts = [];
   2356     chopIntoQuadsPOW2(curve, pow2, pts);
   2357     for (var i = 0; i < pts.length; i += 4) {
   2358         ctx.quadraticCurveTo(
   2359             (pts[i + 0] - srcLeft) * scale, (pts[i + 1] - srcTop) * scale,
   2360             (pts[i + 2] - srcLeft) * scale, (pts[i + 3] - srcTop) * scale);
   2361     }
   2362     ctx.stroke();
   2363 }
   2364 
   2365 function conic_eval_numerator(x1, x2, x3, w, t) {
   2366     var src2w = x2 * w;
   2367     var C = x1;
   2368     var A = x3 - 2 * src2w + C;
   2369     var B = 2 * (src2w - C);
   2370     return (A * t + B) * t + C;
   2371 }
   2372 
   2373 
   2374 function conic_eval_denominator(w, t) {
   2375     var B = 2 * (w - 1);
   2376     var C = 1;
   2377     var A = -B;
   2378     return (A * t + B) * t + C;
   2379 }
   2380 
   2381 function conicPartial(x1, y1, x2, y2, x3, y3, w, t1, t2) {
   2382     var ax = conic_eval_numerator(x1, x2, x3, w, t1);
   2383     var ay = conic_eval_numerator(y1, y2, y3, w, t1);
   2384     var az = conic_eval_denominator(w, t1);
   2385     var midT = (t1 + t2) / 2;
   2386     var dx = conic_eval_numerator(x1, x2, x3, w, midT);
   2387     var dy = conic_eval_numerator(y1, y2, y3, w, midT);
   2388     var dz = conic_eval_denominator(w, midT);
   2389     var cx = conic_eval_numerator(x1, x2, x3, w, t2);
   2390     var cy = conic_eval_numerator(y1, y2, y3, w, t2);
   2391     var cz = conic_eval_denominator(w, t2);
   2392     var bx = 2 * dx - (ax + cx) / 2;
   2393     var by = 2 * dy - (ay + cy) / 2;
   2394     var bz = 2 * dz - (az + cz) / 2;
   2395     var dt = t2 - t1;
   2396     var dt_1 = 1 - dt;
   2397     var partW = (1 + dt * (w - 1)) / Math.sqrt(dt * dt + 2 * dt * dt_1 * w + dt_1 * dt_1);
   2398     var array = [
   2399         ax / az, ay / az, bx / bz, by / bz, cx / cz, cy / cz, partW
   2400     ];
   2401     return array;
   2402 }
   2403     
   2404 function drawConicPartial(x1, y1, x2, y2, x3, y3, w, t1, t2) {
   2405     var a = conicPartial(x1, y1, x2, y2, x3, y3, w, t1, t2);
   2406     var ax = a[0];
   2407     var ay = a[1];
   2408     var bx = a[2];
   2409     var by = a[3];
   2410     var cx = a[4];
   2411     var cy = a[5];
   2412     var w_ = a[6];
   2413     drawConicWithQuads(ax, ay, bx, by, cx, cy, w_);
   2414 }
   2415 
   2416 function alreadyDrawnCubic(x1, y1, x2, y2, x3, y3, x4, y4) {
   2417     if (collect_bounds) {
   2418         if (focus_enabled) {
   2419             focusXmin = Math.min(focusXmin, x1, x2, x3, x4);
   2420             focusYmin = Math.min(focusYmin, y1, y2, y3, y4);
   2421             focusXmax = Math.max(focusXmax, x1, x2, x3, x4);
   2422             focusYmax = Math.max(focusYmax, y1, y2, y3, y4);
   2423         }
   2424         return true;
   2425     }
   2426     for (var pts = 0; pts < drawnCubics.length; pts += 8) {
   2427         if (x1 == drawnCubics[pts] && y1 == drawnCubics[pts + 1]
   2428                 && x2 == drawnCubics[pts + 2] && y2 == drawnCubics[pts + 3] 
   2429                 && x3 == drawnCubics[pts + 4] && y3 == drawnCubics[pts + 5] 
   2430                 && x4 == drawnCubics[pts + 6] && y4 == drawnCubics[pts + 7]) {
   2431             return true;
   2432         }
   2433     }
   2434     drawnCubics.push(x1);
   2435     drawnCubics.push(y1);
   2436     drawnCubics.push(x2);
   2437     drawnCubics.push(y2);
   2438     drawnCubics.push(x3);
   2439     drawnCubics.push(y3);
   2440     drawnCubics.push(x4);
   2441     drawnCubics.push(y4);
   2442     return false;
   2443 }
   2444 
   2445 function drawCubic(x1, y1, x2, y2, x3, y3, x4, y4) {
   2446     if (alreadyDrawnCubic(x1, y1, x2, y2, x3, y3, x4, y4)) {
   2447         return;
   2448     }
   2449     ctx.beginPath();
   2450     ctx.moveTo((x1 - srcLeft) * scale,
   2451             (y1 - srcTop) * scale);
   2452     ctx.bezierCurveTo((x2 - srcLeft) * scale,
   2453             (y2 - srcTop) * scale,
   2454             (x3 - srcLeft) * scale,
   2455             (y3 - srcTop) * scale,
   2456             (x4 - srcLeft) * scale,
   2457             (y4 - srcTop) * scale);
   2458     ctx.stroke();
   2459 }
   2460 
   2461 function interp_cubic_coords(x1, x2, x3, x4, t)
   2462 {
   2463     var ab = interp(x1, x2, t);
   2464     var bc = interp(x2, x3, t);
   2465     var cd = interp(x3, x4, t);
   2466     var abc = interp(ab, bc, t);
   2467     var bcd = interp(bc, cd, t);
   2468     var abcd = interp(abc, bcd, t);
   2469     return abcd;
   2470 }
   2471 
   2472 function cubicPartial(x1, y1, x2, y2, x3, y3, x4, y4, t1, t2) {
   2473     var ax = interp_cubic_coords(x1, x2, x3, x4, t1);
   2474     var ay = interp_cubic_coords(y1, y2, y3, y4, t1);
   2475     var ex = interp_cubic_coords(x1, x2, x3, x4, (t1*2+t2)/3);
   2476     var ey = interp_cubic_coords(y1, y2, y3, y4, (t1*2+t2)/3);
   2477     var fx = interp_cubic_coords(x1, x2, x3, x4, (t1+t2*2)/3);
   2478     var fy = interp_cubic_coords(y1, y2, y3, y4, (t1+t2*2)/3);
   2479     var dx = interp_cubic_coords(x1, x2, x3, x4, t2);
   2480     var dy = interp_cubic_coords(y1, y2, y3, y4, t2);
   2481     var mx = ex * 27 - ax * 8 - dx;
   2482     var my = ey * 27 - ay * 8 - dy;
   2483     var nx = fx * 27 - ax - dx * 8;
   2484     var ny = fy * 27 - ay - dy * 8;
   2485     var bx = (mx * 2 - nx) / 18;
   2486     var by = (my * 2 - ny) / 18;
   2487     var cx = (nx * 2 - mx) / 18;
   2488     var cy = (ny * 2 - my) / 18;
   2489     var array = [
   2490         ax, ay, bx, by, cx, cy, dx, dy
   2491     ];
   2492     return array;
   2493 }
   2494     
   2495 function drawCubicPartial(x1, y1, x2, y2, x3, y3, x4, y4, t1, t2) {
   2496     var a = cubicPartial(x1, y1, x2, y2, x3, y3, x4, y4, t1, t2);
   2497     var ax = a[0];
   2498     var ay = a[1];
   2499     var bx = a[2];
   2500     var by = a[3];
   2501     var cx = a[4];
   2502     var cy = a[5];
   2503     var dx = a[6];
   2504     var dy = a[7];
   2505     if (alreadyDrawnCubic(ax, ay, bx, by, cx, cy, dx, dy)) {
   2506         return;
   2507     }
   2508     ctx.beginPath();
   2509     ctx.moveTo((ax - srcLeft) * scale,
   2510             (ay - srcTop) * scale);
   2511     ctx.bezierCurveTo((bx - srcLeft) * scale,
   2512             (by - srcTop) * scale,
   2513             (cx - srcLeft) * scale,
   2514             (cy - srcTop) * scale,
   2515             (dx - srcLeft) * scale,
   2516             (dy - srcTop) * scale);
   2517     ctx.stroke();
   2518 }
   2519 
   2520 function drawCurve(c) {
   2521     switch (c.length) {
   2522         case 4:
   2523             drawLine(c[0], c[1], c[2], c[3]);
   2524             break;
   2525         case 6:
   2526             drawQuad(c[0], c[1], c[2], c[3], c[4], c[5]);
   2527             break;
   2528         case 7:
   2529             drawConicWithQuads(c[0], c[1], c[2], c[3], c[4], c[5], c[6]);
   2530             break;
   2531         case 8:
   2532             drawCubic(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
   2533             break;
   2534     }
   2535 }
   2536 
   2537 function boundsWidth(pts) {
   2538     var min = pts[0];
   2539     var max = pts[0];
   2540     var length = pts.length == 7 ? 6 : pts.length;
   2541     for (var idx = 2; idx < length; idx += 2) {
   2542         min = Math.min(min, pts[idx]);
   2543         max = Math.max(max, pts[idx]);
   2544     }
   2545     return max - min;
   2546 }
   2547 
   2548 function boundsHeight(pts) {
   2549     var min = pts[1];
   2550     var max = pts[1];
   2551     var length = pts.length == 7 ? 6 : pts.length;
   2552     for (var idx = 3; idx < length; idx += 2) {
   2553         min = Math.min(min, pts[idx]);
   2554         max = Math.max(max, pts[idx]);
   2555     }
   2556     return max - min;
   2557 }
   2558 
   2559 function tangent(pts) {
   2560     var dx = pts[2] - pts[0];
   2561     var dy = pts[3] - pts[1];
   2562     if (dx == 0 && dy == 0 && pts.length > 4) {
   2563         dx = pts[4] - pts[0];
   2564         dy = pts[5] - pts[1];
   2565         if (dx == 0 && dy == 0 && pts.length == 8) {
   2566             dx = pts[6] - pts[0];
   2567             dy = pts[7] - pts[1];
   2568         }
   2569     }
   2570     return Math.atan2(-dy, dx);
   2571 }
   2572 
   2573 function hodograph(cubic) {
   2574     var hodo = [];
   2575     hodo[0] = 3 * (cubic[2] - cubic[0]);
   2576     hodo[1] = 3 * (cubic[3] - cubic[1]);
   2577     hodo[2] = 3 * (cubic[4] - cubic[2]);
   2578     hodo[3] = 3 * (cubic[5] - cubic[3]);
   2579     hodo[4] = 3 * (cubic[6] - cubic[4]);
   2580     hodo[5] = 3 * (cubic[7] - cubic[5]);
   2581     return hodo;
   2582 }
   2583 
   2584 function hodograph2(cubic) {
   2585     var quad = hodograph(cubic);
   2586     var hodo = [];
   2587     hodo[0] = 2 * (quad[2] - quad[0]);
   2588     hodo[1] = 2 * (quad[3] - quad[1]);
   2589     hodo[2] = 2 * (quad[4] - quad[2]);
   2590     hodo[3] = 2 * (quad[5] - quad[3]);
   2591     return hodo;
   2592 }
   2593 
   2594 function quadraticRootsReal(A, B, C, s) {
   2595     if (A == 0) {
   2596         if (B == 0) {
   2597             s[0] = 0;
   2598             return C == 0;
   2599         }
   2600         s[0] = -C / B;
   2601         return 1;
   2602     }
   2603     /* normal form: x^2 + px + q = 0 */
   2604     var p = B / (2 * A);
   2605     var q = C / A;
   2606     var p2 = p * p;
   2607     if (p2 < q) {
   2608         return 0;
   2609     }
   2610     var sqrt_D = 0;
   2611     if (p2 > q) {
   2612         sqrt_D = sqrt(p2 - q);
   2613     }
   2614     s[0] = sqrt_D - p;
   2615     s[1] = -sqrt_D - p;
   2616     return 1 + s[0] != s[1];
   2617 }
   2618 
   2619 function add_valid_ts(s, realRoots, t) {
   2620     var foundRoots = 0;
   2621     for (var index = 0; index < realRoots; ++index) {
   2622         var tValue = s[index];
   2623         if (tValue >= 0 && tValue <= 1) {
   2624             for (var idx2 = 0; idx2 < foundRoots; ++idx2) {
   2625                 if (t[idx2] != tValue) {
   2626                     t[foundRoots++] = tValue;
   2627                 }
   2628             }
   2629         }
   2630     }
   2631     return foundRoots;
   2632 }
   2633 
   2634 function quadraticRootsValidT(a, b, c, t) {
   2635     var s = [];
   2636     var realRoots = quadraticRootsReal(A, B, C, s);
   2637     var foundRoots = add_valid_ts(s, realRoots, t);
   2638     return foundRoots != 0;
   2639 }
   2640 
   2641 function find_cubic_inflections(cubic, tValues) {
   2642     var Ax = src[2] - src[0];
   2643     var Ay = src[3] - src[1];
   2644     var Bx = src[4] - 2 * src[2] + src[0];
   2645     var By = src[5] - 2 * src[3] + src[1];
   2646     var Cx = src[6] + 3 * (src[2] - src[4]) - src[0];
   2647     var Cy = src[7] + 3 * (src[3] - src[5]) - src[1];
   2648     return quadraticRootsValidT(Bx * Cy - By * Cx, (Ax * Cy - Ay * Cx),
   2649             Ax * By - Ay * Bx, tValues);
   2650 }
   2651 
   2652 function dxy_at_t(curve, type, t) {
   2653     var dxy = {};
   2654     if (type == PATH_QUAD) {
   2655         var a = t - 1;
   2656         var b = 1 - 2 * t;
   2657         var c = t;
   2658         dxy.x = a * curve[0] + b * curve[2] + c * curve[4];
   2659         dxy.y = a * curve[1] + b * curve[3] + c * curve[5];
   2660     } else if (type == PATH_CONIC) {
   2661         var p20x = curve[4] - curve[0];
   2662         var p20y = curve[5] - curve[1];
   2663         var p10xw = (curve[2] - curve[0]) * curve[6];
   2664         var p10yw = (curve[3] - curve[1]) * curve[6];
   2665         var coeff0x = curve[6] * p20x - p20x;
   2666         var coeff0y = curve[6] * p20y - p20y;
   2667         var coeff1x = p20x - 2 * p10xw;
   2668         var coeff1y = p20y - 2 * p10yw;
   2669         dxy.x = t * (t * coeff0x + coeff1x) + p10xw;
   2670         dxy.y = t * (t * coeff0y + coeff1y) + p10yw;
   2671     } else if (type == PATH_CUBIC) {
   2672         var one_t = 1 - t;
   2673         var a = curve[0];
   2674         var b = curve[2];
   2675         var c = curve[4];
   2676         var d = curve[6];
   2677         dxy.x = 3 * ((b - a) * one_t * one_t + 2 * (c - b) * t * one_t + (d - c) * t * t);
   2678         a = curve[1];
   2679         b = curve[3];
   2680         c = curve[5];
   2681         d = curve[7];
   2682         dxy.y = 3 * ((b - a) * one_t * one_t + 2 * (c - b) * t * one_t + (d - c) * t * t);
   2683     }
   2684     return dxy;
   2685 }
   2686 
   2687 function drawLabel(num, px, py) {
   2688     ctx.beginPath();
   2689     ctx.arc(px, py, 8, 0, Math.PI*2, true);
   2690     ctx.closePath();
   2691     ctx.strokeStyle = "rgba(0,0,0, 0.4)";
   2692     ctx.lineWidth = num == 0 || num == 3 ? 2 : 1;
   2693     ctx.stroke();
   2694     ctx.fillStyle = "black";
   2695     ctx.font = "normal 10px Arial";
   2696   //  ctx.rotate(0.001);
   2697     ctx.fillText(num, px - 2, py + 3);
   2698   //  ctx.rotate(-0.001);
   2699 }
   2700 
   2701 function drawLabelX(ymin, num, loc) {
   2702     var px = (loc - srcLeft) * scale;
   2703     var py = (ymin - srcTop) * scale - 20;
   2704     drawLabel(num, px, py);
   2705 }
   2706 
   2707 function drawLabelY(xmin, num, loc) {
   2708     var px = (xmin - srcLeft) * scale - 20;
   2709     var py = (loc - srcTop) * scale;
   2710     drawLabel(num, px, py);
   2711 }
   2712 
   2713 function drawHodoOrigin(hx, hy, hMinX, hMinY, hMaxX, hMaxY) {
   2714     ctx.beginPath();
   2715     ctx.moveTo(hx, hy - 100);
   2716     ctx.lineTo(hx, hy);
   2717     ctx.strokeStyle = hMinY < 0 ? "green" : "blue";
   2718     ctx.stroke();
   2719     ctx.beginPath();
   2720     ctx.moveTo(hx, hy);
   2721     ctx.lineTo(hx, hy + 100);
   2722     ctx.strokeStyle = hMaxY > 0 ? "green" : "blue";
   2723     ctx.stroke();
   2724     ctx.beginPath();
   2725     ctx.moveTo(hx - 100, hy);
   2726     ctx.lineTo(hx, hy);
   2727     ctx.strokeStyle = hMinX < 0 ? "green" : "blue";
   2728     ctx.stroke();
   2729     ctx.beginPath();
   2730     ctx.moveTo(hx, hy);
   2731     ctx.lineTo(hx + 100, hy);
   2732     ctx.strokeStyle = hMaxX > 0 ? "green" : "blue";
   2733     ctx.stroke();
   2734 }
   2735 
   2736 function scalexy(x, y, mag) {
   2737     var length = Math.sqrt(x * x + y * y);
   2738     return mag / length;
   2739 }
   2740 
   2741 function drawArrow(x, y, dx, dy, s) {
   2742     var dscale = scalexy(dx, dy, 1 / scale * 100 * s);
   2743     dx *= dscale;
   2744     dy *= dscale;
   2745     ctx.beginPath();
   2746     ctx.moveTo((x - srcLeft) * scale, (y - srcTop) * scale);
   2747     x += dx;
   2748     y += dy;
   2749     ctx.lineTo((x - srcLeft) * scale, (y - srcTop) * scale);
   2750     dx /= 10;
   2751     dy /= 10;
   2752     ctx.lineTo((x - dy - srcLeft) * scale, (y + dx - srcTop) * scale);
   2753     ctx.lineTo((x + dx * 2 - srcLeft) * scale, (y + dy * 2 - srcTop) * scale);
   2754     ctx.lineTo((x + dy - srcLeft) * scale, (y - dx - srcTop) * scale);
   2755     ctx.lineTo((x - srcLeft) * scale, (y - srcTop) * scale);
   2756     ctx.strokeStyle = "rgba(0,75,0, 0.4)";
   2757     ctx.stroke();
   2758 }
   2759 
   2760 function x_at_t(curve, t) {
   2761     var one_t = 1 - t;
   2762     if (curve.length == 4) {
   2763         return one_t * curve[0] + t * curve[2];
   2764     }
   2765     var one_t2 = one_t * one_t;
   2766     var t2 = t * t;
   2767     if (curve.length == 6) {
   2768         return one_t2 * curve[0] + 2 * one_t * t * curve[2] + t2 * curve[4];
   2769     }
   2770     if (curve.length == 7) {
   2771         return (one_t2 * curve[0] + 2 * one_t * t * curve[2] * curve[6] + t2 * curve[4])
   2772                 / (one_t2 +2 * one_t * t * curve[6] + t2);
   2773     }
   2774     var a = one_t2 * one_t;
   2775     var b = 3 * one_t2 * t;
   2776     var c = 3 * one_t * t2;
   2777     var d = t2 * t;
   2778     return a * curve[0] + b * curve[2] + c * curve[4] + d * curve[6];
   2779 }
   2780 
   2781 function y_at_t(curve, t) {
   2782     var one_t = 1 - t;
   2783     if (curve.length == 4) {
   2784         return one_t * curve[1] + t * curve[3];
   2785     }
   2786     var one_t2 = one_t * one_t;
   2787     var t2 = t * t;
   2788     if (curve.length == 6) {
   2789         return one_t2 * curve[1] + 2 * one_t * t * curve[3] + t2 * curve[5];
   2790     }
   2791     if (curve.length == 7) {
   2792         return (one_t2 * curve[1] + 2 * one_t * t * curve[3] * curve[6] + t2 * curve[5])
   2793                 / (one_t2 +2 * one_t * t * curve[6] + t2);
   2794     }
   2795     var a = one_t2 * one_t;
   2796     var b = 3 * one_t2 * t;
   2797     var c = 3 * one_t * t2;
   2798     var d = t2 * t;
   2799     return a * curve[1] + b * curve[3] + c * curve[5] + d * curve[7];
   2800 }
   2801 
   2802 function drawOrder(curve, label) {
   2803     var px = x_at_t(curve, 0.75);
   2804     var py = y_at_t(curve, 0.75);
   2805     var _px = (px - srcLeft) * scale;
   2806     var _py = (py - srcTop) * scale;
   2807     ctx.beginPath();
   2808     ctx.arc(_px, _py, 15, 0, Math.PI * 2, true);
   2809     ctx.closePath();
   2810     ctx.fillStyle = "white";
   2811     ctx.fill();
   2812     if (label == 'L') {
   2813         ctx.strokeStyle = "rgba(255,0,0, 1)";
   2814         ctx.fillStyle = "rgba(255,0,0, 1)";
   2815     } else {
   2816         ctx.strokeStyle = "rgba(0,0,255, 1)";
   2817         ctx.fillStyle = "rgba(0,0,255, 1)";
   2818     }
   2819     ctx.stroke();
   2820     ctx.font = "normal 16px Arial";
   2821     ctx.textAlign = "center";
   2822     ctx.fillText(label, _px, _py + 5);
   2823     ctx.font = "normal 10px Arial";
   2824 }
   2825 
   2826 function drawID(curve, id) {
   2827     var px = x_at_t(curve, 0.5);
   2828     var py = y_at_t(curve, 0.5);
   2829     var _px = (px - srcLeft) * scale;
   2830     var _py = (py - srcTop) * scale;
   2831     draw_id_at(id, _px, _py);
   2832 }
   2833 
   2834 function draw_id_at(id, _px, _py) {
   2835     ctx.beginPath();
   2836     ctx.arc(_px, _py, 15, 0, Math.PI * 2, true);
   2837     ctx.closePath();
   2838     ctx.fillStyle = "white";
   2839     ctx.fill();
   2840     ctx.strokeStyle = "rgba(127,127,0, 1)";
   2841     ctx.fillStyle = "rgba(127,127,0, 1)";
   2842     ctx.stroke();
   2843     ctx.font = "normal 16px Arial";
   2844     ctx.textAlign = "center";
   2845     ctx.fillText(id, _px, _py + 5);
   2846     ctx.font = "normal 10px Arial";
   2847 }
   2848 
   2849 function drawLinePartialID(id, x1, y1, x2, y2, t1, t2) {
   2850     var curve = [x1, y1, x2, y2];
   2851     drawCurvePartialID(id, curve, t1, t2);
   2852 }
   2853 
   2854 function drawQuadPartialID(id, x1, y1, x2, y2, x3, y3, t1, t2) {
   2855     var curve = [x1, y1, x2, y2, x3, y3];
   2856     drawCurvePartialID(id, curve, t1, t2);
   2857 }
   2858 
   2859 function drawConicPartialID(id, x1, y1, x2, y2, x3, y3, w, t1, t2) {
   2860     var curve = [x1, y1, x2, y2, x3, y3, w];
   2861     drawCurvePartialID(id, curve, t1, t2);
   2862 }
   2863 
   2864 function drawCubicPartialID(id, x1, y1, x2, y2, x3, y3, x4, y4, t1, t2) {
   2865     var curve = [x1, y1, x2, y2, x3, y3, x4, y4];
   2866     drawCurvePartialID(id, curve, t1, t2);
   2867 }
   2868 
   2869 function  drawCurvePartialID(id, curve, t1, t2) {
   2870     var px = x_at_t(curve, (t1 + t2) / 2);
   2871     var py = y_at_t(curve, (t1 + t2) / 2);
   2872     var _px = (px - srcLeft) * scale;
   2873     var _py = (py - srcTop) * scale;
   2874     draw_id_at(id, _px, _py);
   2875 }
   2876 
   2877 function drawCurveSpecials(test, curve, type) {
   2878     if (pt_labels) {
   2879         drawPoints(curve, type, pt_labels == 2);
   2880     }
   2881     if (control_lines != 0) {
   2882         drawControlLines(curve, type, control_lines);
   2883     }
   2884     if (curve_t) {
   2885         drawPointAtT(curve, type);
   2886     }
   2887     if (draw_midpoint) {
   2888         var mid = pointAtT(curve, type, 0.5);
   2889         drawPoint(mid.x, mid.y, true);
   2890     }
   2891     if (draw_id) {
   2892         var id = idByCurve(test, curve, type);
   2893         if (id >= 0) {
   2894             drawID(curve, id);
   2895         }
   2896     }
   2897     if (type == PATH_LINE) {
   2898         return;
   2899     }
   2900     if (draw_deriviatives > 0) {
   2901         var d = dxy_at_t(curve, type, 0);
   2902         drawArrow(curve[0], curve[1], d.x, d.y, 1);
   2903         if (draw_deriviatives == 2) {
   2904             d = dxy_at_t(curve, type, 1);
   2905             if (type == PATH_CUBIC) {
   2906                 drawArrow(curve[6], curve[7], d.x, d.y, 1);
   2907             } else {
   2908                 drawArrow(curve[4], curve[5], d.x, d.y, 1);
   2909             }
   2910         }
   2911         if (draw_midpoint) {
   2912             var mid = pointAtT(curve, type, 0.5);
   2913             d = dxy_at_t(curve, type, 0.5);
   2914             drawArrow(mid.x, mid.y, d.x, d.y, 1);
   2915         }
   2916     }
   2917     if (type != PATH_CUBIC) {
   2918         return;
   2919     }
   2920     if (draw_sequence) {
   2921         var ymin = Math.min(curve[1], curve[3], curve[5], curve[7]);
   2922         for (var i = 0; i < 8; i+= 2) {
   2923             drawLabelX(ymin, i >> 1, curve[i]);
   2924         }
   2925         var xmin = Math.min(curve[0], curve[2], curve[4], curve[6]);
   2926         for (var i = 1; i < 8; i+= 2) {
   2927             drawLabelY(xmin, i >> 1, curve[i]);
   2928         }
   2929     }
   2930 }
   2931 
   2932 function logCurves(test) {
   2933     for (curves in test) {
   2934         var curve = test[curves];
   2935         dumpCurve(curve);
   2936     }
   2937 }
   2938 
   2939 function curveToString(curve) {
   2940     var str = "{{";
   2941     var length = curve.length == 7 ? 6 : curve.length;
   2942     if (curve.length == 7) {
   2943         str += "{";
   2944     }
   2945     for (i = 0; i < length; i += 2) {
   2946         str += curve[i].toFixed(decimal_places) + "," + curve[i + 1].toFixed(decimal_places);
   2947         if (i < curve.length - 2) {
   2948             str += "}, {";
   2949         }
   2950     }
   2951     str += "}";
   2952     if (curve.length == 7) {
   2953         str += "}, " + curve[6].toFixed(decimal_places);
   2954     }
   2955     str += "}";
   2956     return str;
   2957 }
   2958 
   2959 function dumpCurve(curve) {
   2960     console.log(curveToString(curve));
   2961 }
   2962 
   2963 function draw(test, lines, title) {
   2964     ctx.fillStyle = "rgba(0,0,0, 0.1)";
   2965     ctx.font = "normal 50px Arial";
   2966     ctx.textAlign = "left";
   2967     ctx.fillText(title, 50, 50);
   2968     ctx.font = "normal 10px Arial";
   2969     ctx.lineWidth = "1.001"; "0.999";
   2970     var secondPath = test.length;
   2971     var closeCount = 0;
   2972     logStart = -1;
   2973     logRange = 0;
   2974     // find last active rec type at this step
   2975     var curType = test[0];
   2976     var curStep = 0;
   2977     var hasOp = false;
   2978     var lastActive = 0;
   2979     var lastAdd = 0;
   2980     var lastCoin = 0;
   2981     var lastSect = 0;
   2982     var lastSort = 0;
   2983     var lastMark = 0;
   2984     var lastTop = 0;
   2985     activeCount = 0;
   2986     addCount = 0;
   2987     angleCount = 0;
   2988     opCount = 0;
   2989     sectCount = 0;
   2990     sortCount = 0;
   2991     topCount = 0;
   2992     markCount = 0;
   2993     activeMax = 0;
   2994     addMax = 0;
   2995     angleMax = 0;
   2996     coinMax = 0;
   2997     opMax = 0;
   2998     sectMax = 0;
   2999     sectMax2 = 0;
   3000     sortMax = 0;
   3001     topMax = 0;
   3002     markMax = 0;
   3003     lastIndex = test.length - 3;
   3004     for (var tIndex = 0; tIndex < test.length; tIndex += 3) {
   3005         var recType = test[tIndex];
   3006         if (!typeof recType == 'number' || recType < REC_TYPE_UNKNOWN || recType > REC_TYPE_LAST) {
   3007             console.log("unknown rec type: " + recType);
   3008             throw "stop execution";
   3009         }
   3010    //     if (curType == recType && curType != REC_TYPE_ADD) {
   3011    //         continue;
   3012    //     }
   3013         var inStepRange = step_limit == 0 || curStep < step_limit;
   3014         curType = recType;
   3015         if (recType == REC_TYPE_OP) {
   3016             hasOp = true;
   3017             continue;
   3018         }
   3019         if (recType == REC_TYPE_UNKNOWN) {
   3020             // these types do not advance step
   3021             continue;
   3022         }
   3023         var bumpStep = false;
   3024         var records = test[tIndex + 2];
   3025         var fragType = records[0];
   3026         if (recType == REC_TYPE_ADD) {
   3027             if (records.length != 2) {
   3028                 console.log("expect only two elements: " + records.length);
   3029                 throw "stop execution";
   3030             }
   3031             if (fragType == ADD_MOVETO || fragType == ADD_CLOSE) {
   3032                 continue;
   3033             }
   3034             ++addMax;
   3035             if (!draw_add || !inStepRange) {
   3036                 continue;
   3037             }
   3038             lastAdd = tIndex;
   3039             ++addCount;
   3040             bumpStep = true;
   3041         }
   3042         if (recType == REC_TYPE_PATH && hasOp) {
   3043             secondPath = tIndex;
   3044         }
   3045         if (recType == REC_TYPE_PATH2 && hasOp) {
   3046             secondPath = tIndex;
   3047         }
   3048         if (recType == REC_TYPE_ACTIVE) {
   3049             ++activeMax;
   3050             if (!draw_active || !inStepRange) {
   3051                 continue;
   3052             }
   3053             lastActive = tIndex;
   3054             ++activeCount;
   3055             bumpStep = true;
   3056         }
   3057         if (recType == REC_TYPE_ACTIVE_OP) {
   3058             ++opMax;
   3059             if (!draw_op || !inStepRange) {
   3060                 continue;
   3061             }
   3062             lastOp = tIndex;
   3063             ++opCount;
   3064             bumpStep = true;
   3065         }
   3066         if (recType == REC_TYPE_AFTERPART) {
   3067             if (draw_angle != 3 || !inStepRange) {
   3068                 continue;
   3069             }
   3070             lastAngle = tIndex;
   3071             ++angleCount;
   3072             bumpStep = true;
   3073         }
   3074         if (recType == REC_TYPE_ANGLE) {
   3075             ++angleMax;
   3076             if (draw_angle == 0 || draw_angle == 3 || !inStepRange) {
   3077                 continue;
   3078             }
   3079             lastAngle = tIndex;
   3080             ++angleCount;
   3081             bumpStep = true;
   3082         }
   3083         if (recType == REC_TYPE_COINCIDENCE) {
   3084             ++coinMax;
   3085             if (!draw_coincidence || !inStepRange) {
   3086                 continue;
   3087             }
   3088             lastCoin = tIndex;
   3089             ++coinCount;
   3090             bumpStep = true;
   3091         }
   3092         if (recType == REC_TYPE_SECT) {
   3093             if (records.length != 2) {
   3094                 console.log("expect only two elements: " + records.length);
   3095                 throw "stop execution";
   3096             }
   3097             ++sectMax;
   3098             var sectBump = 1;
   3099             switch (fragType) {
   3100                 case INTERSECT_LINE:
   3101                 case INTERSECT_QUAD_LINE:
   3102                 case INTERSECT_QUAD:
   3103                 case INTERSECT_CONIC_LINE:
   3104                 case INTERSECT_CONIC:
   3105                 case INTERSECT_SELF_CUBIC:
   3106                 case INTERSECT_CUBIC_LINE:
   3107                 case INTERSECT_CUBIC_QUAD:
   3108                 case INTERSECT_CUBIC:
   3109                     sectBump = 1;
   3110                     break;
   3111                 case INTERSECT_LINE_2:
   3112                 case INTERSECT_QUAD_LINE_2:
   3113                 case INTERSECT_QUAD_2:
   3114                 case INTERSECT_CONIC_LINE_2:
   3115                 case INTERSECT_CONIC_2:
   3116                 case INTERSECT_CUBIC_LINE_2:
   3117                 case INTERSECT_CUBIC_QUAD_2:
   3118                 case INTERSECT_CUBIC_2:
   3119                     sectBump = 2;
   3120                     break;
   3121                 case INTERSECT_LINE_NO:
   3122                 case INTERSECT_QUAD_LINE_NO:
   3123                 case INTERSECT_QUAD_NO:
   3124                 case INTERSECT_CONIC_LINE_NO:
   3125                 case INTERSECT_CONIC_NO:
   3126                 case INTERSECT_SELF_CUBIC_NO:
   3127                 case INTERSECT_CUBIC_LINE_NO:
   3128                 case INTERSECT_CUBIC_QUAD_NO:
   3129                 case INTERSECT_CUBIC_NO:
   3130                     sectBump = 0;
   3131                     break;
   3132                 case INTERSECT_CUBIC_LINE_3:
   3133                 case INTERSECT_CUBIC_QUAD_3:
   3134                 case INTERSECT_CUBIC_3:
   3135                     sectBump = 3;
   3136                     break;
   3137                 case INTERSECT_CUBIC_QUAD_4:
   3138                 case INTERSECT_CUBIC_4:
   3139                     sectBump = 4;
   3140                     break;
   3141                 default:
   3142                     console.log("missing case " + records.length);
   3143                     throw "stop execution";
   3144             }
   3145             sectMax2 += sectBump;
   3146             if (draw_intersection <= 1 || !inStepRange) {
   3147                 continue;
   3148             }
   3149             lastSect = tIndex;
   3150             sectCount += sectBump;
   3151             bumpStep = true;
   3152         }
   3153         if (recType == REC_TYPE_SORT) {
   3154             ++sortMax;
   3155             if (!draw_sort || !inStepRange) {
   3156                 continue;
   3157             }
   3158             lastSort = tIndex;
   3159             ++sortCount;
   3160             bumpStep = true;
   3161         }
   3162         if (recType == REC_TYPE_TOP) {
   3163             ++topMax;
   3164             if (!draw_top || !inStepRange) {
   3165                 continue;
   3166             }
   3167             lastTop = tIndex;
   3168             ++topCount;
   3169             bumpStep = true;
   3170         }
   3171         if (recType == REC_TYPE_MARK) {
   3172             ++markMax;
   3173             if (!draw_mark || !inStepRange) {
   3174                 continue;
   3175             }
   3176             lastMark = tIndex;
   3177             ++markCount;
   3178             bumpStep = true;
   3179         }
   3180         if (bumpStep) {
   3181             lastIndex = tIndex;
   3182             logStart = test[tIndex + 1];
   3183             logRange = records.length / 2;
   3184             ++curStep;
   3185         }
   3186     }
   3187     stepMax = (draw_add ? addMax : 0)
   3188             + (draw_active ? activeMax : 0)
   3189             + (draw_angle ? angleMax : 0)
   3190             + (draw_coincidence ? coinMax : 0)
   3191             + (draw_op ? opMax : 0)
   3192             + (draw_sort ? sortMax : 0)
   3193             + (draw_top ? topMax : 0)
   3194             + (draw_mark ? markMax : 0)
   3195             + (draw_intersection == 2 ? sectMax : draw_intersection == 3 ? sectMax2 : 0);
   3196     if (stepMax == 0) {
   3197         stepMax = addMax + activeMax + angleMax + coinMax + opMax + sortMax + topMax + markMax;
   3198     }
   3199     drawnPts = [];
   3200     drawnLines = [];
   3201     drawnQuads = [];
   3202     drawnConics = [];
   3203     drawnCubics = [];
   3204     focusXmin = focusYmin = Infinity;
   3205     focusXmax = focusYmax = -Infinity;
   3206     var pathIndex = 0;
   3207     var opLetter = 'S';
   3208     for (var tIndex = lastIndex; tIndex >= 0; tIndex -= 3) {
   3209         var recType = test[tIndex];
   3210         var records = test[tIndex + 2];
   3211         for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
   3212             var fragType = records[recordIndex];
   3213             if (!typeof fragType == 'number' || fragType < 1 || fragType > FRAG_TYPE_LAST) {
   3214                 console.log("unknown in range frag type: " + fragType);
   3215                 throw "stop execution";
   3216             }
   3217             var frags = records[recordIndex + 1];
   3218             focus_enabled = false;
   3219             switch (recType) {
   3220                 case REC_TYPE_COMPUTED:
   3221                     if (draw_computed == 0) {
   3222                         continue;
   3223                     }
   3224                     ctx.lineWidth = 1;
   3225                     ctx.strokeStyle = pathIndex == 0 ? "black" : "red";
   3226                     ctx.fillStyle = "blue";
   3227                     var drawThis = false;
   3228                     switch (fragType) {
   3229                         case PATH_QUAD:
   3230                             if ((draw_computed & 0x9) == 1 || ((draw_computed & 8) != 0
   3231                                     && (draw_computed & 7) == pathIndex)) {
   3232                                 drawQuad(frags[0], frags[1], frags[2], frags[3],
   3233                                         frags[4], frags[5]);
   3234                                 drawThis = true;
   3235                             }
   3236                             break;
   3237                         case PATH_CONIC:
   3238                             if ((draw_computed & 0xA) == 2 || ((draw_computed & 8) != 0
   3239                                     && (draw_computed & 7) == pathIndex)) {
   3240                                 drawConicWithQuads(frags[0], frags[1], frags[2], frags[3],
   3241                                         frags[4], frags[5], frags[6]);
   3242                                 drawThis = true;
   3243                             }
   3244                             break;
   3245                         case PATH_CUBIC:
   3246                             if ((draw_computed & 0xC) == 4 || ((draw_computed & 8) != 0
   3247                                      && (draw_computed & 7) == pathIndex)) {
   3248                                 drawCubic(frags[0], frags[1], frags[2], frags[3],
   3249                                         frags[4], frags[5], frags[6], frags[7]);
   3250                                 drawThis = true;
   3251                             }
   3252                             ++pathIndex;
   3253                             break;
   3254                         case COMPUTED_SET_1:
   3255                             pathIndex = 0;
   3256                             break;
   3257                         case COMPUTED_SET_2:
   3258                             pathIndex = 1;
   3259                             break;
   3260                         default:
   3261                             console.log("unknown REC_TYPE_COMPUTED frag type: " + fragType);
   3262                             throw "stop execution";
   3263                     }
   3264                     if (!drawThis || collect_bounds) {
   3265                         break;
   3266                     }
   3267                     drawCurveSpecials(test, frags, fragType);
   3268                     break;
   3269                 case REC_TYPE_PATH:
   3270                 case REC_TYPE_PATH2:
   3271                     if (!draw_path) {
   3272                         continue;
   3273                     }
   3274                     var firstPath = tIndex < secondPath;
   3275                     if ((draw_path & (firstPath ? 1 : 2)) == 0) {
   3276                         continue;
   3277                     }
   3278                     ctx.lineWidth = 1;
   3279                     ctx.strokeStyle = firstPath ? "black" : "red";
   3280                     ctx.fillStyle = "blue";
   3281                     var frags2 = []; 
   3282                     switch (fragType) {
   3283                         case PATH_LINE:
   3284                             for (var i = 0; i < 4; ++ i) { frags2[i] = frags[i + 1]; }
   3285                             drawLine(frags2[0], frags2[1], frags2[2], frags2[3]);
   3286                             break;
   3287                         case PATH_QUAD:
   3288                             for (var i = 0; i < 6; ++ i) { frags2[i] = frags[i + 1]; }
   3289                             drawQuad(frags2[0], frags2[1], frags2[2], frags2[3],
   3290                                     frags2[4], frags2[5]);
   3291                             break;
   3292                         case PATH_CONIC:
   3293                             for (var i = 0; i < 7; ++ i) { frags2[i] = frags[i + 1]; }
   3294                             drawConicWithQuads(frags2[0], frags2[1], frags2[2], frags2[3],
   3295                                     frags2[4], frags2[5], frags2[6]);
   3296                             break;
   3297                         case PATH_CUBIC:
   3298                             for (var i = 0; i < 8; ++ i) { frags2[i] = frags[i + 1]; }
   3299                             drawCubic(frags2[0], frags2[1], frags2[2], frags2[3],
   3300                                     frags2[4], frags2[5], frags2[6], frags2[7]);
   3301                             break;
   3302                         default:
   3303                             console.log("unknown REC_TYPE_PATH2 frag type: " + fragType);
   3304                             throw "stop execution";
   3305                     }
   3306                     if (collect_bounds) {
   3307                         break;
   3308                     }
   3309                     drawCurveSpecials(test, frags2, fragType);
   3310                     break;
   3311                 case REC_TYPE_OP:
   3312                     switch (fragType) {
   3313                         case OP_INTERSECT: opLetter = 'I'; break;
   3314                         case OP_DIFFERENCE: opLetter = 'D'; break;
   3315                         case OP_UNION: opLetter = 'U'; break;
   3316                         case OP_XOR: opLetter = 'X'; break;
   3317                         default:
   3318                             console.log("unknown REC_TYPE_OP frag type: " + fragType);
   3319                             throw "stop execution";
   3320                     }
   3321                     break;
   3322                 case REC_TYPE_ACTIVE:
   3323                     if (!draw_active || (step_limit > 0 && tIndex < lastActive)) {
   3324                         continue;
   3325                     }
   3326                     var x1 = frags[SPAN_X1];
   3327                     var y1 = frags[SPAN_Y1];
   3328                     var x2 = frags[SPAN_X2];
   3329                     var y2 = frags[SPAN_Y2];
   3330                     var x3, y3, x3, y4, t1, t2, w;
   3331                     ctx.lineWidth = 3;
   3332                     ctx.strokeStyle = "rgba(0,0,255, 0.3)";
   3333                     focus_enabled = true;
   3334                     switch (fragType) {
   3335                         case ACTIVE_LINE_SPAN:
   3336                             t1 = frags[SPAN_L_T];
   3337                             t2 = frags[SPAN_L_TEND];
   3338                             drawLinePartial(x1, y1, x2, y2, t1, t2);
   3339                             if (draw_id) {
   3340                                 drawLinePartialID(frags[0], x1, y1, x2, y2, t1, t2);
   3341                             }
   3342                              break;
   3343                         case ACTIVE_QUAD_SPAN:
   3344                             x3 = frags[SPAN_X3];
   3345                             y3 = frags[SPAN_Y3];
   3346                             t1 = frags[SPAN_Q_T];
   3347                             t2 = frags[SPAN_Q_TEND];
   3348                             drawQuadPartial(x1, y1, x2, y2, x3, y3, t1, t2);
   3349                             if (draw_id) {
   3350                                 drawQuadPartialID(frags[0], x1, y1, x2, y2, x3, y3, t1, t2);
   3351                             }
   3352                             break;
   3353                         case ACTIVE_CONIC_SPAN:
   3354                             x3 = frags[SPAN_X3];
   3355                             y3 = frags[SPAN_Y3];
   3356                             t1 = frags[SPAN_K_T];
   3357                             t2 = frags[SPAN_K_TEND];
   3358                             w = frags[SPAN_K_W];
   3359                             drawConicPartial(x1, y1, x2, y2, x3, y3, w, t1, t2);
   3360                             if (draw_id) {
   3361                                 drawConicPartialID(frags[0], x1, y1, x2, y2, x3, y3, w, t1, t2);
   3362                             }
   3363                             break;
   3364                         case ACTIVE_CUBIC_SPAN:
   3365                             x3 = frags[SPAN_X3];
   3366                             y3 = frags[SPAN_Y3];
   3367                             x4 = frags[SPAN_X4];
   3368                             y4 = frags[SPAN_Y4];
   3369                             t1 = frags[SPAN_C_T];
   3370                             t2 = frags[SPAN_C_TEND];
   3371                             drawCubicPartial(x1, y1, x2, y2, x3, y3, x4, y4, t1, t2);
   3372                             if (draw_id) {
   3373                                 drawCubicPartialID(frags[0], x1, y1, x2, y2, x3, y3, x4, y4, t1, t2);
   3374                             }
   3375                             break;
   3376                         default:
   3377                             console.log("unknown REC_TYPE_ACTIVE frag type: " + fragType);
   3378                             throw "stop execution";
   3379                     }
   3380                     break;
   3381                 case REC_TYPE_ACTIVE_OP:
   3382                     if (!draw_op || (step_limit > 0 && tIndex < lastOp)) {
   3383                         continue;
   3384                     }
   3385                     focus_enabled = true;
   3386                     ctx.lineWidth = 3;
   3387                     var activeSpan = frags[7] == "1";
   3388                     ctx.strokeStyle = activeSpan ? "rgba(45,160,0, 0.3)" : "rgba(255,45,0, 0.5)";
   3389                     var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
   3390                     drawCurve(curve);
   3391                     if (draw_op > 1) {
   3392                         drawArc(curve, false, frags[3], frags[4]);
   3393                         drawArc(curve, true, frags[5], frags[6]);
   3394                     }
   3395                     break;
   3396                 case REC_TYPE_ADD:
   3397                     if (!draw_add) {
   3398                         continue;
   3399                     }
   3400                     ctx.lineWidth = 3;
   3401                     ctx.strokeStyle = closeCount == 0 ? "rgba(0,0,255, 0.3)"
   3402                             : closeCount == 1 ? "rgba(0,127,0, 0.3)"
   3403                             : closeCount == 2 ? "rgba(0,127,127, 0.3)"
   3404                             : closeCount == 3 ? "rgba(127,127,0, 0.3)"
   3405                             : "rgba(127,0,127, 0.3)";
   3406                     focus_enabled = true;
   3407                     switch (fragType) {
   3408                         case ADD_MOVETO:
   3409                             break;
   3410                         case ADD_LINETO:
   3411                             if (step_limit == 0 || tIndex >= lastAdd) {
   3412                                 drawLine(frags[0], frags[1], frags[2], frags[3]);
   3413                             }
   3414                             break;
   3415                         case ADD_QUADTO:
   3416                             if (step_limit == 0 || tIndex >= lastAdd) {
   3417                                 drawQuad(frags[0], frags[1], frags[2], frags[3], frags[4], frags[5]);
   3418                             }
   3419                             break;
   3420                         case ADD_CONICTO:
   3421                             if (step_limit == 0 || tIndex >= lastAdd) {
   3422                                 drawConicWithQuads(frags[0], frags[1], frags[2], frags[3],
   3423                                         frags[4], frags[5], frags[6]);
   3424                             }
   3425                             break;
   3426                         case ADD_CUBICTO:
   3427                             if (step_limit == 0 || tIndex >= lastAdd) {
   3428                                 drawCubic(frags[0], frags[1], frags[2], frags[3],
   3429                                         frags[4], frags[5], frags[6], frags[7]);
   3430                             }
   3431                             break;
   3432                         case ADD_CLOSE:
   3433                             ++closeCount;
   3434                             break;
   3435                         case ADD_FILL:
   3436                             break;
   3437                         default:
   3438                             console.log("unknown REC_TYPE_ADD frag type: " + fragType);
   3439                             throw "stop execution";
   3440                     }
   3441                     break;
   3442                 case REC_TYPE_ANGLE:
   3443                     angleBetween = frags[18] == "T";
   3444                     afterIndex = 0;
   3445                     if (draw_angle == 0 || draw_angle == 3 || (step_limit > 0 && tIndex < lastAngle)) {
   3446                         continue;
   3447                     }
   3448                     focus_enabled = true;
   3449                     ctx.lineWidth = 3;
   3450                     ctx.strokeStyle = "rgba(127,45,127, 0.3)";
   3451                     var leftCurve = curvePartialByID(test, frags[0], frags[4], frags[5]);
   3452                     var midCurve = curvePartialByID(test, frags[6], frags[10], frags[11]);
   3453                     var rightCurve = curvePartialByID(test, frags[12], frags[16], frags[17]);
   3454                     drawCurve(leftCurve);
   3455                     drawCurve(rightCurve);
   3456                     ctx.strokeStyle = angleBetween ? "rgba(0,160,45, 0.3)" : "rgba(255,0,45, 0.5)";
   3457                     drawCurve(midCurve);
   3458                     if (draw_angle > 1) {
   3459                         drawOrder(leftCurve, 'L');
   3460                         drawOrder(rightCurve, 'R');
   3461                     }
   3462                     break;
   3463                 case REC_TYPE_AFTERPART:
   3464                     if (draw_angle != 3 || (step_limit > 0 && tIndex < lastAngle)) {
   3465                         continue;
   3466                     }
   3467                     ctx.strokeStyle = afterIndex == 0 ? "rgba(255,0,0, 1.0)"
   3468                             : (afterIndex == 1) == angleBetween ? "rgba(0,128,0, 1.0)"
   3469                             :  "rgba(0,0,255, 1.0)";
   3470                     switch (fragType) {
   3471                         case PATH_LINE:
   3472                             drawLine(frags[0], frags[1], frags[2], frags[3]);
   3473                             break;
   3474                         case PATH_QUAD:
   3475                             drawQuad(frags[0], frags[1], frags[2], frags[3],
   3476                                      frags[4], frags[5]);
   3477                             break;
   3478                         case PATH_CONIC:
   3479                             drawConicWithQuads(frags[0], frags[1], frags[2], frags[3],
   3480                                      frags[4], frags[5], frags[6]);
   3481                             break;
   3482                         case PATH_CUBIC:
   3483                             drawCubic(frags[0], frags[1], frags[2], frags[3],
   3484                                      frags[4], frags[5], frags[6], frags[7]);
   3485                             break;
   3486                         default:
   3487                             console.log("unknown REC_TYPE_AFTERPART frag type: " + fragType);
   3488                             throw "stop execution";
   3489                     }
   3490                     ++afterIndex;
   3491                     break;
   3492                 case REC_TYPE_COINCIDENCE:
   3493                     if (!draw_coincidence || (step_limit > 0 && tIndex < lastCoin)) {
   3494                         continue;
   3495                     }
   3496                     focus_enabled = true;
   3497                     ctx.lineWidth = 3;
   3498                     ctx.strokeStyle = "rgba(127,45,63, 0.3)";
   3499                     var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
   3500                     drawCurve(curve);
   3501                     break;
   3502                 case REC_TYPE_SECT:
   3503                     if (!draw_intersection) {
   3504                         continue;
   3505                     }
   3506                     if (draw_intersection != 1 && (step_limit > 0 && tIndex < lastSect)) {
   3507                         continue;
   3508                     }
   3509                     // draw_intersection == 1 : show all
   3510                     // draw_intersection == 2 : step == 0 ? show all : show intersection line #step
   3511                     // draw_intersection == 3 : step == 0 ? show all : show intersection #step
   3512                     ctx.lineWidth = 1;
   3513                     ctx.strokeStyle = "rgba(0,0,255, 0.3)";
   3514                     ctx.fillStyle = "blue";
   3515                     focus_enabled = true;
   3516                     var f = [];
   3517                     var c1s;
   3518                     var c1l;
   3519                     var c2s;
   3520                     var c2l;
   3521                     switch (fragType) {
   3522                         case INTERSECT_LINE:
   3523                             f.push(5, 6, 0, 7);
   3524                             c1s = 1; c1l = 4; c2s = 8; c2l = 4;
   3525                             break;
   3526                         case INTERSECT_LINE_2:
   3527                             f.push(5, 6, 0, 10);
   3528                             f.push(8, 9, 7, 15);
   3529                             c1s = 1; c1l = 4; c2s = 11; c2l = 4;
   3530                             break;
   3531                         case INTERSECT_LINE_NO:
   3532                             c1s = 0; c1l = 4; c2s = 4; c2l = 4;
   3533                             break;
   3534                         case INTERSECT_QUAD_LINE:
   3535                             f.push(7, 8, 0, 9);
   3536                             c1s = 1; c1l = 6; c2s = 10; c2l = 4;
   3537                             break;
   3538                         case INTERSECT_QUAD_LINE_2:
   3539                             f.push(7, 8, 0, 12);
   3540                             f.push(10, 11, 9, 17);
   3541                             c1s = 1; c1l = 6; c2s = 13; c2l = 4;
   3542                             break;
   3543                         case INTERSECT_QUAD_LINE_NO:
   3544                             c1s = 0; c1l = 6; c2s = 6; c2l = 4;
   3545                             break;
   3546                         case INTERSECT_QUAD:
   3547                             f.push(7, 8, 0, 9);
   3548                             c1s = 1; c1l = 6; c2s = 10; c2l = 6;
   3549                             break;
   3550                         case INTERSECT_QUAD_2:
   3551                             f.push(7, 8, 0, 12);
   3552                             f.push(10, 11, 9, 19);
   3553                             c1s = 1; c1l = 6; c2s = 13; c2l = 6;
   3554                             break;
   3555                         case INTERSECT_QUAD_NO:
   3556                             c1s = 0; c1l = 6; c2s = 6; c2l = 6;
   3557                             break;
   3558                         case INTERSECT_CONIC_LINE:
   3559                             f.push(8, 9, 0, 10);
   3560                             c1s = 1; c1l = 7; c2s = 11; c2l = 4;
   3561                             break;
   3562                         case INTERSECT_CONIC_LINE_2:
   3563                             f.push(8, 9, 0, 12);
   3564                             f.push(11, 12, 10, 18);
   3565                             c1s = 1; c1l = 7; c2s = 14; c2l = 4;
   3566                             break;
   3567                         case INTERSECT_CONIC_LINE_NO:
   3568                             c1s = 0; c1l = 7; c2s = 7; c2l = 4;
   3569                             break;
   3570                         case INTERSECT_CONIC:
   3571                             f.push(8, 9, 0, 10);
   3572                             c1s = 1; c1l = 7; c2s = 11; c2l = 7;
   3573                             break;
   3574                         case INTERSECT_CONIC_2:
   3575                             f.push(8, 9, 0, 13);
   3576                             f.push(11, 12, 10, 21);
   3577                             c1s = 1; c1l = 7; c2s = 14; c2l = 7;
   3578                             break;
   3579                         case INTERSECT_CONIC_NO:
   3580                             c1s = 0; c1l = 7; c2s = 7; c2l = 7;
   3581                             break;
   3582                         case INTERSECT_SELF_CUBIC:
   3583                             f.push(9, 10, 0, 11);
   3584                             c1s = 1; c1l = 8; c2s = 0; c2l = 0;
   3585                             break;
   3586                         case INTERSECT_SELF_CUBIC_NO:
   3587                             c1s = 0; c1l = 8; c2s = 0; c2l = 0;
   3588                             break;
   3589                         case INTERSECT_CUBIC_LINE:
   3590                             f.push(9, 10, 0, 11);
   3591                             c1s = 1; c1l = 8; c2s = 12; c2l = 4;
   3592                             break;
   3593                         case INTERSECT_CUBIC_LINE_2:
   3594                             f.push(9, 10, 0, 14);
   3595                             f.push(12, 13, 11, 19);
   3596                             c1s = 1; c1l = 8; c2s = 15; c2l = 4;
   3597                             break;
   3598                         case INTERSECT_CUBIC_LINE_3:
   3599                             f.push(9, 10, 0, 17);
   3600                             f.push(12, 13, 11, 22);
   3601                             f.push(15, 16, 14, 23);
   3602                             c1s = 1; c1l = 8; c2s = 18; c2l = 4;
   3603                             break;
   3604                         case INTERSECT_CUBIC_QUAD_NO:
   3605                             c1s = 0; c1l = 8; c2s = 8; c2l = 6;
   3606                             break;
   3607                         case INTERSECT_CUBIC_QUAD:
   3608                             f.push(9, 10, 0, 11);
   3609                             c1s = 1; c1l = 8; c2s = 12; c2l = 6;
   3610                             break;
   3611                         case INTERSECT_CUBIC_QUAD_2:
   3612                             f.push(9, 10, 0, 14);
   3613                             f.push(12, 13, 11, 21);
   3614                             c1s = 1; c1l = 8; c2s = 15; c2l = 6;
   3615                             break;
   3616                         case INTERSECT_CUBIC_QUAD_3:
   3617                             f.push(9, 10, 0, 17);
   3618                             f.push(12, 13, 11, 24);
   3619                             f.push(15, 16, 14, 25);
   3620                             c1s = 1; c1l = 8; c2s = 18; c2l = 6;
   3621                             break;
   3622                         case INTERSECT_CUBIC_QUAD_4:
   3623                             f.push(9, 10, 0, 20);
   3624                             f.push(12, 13, 11, 27);
   3625                             f.push(15, 16, 14, 28);
   3626                             f.push(18, 19, 17, 29);
   3627                             c1s = 1; c1l = 8; c2s = 21; c2l = 6;
   3628                             break;
   3629                         case INTERSECT_CUBIC_LINE_NO:
   3630                             c1s = 0; c1l = 8; c2s = 8; c2l = 4;
   3631                             break;
   3632                         case INTERSECT_CUBIC:
   3633                             f.push(9, 10, 0, 11);
   3634                             c1s = 1; c1l = 8; c2s = 12; c2l = 8;
   3635                             break;
   3636                         case INTERSECT_CUBIC_2:
   3637                             f.push(9, 10, 0, 14);
   3638                             f.push(12, 13, 11, 23);
   3639                             c1s = 1; c1l = 8; c2s = 15; c2l = 8;
   3640                             break;
   3641                         case INTERSECT_CUBIC_3:
   3642                             f.push(9, 10, 0, 17);
   3643                             f.push(12, 13, 11, 26);
   3644                             f.push(15, 16, 14, 27);
   3645                             c1s = 1; c1l = 8; c2s = 18; c2l = 8;
   3646                             break;
   3647                         case INTERSECT_CUBIC_4:
   3648                             f.push(9, 10, 0, 20);
   3649                             f.push(12, 13, 11, 29);
   3650                             f.push(15, 16, 14, 30);
   3651                             f.push(18, 19, 17, 31);
   3652                             c1s = 1; c1l = 8; c2s = 21; c2l = 8;
   3653                             break;
   3654                         case INTERSECT_CUBIC_NO:
   3655                             c1s = 0; c1l = 8; c2s = 8; c2l = 8;
   3656                             break;
   3657                         default:
   3658                             console.log("unknown REC_TYPE_SECT frag type: " + fragType);
   3659                             throw "stop execution";
   3660                     }
   3661                     if (draw_intersection != 1) {
   3662                         var id = -1;
   3663                         var curve;
   3664                         switch (c1l) {
   3665                             case 4: 
   3666                                 drawLine(frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3]);
   3667                                 if (draw_id) {
   3668                                     curve = [frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3]];
   3669                                     id = idByCurve(test, curve, PATH_LINE);
   3670                                 }
   3671                                 break;
   3672                             case 6:
   3673                                 drawQuad(frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
   3674                                         frags[c1s + 4], frags[c1s + 5]);
   3675                                 if (draw_id) {
   3676                                     curve = [frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
   3677                                             frags[c1s + 4], frags[c1s + 5]];
   3678                                     id = idByCurve(test, curve, PATH_QUAD);
   3679                                 }
   3680                                 break;
   3681                             case 7:
   3682                                 drawConicWithQuads(frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
   3683                                         frags[c1s + 4], frags[c1s + 5], frags[c1s + 6]);
   3684                                 if (draw_id) {
   3685                                     curve = [frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
   3686                                             frags[c1s + 4], frags[c1s + 5], frags[c1s + 6]];
   3687                                     id = idByCurve(test, curve, PATH_CONIC);
   3688                                 }
   3689                                 break;
   3690                             case 8:
   3691                                 drawCubic(frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
   3692                                         frags[c1s + 4], frags[c1s + 5], frags[c1s + 6], frags[c1s + 7]);
   3693                                 if (draw_id) {
   3694                                     curve = [frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
   3695                                             frags[c1s + 4], frags[c1s + 5], frags[c1s + 6], frags[c1s + 7]];
   3696                                     id = idByCurve(test, curve, PATH_CUBIC);
   3697                                 }
   3698                                 break;
   3699                         }
   3700                         if (id >= 0) {
   3701                             drawID(curve, id);
   3702                         }
   3703                         id = -1;
   3704                         switch (c2l) {
   3705                             case 0:
   3706                                 break;
   3707                             case 4: 
   3708                                 drawLine(frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3]);
   3709                                 if (draw_id) {
   3710                                     curve = [frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3]];
   3711                                     id = idByCurve(test, curve, PATH_LINE);
   3712                                 }
   3713                                 break;
   3714                             case 6:
   3715                                 drawQuad(frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
   3716                                         frags[c2s + 4], frags[c2s + 5]);
   3717                                 if (draw_id) {
   3718                                     curve = [frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
   3719                                             frags[c2s + 4], frags[c2s + 5]];
   3720                                     id = idByCurve(test, curve, PATH_QUAD);
   3721                                 }
   3722                                 break;
   3723                             case 7:
   3724                                 drawConicWithQuads(frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
   3725                                         frags[c2s + 4], frags[c2s + 5], frags[c2s + 6]);
   3726                                 if (draw_id) {
   3727                                     curve = [frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
   3728                                             frags[c2s + 4], frags[c2s + 5], frags[c2s + 6]];
   3729                                     id = idByCurve(test, curve, PATH_CONIC);
   3730                                 }
   3731                                 break;
   3732                             case 8:
   3733                                 drawCubic(frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
   3734                                         frags[c2s + 4], frags[c2s + 5], frags[c2s + 6], frags[c2s + 7]);
   3735                                 if (draw_id) {
   3736                                     curve = [frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
   3737                                             frags[c2s + 4], frags[c2s + 5], frags[c2s + 6], frags[c2s + 7]];
   3738                                     id = idByCurve(test, curve, PATH_CUBIC);
   3739                                 }
   3740                                 break;
   3741                         }
   3742                         if (id >= 0) {
   3743                             drawID(curve, id);
   3744                         }
   3745                     }
   3746                     if (collect_bounds) {
   3747                         break;
   3748                     }
   3749                     if (draw_intersection != 3 || step_limit == 0 || tIndex >= lastSect) {
   3750                         for (var idx = 0; idx < f.length; idx += 4) {
   3751                             drawPoint(frags[f[idx]], frags[f[idx + 1]], true);
   3752                         }
   3753                     }
   3754                     if (!draw_intersectT) {
   3755                         break;
   3756                     }
   3757                     ctx.fillStyle = "red";
   3758                     if (draw_intersection != 3 || step_limit == 0 || tIndex >= lastSect) {
   3759                         for (var idx = 0; idx < f.length; idx += 4) {
   3760                             drawTAtPointUp(frags[f[idx]], frags[f[idx + 1]], frags[f[idx + 2]]);
   3761                             drawTAtPointDown(frags[f[idx]], frags[f[idx + 1]], frags[f[idx + 3]]);
   3762                         }
   3763                     }
   3764                     break;
   3765                 case REC_TYPE_SORT:
   3766                     if (!draw_sort || (step_limit > 0 && tIndex < lastSort)) {
   3767                         continue;
   3768                     }
   3769                     ctx.lineWidth = 3;
   3770                     ctx.strokeStyle = "rgba(127,127,0, 0.5)";
   3771                     focus_enabled = true;
   3772                     switch (fragType) {
   3773                         case SORT_UNARY:
   3774                         case SORT_BINARY:
   3775                             var curve = curvePartialByID(test, frags[0], frags[6], frags[8]);
   3776                             drawCurve(curve);
   3777                             break;
   3778                         default:
   3779                             console.log("unknown REC_TYPE_SORT frag type: " + fragType);
   3780                             throw "stop execution";
   3781                     }
   3782                     break;
   3783                 case REC_TYPE_TOP:
   3784                     if (!draw_top || (step_limit > 0 && tIndex < lastTop)) {
   3785                         continue;
   3786                     }
   3787                     ctx.lineWidth = 3;
   3788                     ctx.strokeStyle = "rgba(127,127,0, 0.5)";
   3789                     focus_enabled = true;
   3790                     {
   3791                         var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
   3792                         drawCurve(curve);
   3793                         var type = PATH_LINE + (curve.length / 2 - 2);
   3794                         var mid = pointAtT(curve, type, 0.5);
   3795                         var d = dxy_at_t(curve, type, 0.5);
   3796                         drawArrow(mid.x, mid.y, d.x, d.y, 0.3);
   3797                     }
   3798                     break;
   3799                 case REC_TYPE_MARK:
   3800                     if (!draw_mark || (step_limit > 0 && tIndex < lastMark)) {
   3801                         continue;
   3802                     }
   3803                     ctx.lineWidth = 3;
   3804                     ctx.strokeStyle = fragType >= MARK_DONE_LINE ?
   3805                             "rgba(127,0,127, 0.5)" : "rgba(127,127,0, 0.5)";
   3806                     focus_enabled = true;
   3807                     switch (fragType) {
   3808                         case MARK_LINE:
   3809                         case MARK_DONE_LINE:
   3810                         case MARK_UNSORTABLE_LINE:
   3811                         case MARK_SIMPLE_LINE:
   3812                         case MARK_SIMPLE_DONE_LINE:
   3813                         case MARK_DONE_UNARY_LINE:
   3814                             drawLinePartial(frags[1], frags[2], frags[3], frags[4],
   3815                                 frags[5], frags[9]);
   3816                             if (draw_id) {
   3817                                 drawLinePartialID(frags[0], frags[1], frags[2], frags[3], frags[4],
   3818                                 frags[5], frags[9]);
   3819                             }
   3820                             break;
   3821                         case MARK_QUAD:
   3822                         case MARK_DONE_QUAD:
   3823                         case MARK_UNSORTABLE_QUAD:
   3824                         case MARK_SIMPLE_QUAD:
   3825                         case MARK_SIMPLE_DONE_QUAD:
   3826                         case MARK_DONE_UNARY_QUAD:
   3827                             drawQuadPartial(frags[1], frags[2], frags[3], frags[4],
   3828                                 frags[5], frags[6], frags[7], frags[11]);
   3829                             if (draw_id) {
   3830                                 drawQuadPartialID(frags[0], frags[1], frags[2], frags[3], frags[4],
   3831                                 frags[5], frags[6], frags[7], frags[11]);
   3832                             }
   3833                             break;
   3834                         case MARK_CUBIC:
   3835                         case MARK_DONE_CUBIC:
   3836                         case MARK_UNSORTABLE_CUBIC:
   3837                         case MARK_SIMPLE_CUBIC:
   3838                         case MARK_SIMPLE_DONE_CUBIC:
   3839                         case MARK_DONE_UNARY_CUBIC:
   3840                             drawCubicPartial(frags[1], frags[2], frags[3], frags[4],
   3841                                 frags[5], frags[6], frags[7], frags[8], frags[9], frags[13]);
   3842                             if (draw_id) {
   3843                                 drawCubicPartialID(frags[0], frags[1], frags[2], frags[3], frags[4],
   3844                                 frags[5], frags[6], frags[7], frags[8], frags[9], frags[13]);
   3845                             }
   3846                             break;
   3847                         case MARK_ANGLE_LAST:
   3848                             // FIXME: ignored for now
   3849                             break;
   3850                         default:
   3851                             console.log("unknown REC_TYPE_MARK frag type: " + fragType);
   3852                             throw "stop execution";
   3853                     }
   3854                     break;
   3855                 default:
   3856                     continue;
   3857             }
   3858         }
   3859         switch (recType) {
   3860             case REC_TYPE_SORT:
   3861                 if (!draw_sort || (step_limit > 0 && tIndex < lastSort)) {
   3862                     break;
   3863                 }
   3864                 var angles = []; // use tangent lines to describe arcs
   3865                 var windFrom = [];
   3866                 var windTo = [];
   3867                 var opp = [];
   3868                 var minXY = Number.MAX_VALUE;
   3869                 var partial;
   3870                 focus_enabled = true;
   3871                 var someUnsortable = false;
   3872                 for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
   3873                     var fragType = records[recordIndex];
   3874                     var frags = records[recordIndex + 1];
   3875                     var unsortable = (fragType == SORT_UNARY && frags[14]) ||
   3876                             (fragType == SORT_BINARY && frags[16]);
   3877                     someUnsortable |= unsortable;
   3878                     switch (fragType) {
   3879                         case SORT_UNARY:
   3880                         case SORT_BINARY:
   3881                             partial = curvePartialByID(test, frags[0], frags[6], frags[8]);
   3882                             break;
   3883                         default:
   3884                             console.log("unknown REC_TYPE_SORT frag type: " + fragType);
   3885                             throw "stop execution";
   3886                     }
   3887                     var dx = boundsWidth(partial);
   3888                     var dy = boundsHeight(partial);
   3889                     minXY = Math.min(minXY, dx * dx + dy * dy);
   3890                     if (collect_bounds) {
   3891                         continue;
   3892                     }
   3893                     angles.push(tangent(partial));
   3894                     var from = frags[12];
   3895                     var to = frags[12];
   3896                     var sgn = frags[10];
   3897                     if (sgn < 0) {
   3898                         from -= frags[11];
   3899                     } else if (sgn > 0) {
   3900                         to -= frags[11];
   3901                     }
   3902                     windFrom.push(from + (unsortable ? "!" : ""));
   3903                     windTo.push(to + (unsortable ? "!" : ""));
   3904                     opp.push(fragType == SORT_BINARY);
   3905                     if (draw_sort == 1) {
   3906                         drawOrder(partial, frags[12]);
   3907                     } else {
   3908                         drawOrder(partial, (recordIndex / 2) + 1);
   3909                     }
   3910                 }
   3911                 var radius = Math.sqrt(minXY) / 2 * scale;
   3912                 radius = Math.min(50, radius);
   3913                 var scaledRadius = radius / scale;
   3914                 var centerX = partial[0];
   3915                 var centerY = partial[1];
   3916                 if (collect_bounds) {
   3917                     if (focus_enabled) {
   3918                         focusXmin = Math.min(focusXmin, centerX - scaledRadius);
   3919                         focusYmin = Math.min(focusYmin, centerY - scaledRadius);
   3920                         focusXmax = Math.max(focusXmax, centerX + scaledRadius);
   3921                         focusYmax = Math.max(focusYmax, centerY + scaledRadius);
   3922                     }
   3923                     break;
   3924                 }
   3925                 break;
   3926             default:
   3927                 break;
   3928         }
   3929     }
   3930     if (collect_bounds) {
   3931         return;
   3932     }
   3933     if (draw_log && logStart >= 0) {
   3934         ctx.font = "normal 10px Arial";
   3935         ctx.textAlign = "left";
   3936         ctx.beginPath();
   3937         var top = screenHeight - 20 - (logRange + 2) * 10;
   3938         ctx.rect(50, top, screenWidth - 100, (logRange + 2) * 10);
   3939         ctx.fillStyle = "white";
   3940         ctx.fill();
   3941         ctx.fillStyle = "rgba(0,0,0, 0.5)";
   3942         if (logStart > 0) {
   3943             ctx.fillText(lines[logStart - 1], 50, top + 8);
   3944         }
   3945         ctx.fillStyle = "black";
   3946         for (var idx = 0; idx < logRange; ++idx) {
   3947             ctx.fillText(lines[logStart + idx], 50, top + 18 + 10 * idx);
   3948         }
   3949         ctx.fillStyle = "rgba(0,0,0, 0.5)";
   3950         if (logStart + logRange < lines.length) {
   3951             ctx.fillText(lines[logStart + logRange], 50, top + 18 + 10 * logRange);
   3952         }
   3953     }
   3954     if (draw_legend) {
   3955         var pos = 0;
   3956         var drawSomething = draw_add | draw_active | draw_angle | draw_coincidence | draw_sort | draw_mark;
   3957    //     drawBox(pos++, "yellow", "black", opLetter, true, '');
   3958         drawBox(pos++, "rgba(0,0,255, 0.3)", "black", draw_intersection > 1 ? sectCount : sectMax2, draw_intersection, intersectionKey);
   3959         drawBox(pos++, "rgba(0,0,255, 0.3)", "black", draw_add ? addCount : addMax, draw_add, addKey);
   3960         drawBox(pos++, "rgba(0,0,255, 0.3)", "black", draw_active ? activeCount : activeMax, draw_active, activeKey);
   3961         drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_angle ? angleCount : angleMax, draw_angle, angleKey);
   3962         drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_coincidence ? coinCount : coinMax, draw_coincidence, coincidenceKey);
   3963         drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_op ? opCount : opMax, draw_op, opKey);
   3964         drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_sort ? sortCount : sortMax, draw_sort, sortKey);
   3965         drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_top ? topCount : topMax, draw_top, topKey);
   3966         drawBox(pos++, "rgba(127,0,127, 0.3)", "black", draw_mark ? markCount : markMax, draw_mark, markKey);
   3967         drawBox(pos++, "black", "white", 
   3968                 (new Array('P', 'P1', 'P2', 'P'))[draw_path], draw_path != 0, pathKey);
   3969         drawBox(pos++, "rgba(0,63,0, 0.7)", "white",
   3970                 (new Array('Q', 'Q', 'C', 'QC', 'Qc', 'Cq'))[draw_computed],
   3971                 draw_computed != 0, computedKey);
   3972         drawBox(pos++, "green", "black", step_limit, drawSomething, '');
   3973         drawBox(pos++, "green", "black", stepMax, drawSomething, '');
   3974         drawBox(pos++, "rgba(255,0,0, 0.6)", "black", lastIndex, drawSomething & draw_log, '');
   3975         drawBox(pos++, "rgba(255,0,0, 0.6)", "black", test.length - 1, drawSomething & draw_log, '');
   3976         if (curve_t) {
   3977             drawCurveTControl();
   3978         }
   3979         ctx.font = "normal 20px Arial";
   3980         ctx.fillStyle = "rgba(0,0,0, 0.3)";
   3981         ctx.textAlign = "right";
   3982         ctx.fillText(scale.toFixed(decimal_places) + 'x' , screenWidth - 10, screenHeight - 5);
   3983     }
   3984     if (draw_hints) {
   3985         ctx.font = "normal 10px Arial";
   3986         ctx.fillStyle = "rgba(0,0,0, 0.5)";
   3987         ctx.textAlign = "right";
   3988         var y = 4;
   3989         ctx.fillText("control lines : " +  controlLinesKey, ctx.screenWidthwidth - 10, pos * 50 + y++ * 10);
   3990         ctx.fillText("curve t : " +  curveTKey, screenWidth - 10, pos * 50 + y++ * 10);
   3991         ctx.fillText("deriviatives : " +  deriviativesKey, screenWidth - 10, pos * 50 + y++ * 10);
   3992         ctx.fillText("intersect t : " +  intersectTKey, screenWidth - 10, pos * 50 + y++ * 10);
   3993         ctx.fillText("log : " +  logKey, screenWidth - 10, pos * 50 + y++ * 10);
   3994         ctx.fillText("log curve : " +  logCurvesKey, screenWidth - 10, pos * 50 + y++ * 10);
   3995         ctx.fillText("mid point : " +  midpointKey, screenWidth - 10, pos * 50 + y++ * 10);
   3996         ctx.fillText("points : " +  ptsKey, screenWidth - 10, pos * 50 + y++ * 10);
   3997         ctx.fillText("sequence : " +  sequenceKey, screenWidth - 10, pos * 50 + y++ * 10);
   3998         ctx.fillText("xy : " +  xyKey, screenWidth - 10, pos * 50 + y++ * 10);
   3999     }
   4000 }
   4001 
   4002 function drawBox(y, backC, foreC, str, enable, label) {
   4003     ctx.beginPath();
   4004     ctx.fillStyle = backC;
   4005     ctx.rect(screenWidth - 40, y * 50 + 10, 40, 30);
   4006     ctx.fill();
   4007     ctx.font = "normal 16px Arial";
   4008     ctx.fillStyle = foreC;
   4009     ctx.textAlign = "center";
   4010     ctx.fillText(str, screenWidth - 20, y * 50 + 32);
   4011     if (!enable) {
   4012         ctx.fillStyle = "rgba(255,255,255, 0.5)";
   4013         ctx.fill();
   4014     }
   4015     if (label != '') {
   4016         ctx.font = "normal 9px Arial";
   4017         ctx.fillStyle = "black";
   4018         ctx.fillText(label, screenWidth - 47, y * 50 + 40);
   4019     }
   4020 }
   4021 
   4022 function drawCurveTControl() {
   4023     ctx.lineWidth = 2;
   4024     ctx.strokeStyle = "rgba(0,0,0, 0.3)";
   4025     ctx.beginPath();
   4026     ctx.rect(screenWidth - 80, 40, 28, screenHeight - 80);
   4027     ctx.stroke();
   4028     var ty = 40 + curveT * (screenHeight - 80);
   4029     ctx.beginPath();
   4030     ctx.moveTo(screenWidth - 80, ty);
   4031     ctx.lineTo(screenWidth - 85, ty - 5);
   4032     ctx.lineTo(screenWidth - 85, ty + 5);
   4033     ctx.lineTo(screenWidth - 80, ty);
   4034     ctx.fillStyle = "rgba(0,0,0, 0.6)";
   4035     ctx.fill();
   4036     var num = curveT.toFixed(decimal_places);
   4037     ctx.font = "normal 10px Arial";
   4038     ctx.textAlign = "left";
   4039     ctx.fillText(num, screenWidth - 78, ty);
   4040 }
   4041 
   4042 function ptInTControl() {
   4043     var e = window.event;
   4044 	var tgt = e.target || e.srcElement;
   4045     var left = tgt.offsetLeft;
   4046     var top = tgt.offsetTop;
   4047     var x = (e.clientX - left);
   4048     var y = (e.clientY - top);
   4049     if (x < screenWidth - 80 || x > screenWidth - 50) {
   4050         return false;
   4051     }
   4052     if (y < 40 || y > screenHeight - 80) {
   4053         return false;
   4054     }
   4055     curveT = (y - 40) / (screenHeight - 120);
   4056     if (curveT < 0 || curveT > 1) {
   4057         throw "stop execution";
   4058     }
   4059     return true;
   4060 }
   4061 
   4062 function drawTop() {
   4063     if (tests[testIndex] == null) {
   4064         var str = testDivs[testIndex].textContent;
   4065         parse_all(str);
   4066         var title = testDivs[testIndex].id.toString();
   4067         testTitles[testIndex] = title;
   4068     }
   4069     init(tests[testIndex]);
   4070     redraw();
   4071 }
   4072 
   4073 function redraw() {
   4074     if (focus_on_selection) {
   4075         collect_bounds = true;
   4076         draw(tests[testIndex], testLines[testIndex], testTitles[testIndex]);
   4077         collect_bounds = false;
   4078         if (focusXmin < focusXmax && focusYmin < focusYmax) {
   4079             setScale(focusXmin, focusXmax, focusYmin, focusYmax);
   4080         }
   4081     }
   4082     ctx.beginPath();
   4083     ctx.fillStyle = "white";
   4084     ctx.rect(0, 0, screenWidth, screenHeight);
   4085     ctx.fill();
   4086     draw(tests[testIndex], testLines[testIndex], testTitles[testIndex]);
   4087 }
   4088 
   4089 function dumpCurvePartial(test, id, t0, t1) {
   4090     var curve = curveByID(test, id);
   4091     var name = ["line", "quad", "cubic"][curve.length / 2 - 2];
   4092     console.log("id=" + id + " " + name + "=" +  curveToString(curve)
   4093         + " t0=" + t0 + " t1=" + t1
   4094         + " partial=" + curveToString(curvePartialByID(test, id, t0, t1)));
   4095 }
   4096 
   4097 function dumpAngleTest(test, id, t0, t1) {
   4098     var curve = curveByID(test, id);
   4099     console.log("    { {" + curveToString(curve) + "}, " 
   4100             + curve.length / 2 + ", " + t0 + ", " + t1 + ", {} }, //");
   4101 }
   4102 
   4103 function dumpLogToConsole() {
   4104     if (logStart < 0) {
   4105         return;
   4106     }
   4107     var test = tests[testIndex];
   4108     var recType = REC_TYPE_UNKNOWN;
   4109     var records;
   4110     for (var index = 0; index < test.length; index += 3) {
   4111         var lastLineNo = test[index + 1];
   4112         if (lastLineNo >= logStart && lastLineNo < logStart + logRange) {
   4113             recType = test[index];
   4114             records = test[index + 2];
   4115             break;
   4116         }
   4117     }
   4118     if (recType == REC_TYPE_UNKNOWN) {
   4119         return;
   4120     }
   4121     var lines = testLines[testIndex];
   4122     for (var idx = 0; idx < logRange; ++idx) {
   4123         var line = lines[logStart + idx];
   4124         console.log(line);
   4125         for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
   4126             var fragType = records[recordIndex];
   4127             var frags = records[recordIndex + 1];
   4128             if (recType == REC_TYPE_ANGLE && fragType == ANGLE_AFTER) {
   4129                 dumpCurvePartial(test, frags[0], frags[4], frags[5]);
   4130                 dumpCurvePartial(test, frags[6], frags[10], frags[11]);
   4131                 dumpCurvePartial(test, frags[12], frags[16], frags[17]);
   4132                 console.log("\nstatic IntersectData intersectDataSet[] = { //");
   4133                 dumpAngleTest(test, frags[0], frags[4], frags[5]);
   4134                 dumpAngleTest(test, frags[6], frags[10], frags[11]);
   4135                 dumpAngleTest(test, frags[12], frags[16], frags[17]);
   4136                 console.log("}; //");
   4137             }
   4138         }
   4139     }
   4140 }
   4141 
   4142 var activeKey = 'a';
   4143 var pathKey = 'b';
   4144 var pathBackKey = 'B';
   4145 var centerKey = 'c';
   4146 var coincidenceKey = 'C';
   4147 var addKey = 'd';
   4148 var deriviativesKey = 'f';
   4149 var angleKey = 'g';
   4150 var angleBackKey = 'G';
   4151 var intersectionKey = 'i';
   4152 var intersectionBackKey = 'I';
   4153 var sequenceKey = 'j';
   4154 var midpointKey = 'k';
   4155 var logKey = 'l';
   4156 var logToConsoleKey = 'L';
   4157 var markKey = 'm';
   4158 var sortKey = 'o';
   4159 var opKey = 'p';
   4160 var opBackKey = 'P';
   4161 var computedKey = 'q';
   4162 var computedBackKey = 'Q';
   4163 var stepKey = 's';
   4164 var stepBackKey = 'S';
   4165 var intersectTKey = 't';
   4166 var topKey = 'T';
   4167 var curveTKey = 'u';
   4168 var controlLinesBackKey = 'V';
   4169 var controlLinesKey = 'v';
   4170 var ptsKey = 'x';
   4171 var xyKey = 'y';
   4172 var logCurvesKey = 'z';
   4173 var focusKey = '`';
   4174 var idKey = '.';
   4175 var retinaKey = '\\';
   4176 
   4177 function doKeyPress(evt) {
   4178     var char = String.fromCharCode(evt.charCode);
   4179     var focusWasOn = false;
   4180     switch (char) {
   4181     case '0':
   4182     case '1':
   4183     case '2':
   4184     case '3':
   4185     case '4':
   4186     case '5':
   4187     case '6':
   4188     case '7':
   4189     case '8':
   4190     case '9':
   4191         decimal_places = char - '0';
   4192         redraw();
   4193         break;
   4194     case activeKey:
   4195         draw_active ^= true;
   4196         redraw(); 
   4197         break;
   4198     case addKey:
   4199         draw_add ^= true;
   4200         redraw(); 
   4201         break;
   4202     case angleKey:
   4203         draw_angle = (draw_angle + 1) % 4;
   4204         redraw();
   4205         break;
   4206     case angleBackKey:
   4207         draw_angle = (draw_angle + 2) % 3;
   4208         redraw();
   4209         break;
   4210     case centerKey:
   4211         setScale(xmin, xmax, ymin, ymax);
   4212         redraw(); 
   4213         break;
   4214     case coincidenceKey:
   4215         draw_coincidence ^= true;
   4216         redraw();
   4217         break;
   4218     case controlLinesBackKey:
   4219         control_lines = (control_lines + 3) % 4;
   4220         redraw(); 
   4221         break;
   4222     case controlLinesKey:
   4223         control_lines = (control_lines + 1) % 4;
   4224         redraw(); 
   4225         break;
   4226     case computedBackKey:
   4227         draw_computed = (draw_computed + 5) % 6;
   4228         redraw(); 
   4229         break;
   4230     case computedKey:
   4231         draw_computed = (draw_computed + 1) % 6;
   4232         redraw(); 
   4233         break;
   4234     case curveTKey:
   4235         curve_t ^= true;
   4236         if (curve_t) {
   4237             draw_legend = true;
   4238         }
   4239         redraw();
   4240         break;
   4241     case deriviativesKey:
   4242         draw_deriviatives = (draw_deriviatives + 1) % 3;
   4243         redraw();
   4244         break;
   4245     case focusKey:
   4246         focus_on_selection ^= true;
   4247         setScale(xmin, xmax, ymin, ymax);
   4248         redraw();
   4249         break;
   4250     case idKey:
   4251         draw_id ^= true;
   4252         redraw();
   4253         break;
   4254     case intersectionBackKey:
   4255         draw_intersection = (draw_intersection + 3) % 4;
   4256         redraw(); 
   4257         break;
   4258     case intersectionKey:
   4259         draw_intersection = (draw_intersection + 1) % 4;
   4260         redraw(); 
   4261         break;
   4262     case intersectTKey:
   4263         draw_intersectT ^= true;
   4264         redraw();
   4265         break;
   4266     case logCurvesKey:
   4267         logCurves(tests[testIndex]);
   4268         break;
   4269     case logKey:
   4270         draw_log ^= true;
   4271         redraw();
   4272         break;
   4273     case logToConsoleKey:
   4274         if (draw_log) {
   4275             dumpLogToConsole();
   4276         }
   4277         break;
   4278     case markKey:
   4279         draw_mark ^= true;
   4280         redraw();
   4281         break;
   4282     case midpointKey:
   4283         draw_midpoint ^= true;
   4284         redraw();
   4285         break;
   4286     case opKey:
   4287         draw_op = (draw_op + 1) % 3;
   4288         redraw();
   4289         break;
   4290     case opBackKey:
   4291         draw_op = (draw_op + 2) % 3;
   4292         redraw();
   4293         break;
   4294     case pathKey:
   4295         draw_path = (draw_path + 1) % 4;
   4296         redraw(); 
   4297         break;
   4298     case pathBackKey:
   4299         draw_path = (draw_path + 3) % 4;
   4300         redraw(); 
   4301         break;
   4302     case ptsKey:
   4303         pt_labels = (pt_labels + 1) % 3;
   4304         redraw();
   4305         break;
   4306     case retinaKey:
   4307         retina_scale ^= true;
   4308         drawTop();
   4309         break;
   4310     case sequenceKey:
   4311         draw_sequence ^= true;
   4312         redraw();
   4313         break;
   4314     case sortKey:
   4315         draw_sort = (draw_sort + 1) % 3;
   4316         drawTop();
   4317         break;
   4318     case stepKey:
   4319         step_limit++;
   4320         if (step_limit > stepMax) {
   4321             step_limit = stepMax;
   4322         }
   4323         redraw();
   4324         break;
   4325     case stepBackKey:
   4326         step_limit--;
   4327         if (step_limit < 0) {
   4328             step_limit = 0;
   4329         }
   4330         redraw();
   4331         break;
   4332     case topKey:
   4333         draw_top ^= true;
   4334         redraw();
   4335         break;
   4336     case xyKey:
   4337         debug_xy = (debug_xy + 1) % 3;
   4338         redraw();
   4339         break;
   4340     case '-':
   4341         focusWasOn = focus_on_selection;
   4342         if (focusWasOn) {
   4343             focus_on_selection = false;
   4344             scale /= 1.2;
   4345         } else {
   4346             scale /= 2;
   4347             calcLeftTop();
   4348         }
   4349         redraw();
   4350         focus_on_selection = focusWasOn;
   4351         break;
   4352     case '=':
   4353     case '+':
   4354         focusWasOn = focus_on_selection;
   4355         if (focusWasOn) {
   4356             focus_on_selection = false;
   4357             scale *= 1.2;
   4358         } else {
   4359             scale *= 2;
   4360             calcLeftTop();
   4361         }
   4362         redraw();
   4363         focus_on_selection = focusWasOn;
   4364         break;
   4365     case '?':
   4366         draw_hints ^= true;
   4367         if (draw_hints && !draw_legend) {
   4368             draw_legend = true;
   4369         }
   4370         redraw();
   4371         break;
   4372     case '/':
   4373         draw_legend ^= true;
   4374         redraw();
   4375         break;
   4376     }
   4377 }
   4378 
   4379 function doKeyDown(evt) {
   4380     var char = evt.keyCode;
   4381     var preventDefault = false;
   4382     switch (char) {
   4383     case 37: // left arrow
   4384         if (evt.shiftKey) {
   4385             testIndex -= 9;
   4386         }
   4387         if (--testIndex < 0)
   4388             testIndex = tests.length - 1;
   4389         drawTop();
   4390         preventDefault = true;
   4391         break;
   4392     case 39: // right arrow
   4393         if (evt.shiftKey) {
   4394             testIndex += 9;
   4395         }
   4396         if (++testIndex >= tests.length)
   4397             testIndex = 0;
   4398         drawTop();
   4399         preventDefault = true;
   4400         break;
   4401     }
   4402     if (preventDefault) {
   4403           evt.preventDefault();
   4404           return false;
   4405     }
   4406     return true;
   4407 }
   4408 
   4409 (function() {
   4410     var hidden = "hidden";
   4411 
   4412     // Standards:
   4413     if (hidden in document)
   4414         document.addEventListener("visibilitychange", onchange);
   4415     else if ((hidden = "mozHidden") in document)
   4416         document.addEventListener("mozvisibilitychange", onchange);
   4417     else if ((hidden = "webkitHidden") in document)
   4418         document.addEventListener("webkitvisibilitychange", onchange);
   4419     else if ((hidden = "msHidden") in document)
   4420         document.addEventListener("msvisibilitychange", onchange);
   4421     // IE 9 and lower:
   4422     else if ('onfocusin' in document)
   4423         document.onfocusin = document.onfocusout = onchange;
   4424     // All others:
   4425     else
   4426         window.onpageshow = window.onpagehide 
   4427             = window.onfocus = window.onblur = onchange;
   4428 
   4429     function onchange (evt) {
   4430         var v = 'visible', h = 'hidden',
   4431             evtMap = { 
   4432                 focus:v, focusin:v, pageshow:v, blur:h, focusout:h, pagehide:h 
   4433             };
   4434 
   4435         evt = evt || window.event;
   4436         if (evt.type in evtMap)
   4437             document.body.className = evtMap[evt.type];
   4438         else        
   4439             document.body.className = this[hidden] ? "hidden" : "visible";
   4440     }
   4441 })();
   4442 
   4443 function calcXY() {
   4444     var e = window.event;
   4445 	var tgt = e.target || e.srcElement;
   4446     var left = tgt.offsetLeft;
   4447     var top = tgt.offsetTop;
   4448     mouseX = (e.clientX - left) / scale + srcLeft;
   4449     mouseY = (e.clientY - top) / scale + srcTop;
   4450 }
   4451 
   4452 function calcLeftTop() {
   4453     srcLeft = mouseX - screenWidth / 2 / scale;
   4454     srcTop = mouseY - screenHeight / 2 / scale;
   4455 }
   4456 
   4457 var disableClick = false;
   4458 
   4459 function handleMouseClick() {
   4460     if (disableClick) {
   4461         return;
   4462     }
   4463     if (!curve_t || !ptInTControl()) {
   4464         calcXY();
   4465         calcLeftTop();
   4466     }
   4467     redraw();
   4468 //    if (!curve_t || !ptInTControl()) {
   4469 //        mouseX = screenWidth / 2 / scale + srcLeft;
   4470 //        mouseY = screenHeight / 2 / scale + srcTop;
   4471 //    }
   4472 }
   4473 
   4474 function handleMouseOver() {
   4475     calcXY();
   4476     if (debug_xy != 2) {
   4477         return;
   4478     }
   4479     var num = mouseX.toFixed(decimal_places) + ", " + mouseY.toFixed(decimal_places);
   4480     ctx.beginPath();
   4481     ctx.rect(300,100,num.length * 6,10);
   4482     ctx.fillStyle="white";
   4483     ctx.fill();
   4484     ctx.font = "normal 10px Arial";
   4485     ctx.fillStyle="black";
   4486     ctx.textAlign = "left";
   4487     ctx.fillText(num, 300, 108);
   4488 }
   4489 
   4490 function start() {
   4491     for (var i = 0; i < testDivs.length; ++i) {
   4492         tests[i] = null;
   4493     }
   4494     testIndex = 0;
   4495     drawTop();
   4496     window.addEventListener('keypress', doKeyPress, true);
   4497     window.addEventListener('keydown', doKeyDown, true);
   4498     window.onresize = function() {
   4499         drawTop();
   4500     }
   4501     /*
   4502     window.onpagehide = function() {
   4503         disableClick = true;
   4504     }
   4505     */
   4506     window.onpageshow = function () {
   4507         disableClick = false;
   4508     }
   4509 }
   4510 
   4511 </script>
   4512 </head>
   4513 
   4514 <body onLoad="start();">
   4515 <canvas id="canvas" width="750" height="500"
   4516     onmousemove="handleMouseOver()"
   4517     onclick="handleMouseClick()"
   4518     ></canvas >
   4519 </body>
   4520 </html>
   4521