From d435ba43ef474f837769269ac9573da781f0c6b9 Mon Sep 17 00:00:00 2001 From: Boxel Submission Bot Date: Wed, 5 Aug 2026 22:04:47 +0800 Subject: [PATCH 1/2] add Echo Pad changes [boxel-content-hash:7aeead4ff086] --- f22ed9-echo-pad/EchoPad/arithmetic-check.json | 64 + f22ed9-echo-pad/EchoPad/diagram-complete.json | 42 + f22ed9-echo-pad/EchoPad/wave-study.json | 42 + .../f4661be9-ff9e-4917-a307-e264d42c4326.json | 153 ++ .../ListingThumbnails/echo-pad-1c0f5c.png | Bin 0 -> 100079 bytes .../Screenshots/ambient-marking-3c91d4.png | Bin 0 -> 90745 bytes .../Screenshots/wave-morph-scene-7be2a1.png | Bin 0 -> 86583 bytes .../echo-pad/Skill/echo-marker.json | 17 + .../04196a72-1b33-46cb-adc7-11f105c12fcc.json | 28 + .../09862dce-770f-4e34-b0fe-c0f0ae65e43d.json | 28 + .../1535c33b-d0d6-4f89-9ed1-bd305c5ed882.json | 28 + .../2de99ec8-608e-4378-a9a4-ad4db70b3427.json | 28 + .../2e1b2b22-045a-4ae6-8684-a3eccfe78daf.json | 28 + .../3552a1a1-dfc4-4344-9270-dd7b683fb87b.json | 28 + .../5a94d17e-1a3c-47ab-95d8-59cb5104e30d.json | 28 + .../5ebd1f7e-043d-4632-8866-b5c6c10eea7f.json | 28 + .../75b1c152-d2cf-401d-8c66-dde32f735a7c.json | 28 + .../b87dbcab-3f75-4de7-a690-af41c6cf9e2b.json | 28 + .../bb45a3c4-c96b-4a49-b903-2426be4001b5.json | 28 + .../e565fb4c-1eb6-4e36-a5fd-ac51eeb2b934.json | 28 + .../commands/recognize-ink-command.gts | 138 + f22ed9-echo-pad/echo-pad/components/edit.gts | 220 ++ .../echo-pad/components/formats.gts | 547 ++++ .../echo-pad/components/isolated.gts | 2243 +++++++++++++++++ .../echo-pad/components/scene-player.gts | 496 ++++ f22ed9-echo-pad/echo-pad/echo-pad.gts | 42 + f22ed9-echo-pad/echo-pad/fields/echo-note.gts | 59 + f22ed9-echo-pad/echo-pad/utils/index.gts | 482 ++++ f22ed9-echo-pad/echo-pad/utils/scene.gts | 515 ++++ 29 files changed, 5396 insertions(+) create mode 100644 f22ed9-echo-pad/EchoPad/arithmetic-check.json create mode 100644 f22ed9-echo-pad/EchoPad/diagram-complete.json create mode 100644 f22ed9-echo-pad/EchoPad/wave-study.json create mode 100644 f22ed9-echo-pad/echo-pad/CardListing/f4661be9-ff9e-4917-a307-e264d42c4326.json create mode 100644 f22ed9-echo-pad/echo-pad/ListingThumbnails/echo-pad-1c0f5c.png create mode 100644 f22ed9-echo-pad/echo-pad/Screenshots/ambient-marking-3c91d4.png create mode 100644 f22ed9-echo-pad/echo-pad/Screenshots/wave-morph-scene-7be2a1.png create mode 100644 f22ed9-echo-pad/echo-pad/Skill/echo-marker.json create mode 100644 f22ed9-echo-pad/echo-pad/Spec/04196a72-1b33-46cb-adc7-11f105c12fcc.json create mode 100644 f22ed9-echo-pad/echo-pad/Spec/09862dce-770f-4e34-b0fe-c0f0ae65e43d.json create mode 100644 f22ed9-echo-pad/echo-pad/Spec/1535c33b-d0d6-4f89-9ed1-bd305c5ed882.json create mode 100644 f22ed9-echo-pad/echo-pad/Spec/2de99ec8-608e-4378-a9a4-ad4db70b3427.json create mode 100644 f22ed9-echo-pad/echo-pad/Spec/2e1b2b22-045a-4ae6-8684-a3eccfe78daf.json create mode 100644 f22ed9-echo-pad/echo-pad/Spec/3552a1a1-dfc4-4344-9270-dd7b683fb87b.json create mode 100644 f22ed9-echo-pad/echo-pad/Spec/5a94d17e-1a3c-47ab-95d8-59cb5104e30d.json create mode 100644 f22ed9-echo-pad/echo-pad/Spec/5ebd1f7e-043d-4632-8866-b5c6c10eea7f.json create mode 100644 f22ed9-echo-pad/echo-pad/Spec/75b1c152-d2cf-401d-8c66-dde32f735a7c.json create mode 100644 f22ed9-echo-pad/echo-pad/Spec/b87dbcab-3f75-4de7-a690-af41c6cf9e2b.json create mode 100644 f22ed9-echo-pad/echo-pad/Spec/bb45a3c4-c96b-4a49-b903-2426be4001b5.json create mode 100644 f22ed9-echo-pad/echo-pad/Spec/e565fb4c-1eb6-4e36-a5fd-ac51eeb2b934.json create mode 100644 f22ed9-echo-pad/echo-pad/commands/recognize-ink-command.gts create mode 100644 f22ed9-echo-pad/echo-pad/components/edit.gts create mode 100644 f22ed9-echo-pad/echo-pad/components/formats.gts create mode 100644 f22ed9-echo-pad/echo-pad/components/isolated.gts create mode 100644 f22ed9-echo-pad/echo-pad/components/scene-player.gts create mode 100644 f22ed9-echo-pad/echo-pad/echo-pad.gts create mode 100644 f22ed9-echo-pad/echo-pad/fields/echo-note.gts create mode 100644 f22ed9-echo-pad/echo-pad/utils/index.gts create mode 100644 f22ed9-echo-pad/echo-pad/utils/scene.gts diff --git a/f22ed9-echo-pad/EchoPad/arithmetic-check.json b/f22ed9-echo-pad/EchoPad/arithmetic-check.json new file mode 100644 index 00000000..1725f6a2 --- /dev/null +++ b/f22ed9-echo-pad/EchoPad/arithmetic-check.json @@ -0,0 +1,64 @@ +{ + "data": { + "type": "card", + "attributes": { + "boardName": "Arithmetic check", + "inkJson": "{\"v\":1,\"strokes\":[{\"w\":2.5,\"pts\":[344,119.4,344,125.7,344,132.9,344,144.6,344,163.9,344,179.1,344,206.3,344,219.8,344,231.9,344,244.7,344,263.6,344,268.6,344,274,344,282.7,344,289.6,344,290.8,344,291.9,344,293.4,344,295]},{\"w\":2.5,\"pts\":[396,170.5,395.7,169.2,395.7,166.8,395.7,157.3,395.9,151.7,397,148.1,398.4,144.2,399.9,141.1,401.9,137.6,404,134.6,409.2,129.7,412.4,127.7,420.9,124.5,425.8,123,431.6,121.5,437.9,119.9,444.2,118.4,450.5,117.4,455.1,117.1,462.3,117.1,465.6,117.1,469.4,117.1,474.2,119.4,476.9,124.3,478.6,127.8,481.4,135.2,482.8,139.5,484,143.5,485.2,148.2,486.7,159.9,487.3,166.1,487.6,180.2,487.6,194.1,484.3,212.1,476.1,232.8,471,243.4,466.4,251.8,456.9,265.5,444,283,439,289,435.1,293,431.3,297.2,427.8,300.7,424,303.7,422.8,304.7,421.6,305.6,420.8,306.2,420.1,304.9,420,303.8,420,302.8,420,301.6,420,300.4,420.9,297.6,423.1,295.4,427.5,291.3,434.2,285.7,442.4,279.3,464.5,263.5,477.9,256.1,494.9,248.6,503.8,245.4,511.3,243,517.1,241.4,528.2,239.3,531.5,239.2,534.6,239.1]},{\"w\":2.5,\"pts\":[579.4,202.3,586,202.3,596.1,202.3,605,202.3,628.3,202.3,654.3,202.3,667.7,202.3,681.4,202.3,698.5,202.3,714.7,202.3,721.3,202.3,730.6,202.3,733.6,202.3]},{\"w\":2.5,\"pts\":[659.4,164.6,659.4,166,659.4,169.5,659.4,174.9,659.4,192.9,659.4,216.9,659.4,234.4,659.4,241.4,659.4,253.8,659.4,258.4,659.4,266.3,659.4,268.4]},{\"w\":2.5,\"pts\":[786.8,164,790,164,793.3,164,797.8,164,805.5,164,820.1,164,826.6,163.7,837.1,163.4,842.5,163.4,843.8,163.4,845.2,163.4,844.9,170.9,843.9,178.6,842.6,190.4,840.9,204.7,839.5,216.3,836.3,244.6,832.9,278.1,831.8,293.5,830.2,315.3,829.4,326.6,828.2,337.7,827.9,343.5,827.6,347.6,827.2,352,826.9,354.1]},{\"w\":2.5,\"pts\":[957.2,224.5,961.3,224.5,971.1,224.5,977.9,224.5,988.3,224.5,995.1,224.5,1003.8,224.5,1005.5,224.5,1007.6,224.5,1010.7,224.5]},{\"w\":2.5,\"pts\":[969.6,261,973.5,261,977.9,261,982.9,261,987.4,261,992.2,261,998,261,1003.5,261,1005.8,261,1008.3,261]},{\"w\":2.5,\"pts\":[1115.5,185.8,1118.9,183.4,1127.6,176.8,1131.5,174,1140.8,168.1,1146.2,165.5,1151.4,163.3,1156.4,161.7,1160.9,161.2,1165.3,160.9,1168.4,160.9,1172.4,160.9,1176.1,160.9,1178.2,160.9,1183.1,161.1,1184.5,161.7,1187.6,164.6,1189.1,166.7,1191.7,171.8,1193,174.9,1194.7,179,1196.7,183.3,1198.2,187.7,1199.4,192,1200.2,196.2,1200.8,200.2,1201.3,204.3,1201.6,208.8,1201.6,212.9,1201.6,220.9,1199.7,229.8,1197.3,234.8,1194.3,239.8,1190.9,244.9,1178.3,258.8,1172,264.6,1165,270.5,1158,276.5,1150.8,282.2,1143.9,287.4,1137.8,291.8,1132.1,295.5,1126.8,299.3,1121.9,302.7,1118.4,304.8,1115.7,306.6,1112.5,308.7,1109.5,310.4,1106.9,311.9,1104.8,313.3,1103,314.5,1101.8,315.3,1104.4,314.1,1124.8,309.6,1137.5,306.7,1163,302,1181.5,299.1,1200,296.2,1228.3,292.6,1242.2,290.8,1250.5,289.9,1256.2,289.5,1261.7,288.9,1265.4,288.6,1267.4,288.6,1268.8,288.5]},{\"w\":2.5,\"pts\":[1308.7,156.5,1312.9,324.1,1313.6,326.9]},{\"w\":2.5,\"pts\":[366.8,407.2,368.8,407.2,371.6,407.2,375.8,407.2,381.3,407.2,387.4,407.2,393.5,407.2,400,407.2,410.1,407.2,417.1,407.2,420.1,407.2,424.4,407.2,426,407.2]},{\"w\":2.5,\"pts\":[367,407.2,367,411.1,367,423.1,367,437.7,367,452.7,367,457.9,367,462.3,367,467.1,367,470.2,367,472.4,367,474.4,367,475.7,368.3,474,370.4,472.6,373.4,470.8,377.3,468.8,381.6,466.3,386.3,463.8,396,459.9,399.8,458.5,404.7,457,409.7,455.5,414,454.4,418.3,453.6,423,453.1,427.7,452.7,432.2,452.3,435.7,452.3,438.9,452.3,442.7,452.3,446.1,452.3,449.1,452.6,452.2,453.3,455.1,454.7,457.7,456.1,459.4,457.2,461.1,458.6,463.1,460.7,463.4,461.9,464.7,466.7,465.2,469.7,465.6,474.1,465.7,478.6,465.7,483.8,465.7,488.5,465.7,493.6,465.3,500.1,464.3,504.4,462.7,508.3,460.2,513.4,457.1,518.2,453.6,522.5,449.9,526.4,445.4,530.2,440,533.8,434.3,536.5,421.5,539.6,413.8,541,403.4,542.5,392.2,543.6,381.2,544.6,370.8,545.1,359.7,545.2,349.4,545.3,343,545.3,337.5,545.3,332.3,545.3,328.4,545,324.9,544.7,322.3,544.4,320.2,543.8]},{\"w\":2.5,\"pts\":[547.1,429.7,548.5,432,556.7,442,563,449.1,571.9,458.6,581.2,470,591,481.9,599.7,491.7,619.9,514.1,628.7,522.7,636.2,529.2,642.3,534.6,646.5,538.3,650.7,542.1,653.6,544.2,655.5,545.3,656.5,546,656.6,544.4]},{\"w\":2.5,\"pts\":[647.5,417.4,647.5,418.7,647.5,420.8,647.5,424.4,646.4,431,643.3,443.5,641.1,450.3,637.7,458,634.3,466.2,628.6,478,623.7,486.8,621.3,491.2,617.6,498,612.8,505.1,608.2,511.9,605.3,516.8,602.3,520.3,599.4,524.3,597.3,527.7,595.9,529.4,595.2,530.3,593.5,532.1,593.1,533.2,592.7,534.2]},{\"w\":2.5,\"pts\":[780.1,435.8,782.3,435.8,784.7,435.8,787.7,435.6,791.2,435.3,800.5,434.6,804.4,434.6,808.4,434.5,813.3,434.5,817.7,434.5,820.7,434.5,823.8,434.5,830.2,434.5,832.5,434.7,834.3,435.4,835.5,436.4,836.4,437.4,837.1,438.3,837.4,439.6,837.4,440.8,837.4,444.2,837.4,446.4,837.4,449.4,837.1,452.4,833.9,460.1,831.3,463.7,824.9,470.7,822.1,473,819.8,474.8,816.4,477,812.9,479,809.6,480.7,806.7,482,804.2,483,802.5,483.6,801.5,484.1,800,484.3,801.3,484.3,803.3,484.3,805.8,484.3,809.3,484.6,813.7,485.2,819.3,486.7,825.4,488.9,837.4,493.3,842.6,495.7,852.2,500.5,855.9,503,859.3,505.7,861.7,508,863.2,509.7,864.1,511.7,864.6,513.9,864.9,515.6,864.9,517.7,864.4,520.6,862.5,523.5,859.5,526.3,856,528.7,852,530.9,847.3,532.8,841.8,534.3,831.3,536.7,826.5,537.3,821.3,538,816.6,538.7,805.2,539.3,800.6,539.3,787.6,539.3]},{\"w\":2.5,\"pts\":[940,465.9,946.7,465.9,953.3,465.9,960.1,465.9,969.6,465.9,986.1,465.9,996.1,465.9,1017.7,465.9,1020.8,465.9,1022.6,465.9]},{\"w\":2.5,\"pts\":[958.7,499.2,960.6,499.2,963.6,499.2,967.3,499.2,974,499.2,982.3,499.2,991.1,499.2,1043.3,496.7,1049,496.7]},{\"w\":2.5,\"pts\":[447.1,701.1,448.3,700.6,449.4,700.8,450.2,702.1,450.7,703.2,451.3,704.4,451.9,705.6,452.5,706.8,453.1,707.9,454,709.7,454.6,711.1,454.9,712.6,455.3,714.6,455.7,717.2,455.8,723.1,455.8,726.3,455.8,729.5,455.8,732.2,455.8,734.1,455.8,735.9,455.8,738.2,455.8,742,455.8,744.4,455.8,746.4,455.4,748.8,454.5,751.1,451.3,756.2,449.9,758.2,446.2,763,444.7,764.8,443.3,766.5,442.1,767.7,441.2,768.7,440.3,769.5,438.8,770.7,436.7,772.1,435.2,773.2,433.7,774.4,432.5,775.3,431.2,776.3,430.2,777.2,429.1,778,431.2,776,434.6,773.4,439.1,769.6,445,764.7,450.7,759.8,456.6,754.2,464.2,747.2,471.9,740.5,477.5,735.3,482.1,731.3,487.4,726.8,492.4,722.7,496,719.5,498.5,717,502.8,713.2,503.8,711.9,505,710.9,506.6,709.5,507.7,708.4,508.6,707.5,509.5,706.6,510.6,705.5,511.7,704.7,512.4,704,510.8,706,509.5,707.9,508.1,710.3,506.7,713.5,504,722.3,503.5,724.8,502,733.8,502,737.9,502,742.6,502,750.9,502,754.8,503.2,758.1,505.9,761.9,508.5,764.3,512.2,767,516.6,769.9,521.5,772.5,527,775.2,532.6,777.4,537.4,778.8,543.3,779.7,552.6,780.9,556.3,780.9,561.1,780.9,569,779.8,570.7,778.9,572.3,777.2,573.1,774.5]},{\"w\":2.5,\"pts\":[613.2,669.2,615,669.6,616.9,669.6,621.1,669.6,623,669.6,624.5,669.6,626.4,669.6,628,669.6,630,669.6,631.7,669.6,632.7,669.6,634.5,669.9,635.2,670.8,635.6,671.8,635.6,673.3,635.6,674.4,635.6,675.5,635.6,677,635.6,678.1,635.6,679.6,635.3,681.4,634.7,683.4,633.8,685.4,632,687.9,629.9,690.5,623.7,695.5,618.1,699.1,615.3,701,612,702.9,608.9,704.8,606.3,706.4,603.8,707.5,601.4,708.5,599.9,709.1,599,709.6,597.2,709.9,598.6,709.9,602.2,709.9,606.9,709.6,612.5,708.3,619.9,707.5,628.4,707,638.6,705.5,652.2,704,656.4,703.6,660.6,703.3,663.3,703.2,665.4,703.2,666.7,703.2]},{\"w\":2.5,\"pts\":[712,713.5,714.5,713.5,717.5,713.5,721.1,713.5,725.5,713.5,730.4,713.5,734.8,713.5,740.8,713.5,743,713.5,749.4,713.5,751.4,713.5,755.4,713.5,756.7,713.5]},{\"w\":2.5,\"pts\":[711.1,737.8,713.6,737.8,716,737.8,718.6,737.8,720.7,737.8,723.4,737.8,727,737.8,732.9,737.8,736.2,737.8,739.1,737.8,741.2,737.8,742.8,737.8,744.7,737.8,746.2,737.8,747.3,737.8,748.3,737.8,749.6,737.8,750.7,737.8,751.8,737.8]},{\"w\":2.5,\"pts\":[858.7,678,859.2,681.7,859.2,686.2,859.2,692.6,858.4,710.2,856.5,719.4,854.8,730,853.8,738.7,852.6,744.8,851.6,748.8,850.6,754.1,849,760.2,847.7,765.5,846.8,769.9,845.9,775.4,845.5,777.4,845.5,779,845.5,780.1,845.5,781.2,845.5,783.3,845.5,785.9,845.5,786.9]},{\"w\":2.5,\"pts\":[972.8,677.2,971.9,676.7,969.2,676.7,965.2,676.7,962.8,676.7,960,676.7,954.8,676.7,950.6,676.7,948.3,677.7,946.6,678.6,945.3,679.8,943.6,681.4,941.6,683.4,939.7,685.5,938.3,687.2,936.9,688.9,935.6,690.8,934.4,692.4,932.2,695.4,931.4,696.6,929,700.6,928.1,702.7,926,706.9,925.3,709.2,924.6,711.5,923.7,713.8,923,716.1,922.8,717.9,922.2,719.8,921.8,721.8,921.5,723.7,921.1,725.7,920.8,728.2,920.4,730.6,920.4,732.6,920.3,736.8,920.3,740.8,920.3,742.5,920.3,744.2,920.3,745.9,920.3,747.2,920.3,748.4,920.3,749.6,920.3,751.5,920.3,752.8,920.6,754.5,921.1,755.4,921.6,756.3,922.4,756.9,923.3,757.5,926.2,759.1,927.1,759.5,928.5,759.8,931.8,760.8,935.5,761.5,937.9,762.1,940.2,762.5,942.5,762.8,944.4,763.1,946.2,763.1,948.5,763.4,950.5,763.6,952.6,763.7,956.2,763.7,957.9,763.7,959.4,763.7,960.5,763.7,962.4,763.7,963.8,763,965.1,761.1,966,759.9,966.8,758.7,967.4,757.5,968,756.4,968.5,755.5,968.9,754.6,969.8,752.2,970.2,750.7,970.5,748.8,970.6,746.9,970.9,744.4,971.2,742.1,971.2,736.4,971.2,734.5,971.2,732.6,971.2,731.1,971.2,729.2,971.2,727.5,970.5,726.1,969.3,725.5,967.7,725.1,966.5,725,965.3,725,963.7,725,961.8,724.7,958.2,724.4,955.5,724.4,952.3,724.4,950,724.4,947.7,724.4,941.8,724.4,940.5,724.4,939.4,724.4,938,724.4,937,724.4,936,724.4,934.9,724.4,932.8,724.4,930.2,724.4,927.9,724.9,927,725.4,926,725.4,925,725.8,924,726.3]}]}", + "viewportJson": "{\"x\":168,\"y\":9,\"zoom\":0.61}", + "echoes": [ + { + "label": "Echo № 1", + "mode": "auto", + "content": "12 + 7 = 19, not 21 ✗ → 19", + "x": 1366, + "y": 147, + "width": 340, + "acceptedAt": "2026-07-29T14:51:24.956Z", + "sketchJson": null, + "sceneJson": null + }, + { + "label": "Echo № 2", + "mode": "auto", + "content": "5 × 3 = 15", + "x": 1207, + "y": 436, + "width": 340, + "acceptedAt": "2026-07-29T14:51:52.151Z", + "sketchJson": "{\"polylines\":[],\"labels\":[{\"text\":\"15\",\"x\":1081.986689539992,\"y\":454.1526972433873,\"size\":44.954856762614234}]}", + "sceneJson": null + }, + { + "label": "Echo № 3", + "mode": "auto", + "content": "x² = 16 → x = ±√16 = ±4\n(don't forget the negative root!)", + "x": 1093, + "y": 689, + "width": 340, + "acceptedAt": "2026-07-29T14:52:54.518Z", + "sketchJson": null, + "sceneJson": null + } + ], + "cardInfo": { + "name": "Arithmetic check", + "summary": "Handwritten sum with a wrong answer — the marker checks it", + "notes": null, + "cardThumbnailURL": null + } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + }, + "meta": { + "adoptsFrom": { + "module": "../echo-pad/echo-pad", + "name": "EchoPad" + } + } + } +} \ No newline at end of file diff --git a/f22ed9-echo-pad/EchoPad/diagram-complete.json b/f22ed9-echo-pad/EchoPad/diagram-complete.json new file mode 100644 index 00000000..5b27628e --- /dev/null +++ b/f22ed9-echo-pad/EchoPad/diagram-complete.json @@ -0,0 +1,42 @@ +{ + "data": { + "type": "card", + "attributes": { + "boardName": "Diagram complete", + "inkJson": "{\"v\":1,\"strokes\":[{\"w\":2.5,\"pts\":[457,227.4,460.6,227.4,469.2,227.4,497.7,227.4,517.7,227.4,541.4,227.4,565.7,227.4,584.6,227.4,604,227.4,627.1,227.4,646.7,227.4,665.4,227.4,677.7,227.4,694.4,227.4,698.8,227.4,704.7,227.4,709.7,227.4,713.7,227.4,716.5,227.4,718.4,227.4,719.6,227.4,720.7,227.4,721.1,228.4,720.4,229.3,719.3,230.9,718.8,232,718.4,233.7,717.8,242.1,717.6,247.1,717.5,254,717.4,261.5,717.4,269.1,717.4,285,717.4,291.9,717.4,298.2,717.4,304.5,717.4,310.1,717.4,315.2,717.4,320.3,717.4,325.3,717.2,329.1,717,332.4,716.9,335.7,716.9,339,716.9,342.8,716.9,346.2,716.9,349.2,716.9,352,716.9,354.2,716.8,356.2,716.8,358.3,716.8,360,716.8,361.7,716.8,363.6,716.8,365.8,716.8,368,716.8,370.1,716.8,374,716.8,375.7,716.8,377.8,716.8,379.7,716.8,381.7,716.8,383.9,717,386.7,717.3,389.1,717.3,391.2,717.5,393.8,717.7,396.3,717.9,398.9,718.1,401.2,718.2,403.8,718.4,406,718.6,407.9,718.8,409.8,719,411.4,719,413,719.1,414.2,719.2,415.5,719.3,416.9,719.5,418.1,719.6,419.2,719.7,420.4,720,422.1,720,423.4,720.3,424.5,720.4,425.5,720.4,427.1,720.4,428.3,720.4,429.4,720.4,430.5,720.4,431.8,720.4,433,720.4,434.3,718.4,434.4,716.5,434.4,713.7,434.4,709.8,434.4,703.6,434.7,696.1,435.7,688.1,436.7,678.5,437.7,667.7,439.2,658.7,440.4,649.6,441.4,637.8,442.6,628.1,443.7,618.8,444.4,608,445.3,597.8,446,588.6,446.8,580.9,447.2,574.4,447.2,569.7,447.3,565.7,447.5,561.2,447.8,557.2,447.8,553.7,448.1,550.9,448.3,545.4,448.4,543.4,448.6,541,448.7,538.8,448.7,536.8,448.7,534.8,448.7,532.8,448.7,531.1,448.7,529.1,448.7,526.3,448.7,523.2,448.7,520.2,448.7,517,448.7,514,448.7,511.1,448.7,507.9,448.7,505.1,448.7,502.6,448.7,500.2,448.7,498.3,448.7,496.8,448.7,495.1,448.7,493.4,448.7,491.5,448.7,489.6,448.7,488,448.7,486.6,448.7,485.1,448.7,483.9,448.7,482,448.7,480.8,448.7,479,448.7,477.9,448.7,475.7,448.7,474.5,448.7,473.2,448.7,471.8,448.7,470.8,448.7,469.5,448.7,468.3,448.7,466.9,448.6,465.2,448.1,463.9,447.9,462.5,447.7,461.1,447.5,459.7,447.3,458.6,447.2,457.6,447,456.3,446.7,455.1,446.4,455.1,445.3,455.1,444,455.1,442.7,455.1,441.7,455.1,440.1,455.1,437.8,455.1,434.2,455.1,426,455.1,417.9,455.1,413.4,455.1,407.9,455.1,401,455.1,394.3,455.1,386.9,455.5,376.9,456.1,367.7,456.7,360.3,457.3,352.4,458,345.1,458.6,337.8,459.3,331.3,459.9,325.5,460.5,319.4,461.1,313.9,461.6,308.3,462.7,297.9,463.1,293.9,463.7,289,464.2,285,464.7,281.4,465.2,277.4,465.8,273.1,466.1,269.5,466.2,266.6,466.4,262.7,466.7,259.1,466.7,255.7,466.7,252.4,466.7,249.8,466.7,246.8,466.7,243.7,466.7,241.2,466.7,238.7,466.7,236.5,466.7,235.1,466.7,233.6,466.7,232.2,466.7,230.9,466.7,229.9,466.7,228.3,466.7,227.2]},{\"w\":2.5,\"pts\":[553.3,436.2,553.3,434.5,553.3,432.9,553.3,430.3,553.3,426.8,553.3,423.3,553.3,417.6,553.1,412.5,552.1,404.4,551.9,401.9,551.6,398.4,551,391.6,550.8,389.3,550.8,386.7,550.7,384.1,550.7,382.1,550.7,380.4,550.7,378.7,550.7,377.3,550.7,375.5,550.7,374.4,550.7,373.3,550.7,372,550.7,370.9,550.7,369.8,550.8,368.7,552,368.4,553.2,368.1,554.4,367.6,556.1,367.3,557.2,367.1,558.3,366.9,559.4,366.6,562.9,366.1,565.3,365.7,567.8,365.2,570.6,364.7,573.3,364.5,575.9,364.2,578.8,364,581.3,363.7,583.8,363.3,586.6,362.8,591.6,361.5,593.8,361.1,596.3,360.7,598.8,360.1,601.7,359.4,604.5,358.6,607.4,357.9,611,357.4,614,356.8,616.8,356.4,620,355.9,622.6,355.4,625.2,355.1,627.5,354.9,629.2,354.7,630.5,354.7,631.6,354.5,632.9,354.3,634,354.5,634,355.5,633.7,356.5,633.3,357.6,633,358.9,632.8,360,632.7,362.3,632.7,363.9,632.7,365.8,632.7,367.5,632.7,369.5,632.9,371.7,633.5,373.9,634.5,376.8,635.2,379.4,635.6,381.4,636.1,383.9,636.5,386.4,637,388.8,637.6,391.3,638.2,393,638.5,394.7,638.9,396.8,639.4,398.9,639.6,400.9,639.9,402.7,640.1,404.4,640.3,406.2,640.5,407.6,640.6,409,640.6,410.4,640.8,411.9,641,413.3,641,414.5,641,415.9,641,417.2,641,418.3,641,420.3,641,422.1,641,423.7,641,425.3,641,426.8,641,428.6,641,430,641,431.4,641,432.7,641,433.8,641,435.1,641,436.3,641,437.5]},{\"w\":2.5,\"pts\":[525.2,73.9,525.2,72.3,525.2,70.4,526.8,68,528.3,66.6,529.9,66,532.4,65.3,535.2,64.6,538.3,63.9,540.5,63.7,542.2,63.7,545.1,63.5,548.1,63.2,551.2,63.2,554.5,63.2,557.4,63.1,560.3,63.1,563,63.3,565.3,63.9,567.7,64.8,569.7,65.9,571.5,67,573,68,574.1,69,575,69.9,576.2,71.3,576.8,72.5,577.3,73.8,577.4,75.2,577.4,76.6,577.4,78.2,577.4,79.3,576.6,81.2,576,82.1,575.3,83,574.3,84.1,573.1,85.6,571.6,87.3,569,89.9,567.4,91.6,566.1,93.1,564.5,94.7,563.2,96.2,561.9,97.7,560.8,98.8,560.1,99.6,559.1,100.9,558.4,101.9,558.2,103.3,557.9,104.5,557.8,105.6,557.6,106.6,557.6,107.8,557.6,109.5,557.4,110.8]},{\"w\":2.5,\"pts\":[557.4,161.5,558.8,160.6,559.5,159.7,560.1,158.8,560.7,158,561.3,157.1,561.9,156,562.8,155.1]}]}", + "viewportJson": "{\"x\":149,\"y\":17,\"zoom\":0.85}", + "echoes": [ + { + "label": "Echo № 1", + "mode": "auto", + "content": "This is a house outline missing its roof — rectangle walls + a door, but no triangle on top.\nCompleting it: add a peaked roof connecting the top corners.", + "x": 751, + "y": 63, + "width": 340, + "acceptedAt": "2026-08-05T10:12:22.738Z", + "sketchJson": "{\"polylines\":[[457.1309719411182,224.1715257593184,587.100538595693,165.16297413048423,718.0698711476108,224.1715257593184]],\"labels\":[{\"text\":\"roof\",\"x\":572.1040501355499,\"y\":185.16587298771617,\"size\":12.001739314339153}]}", + "sceneJson": null + } + ], + "cardInfo": { + "name": "Diagram complete", + "summary": "An unfinished figure the marker completes in red ink", + "notes": null, + "cardThumbnailURL": null + } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + }, + "meta": { + "adoptsFrom": { + "module": "../echo-pad/echo-pad", + "name": "EchoPad" + } + } + } +} \ No newline at end of file diff --git a/f22ed9-echo-pad/EchoPad/wave-study.json b/f22ed9-echo-pad/EchoPad/wave-study.json new file mode 100644 index 00000000..842719e7 --- /dev/null +++ b/f22ed9-echo-pad/EchoPad/wave-study.json @@ -0,0 +1,42 @@ +{ + "data": { + "type": "card", + "attributes": { + "boardName": "Wave study", + "inkJson": "{\"v\":1,\"strokes\":[{\"w\":2.5,\"pts\":[419.2,32.6,418.8,33.6,418.8,37.6,418.8,41.9,418.8,48.2,418.8,57.5,418.8,68.6,418.8,88.5,418.8,156.6,418.8,183.3,418.8,212.7,418.8,243,418.8,266.2,418.8,288.4,418.8,310.7,418.8,372.6,418.8,393.9,418.8,419.4,418.8,442.9,418.8,463.8,418.8,493.6,419.1,500.2,421.4,521.2,421.8,524.9,422.6,529.7,423.4,533.8,423.9,536.5,424.4,538.4,424.6,539.6,425.2,542.1]},{\"w\":2.5,\"pts\":[291.6,277.3,294.5,277.3,300.2,277.3,312.6,277.3,349,277.3,366.5,277.3,420.9,277.3,444.9,277.3,502.5,277.3,536.9,277.3,572.3,277.3,624.8,277.3,673.4,277.3,712.3,277.3,751.8,277.3,790.4,277.3,836.8,277.3,871,277.3,899.6,277.3,932.1,277.3,957.7,277.3,972.1,277.3,982.7,277.3,994.4,276.9,1001.5,276.3,1006.3,275.7,1011.6,275.1,1017.3,274.2,1018.7,273.8,1019.7,273.4,1021.2,272.9]},{\"w\":2.5,\"pts\":[423.4,274,423.4,270.3,423.4,267.5,423.4,265.6,423.4,263,423.4,256.5,423.4,251.6,423.4,245.3,423.4,238.6,423.4,235.2,423.7,231.7,424.8,226.1,426.1,222.9,427.5,220,429.2,217.3,434.4,210,437,206.8,442.8,200.1,445.7,197.2,448.3,194.8,451,192.7,459.8,186.6,465.1,183.1,485.2,171.7,491.4,168.1,503.4,161.8,509.2,159.1,514.9,156.7,520.1,154.4,534.9,149.4,540.2,147.8,547.7,145.9,550.7,145.2,553,144.8,555.9,144.3,560.3,143.9,561.8,143.9,562.9,143.9,564.6,143.9,567.1,146.3,568.4,148,570.4,150.2,577.7,160.7,580.9,165.3,584.4,171.1,590,181.3,592.2,186,595,191.5,600.4,202.8,602.9,208.8,605.5,214.9,610.5,226.1,612.8,231.4,614.9,237.1,619.6,250.3,622.5,256.6,627.9,269.1,630.9,274.8,637.8,287,641.2,292.7,644.6,297.9,647.5,301.8,650.6,305.4,654.5,310,662.9,319.2,672.5,328,681,335.8,684.9,338.9,689.1,341.7,693.3,344.6,701.2,349.7,709.1,353.7,713,355.2,717.2,356.9,720.7,358.3,723.6,359.2,728.5,360.2,731.2,360.7,733.6,361.2,737.9,361.5,744.1,361.5,750.5,359.5,752.1,358.6,755.8,356.2,759.5,353,761,351.5,762.9,349.7,764.7,347.9,766.3,346.3,768.1,344.3,769.7,342.3,771.5,340.1,774.8,335.4,776.5,333,780.3,325.8,781.7,322.9,784.1,316.8,785.2,313.8,786.2,311.2,788.2,305.1,789.7,298.8,790.7,295.4,796,267.4,798.4,253.3,799.1,250.4,799.8,247.6,800.7,243.4,802.1,238.1,802.8,234.9,803.9,230.8,808.5,219.3,811.7,213.4,816.3,206.2,821.1,198.8,823.8,195.5,826.4,192.6,829.3,189.6,831.6,187.1,837.8,181.5,839.8,179.7,846.6,173.4,848.9,171.1,851.1,169.2,853.2,167.5,854.6,166.3,856,164.9,857.8,163.3,859.7,161.8,861.8,160.5,863.9,159.3,865.8,158.3,867.6,157.6,869.3,157,870.9,156.8,872.8,156.8,875.1,156.8,877.3,156.8,879.8,156.8,884.7,156.8,888.2,156.8,892,157.2,895.3,158.2,898.6,159.2,900.5,159.9,902.3,160.8,904.7,162.1,907.3,163.5,910,165,912.3,166.4,914.3,168.1,916.2,170,918.4,172.2,920.7,174.7,922.5,176.8,924.4,178.8,926.6,181.6,930.4,185.9,936.1,192.3,938.4,195.4,940.8,198.6,943.1,201.7,944.9,204.1,946.1,206,947.6,208.5,949.3,211.2,951.1,214,952.9,216.8,954.4,219.3,955.7,221.7,956.8,224,957.9,226,959.6,229.3,960.3,230.6,961.8,233.7,963,236.3,963.9,237.8,964.7,239.3,965.5,240.6,966.1,241.7,966.7,242.8,967.5,244.2,968.3,245.7,969.2,247.1,970,248.6,971.1,250.2,972.4,251.8,973.5,253.3,974.6,254.8,975.6,256,976.3,257.1,977.1,258.2,977.8,259.4,978.8,260.6,980.5,262.3,981.2,263.2,981.9,264,983.1,265.8,984.7,267.4,986,268.6,987.2,268.9,988.4,268.9,989.2,269.6,989.2,270.8,989.6,272.2,990.8,272.6,992,273.1,993.3,273.1,993.8,274.2]}]}", + "viewportJson": "{\"x\":202,\"y\":36,\"zoom\":0.83}", + "echoes": [ + { + "label": "Echo № 1", + "mode": "animate", + "content": "Rough hand-drawn wave morphs into a clean sine curve, then ripples with growing amplitude.", + "x": 1051, + "y": 33, + "width": 340, + "acceptedAt": "2026-07-29T14:59:41.615Z", + "sketchJson": null, + "sceneJson": "{\"title\":\"Wave study\",\"steps\":[{\"add\":\"ink\",\"id\":\"ink1\"},{\"add\":\"axes\",\"id\":\"ax\",\"xRange\":[-6,6],\"yRange\":[-2,2]},{\"add\":\"graph\",\"id\":\"g\",\"fn\":\"sin(x)\",\"xRange\":[-5,5],\"axes\":\"ax\"},{\"play\":\"create\",\"duration\":1,\"target\":\"ink1\"},{\"play\":\"transform\",\"duration\":2,\"target\":\"ink1\",\"to\":\"g\"},{\"play\":\"fadeOut\",\"duration\":0.5,\"target\":\"ink1\"},{\"play\":\"create\",\"duration\":1,\"target\":\"g\"},{\"play\":\"wave\",\"duration\":3,\"target\":\"g\",\"amplitude\":0.6}],\"background\":\"paper\",\"ink\":[[-2.792965863750554,3,-2.7970666469632035,2.987808482340771,-2.7970666469632035,2.9410373873208218,-2.7970666469632035,2.8895559332052607,-2.7970666469632035,2.815852667356288,-2.7970666469632035,2.7062398404019508,-2.7970666469632035,2.5756797694694846,-2.7970666469632035,2.3417688783803756,-2.7970666469632035,1.5398440963499336,-2.7970666469632035,1.2249704448056744,-2.7970666469632035,0.8792300871878234,-2.7970666469632035,0.5222402837298654,-2.7970666469632035,0.2490948721737843,-2.7970666469632035,-0.01269026156346961,-2.7970666469632035,-0.2752512191517662,-2.7970666469632035,-1.003749815280036,-2.7970666469632035,-1.2551721590069456,-2.7970666469632035,-1.554917245455889,-2.7970666469632035,-1.8311659524161374,-2.7970666469632035,-2.0778779370474365,-2.7970666469632035,-2.42904906162258,-2.794185015516477,-2.506077286833161,-2.7671420127087334,-2.753343431358061,-2.7616558297620806,-2.7973991428993643,-2.7526784394857393,-2.853424708142456,-2.7430914733264373,-2.90224619476873,-2.7369402985074625,-2.934110388650805,-2.73162036352889,-2.9560551204374166,-2.7291266440076845,-2.97013078173489,-2.722033397369587,-3],[-4.29545958327176,0.11825772129451757,-4.260769173932319,0.11825772129451757,-4.19343874685976,0.11825772129451757,-4.04824885473622,0.11825772129451757,-3.6187749371952123,0.11825772129451757,-3.41351411260529,0.11825772129451757,-2.7727390276341066,0.11825772129451757,-2.489951233929363,0.11825772129451757,-1.81132702822521,0.11825772129451757,-1.407122801832422,0.11825772129451757,-0.9892308260676813,0.11825772129451757,-0.37173045662775167,0.11825772129451757,0.2002179695581506,0.11825772129451757,0.6584527855770649,0.11825772129451757,1.1243904241170393,0.11825772129451757,1.5788569528594654,0.11825772129451757,2.1250923599822675,0.11825772129451757,2.5269136988325704,0.11825772129451757,2.8641754100783214,0.11825772129451757,3.2472107285355403,0.11825772129451757,3.547953302792967,0.11825772129451757,3.7176924782030443,0.11825772129451757,3.842489286242057,0.11825772129451757,3.980863011674302,0.12269100044332798,4.063543667799617,0.13011674301758527,4.12067755282991,0.13676666174080054,4.1824109649770955,0.14363824442145678,4.250240135953894,0.15461061031476267,4.266310772868332,0.15921013743165346,4.278280626570121,0.16380966454854426,4.295459583271761,0.17001625535687898],[-2.7430360573370764,0.15660558593172727,-2.7430360573370764,0.20066129747303052,-2.7430360573370764,0.2335229791635876,-2.7430360573370764,0.2564651987586817,-2.7430360573370764,0.2862235850450714,-2.7430360573370764,0.362974730308852,-2.7430360573370764,0.4204965272646666,-2.7430360573370764,0.495585192847643,-2.7430360573370764,0.5739434018028668,-2.7430360573370764,0.614563322003842,-2.7400435939116297,0.6555711541303385,-2.726245012560957,0.7211282695433723,-2.711615191369883,0.7591436382444215,-2.694768730604404,0.7933353036796217,-2.6748743904241166,0.8245345056893749,-2.612974730308852,0.9108726171124575,-2.583050096054381,0.9480567459731049,-2.5147775971627016,1.0267474508644894,-2.4802534357913406,1.0613824442145705,-2.4503288015368696,1.0895337668095166,-2.417965863750554,1.1144709620215754,-2.3148921235407123,1.1860130042855033,-2.251607063691444,1.2274087483375202,-2.01575661297473,1.3612937786315944,-1.942275011083198,1.403797842470814,-1.801185902172307,1.4780552682133887,-1.732691739323186,1.5105290379784246,-1.6659708881335897,1.5386249445840106,-1.6046253879119252,1.565945027338555,-1.4297879414807153,1.6245197280922123,-1.3677220333973694,1.6429178365597754,-1.2791118664105212,1.6655829762080687,-1.2436456332200378,1.6736737106546475,-1.2168242943697358,1.6781624057928182,-1.1829651248706965,1.6838148367075514,-1.1304861829466528,1.6884697798138022,-1.1135288902024525,1.6889131077286834,-1.1006723806709027,1.6890239397074036,-1.080057632628934,1.689134771686124,-1.051130486182946,1.6613159450273387,-1.0354477611940303,1.6403687010492094,-1.0125609575882961,1.6148773459435495,-0.9261120141864934,1.4908563617555783,-0.8888724693364851,1.436548692182651,-0.8468117334121464,1.3682761932909708,-0.7813654499778332,1.2484114083050097,-0.7553199349785724,1.1937158268065613,-0.7225690852667351,1.128047879414807,-0.6594502733855472,0.9957144968228167,-0.6289714792374753,0.9248374464312102,-0.5984926850894049,0.8529629082311216,-0.5400842323038275,0.7210728535540121,-0.5123208216344017,0.6585636175557854,-0.4878823703265849,0.5918427663661889,-0.4322447170090148,0.436013004285503,-0.39882887542485596,0.3619218265110091,-0.3350450716713465,0.21429363085562253,-0.30002216639574375,0.14768361164474653,-0.2187269100044336,0.0038237032658487873,-0.1780515738140979,-0.06295256391310758,-0.13842914142160437,-0.12424264814541133,-0.10407122801832452,-0.17007167134623888,-0.0675520910299977,-0.21268656716417927,-0.02150140387172986,-0.2671050687158268,0.07669572927442073,-0.37450125609575896,0.18968893157972597,-0.47823998817792207,0.28960396039604025,-0.5710063543667799,0.335931727501109,-0.6074700753657455,0.3856398699571452,-0.6405534210137436,0.43534801241318144,-0.6736367666617409,0.5284468745382008,-0.7345943549578839,0.620991576769617,-0.7813100339884733,0.6663772720555633,-0.7994310625092362,0.7169166543520021,-0.8194916506576032,0.7570378306487362,-0.8348972956997196,0.7911740800945763,-0.8461467415398256,0.8495825328801537,-0.8583936751884147,0.880947982857988,-0.8639352741244272,0.9094872173784538,-0.8694214570710804,0.9601928476429737,-0.8734668242943695,1.032843209694104,-0.8736884882518104,1.1079318752770808,-0.850025860795035,1.127438303531846,-0.8388872469336487,1.1709952711689076,-0.8107913403280628,1.214940150731491,-0.7733301315206149,1.232562435348013,-0.7556524309147332,1.2541192552091025,-0.7340401950642829,1.275121915176592,-0.7129821191074329,1.2944066794739177,-0.693641938820748,1.315575587409488,-0.6702563913107727,1.334306191813212,-0.6472587557263187,1.3553088517807002,-0.6211578247376981,1.394432540268953,-0.5663514112605292,1.4149364563322007,-0.5371471848677406,1.4591029998522238,-0.4526378010935425,1.4760048766070641,-0.4187232156051426,1.504710359095611,-0.3469040933944142,1.5176222846165222,-0.3120474360868925,1.5284838185311076,-0.28123614600265995,1.5519247820304423,-0.20853036796216973,1.5698795625831248,-0.134937934091917,1.5818494162849124,-0.09531550169942352,1.6446357322299394,0.23496379488695113,1.672731638835526,0.40038052312693967,1.6808777892714641,0.4351817644451011,1.6895226836116453,0.46754470223141703,1.699774641643269,0.5169203487512929,1.7160115265257867,0.5797620806856806,1.7245455888872467,0.6172232894931284,1.737235850450717,0.6660447761194029,1.7909339441406824,0.800705630264519,1.8285614009162112,0.8709176887838036,1.8827582385104185,0.9559258164622431,1.9393933796364708,1.0431505837150878,1.971091325550466,1.081941776267179,2.0018471996453373,1.116022609723659,2.0361496970592587,1.1503805231269395,2.0632481158563616,1.1801389094133292,2.1368405497266143,1.2466380966454855,2.16028151322595,1.2670865967193734,2.240191369883257,1.341898182355549,2.2674560366484413,1.3688857691739322,2.2927811437860206,1.391384660854145,2.3173304270725588,1.4105585931727502,2.334066055859318,1.4247450864489433,2.351078764592877,1.4418132111718633,2.372413920496527,1.4610979754691886,2.394247820304419,1.4783877641495493,2.4189633515590367,1.4933500812767844,2.4438451307817353,1.5078136544997784,2.466066942515147,1.5193401802866853,2.487069602482636,1.5276525786907047,2.5068531106842036,1.5351337372543226,2.526193290970888,1.5375720407861682,2.548969262597902,1.5375720407861682,2.5751256095758825,1.5375720407861682,2.6012819565538647,1.5375720407861682,2.631262006797695,1.5375720407861682,2.6887838037535094,1.5375720407861682,2.730068715826807,1.5375720407861682,2.774734003251072,1.5320304418501551,2.813968523718043,1.520393084084528,2.852260972365894,1.5087003103295404,2.874870696024827,1.5002216639574404,2.895984187971036,1.4896926259790157,2.9246342544702233,1.4743423969262597,2.955113048618295,1.4579392640756614,2.98686641052165,1.440704891384661,3.0133552534357912,1.4237475986404609,3.036962464903207,1.404185754396335,3.05973843653022,1.3820747746416433,3.086061031476283,1.3558630116743018,3.1124390424117045,1.326658785281513,3.134162110240875,1.3021095019949755,3.155885178070046,1.2775602187084378,3.1822077730161076,1.2454189448795625,3.2269838924190934,1.1950458105512043,3.293593911629969,1.118627161223585,3.320692330427073,1.0824959361607804,3.3488990690113796,1.0447022314171714,3.3759974878084824,1.0085710063543667,3.398053051573814,0.9799763558445396,3.4117962169351266,0.9574774641643267,3.429861829466529,0.9282732377715384,3.449811585636176,0.8967969558149846,3.4708142456036657,0.8638244421457071,3.4919831535392345,0.8305748485296289,3.509660854145116,0.8014260381262005,3.5242906753361902,0.7728868036057337,3.5380892566868622,0.7455113048618296,3.5510011822077736,0.722292005319935,3.570285946505098,0.6836116447465642,3.5782658489729577,0.6676518398108469,3.596054381557559,0.6315760307374019,3.610795034727354,0.6010418205999705,3.6208807447908966,0.5834749519728093,3.63057854292892,0.566295995271169,3.6398884291414215,0.5498374464312101,3.6470925077582383,0.5375905127826215,3.6544628343431365,0.5245123392936308,3.6638835525343576,0.507610462538791,3.6734151027043,0.4907640017733116,3.6832237328210433,0.47341879710359097,3.6932540268952274,0.4557965124870695,3.7061659524161374,0.4372321560514259,3.7219040933944143,0.4183353036796216,3.7347051869366044,0.40038052312693967,3.7470075365745528,0.38320156642529907,3.758700310329541,0.3692921530959065,3.7675668686271617,0.3559923156494753,3.7764334269247826,0.34269247820304405,3.7852999852224034,0.32939264075661284,3.796992758977391,0.31548322742721996,3.816166691295996,0.2943697354810108,3.8244236737106547,0.28389611349194604,3.833123984040196,0.27491872321560473,3.8478646372099896,0.2532510713757945,3.865653169794592,0.23463129895079038,3.8811696468154286,0.22061105364267772,3.8951344761341806,0.2169535983449093]]}" + } + ], + "cardInfo": { + "name": "Wave study", + "summary": "A rough wave sketch answered with a composed manim scene", + "notes": null, + "cardThumbnailURL": null + } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + }, + "meta": { + "adoptsFrom": { + "module": "../echo-pad/echo-pad", + "name": "EchoPad" + } + } + } +} \ No newline at end of file diff --git a/f22ed9-echo-pad/echo-pad/CardListing/f4661be9-ff9e-4917-a307-e264d42c4326.json b/f22ed9-echo-pad/echo-pad/CardListing/f4661be9-ff9e-4917-a307-e264d42c4326.json new file mode 100644 index 00000000..06916fe8 --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/CardListing/f4661be9-ff9e-4917-a307-e264d42c4326.json @@ -0,0 +1,153 @@ +{ + "data": { + "type": "card", + "attributes": { + "name": "Echo Pad", + "summary": "Echo Pad is a whiteboard that answers back: write math, sketch diagrams, or scribble half-formed ideas in blue ink, and an AI marker replies in red pen directly on the paper — checking your work, writing the missing answer into the blank, completing your drawing, or playing a short manim animation of the idea inside a projection slip. Circle any region and pick Solve, Check, Complete, Explain or Animate, or leave the ambient Auto mode on and the marker follows along as you write, proposing help only when your pen pauses. Every AI response is a draft you accept or dismiss, so the board stays yours: handwriting recognition, math checking and grading, sketch completion, and hand-drawn-curve-to-animation morphing on an infinite zoomable canvas.", + "cardInfo": { + "name": null, + "summary": null, + "cardThumbnailURL": null, + "notes": null + } + }, + "relationships": { + "cardInfo.cardThumbnail": { + "links": { + "self": "../ListingThumbnails/echo-pad-1c0f5c.png" + } + }, + "cardInfo.theme": { + "links": { + "self": null + } + }, + "categories.0": { + "links": { + "self": "https://app.boxel.ai/catalog/Category/education-courses" + } + }, + "categories.1": { + "links": { + "self": "https://app.boxel.ai/catalog/Category/ai-automation" + } + }, + "examples.0": { + "links": { + "self": "../../EchoPad/arithmetic-check" + } + }, + "examples.1": { + "links": { + "self": "../../EchoPad/wave-study" + } + }, + "examples.2": { + "links": { + "self": "../../EchoPad/diagram-complete" + } + }, + "images.0": { + "links": { + "self": "../Screenshots/ambient-marking-3c91d4.png" + } + }, + "images.1": { + "links": { + "self": "../Screenshots/wave-morph-scene-7be2a1.png" + } + }, + "license": { + "links": { + "self": null + } + }, + "publisher": { + "links": { + "self": null + } + }, + "skills.0": { + "links": { + "self": "../Skill/echo-marker" + } + }, + "tags.0": { + "links": { + "self": "https://app.boxel.ai/catalog/Tag/ai" + } + }, + "tags.1": { + "links": { + "self": "https://app.boxel.ai/catalog/Tag/app" + } + }, + "specs.0": { + "links": { + "self": "../Spec/bb45a3c4-c96b-4a49-b903-2426be4001b5" + } + }, + "specs.1": { + "links": { + "self": "../Spec/75b1c152-d2cf-401d-8c66-dde32f735a7c" + } + }, + "specs.2": { + "links": { + "self": "../Spec/2de99ec8-608e-4378-a9a4-ad4db70b3427" + } + }, + "specs.3": { + "links": { + "self": "../Spec/5a94d17e-1a3c-47ab-95d8-59cb5104e30d" + } + }, + "specs.4": { + "links": { + "self": "../Spec/09862dce-770f-4e34-b0fe-c0f0ae65e43d" + } + }, + "specs.5": { + "links": { + "self": "../Spec/04196a72-1b33-46cb-adc7-11f105c12fcc" + } + }, + "specs.6": { + "links": { + "self": "../Spec/2e1b2b22-045a-4ae6-8684-a3eccfe78daf" + } + }, + "specs.7": { + "links": { + "self": "../Spec/b87dbcab-3f75-4de7-a690-af41c6cf9e2b" + } + }, + "specs.8": { + "links": { + "self": "../Spec/1535c33b-d0d6-4f89-9ed1-bd305c5ed882" + } + }, + "specs.9": { + "links": { + "self": "../Spec/3552a1a1-dfc4-4344-9270-dd7b683fb87b" + } + }, + "specs.10": { + "links": { + "self": "../Spec/5ebd1f7e-043d-4632-8866-b5c6c10eea7f" + } + }, + "specs.11": { + "links": { + "self": "../Spec/e565fb4c-1eb6-4e36-a5fd-ac51eeb2b934" + } + } + }, + "meta": { + "adoptsFrom": { + "module": "https://app.boxel.ai/catalog/catalog-app/listing/listing", + "name": "CardListing" + } + } + } +} \ No newline at end of file diff --git a/f22ed9-echo-pad/echo-pad/ListingThumbnails/echo-pad-1c0f5c.png b/f22ed9-echo-pad/echo-pad/ListingThumbnails/echo-pad-1c0f5c.png new file mode 100644 index 0000000000000000000000000000000000000000..1513eb1bc75ad9d23a07ebc73a3f7ddaef080fed GIT binary patch literal 100079 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�wK<471d7;k%E$B*RB@7*A#bb^{Ah<0XNJ7 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%0A%k)b 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 literal 0 HcmV?d00001 diff --git a/f22ed9-echo-pad/echo-pad/Screenshots/ambient-marking-3c91d4.png b/f22ed9-echo-pad/echo-pad/Screenshots/ambient-marking-3c91d4.png new file mode 100644 index 0000000000000000000000000000000000000000..de4f304653b329d252ea8094743d9d44979214f2 GIT binary patch literal 90745 zcmeFYXIN8Rw>6B40wP6#GuS_lK8OjJHvqxRKt^6(5$h4#hJpm-PuVT&t7+zAagI&C21;?W?I;T(=VxN)aDd^sz*&S{w-pV~-@(&`{@R-vVC{Qi{KF zEP=oMKt@D}$2HcLB{`!lth-bolD)BiRu z|8ynroJ5Rp`=Z+Jt7um$X_Q25XQXG~74oaM>30nXS?iopP()+J$K(eW=0pqv)aXg^%bs80V?K$uBa z>*P4zJ1K|DFCE>ybs9AD{mJou*|~F~1!2fGy=L~Q$F&_oj$o}h;Sbe}Gt0`G^}Of= z+T%oWlVqbBGJXF@($9%pJkT4LBTZpzWb*JM7KZL+Zq%zQvvoNCBW5%j{nAFHtgIc< z*KtHNDvByJ?QjX@spcE58w);G&~Er1fZzIHP$mEy8swY-<;(~rANmE$Cp-I0yhH#Y zvXtdZQ0EQaZzSTHV8PGo#$53nr$+WYDEukC;I;X-FzZ?{kpks_!nmaz-rFeV?FOr`Nh%|UA8Ng@`@noD{8q}WxjrgXOQ>RCRkRTgF7~5MKdjDbJLTP zv(d~&Cqd_4US1ZbZ%glXD-x3UA%-i2x~nYAp*!vG5Lp`e8mjQ6uw2gwo{nPfg5LM*h032-rKdmQ+VKcg z$dT+c>k|s%?vlHU`jj$@OTJY2del)d!bV~j^X;kRXuRxEnaAU!+iLbE14{7AGwk;J z2k<9fxUVgWM!Iatb4*qD>w%=zvK#k^iVoziNKVzi;(mwt?mWxcOSJT$lhRyItqE6sTR@JXZ+&~3 zO-jya;KC>`>rOa1OQSTiB`n13L0w~}7fu5=o>kSXRM}JJF72uEDnCDVP)WZ2hD0+< zc=}gn!;(Qv!4z)n7^;Z{ST5?(eWHrj2~Xt+E%^K zFHG>^$S8ug*2$VL$aK<(TSJ?xJi}!pJk{K&j+HlT<}50&;7!-gd_TK%@dy{IXelHn zEh>)G+1@$vrH6fXFHTI~Qvn&p`ifsxJJg~1AY94kCFx8yGvb^NOz?u+P8q~6V$Yiu z8ki-|F;U~h0N+=v`PRf-l0Ata^BYth2iGN%@W!wrr58wRzgF=sA1<#+WqZs-k?(R8 zAAHx+d}mM_4+|_SJar=o&)GdMc`t{K&!bkk=tL%4H_y`GFr~XMCBY6_py>Z_Tmmgfb6PerR$vM8&4LMNyXl&KFt$4Y?5u&c9|ngT8If{-fgj>q&hi>76z? z#;tXOTQ+aVFW2~o_`Q-{&{2UJ?{H@MH&o=;=So@Oe!IK&v|Nt-c&?WkQrGQD-wfWW z%MWLn_+a=LajkpafuXk~kdwW1^H_nif-3xhfXzolm}X^UGxC)~-tzQNS27vd{%zhp zt$ZGOQE?qQC?9M}^|B8!7$*C*)q)SL&7yF;w;_z|qzJxZ>xy~PJXPpHp15Q+1;SR;icfZnjsp z9+8RxNB0RyUqmgf6<;wP-o=d_TO~kQ&PK+bI^^nl6?t}QS}^K>zO4Ig#;Sv44qGe0 zCmwyGakAL(KKV-(cKGSCp(T+HmBECk|8+#YKq5)Lt>o8Olhtn$Xf_r=!89MK=79dNg0MtrW>iM}~glaFL{4&;DG2K3bc}nCBEa z;AB3WKoBH+>`&UcH)9Up`_61mIv0fb3e^b&fB2+X zdSAucm{yteGGWiTvX~yB%P6x`;o0r ztFxmD_2k*F*F0d<_vd>tq?_JJaUWkeI-Y;$Ju4sEhWboEkGO-7DWFgOb8~}bPrCCX zWjL~NQ}>8}d957{!d;9T{euwqqTqqJS<<%DovjD3vp#MPe8|DTByKAXj(kvGWBDED z=M==1AE~lQSKZihF~c;`v<1e*6JXahvoE{qp*|Z{s^%Aa_5OR46_~k{0j2W$*w35^ z!ZP*8$*={EzQbm}BgAEvruOK0Cmb?2I{Lt8uh|E>En6+%@OJDgq{*)@c_1YS<34+z z)1(0~4e}?elmYN;+@KGXdsYmE4M6%YhTvH6<0O}VN@U{dzGh4=>}PBX_R07je5QHs z8;|s3jj>z{E12uJ*}y#^?vNqj++HwCr1+(i}WBFpIKIt(}O8nnTlB4}~C z{E=6W?0H~OM`Isrijb_D9V%g7HAwZZH1uyC6WX1??!F-ZEC^|4eF#zPj_+mLF)4DW^}FAETqoZ!!mJ=>@ZBHgDX^|;Vf{0wN$3*sgA9n zBHn>EyVkATvBRTa>n8d2Z?)M@(5x3#Ci2CBb{Cuzv!foP+VZ=5dvdtYcK~^;FxNBs zjSbJwClazYJm1TPV9YEmkiTK!JLnf(B6GM8k#L>yZHu5`S2u@ZItj2Iu2Pu~kpnc| z-rl6!HuK(n1HcwY2KL0OG6$7$sFTT_XLmCNt7 zi)U`|c^`*#@4<%kfz*d+XaLgubeWhySZ?*>WaeJX&ihC&iKyDfVdpW+_}J>Rj&%hY zIJz$eHXVS4M&0!eFL~9MB71h67?*X}So5oY*5{-*g$auca+Nt#8WpK?o^>Cq;+854 zxL2Y%^h8<8`OZ6?uWrRD`lbSsw%;Qtw*0cfIq*V|e$}}@6W$Yf-;L7L`7*l6&4hM6 z`_fahzC#jJR#dXym}Rt?J_P1hDl-1b@Yro+wKzlEIaSVP;+Hmqg;|xBf!L%+oHW)e zI`QH)?;kYPHA$gXwmaLWVl%6{4U>)B*{t1^aE%T=sNoWl-{HXXKrOv2158 z@yoPdxXWLY*Mct73o-*1Pyt9;M3plZ+^{z}sgZCT>+?Kx+I%s*9N}?h2A6FTjn`_% zp4bbTdgkmJdy0IE^bRIP7<@DJHzG2FZqlsFHU*;9X|M-m@(<6xbJl>pJ4T#LS7bQ~ zM6QCQ!3&5zUuvb-odmHv({^_&;j46dBRF&^w`;?Z0lXvn{h+Ml(z8Kx-&SxUP5-Xv zU0839vNO{KG<$CYd|KQM!+sMETFF32pN8w%5t*GqAifvH+*scZueY`@UQ;}MQs%p6 zhxao|xM|s|Fq0HdMB8KY0X%RuFWVQ3THk}BpU6&c8vl~@L3njDLJ&~r(ySfhgF{V; zOH>yKyw!Vo`pj4~I^mP=Rx$UBf%KE%IEx0`9-V|o-g|RZ;EqNzv(w^PSJ+y_diHo? z@f*oo-{z>gj3;#K5#D{gg<0MJ@sJ+7+&jE{TrNCW@3j=7ngzZ{JDUqC{KCN}!CAT` zHi=mbzDDYgZd$OJPUa{Dfx6BX8#}fv*7?E}NsX*bDohi}zmg7^Z{fd4Hpl zEhhx@R24DrIsffP9cu!c6k*iPX+VJ{v4{4v^{y%7{mQr? zmh8UWxrU<@dEDFF6#6Aya$@);dbfV?)3-?wB-qXfd_`Fx!Kfv)@V#ieQY&YQ&niTU%N%4Dy4Ja=Q91@k|b zloV{H7fcrV3-|QKK)$==z|Mv`;`D93I{W%u8c<|#`Lp9L5=YL52m26Y82JJOX?BK1 zld2d*MZEs{%1H#&MvL&6WW3Ml7=P8(_UA9O)nof230Kp&AXtT~5we`g#8BMT6t^?d zZQ+Nyewv)(y*G6+mPm%2Y8W^RQcv*NnY;M0Lgs>iswAvcyHjNLC?_<(I4K3m9t;t~ zWlw6EuRHe{iH*u*h;pWluyd5+t5L~%rN^gXM03EB@q<2-OJ(%w!foNuGQ z@@x^q<%w^9sz1YIV^^bOWu@&L_LK7jOTxrF*&S0^@wF3A%U!T*8QH$xN7P1$vtdor zfTbixBzBBZrNe62=?3LG@!*1obOA`)bynvo6|aS7W79DibY(~{E^`HKJicnzSHIij zGuiL38PY5(@agF1xO~r-kykad|BG znb0J6Us8jbe3FLqLhUB9{?cpuov>Qqfj&9C@T+*-iN#r2S&%vGqhX4VK{|&q#->GN#KG=GF8yxW+7K5n2Y7dO!e*Jl8=K!Z`(!9TywlZ*@uxH$0jx0 z*(Z;kN8V%l`bLP!rncvqPl){r?YTcDQQQyzabyVDcFX_=%+E06ELXfHbAR^I9(a@V zN8B?!`Ede+dQT2!{dNdd-AqEOM@c!l2^@40A(^t$2>0Px?E1F6ly#3zok{--=?x~? zSDwDt@XmjBkd>RZ=#GzWPnK!qk8pqTJsbtelH#dxP()a_d1aae46yw`w0P$|Vng+h zf(FuLxo01qJ<%ocSe7Y!C>`8szV(qskD+u$sG z7PfRbb&pSdpg`#tCL?9`rcf)>CEc^i!QSXBfwOz20B|7+Zv^`MQEO|HmlrbzrG_(3 zH*9><_raW9o;|~dcJPPgH4dYVBn%T9{>#((AcZ%E6{b~oM>j$b^gwcDucR{ThndpL}UvR{F{+h6cC%(|RX|S2&LUW6Kf2sp*Byx03vqU3`Ayyh2 z-a#tAj9Smu6O-BqHd*(=VuFMkR!1JORV|OF7#N&5A}y~s&-k1b-shDL)n9A`bA4Sn zekUQ1noEuYA7oj8xBC<0(vFtk^UkR*N{LZV_HWl6J0qtvAx+!k7MBMNo*GHyb9H&X zv-1_Qb)FBdJWU!--i=5xpY=Pe3ZNm06MjQhwImnGsVnB(ap48{VvyYV=eT+BtYC(C zb8?UO2sfEJ>>LG(m0$W|%lE(*?}mStg#BLgs5xZf3IWrbDl$T~0$m@>N}ZNe&iD^gx7m;hCAz~f$h#uK0kuR$(|D8MXyMrg`a!QY`UgOxXQ6G zu{;HBNZ>YoqL}>8+pne2>V(yIXvmiJvvv&@7iM9*5x7%0r1{CXsFa_udfH&m4@vm1ay3yK^iW54JLm6@Gt@Ze71P!gD}b7%_Q-QxF)(xrCS^V~JP zAGD3YUbG;=M@cCb>9PT*Cid9@8=s??U$=%ZV}5emp4y3*k+a}Et8;>GEZ1lI{hG$} zr8YPBcc8-?s@t8eS$~p!Z)I4ONuyvyUqqt4qiukq<5dpOd7SiUc4ukUUBnQ>O*6!4 zOO2>4%vd=oM4#rYqY4xe2CZ%$mr%QE5ozNm`I%<2gRS05A|uBm9sS2Nfq5^>p5=Lh z67)8gODo9lyb!|VcEC7uo2Y7w4=%$A-IF57qe!XKU7a^7xYpBdINKf!QY zNe0oh*#7RujT;jcLC%M(yg`>i$6w-T=Ww{|AeM3}x^dy|4hv_t-XDs&`S(>yfa|h3zXg@R1 zU7xw)(SiYd^3&5jEqke0S?pNsV7ZyJk6QH)ACdh50)~kSUaG@HF74@NKV@WjW&#J` zBRVu=WuP^V6fv68%NgDq#8)Y+55G~vWsb&x0w*o!#?ojv6l6pMN|T~iYV^+9qgHs` z9lOhK1l>Y|9XMsSZCS&$Msp~u!NoM9JK(72)XyRF70Gf($FmDqA)?`D`$4$zNkgi` zG4lW~6$fdWS$oIXD=%{vmd|0y)P)2by@NHNRG{z85{7Ddi!Xoq?7}Q5;yNBQ zNV~zq9BUYhZ9~0f^0JCQgCi?O6R4dp8^2X^K(83i7)1HMN6MFIGrCMBR8 z{kE^-@OeN{To%%KrgkYQCHbpK3q8dmDr>y~f!!mkcbRY8K^0!nXYyUdo!PkC%q;r%#KD5X(n8a2|hTbKNg=om`7S1P1yk6 zuTF0NGqWeHk+63i*-*BqgDzV<=4{>v^XmeaB77&ndoS=Db_T&zpD}vwFXzQQToApP zG!ID-z^!)6H?QwW%fK`4d(nT52?zZ6F5qD*fbt1`v@znfgWE2b#=h?O29iTb;+3rX zJ*#u^TgzVq0`*JsiR$E+pwnq&p*(7d2DYEZo#m@Pn)o~vE~+iXsWZTb;0ILyQLkgg zSAbjCg#l*;`0*O&S&`@hE1p;WM(`(%-d=BBR3XuIE6*>WWX*dguGa0rgJEQHt$rqT zJJ;D^i6ymU$Jw5T#m7vguVnVjIUmd6mcL8Nm8|G6(kOk%{T?Ly#1#p(zzrS~3(*^2 z)Cv?63(NyFTXPqLLo5Vj-H&&YI$P^BFwfEo!QyT?UqrL2T61h@DHCca@mwI|@ z%j4J(qVWaV(nzJJq!^0BR08R{6X1~s-)=eV7rh1dgIPITXGP#eFFgN2SazQ0*U*xd zP3?8u4)-Kx0|MKYj1A{7(5pZ#omF7BXow>M+0tsAw+k{{Fvu`6@=$YMY=aLBJyHt8 zW(qzNw}}&aBeM=PFCLyXLoh4i>eJ4PG3Bw7wX-fw`FVNlNgBVMaw0bfH5G;MS=CVm zWr?GExS8c~n0L^l7G~00w~QY%Ckz!=NMD+zG@r#n7Dx#n%cu4uWSKscJ@9guBy0Pc9eH3+gbR*XRHk%<(v<(B+JyS(##?z`)c zpIsg;1TGcId5!C+GTJ;774;IIW$o*26myhtncJ_)#{66gp<)%d^Nu^qvv)1Kk%DzK zz?12z(#UF$9^iQzN(=3eerZ3jAGDRAz)aPA=EY=bB5*OTL9RUs?Am?$RDP4?SuqR} zKcjOUXJ)=RUib%02VXt8X@i+@tk|2Iu9-Bi*}P0fZw&7$Z#-!^3@FrprTC>ius1um7u1+GIN zNjw~lCP-5Y9apx{oVe}Wr407)q3xh*#vu*Oq&t!cr`b`)aO}gFcT;>l^@IVb6 zs_-wwLcZIZ_MhxXh@Yzb1h{%IirIf3Sb+RWf6em%OQ6zdLCYfh){lxkH4-=`g+4*B z&&4KxVKFCjo95Q%a*PyY1zT9lOp zo7U7u*~nn5Xx#}u-xkye@@()$q1o$rSK9JniFI~n35l}Ff+xyvIqIArCYtOgxvKex zO2*DjH!Nyec=&s7)vQ|vypE85L?}I2b{15*vSITfOKrDFUOa}7XiY2K}c_xN%&`_sBr*(8^3P{eOxG?(YMY8%E~P& zVHhEx7uORnuokznKRUx(YRkhlwJFOFgYAD3tCg5(Z{=KP4=8$w7N zji?SAM&Z7B&L(G<=-3)~Lu=f^xy)g~Mz6j^;sE&6!$Oy;(MyU&dNz>8Hw7QB+l^Fu zIaRFGus`iV_Mj1cSKGUkp9wMnrwcLzI;z=~UVXp9?l2DzPv^gyv5I1@aad_oCY8OP zxS7*?qGkK8!Z}^atE+bNK@j{|^Esi?&yU3qM74$QI6&$T8)TgVtExr$k~GZDwjE{R z($+ok$i~$c;DMMV4cJ<4{Q_X*7Z8`qqz^yJJ&Dz>AK^}fBFT=)zUcB|>F;Z;eDZ*! zPjKip10!=ep!~IolU?AsgEEV2zJo84q)~j6@#$jpmFTiEi+aP!6Hwst%~4U@bg!-}-pXJ5EZJ>)wUY6~20TAmeNeU~M$ zTd*ah{@N%Th3boyMSX90R`+X!_k_}-q5kP>3N3q9^2(Quja(jg#arIID|mM=p1l8s zs8X;)Lr=Iak5oEWX|Kz6y~du>B8nq1p#rtcn)Xqv=__sFgS2fd0zN2n6jLFOmSIQ8 zdkWv1)r&rUw47mtgQts?o=*D=+r(jffFqgp7F1}U91ICXw;(T>m#qbpyh5v!bDzE2 zd~Ctzox@4-qAFEw=*qL%I?7_I`G@b_*pl3*CZ5Ws;Xl0wbx8L#;-2-($RSKU)!7h# zVUVAhq(9^FDZXh}1ZeLK1|TocvS)LsHZn-=2e>l6o%-Oq2ju+n1c5mvla`8ft+KjL zQY=<#1i=L$FnebZ0nMLhm$BtSc=7RYl5L=S@u(25wJzRX`FnNx;+e5ju7i}WXTges zyh*B-asuc6SL-a|{g*ugc&XSL-KW)B1XZD?AyO{UZtKn?>_jYT_BKh){&^ogT|;iIgIf-+ z&!YJ-!3V;U*y9iF&Ko7ByfaJq!B$3O5xb*GfLoRVxY@VpZb6f>QJFG6=OgMMJcaZ~ zGn$WK_dHAlo-VM3Q(d3+ZZ#HQeRCtRt7%v0u6r_R*vY97dWs+k1g5u>4h9i?&DXlmkKIIGyvy0ly&K!Hx?wlzl?J6Mn-L;$79?UBcGmYS`h>+U zR9wRCVW%-jA8+rdh~8mJb)i7JVNS#2HKm@2p*(5aWx>Z+u+`HI zJ&a+dM?tM@t3q`fQagV#;3g*JB!VvbDWCYyS29%0$tfk2j6^tQZKJ02Y{!qxz;8zi zluX)EpKMzq)+@wQcG>PuxF^>VuuR^^i!Re}?*Vm_S{Sq^%<9*+cjK2vC**Xh=sA{5 z$PYO_I|UBN9$pO}suskL&*dwyde!(in@7t+D|Y*MZ!1&Ei_ensT^pv#JjL0hMB{;> zMqC$5yK#OWLCEfuZiB+}lvj_7O40{jI7g}6Eg2|@v1Ao@rM9IF3oncurL3Y&}YQJnhAp!MP~W zIa6U>Ue6ZZL0r=KDsZh}%2@?+SLuyYpGLke42q2e%qGybw0LbMk)#1WJmjZg3?$U6 zpV>9Nfo7t|tgD%)8bj`>c6b@k(652wH!O%47~Z8jS+5gqo87zoRP9Op^-JI=6-al_ z;ef{AH8MK$gd~it-N-F^^2dDk(Z*>_V8oDz=S~`lW0Fde?838U-0FPU;ex`9Nijyp z#FA=?<{*{CS%kl|E^0~ti{isrxIjt%e2W>qTqyPQewRd^8sci;$5?Wwj}jatClg){ zIU5&`DhXMCS-v zjx1@{{FG8!((__}PVXJ(#9;mMqLTfa*cHxDW9l-nUe@*nxw-E_(>Wdkvp&N^0f}mv z4qv)o-j(mxRMq-#-(+C0xi4>UoXP)kbS~yOuxCWIPtmhwARKP0fzfvKZ*BJ4#dEsf;H8!!Y*-LAk-M*2G zu2~yD!%8pth}qdll%!%i_i`FS$-0_&yY!(I2_LSDItL0URo&1u4x6x45z1s@2Az*z zqj4h(I-P~G-4epl9b#$0jX|#2rZE-$ZzU+cFAKKrj)+X}n`<~zY=#kjHk#gr>-fO7 zEmqClIIW*lx`{{c8BC`O-aJ%eFtGT-xmOgMVSOeR%_w^CRmJqKmEcrc?z0-Iq9I93 zw|2s=1AM-lNrTId?j3g;Qmj$K5lJi0(Osicy{>jI1IH^#?--dzCkWoPb_)DVCG|p| zP8BInO|kgSMr3wUy!U;O0M3=o|RJ^J1?^uxT;uPQd|p~C-Z8PYOTh- zKv3QZuH-z!6j_G)+s0M_8U%eu%~&}p104hYFIHJYDtnhf!PjBL%x!F))>R*n4{lz0 zH#gh0Vd~0E^-gpV^i)326JPP;z>9CTg@);+C9m-DIKzTURE>K#x;||ZH^h?VJdv;| z;Y&F7th=UA{OdiDK|Y&eZkSjWmyva89A=HOE?A{u38yW|>zOHbRJi<19UN9%&BhyF zpi^U75@Hz#=1VG>BTOQ+T57zV@Yn>Nab9pEJAYW*JjVSt-ork_jO4kzB}L`!&~s|o zH{1w$cxuU0G+y&@TAxFa7uHw%rw8yLi;7l#xTaI4w5;hta>b*~jg96tVTpyy3dr(d z@|L$4hk8VyOPd^elv;c(*f$I*&F4gPGhz;gY~WAQs5vmA%dsH~WG1BXQURVsK8usPc>yAC`S>WGcN zvqpraa|IoaDvKX#>9d1y*?Xr$qFdDC{Pa#oSMZaaGrccNxHH`^vZ@Edv?EN#=W9&p z8-=QFRL0qvm{h{CWZ3nEVW=ugxX1b+4jFbP;qsa=nbW;`8tAtBj~2;%S?Z)H1{!#J zZ}o*vrt!tD*P?|3F-s8D>Z{M=1Of!t{XBi1J)mU;o+58U+fj322Y>YD4`he~r-WZI zgDziRgi76FO_y@MC~J9vWbmg!ZunP7;&+&F1kPihwnT5-xRJ1=Vi} zT&t31-mTUf6RFVHm87>?;)$BCx|iq}XHTny@o`-Pi#BBQj0chYeZk2^qz%YKUpZk2!&3wr6_1O!=z-RSjegrc*uQwPuA}&jKJoppuWpoM#NW9w?W(u{pYhWW z`Pa{FbLqgFDOT#C6|3AvZ(lm((KBF{gi~ZxMmi6; zvjV{OGEMDhMgNUkjvAmC(N5vdLC_aGEmfHOYyDt7-}{j;&)(#(ifOMwY~alszuulI zVxlboKy(T_RaiWXR}&lELF`*#VFQcmi^3N5*VOd_c+ROYH^J9op$IMvH72y~ml1d` ztvlU>BCjiTobu)8_|)`{^k%$_IoUSXfF|y9XV)`)*zPXVOMmcMVanGL1K!G8CdSM{ zhYSKk3X_C3O4Pw7KF+HqQn=8!;h`%`2Hk~K3_&W%8*FqVc$n{4<;lG2d(i^dB{>$R&%UY1_WhL}vY$6CyyX4d^leJ{0$ezrK}d$r2yjGJ z@P$!Ap)2?EnjST?;!CN$DC=!;oWtC_`koiV$oflfr_-4v>~H)-OI;U{lzVak}Akz(}OkC_!jiqGjt3Pok^D{5g{;aHG(MSJ0)Pgq)H)orTM|Lec+9~ckfm+-( z1yt0IBA1PHVV!)!uJ$VN4 zuofjo{NaE5D+aw)93j|V0gZ+x$ZiPW;_{1pXgYENNZR6%^6wWqhZYZuZ^N)=e1Bts z|J?ZtF4STO3~b1|0_mrof!XhWD3H@9YkIK+Qt)(MzhZFz=bFf5kXRu8XS*hq(c6DQ*3m-wcj!uW zupWtC+D|s4*9mwAYG|d$bp3;M<&e`TTJ94bUVl6_4Wo7!maEyCC)??thLXPA;TyM* z0BhmW^yM{P-tPqQL^G6e%zi&Cj*c^4Z~Wo0};?({3mOq}1lx?EFgy9P2cghX&IHr+a(w#08F3Ngk088E({s$3nkL7<6-XUQ(<5c;^_GbPXfKLQO5=eDo z=%NJa-#2Kuw7Gf$ms4OH^3ese2mU+!9U;c#P_CCR$)rdDi05rOc%sHah5rUtS6fBG zvwen4;9{`YmyXAF8@X5XkcG&9K98w06wWs6cCG#9kE)dd=Y1XTD;z&yaQd= zl(zwi?S6wVsz;r#pDeJ?^s2Q&QC<8F@D-)JJ>qqNuUgly)7Fw0|Hn4aIs&;1jg!p| zCycoYeV4ses=sOLUr{V9o6I~&^&1@6PY#dA?2n0v8 z38ZnIR=}3~?{NRYu+RI;b*^Wz7PWIPi@|sbsroV?azPd0h@YpqxbeR;-FGI#dn!6FQjERv8>mdtZSFFEFeE)E{Wq4r(XYu%JWP5jrE6+jbk{^_ zSoeTD^h^0;wc$RB{({;{hBvM28r8+&>FUMm+9cbGlQGPr5TWsG{u#XB*xFy=Y9|uq zfhEiAgw%8eH~H2iIHfV6(|?#kk1f~-`?-#GgXle=x9V#lx5!vcof_E*prDnDTlG5-S%Li%qD z=sv66iagB$R&>VvAWt4)q2*XrfhSYo``?ZM z^%C**blm}TaZa`%$wGs&sAKpKV+>hte$L6N`?pZA!~Ycub>MfBWiM3$I9eJr;fW~y z?5mV9QL<7pzkU9Equ*VIT}xe@2>@hqLRp+ZIfr9|m6CnTZ@wT@swtxq_{|u1{ww2i zgn;l4>%IBbPu4*@?U)XUjOmP9k$)L_7;^8B7`&3PSikoO0I%yU-!|7I(NGJKD$G?D z$C6JYNtH~ZICdqzg(G!cBR2mx;dW%(tdAD~6)Epk*H(XZg~)oj`}hw(_8(C5ekYj! zv$Ty$-l4yR_qTL0l0X+}I*%YC`lMX=E5XL$N%8m6S@y3UQ@yYc%QZ;3KZ0+S64%PD z6_u5JQ;Yn!hX@?|c&jaH-SK0k8S9>D(SoTyKIXp zZlAw~xBiZ}V94)SKD!EYp~TeTgXg)KhWup5Bc8@6yQdN~y=}IA>*L()rIE01W@zy@rf!C0S{lzxj*{EJ(Dqrx>S< z(%1f%QUZj=8Q^*KZ}|JLUB)&1Z0UOT=H!+bZFa5nf78pq6jV%(BMt}8jQS$+=9x>(HuJKtTuS%!6Zuvgr@P7bB?h*-g)Zla1quDp1`XdM0d2gEj*tK8%MF< z0n6Zuhtl5PjJ$?N%Oe>}!{IqGbXXi2$5QK5|5EBNlKbxScRU=$dLb^=<@Y#E|^UU`|XkEbTUX`=mPLr0_9YXtxZe-GF91ScgOC2Ll(-&}Nbp27*3>_z zr^ZB|Ddb3FfBgX-yygfWm=|&?IqsjdS|bm1xo;_T5K_or3Tvm>H@ksx61h4b-ip7g z8V7$WA==HyRnSnboIM0I^Yy(W0 zdjxl`u_uON-RGu)4Nq*Xjc)z_>1I@|keq?LDq(I;7H#MUO+|ft)=0WXc#6rl6hp%X zt&>?coD2fn?;nbW{FUCp2?046)mHK0$H^cAOxwtB|D+oC+X(*Uuk}*^Up))_zKVpB zUd*|~_9iPK4SbnakWJ-9ouRtQl(LHs@aM;t+ zAYLiFIWXHeR{Ck>HDL>C3#HepuD8i^irrb-?j6{mK*0hXj6o``RA;iniws|e*C=BE z95cGATId+r0fOXH3)BUF>+JaUVRnX$y=ixQ!@QO32HU$%N+D`8f@p6(-Dv2`21Z`N zvMAaRc)$=|@bu{Y+q##3psjgQNWq6^IasTuM%EbeyV7B$*HE9d{WGXEP`>>Ip+6!{ zXS0I}r?@MkLMSugarD}_QhB+iIb{0>OP?Ag{wch4Y4lon*TsQI%OlIm9?9Q!5T7Oc zJoQOSB(i=ek zs_7_a+o&z-ZpbfEZ(%OL52Xc!@pj(@k|!TW3sdyx`e*&W!`VFtaZw^D9rzEb{4LoV zz%>PMC1Cr&0_~<0qWbFMTyk%setSjD(+&LJ(g}l(|7G|} z2~iSJxc{N1iF+8T^6H)8{1B7p-M=ja{lT{Qp9M1z$j{)z0Ci@h1k7YOO1PV$t)wby zw(I;$=Oqm=Gg&&Ij9K_2&)g(k71rabl`o6#mYgsRQI-l(!@ZWLAspvUyoxzA2461v zh?Md#R+a#2YU(~g`K2pxPIn~%;Qky!`t&L2*}ow${%-`@_8mko>0YXEQ8O2PgbV+> zF0*PB>-?q59qvR#Nm~^Rzo`jtQuX=fH(H@_#BWW6Ct?3x5vl(uVs^$|*$Cr4jL7@= zmI9RhlrcsU8^*=MOv?^ilz6HulV1rsnIf#Uldp(Y8PS-0c{+N6u067xpV}F> z3)DI~Y^#pP`pJRFQ=4weUAsqh)0}d_?iIY~0tT*e zL@VGE;mY@nWB)3NqXPa_8XM+e*0~BPG*mT+iIdnhc})43ls=4&6Y~0-gie3F<9!V% zY}Cb*o<86eD=r4a_iqOCP+`Cuil6vIUX1-s&p;oCtwUci9}^jFP5!s}0K~y(%A`#= zdR<;3Z9DabMw)x3iT49m)52PNqlsJ+DG*^X2dyABC&B6a)T_HdyO8YUl@j1Kuph2c z{TZX<$)DN}Xn?-_gj*>Hqh7f>KKCx_uXe^LhZO%kA;8YR`_CRlQ`8Z^XXVWEfA@R; zhkIM;W-H^o;$RC@2LG=MB}+J=QutMW>tjjEltmajNxLpRepq<(#8an9UQ>7Np{B!CFG+eMpftNpFCa@bHu{f?2STy>uTb#!L=t6E@2YX?5#H*%hWD7z zk1m;8lSk_(|J7{bOp{pqaNeG-4!{Q*B%H)|CfN!~041;6U!CIQq|o2R`0(;SP^TID z-2?HzS(S{kqGb=zK7vs@=Ty^p<){lRa_%q`b_U1$By>nw-n@1xO);Wp(s8`&Fdwx zR^rfKMxXyzk}7F&O~iU8Y7qB8t?K|_2md!ELtc}kIh-Eihi>^t^Z);+{kjK7CoaDb z>w37L%vgh4K#aDq{R=3C)lnPeXn~OPgDWJD@2{sN|Ly-T2&r_gC22^&MAg-4P8$@H z9e4lxGb~a$)x2qIiV7iYf>(sv3!r{Gzp8E~fwOcZ0g%D@)!Bb)VI}{S(pBV+LUmFp?1L(+=%^T7^4d%NB1IeE5kGw%=9#-NRK z1wZFVMtlauxGI(>we-6crKvH7D)+bnnTGp!B0ggdI)nr7KPwz~sO^dynIt>Cf>TF_ zC~A^<**}_{nNDVUR@L*ZGPOL4_Cp zEL`97|F)OY{TI+ANFE9stSz z7p358#)FLje`@lk#M(@@26Z<90ul zt);;jYP!ukvn&14`qwwd>Ybk^KY9e~^svvgaX_sKRK?i9LM;~WCaM`((ZvDr$)3VP z{>uw@G{))wld_j<>uNV7{vPlA@L{Gn) z4xUOet2Sus5_VOWz%2J*f47H3lO*IbRJV{Thj;iUGi2MY#j-&8qT+! z@T9(XKLWTg!{)?|p@C+?n|h5VlOrRb^*}Lz^o`Y9oi;PV{zo45q<8)YzA?CT`!%M&W=&*~wfCo@ZiDuG} z2jg8~Zh;QFJ>7t~mhtP*o-8x*5#^&r`d$Tf4osWZ1TbnUPn_}6Djwp|9SwhIK+AC1$01*Yskku`g?`?e#=eU`8a%(?UssLP^diItHP`l7>=#hP*DA?I!pv z8g3APsuVgy+K$SOlzM&$LiR3(U(hgsZ(J5Y3E!h1uBLT~e!U|>UeF~$YZZiMCpQKS z<<|?^pvi8r7@>}kV9;t!sxqx;eB@A+ChAq=>lc&O1sqtuPbQD0QQNEd*;6&I^19Nr^vRCA#eG- zAN_B?kqg=|_zMeTV9tB*x#$hSm@HQgyK9$|tv5 zF1tj$WWL&*Ty#L>#9c9*3_g8Kp$t;~U9(jR#`&cJr?kiue*T?#Y$B|f-{U`MWta+D zh1|MD)-qhX7%+#?2J>#$*hwn`FT^;`ojCw;RpBZUupldG{`H}De!2iszM(uxvhY`Y zI((T9jQ(x@^lr@W?xtZ?@DB8uNi#-`t30-JV)Yx z-GR@5a9tXyhh9etMVSbyYnHr!HRg(cD0(pc(ay`^S1OZ#(IUMXnY;5^<{HC3=8fO( zFs9;qL6Su14l#9{*WD{hv{D-I)&N#nCC!Zz;wu3YP_A*<8#S6@gjjL?H75RigJ`QwGFXt_>N{oE(#-a~0C~+eU0k_H zQplBkxMfo5hucvC+ll(S>yHAv{!4#cBDqhD3LFb3ve8G)aipB@2-NLKeYp7#*|)HnC5cTtH2*Jz%k3JKudzP24&pC7zw2aL`rJ?BQ=Xdi)he*k zY;9j+E?xLEibRB5urC_qxy`o|S^_&x1ht$6@Y1p>GLRe}x^cfs6hn zwYnr4HpuV4t^}j-pjsEt_v$@z)p#kAR^CSE$%azQ$pU$v{7P8$Jm28Dn2Z#nufW#! z+3Rm^2Pjr7!>T4^(C&tA9Hz}>g&pLo*Oe32X=w=B`LSmRys!V*ywBPr{%tJ~% z=&nn&CZZT(Uu*0ypM%3iTKw|J^af`m&~;D;uEZ^@ZMk5|Qk;#DPJhu(agXw3hDYUf@s zjL5Ta`x=r6+{!-7@z8(npr%8l^4CT&Edx)k6JI4%aX`|i4S@&)!-$1$P7^h(LrYJ8 z=jVD@kg%qz-J#t9A$DEFh5PR>(09A-lniZli^7jxtjA_*HV#wJ7b$jO$1UWm*C)dd z(wkP#O!x=tW^+Fb1c6^bm(Tx+5>TSQ5w3Uv29M3m@4%x7+GI9@HZ19n)6+S26NM4N z&!$!$?-P#Yt`+}_>=;B?<@XoQ0X^C8z1NfW&L~gv!@=tuj1|6GvC_vql!AI`(`>Dr z-2NOTofDO4a7=kb6c4Owh5jq@kCX8g+;Zy-;c_Q(O2TRuK(w3xXskWH0H6-hN{bkE zpzWrK&+SlJ=$6KT!j}wUbDf_;o8R_)beV$wZfJ16)Ejcx-dFc#boHN&op{KXcJVXZ z1i-N7y|q0qWMZ4cQ=5N*_~(OZ$<(Sh)xmW%sJ>s{v6UUPy>prk)6_hJ@TXE}P-@#G=^ zQDZG`$7sBdko9{3y-8n~hy^r!Tz(uZe2*EB;nRq%Q+G3xtT+bVllrK=xZSEiDyLtl z%r&MFEUOrJC-eQxRnX(!REo%!K+<;Hxv!sMvI?}Zer@G(shi=!Vqel_JBw8#9Sqbe z$EYJ1keK!8_W+(c;=r4WwY({g=1N zoa&?f-vP9~6n^p795X(^IU9?lW?*)r?n$inZl+CGS#o@mkww4MV*aLc@I>B7^kucX z=kEJEJ5JaHpVy3O#HJ8U_u-ZY9|;qzZ7)TA5u#5Uh5}`LW~L2)t_9qQcC6&}`|8=< z8F1A4K=Z^;>U>)4H(HK>ZZccwNjcZ(X;vPKQcY037%_Mp>A8@s1-*Aw?S5OB92ShF zs6?n))g1mHSc^c1!guTU?2$T?+-Yy*YRHL7+$<2652fd5JFG)YnwXv#15=%~%cE?! znUKQ1yUpc$U6^yF+Hr=UUxuwk=bLv5${?i_l5(_tJ3BlZ&uX8iOd=6pd$3Pi(Yu*O8*%!71Z<2Gkx>!m zXOv30>qWW_Jogkd0{pXk1AgmyD{I~VRXs3rbB;va2bGXORg{3$k_eVtCpJa0gUrk{ zqE!e+U9(p(=NTZItx$`x1~|l}E~s&byW{KY;tJd+>=R*H__^=8LkLbcD1n|w`3|i; zDocXoMWL^mv52n1tdN+T35&^bj4jB@ zaZIVi{xoU_qHEG9pDJv$k)=w_dtUitPut^6 z;?PFO!FjLv;>tF*z>O={(`(bji{e9)Yy%f;<(|ZlA#}sH`8WxC3K$y(cLySBHi*L6 za_S{krm)Zy6T_=bR5@7Ev+V+>(1i1yG0@mO1FVv;f_16eyeyp%>204W_LMPMJ1Efr z*?9b&{Q=pLH#L|qNhB7rOy(w&zGu+iK<=Yhyir;hvSGK+0u&b;Eh$_O|5L5p><2vF66+xY(P4+QEDN;Y}Q{7}7khIF|gpXNm1; zrPn&hI6^#?LOyw;XJu6(&<|vDae8LUP@L?@honosQ=YZKIb~|R6Yq(6t$;NY2G-~^ zdnH(i#j-PF^ltayo_eygueUW^cAkqm%f5y6{sYm5d>{tgjd#={1DzI#XJ;i~i&4Xk z|LmM?B$3k}w>-MAFE12Th2F5memQD?wb0WOgxz>*OUbY#!Q0u9q4KM5{75jIIOnlG zBByl6df z-RPDq{d?~&jhOWFf(l~9KJ7hbSst}B%0!2qxugszj?r;Q=zX(QV8+e0cv1QePBIbL zPa|9%9Q68%UqC5}6u<%>wd^S7^EUp3M{VJ4xqkl^y(aTOBK}2}E6{9>*Y_X#bU!$0 z=b>itm-8Nwvz8e{dX#~1Mw>+_o+a`3wQ1=H=RPr>CoaGE7J3iTg|-`VH8<6qX48Z; zB@H0jMx*WeC{~4}!c3De9C6?4wyMA&&9tIxG7X4XzZ=KM@eGtuzt-5ISJo+MVL z(tu^F{d(LU$|Ec9q4+SR^tW&wxP1w1+i3yC+@I>%AX|q)QOBq<4I!e>wRl@~)52*{={$M!v)u*vtY0KV= z5TluA?y81tFstY_x3v^oqdq!$ihx}i-+x*yB>YC5b5I2%J2v$j9eMj)A^@bdZ0LDR zk!vZw!uc(ih%Ls_7>3!Z)6>Z{i2YVX06@=p@P!dyZk5JT;RA#WrV<0X_*o9J8ahusEsuoFu7iSNnQIGuIVcSbZ*_cn_kDhb z$##R<^3*koK3hv;zap~pCf;aZf3=MJpM0aq2c&z_C`>sVj`7kl_*URH-1h<8`Fn?0 zRa$gK=mq*v=3UA~m%Cljg}SXYzrTPyfxDt)>E(TJNyv(oZfkqT1{Z^-d6PXB)~~rz zUnl7>fNAwt_pRd6O=4DDvaWmfvZN1VHZX0AJV$3)cm3ePv=QnS=PBE)>E%oE(eihh z47nwQY&}g+=esd`aK4VMARNj17O~gVc2Wr2EUaYtH?<#Jxz8)V<5`~dHd)?PC5?dd zMwdM2EZLPgX^t33VsftxO*>zS9SmW6w8_Mm$#l+&?IN z#5eoNiwQ=*(>Hhq`EH}@S(okSs4Sg5Bao^b1E;@!wjS*Kr@+pLe;sh8MW>nQ5 zI@uc6cvz-dCNDtNC>12!;74#8TQ*|be}pBcRu@0TR&!KQq8i=-{Yd=K&V?@O;l#+u z_^4>D1f)iaL@PZmO_cTH20Nb<2ke;j`Fb5aXqtjQ0f5e`D1CcWpMy_Y%QdrbO#K7J zw3*CfbewFb;nH60NwOAEk>JG%)YPX7|BYE2CgJk>_*Ce5mhD6C!9x~_bWj-4GXgV8 zt=;EY(BIcEn6)>^mgCu`?(#IqvZeb)om2LXRORQCbzxk~gpK`+%Q-X2Sh)|2=Ss0< zLU%=Y{l26>v)tJQ+VIWbh|~5D?~U2JbzqrM<-#SNjdzG zh8o;)vc;Dk8Hn(DASq}pSb82f_~iA%-iwo_*IA*u_S8=oKN!p(93gqHCcNMm$a1*G zx;u2ZN&_$IH)&APj+uKG@J}Byc)RDPY5yRHkWYgU5C)6Rq)!t26HdSV_OmFFXH`p% z)np9SSJzFGerM_a(b7SXb`}mbg4Z+m63rknX+pyl}$fYX(umBQhO{J@EAKhmwulZBbpm3w(ObsHa zM4e9F{GIlBOzfYaEB`@U6}f?g3^mn(goI();Kq40JBO+cvnroi3n!KR%qkL$8MS6` zz3{2E*EKMxo~SwQ!9V4_#yh`S`$6%*dSjxWH+r&w-+5m)@3j}Y zbY7fg&!1lCKBPD*T3i0{vel=PiJ!*>i5LG|%IEYR)GWkbur6P;YDWkmoA0PIl%TLk z{z(*ksk{G!Xh0Fah?0H*(QCeU=?Zkty2E9{StMo@)>L&jI+PiTbo5(>C)w}Abz552 z{EpoVfrg9HVoQV#v*GvY+V=C!Cq0udf1yM!UMKsFnO?TLG^dN&5QDhCAoI|UgWJv~ z*ukYA!~Z}+hGuJPLc(5Gfz@f12cG9WHZMJ{y2P|^1^Twj1x!qUMH}DH7+wfxKE%aB zc-kD~z6Bi~pzGF{ln@xVt)%ofdN#wGhVB%(WDgsZrFM8+hT8W{ClA<%{kB-mbF+yd z&AXjrTF27Y>z(n@C(?&t%atGB4k^KYXNZW2@|=o8RVAe0&FTUOV`@*R&8f_*1yphS zELPXk)^qIwhgb&Rq3i3&>Obc347Z?iKqMU)A+a5L)8$H=tcDXIeXU^F>?;8hy+(h_ zGJiYsC!s=Hpz`)YQ_{qqOzz^;`z#%(*Vx-h)3ak%N_xnOb>F*2gZ|X82&vPV$Te!S z36Bj$d>E!4W87{t8RTuo?I)QLvxZNeR|dgLU4BpCt zJged!_(}mFvy^@tj#)3>6Ij5%csU_ZXE6Jz0iYB&Zlkj!RBveJ>-CBYxbk^w63EqU zuaS!)H7;Qsbm>9cVTEvRqJ_-u z`5~%;xfR0dP+qVXMbB|?e_r?ZH6pK@IzkzO%gP{HI;|}&yq7vQyLt=1o^gMQ0r~F! zsP?nyH9>NE0c{$#aG>(_9t`E-j=ZY1erCj0Reux({biPi%Gf)!Hiu9@+t`*{;h%6y ze4w&hpPleL`8D>lPtLx*J$n!z-#dIfINCqxeZC&dl>3v&d|e;Q9$E|Ie^6agZh|xN z|7j$Ez&HeHF}b9gmV(sDbN^H`vLr?a^V_i(tsF{;3lY3Bbg91>B;VT>A)bM%v9^}L zJWyIk_G##kE;6or@{ZM*E}A4-5Q5tfOZ&kG0Zs;0xyBXxR;y|NrbAn@nUC04`G(`|-p7JY4}S9@%fJCz(89mNbY=yWg~)zAKEPtXH*dXNT( zWM299g}atap=Nq6{nR~w5>-f>+QxdC$AIsZpNwW{S#Q~7#l5Xhd$uIvdYQu0VwwcG z83ScwtIjPa)xMbl5(gV-GoO*bvHLoLMq=6WkXa)2QmgBpHLp1@__!FXXKo_i_o5Ui z2-Jd|@8D=j*;IkErT^3{%@e&xXt`j&z`oE2W859G{p-U?JT5&w={)`R;z?A(DxRmV zo}6)I#*3O_20KFOr_Rcerf2zkBvPpJf@Q5+HVknqz#>^XtSA)wC4)K^V$1d>_S9Gy zkt~dlOLclZ(>5W~)^hn>_mj($>8Rsp_>N;mBl9WQE+YW6`A?FiR($U!$%5l4_=T6W zQ8Vqo8Eta5e@!X8F&2<-^?xNJhj!z2ux}Ghi#&#LFK{Bh{yfE8JQ5Rv(HG_J`e|6D zR=J+}wXjzf0>z4Oncwy(U36m^EP<_Who;8nxw>zJk)*EDcR<5CLXKjx9N9@fClDTK*JNuNaq*O$$m&KP09h z^9)^n^gVtIpKjxi=Q+qfrI2&1#T;{+W6+&#Ipra^fjHL6*$h82s0AMIJeR{((wD(k zVRxHZ7IAQfXn8IpKVao|Yx_EIW3L6W+XrghiGt0bq@IobM!3vvwKLQ;zS;C$y6@Nr zZ$Y{?CO?U^Wpg4oY)F6^C7UJfP2jTvCc5z!4;k_+x_YnF#rS>Qh9(c`c(1wjp*^XuWZOcHO zAwE7R;>3)kj|;O}0n@PUt1<09Zjm5ITmB3Dp2G#a}!s@$&bB+0os-M1Enu369 zIqc}%_KzK*nAsbyXSYZ(R`A8C4Po0z*4YOs{v+F!r2pqKczIIy`tDGj1}dSx-Koi} zAAYek!4VrLDTy7)r;tC*h!t^NxiJQBWEtAdl_q;HK;2&&POKEqc6PRln`O(7Z>5M+ zze*n;)vjC;D0l5 zba|`lCh%%nCes(x?o}Ydu22U1C&*LM&#$k|31iBAlokUh1sij(>HutTamZdC}GV$q$5d%>DZ) zcQ)z>YS}_Rk0qc8!qe>~wnDK3@pSz25Q1q$qlOt;KsBE6w^dqv!TZoLR%e2Do!5G1 z<8CUVrI{X{0XwG+Y^)v+Ebj{GVk><2z&?;w`-oNWkinEYWja{yeX_*WacXgP)K|5K z2Z3QRRfBaVCMc}9?clLu(w6qvO+iRTfCOWQBQWmec(Wy@!h3Le$Jdz4+Vt<33`DD| zl~|~i>Ur_1af;AFwK<=fI*AYi4qT{@2osQ=f~sIQlEIu16p=@X8a4blIRmId^AzB% z=Xy*o8U;>@6tQ+Ke+zwh}1um?}fj>yREvh*P%q&rU)>^-1usi5M|4SC^gr-a{g-apXIIJ`{^{WDPt@ATiV1U9>Vb;V(Y=nCz7_ zrloQD^LR`>%ixXpZCLQsLneD4rm6{}`$ine{B$~Oegw_9i&T1bi6pv-2VO+KLFeqf zQ*}U#H@aYw`Ntnlr={t9xqb9GDYnc^Pwtyvx^DzRdE&7Wk@RlUu4Wsf6&DE6q7UVF zq~RUh>RhFM(Rb@-e&COKeiKGTsRTqzwRvrIK%09K$SYphGWX(@HB*uR;;O6MV6iF$ z^4gT~HOR=HoLsMk`6-S871=Q##%SX`(h^}6E| zx)T%B)0=kW)7I6b;$?ZYIbU*LvUX1fycTsIPH5eL#taW7f&>MktGdXeC1Ki1?N>IU z`PMoP^AP4jJH;#KsMFLc4mseC4j!ln`+?u}cqH`lCnZ}^e3%xypTlC|Z9fTe!{;<1 z0^6MnSCj8$^rnJ#QgY zSbj;R@!F9<3X34~dG6x85=4a2Rk|g_Sl{l?%;*ByRZd|Zf^@W}O*qgXh<2Vk`cc>G zOyPAOdXo7ky16RII%ySH4JQTol6z2Pl1uGs`3K*Ya^8+)Bt++h@RzjL1tl=eaS-23 z@#QY2YGBRTEZK5U%>*jT-axl zrN!>s%QxeF&m514(o(^VIuoL^ff>?oeL_MW5Ed$OO9jwa*BV%&aw#0~!S1O|YPQf7?T<)bu ztKJZ}S)oW!OcmKj4L9HQoMa0h-bCDdOwP0XX)zTCTl=}W?;o8_i#ZjC^tL?*Mjj<$P+)?m zD=qOW&Dlqa{}E7lxJn7^evlX?rPd1#EWp!hF=dyvgZxB&jM;StJbz;U%XH!zX{d>o z#dXE7-^k*@2xIVuUTG69lQ116X^Y0wTy-Z>$ESMpHRRNhhaU!!uR&~|8v-U_V1J-M z9o(@LOeaZ{Y2Om^;VdR3tdyBRvoVA-cc+mcA!>I_pAJIyb|qw9Lr1+t&}?0ioi@kb zC%)xaC$>gAY8mdLl`a0(*oS|>aCy>c2Mp~i@LSi2&|>pqXS^lpJLLUV@`*rHU$cJ* zL7Cdl=FKqY)fJF`c;dR#x6AweRa4`CpWQG?0ss0ABv!~;4u2jYS|m;ebVqxFcp?c_ zMhF53nS_c83aE_6+>Z+y_GaIB7LN8kV)`oe3Or+zG4B1n{e8!b>@!tX3PtL>`9Lq4 zhyU-0pBI`qy6m>BSS=E2;a1ZPi*M8=xXxR7Dpz<9V|fUFrpM}gJiPc&{7g^!XHn*e zQX>4#*;h#rSg`KRa_51%%{?|MN%RZj%SogF7lR7FD(eGT*^wOePyGrF@Z-nNlJpdR z(D0H|m&{@8&@GkD=gx?;>YrY62@kdJ4w{+oQrD_<)CGgA5(EBFU#p-;c^~}Z020N? zZ(~1m0kJ-a|F4)^v~SV34~K#8_bk`qVAg~PuhzMy?f;{av}NhT>c8* zNl+qpfZ$mu@6&?i{6uPrH#F;^(ngG zylYYK%b$%u@*r_<)N1HRZf(HOT&Fc+m2AiuZuy=`4NMk zP6kiX1w&TWfa4Pgx!lTm^;IJA3DJYYIwwAZ2KhSWMe@cWUuAIYZGHnBvcKgIW<=ci z&aHRQ;5R^g{PAG%ZNIYo_WbG;wO>?uu@AnA|1~EhXd3TAtR{A(n|CCM6vyo40!l|S zxhm(TVC}_EOHB|p_LDVg<9X=U8anpA2Cx^xv(D1ZbkZO5RvMJA3L^z|sdyemgU)^f|?`f+d3A5FbR+(~n`i*U1p;3OR3O$bNtLxwraZ zS)CDzr|)@hE#NA^E)Nz7`Frciq)v}l+t(lvkK!Y7A$J*L#{-&o1@|`j9@Ol>jmnr= zA%!dfbi1AF2V2K5;T~=CbFi_TL0TclmBCEA_#dy}TlbwVPpOzxdiqehFq0%V$L!oS zi^&7;Dw|5!{p%*+3)*YGfIi+|DK#4arsphj-NT$B6~F39(Q-_c29u4*bEmygHYTD8 z3h!K#Prw_Sc64BCz7#DK0Llzx81nu=_e7+(@YMf_AL>%Eq$?ffp+oLI6Jr9hEaO&! zg-_m&T8psamh2Uu_+#%fncYRWp6Kay7Cu z61R9TY!$HW-wh&;m-Y4@*RyY^eCI^HtKpwfi)vTFger$3uDC35 zcOoU|wZA!!f{yN2TxTTyTDe;F&`QtPRU0{H0T$n7N(rGcUlD}0SaaCNzR$hQru^pV zeXg73a1_)+q+LcPyG54`H9=HliuH+xSjvKSP(_v^HZ7%Pn4l{ z9~iib{z@Odx}(F66Uy;7+dCbkz5V4TyhA}A37sI7Cf2F=0 z$=fh8JbAeW^zjv7^V=Qtaojv2s9mJaLpe~1A)g4{PFM|#S}V``^R+{H?dd{4rR#_* z5nk~jw&}FbhR<<}EpA|y?up=JH=$W?mGT!S0ot|G={|)K zH^JPRZ^bE^hS0}omy-*GF+lkQ8P;iOcW0%cg)i}m18YC204bsRWY4>Jmj?Hs{8UZ^ z*Hb74+|l#H&)=(SvC<=uU8XtSsGdhEVeWnY<;3Q~tf{{v+C-er%REp#%HlLW%g#Db zqt9J*tr4nogx6=^e}fwXUe1i@qQ@t9pHNpR^ay%(GvS_tioly_{$TnE2i9Z645T#e zNuI-HtIyC`yT`#qwq$ck{gc{WM5%v~izJmZ(kOxTsiRMbav2roG*w23petxmM^#KE zt>#+kT*e1YJ?r@6w3%uiHVbrMXrOH-7fB_a9PEFneywmCS9YSNXmY>749Rb%(iuS1VuqkOpl#H;V%7H9L{+}E@ql=;RWRLW>4W(fNzWR) zs5HQRFD?x@n)|-Hc(NMhQqYpfEIgfC%N}`yxjc-DXmownWbOUf*4CldMJM1%6At1t zc;->ub%wOHj(d~-lI2GkhY!I$BqR&4lM1z&8$JxDw{vB&a45){*%A?9G;Gt zrA2%z+iC%K9VX7QwH0QGSPkX*%s^rhdT25a4<*Hg~Fu#~joOB1i?iaaYnqB$aRia-?(`Rn)} zrfN$1g!OT!nsLmiYL?#5=A~Y1-DR3ciM1}#OPUnsgB3V$RtLw}e{I~++|)Ry57E?x zhAItKJ<7(la{ok%*RJ~RmJgWhPi#l`e!2LsHguhZWRMlA7-r@(d%vF8Nb2pBPv3z{ zwm|O)QqR}$l6xNZ;^70;4$<595cdIe|DMf?0v*0t7qi?6AVhb{IHZ|yBI zVE>!gcGLL+mCgKX_YNz$8C&8c)p8oqH8tOUT-eY!NKF4~g^g0vD`))|-}e2_C8R{; zGkF$Z91ljUzqyZF3Fb`X#ES$L667z=gNgkq|LHPdd}fM%cRi-UDaiHcm{nNYHAA-a z`oGly+4BU{YUM zzI}1L+=E(O#lznOcut=NEf(nh_-UUiUSC&CD`TtXC1{XCRAokTHlj~gLv_Bg;-VeN zA@dR?W^~1xQb1td1l)GRtDR3yAF;ds-ERlFs}n4SdGdMMUu_5(rK$jEO; z@7Po|?a2T%?jz?NfNBJ8wg}iGDrS}wRDFP@)3xS~_>3EgnMOKFou7w5rE69XY{l3; ztOu4h7~22TbQ7nEI{GMSl@=O7HMkKc(p-+?Qs~3ONeWdtj^`*blPhb-LJ`DitK>;= z)dg`;$L9+~!j4dZi%7g&!x1jecRm(~zKh~UvG;jlt()En=IQ{|1hXGGrlRY~ z$mLLx`=m*BOI6M|q{qPA$fTbH0C z?o7d{1*1~vq#xOl9etb_;JgQ|e0qN0CXP!k?z=niv>8AOe88qb)5JX)y3(Q5cJ_%p zD%0@~kG{2}+(Pgdc*?{lh|U+f>~^u(h;=nkmy1vXyk=k%(0!_`?@jZX8(lr9&CbZO zu>Ejm>YhVI*4Hmqf>QwF@3-XFpolx+6-jQ#Jiz^y_#UnZ`Etd5M$^< zu09aD3pkz_bM96mu+WHBC)nhi6Rl{yZa?Jns(93oV5k2wISKOrwut|HOvf1H!i*a( zj`NGxQkBqWinpd{DH-Ep{n!UF4$gXIkS%WMU_6dIzZQ!EQw!?E-U+$vc(NyP*?^aQ zzVO0t?G@*})SA;~v^sZs2xEom%YDhk9U=P;AVn%+_@CyCbV^vmd$%Q2p}tC7jI}TF ze8Z9f3SXQiZs&g`N8n+WHk;VLl8Kx}FG*v}(w}qgJ;ikDMyJOAWWhS6Lkyjy7wvFS zeSf+7{1e7wiGbZwy*0dB#>df;zMqG+*ywe}k`|Y3A?L-6KC1vx_9oK^Uup_w&Co#O4^CTR*;| zt?s~pK9=EU1K_wgUUzH`Zs8}U-~;Du!sms;pbFi=DFvD)xMeVMbq@*jDd^EOtA%yN zHn#9;x8qZ*+p;$P6}SK|c%@0(N)THh>snxOvd?g2qB!YI+w%1U6g83VKMD6_^Ywaw zIlo+^_x2gf^Jl+W7_63jwFp`8EmA%Cy3taYi|u6+2j(JrlR|$WVDjoW@d+i{3Lj??`V9A9o_Cgv zOb|;w{f)V)bX_!VUjSZ&(2$-OV#3 zYb|}Jc}9g3keVWTK10ILv4o?3I^$^E0mGa@-<<~biP8EjG-L-XM-0qKFn0Fq)@pa~ z*d?56{@@Glbn_==Bb|3RNhW1huX**A;G31sB92Vqk!7Gv$h9y1be(hO!TL-`R>0fK zDmj6*3zk>7;YuGo(RmxYV%3f_3FG~)BRu0EON|mNCu7V7=GqGtmMLcD+fk)jwXCQ? z{5wSE6n!|vFw%S)eCo};uZn;{^FhSD!%L!Lw_weY4Np4u;yL5vkeHr)b>dXFk@V=V z%gDiN*TFg?A;3mnX_$W7;*XfF9qcdAQ&hS?CS2Li$Hd)8M_XJjLZ8hT9LD_zEK#bX zpC-`DfYY6_p4R5ByQd60c7f;DG2(UOWqgv&|K{|rk9XPMMef)C{EP86r!gZ$BYY?ttU2I+ zCZoiXlUl}6m=wZ%Yd7~cnmWPCa+>hz`tDMhQpui1&q?iwaO)sxL z;;Q!7%tl2dsc_nia3-6OPk@2QQYfIBeFd%;bz>^&$oS%HV9`}kC7a0t`fiQ54)FC7 zPg18ucfEAXW}>TAXPL-bY`d(38aG0>PAFM~r|YCr@e1s}of^e%XmgNvab?<t_sBpV>8>8xD?m$y`7zZ zT&QD;ALqM&%+fH%BTJDMqG3}Ix7WEP*K#|2crEH{;HpbDPv2g@U3%jx^0E}_>Baiy zdZ4*3_>Q7-94WaozUBl-S41TH9mJlw8gkq;z3CFUGG=^|+^}$&obDtZFyfwHc(HNG zwtwsWZLJlg&V8L@eR*fxWuel5!2^wO;%#M>lgS&?P44{`Q#@fFg{GKB84M_{xtAUK zx`wv;CJXyQ*gogg*$VfV`;F^nFNLx`!s3p|Njg99(1IO1z-LqG49q-#THtHUH4id6 zHA85Q!u^@cb(EEc3dZwxs2ZOPa@3sISOZ~7@j?Q(6vmYb-Kq~5TW&N2cxJXm} z;+Qz4i|>`fM+a;ydox1QQpEUk59hA!fQ-#`V!QIPdy&*`F*AbBupxs4#5=d++Eyrlhl6y zmJ8(E^Z%bm8ub!eA6JSq>0JF=ou(L48l;B0hr0Df4*0#ZkhL%~nI-C|^2Coz^d^HN zHhzoqB%+5R;piQ3wK=LQpBK{^OBU3Vhe#a>*)_4(4Y1eUziy&)AHeIV>Yq;d9s34# zvE}_VRc$Is>IAC`2gIe9<>vA_hNst*YC*%ZRg8ZGD#B&~X{G%sIUy-C3X_8`{ zvaLl1^wOdX^7>E&EV=VD{)`R8nP!fX4{eaX5f>6ShG8X&YFkz1wYHcA9GWnp$q$mMI|g8&N>t z1a$QH#7oMf=Cx@~n(x8C?N@0EwuQOqsCbMMnxQ~4uDWXWU}f*>tczWAHsIw%=^lE>$U=G1LGo&ZlO0M)Y z2q}O5U=OJs&JbRcgj*1MLth!`Z}14ubUt|lFxZ#)y_|jDUnX(%;^HTt|H*s@_SQM8 z?@*S2>$Gq3JJGoz3Sd+ep@KFh`-R5~$!c1+8Kc&vs{BKK(o~B+)PtBk4k~q8n#X@> zem!wH@4AWJ^Sh={O!7RT8F9O!o&gy=WR7@xCEawy!5!2AKtApI*_E z0b1+kNiwf}6F23p7>#~;t69MPdI}@eX1!&W{6PO=Sd0F8D*5{AV>H8McR8F9cdF4~ z2gk-~#uoHWNl_m?3Pn@Ju#{O+mMv3%g1@%dC{u7q?{x4D=((g6cE=4D4#3UJ1%@lD z1r=s#ubaqV73%V{hgC7Xi6lfh>Masv&}M&>KJqK(F)*;X(Sx6j=`w)@tb9IN^?2a^ zQf`@i{l$dIzKQ&4@8aaDj4$WIFy7mGT$zW&PaabOVlp6G$HCbLB09VWJJ~U7^Y_wk zzv(z_>n5HqPZ6^3AKt{aRa%33b4t*pe(OwL2RBd_G8-jgMYiZZ>#kanh|1=B>K;mQ zKgN~=6byM$|Ks&zi71l$5i!#Ykr)p|)(hw}BESu*`X7~5E)ssfyS{}OrDZwBU>=bh zJ!@h1M_ppBmMi(L*2}A*gU#X3p<4_{$OXu@?G5tv@T1YyIO#Gpf+QP@v9`v)Xk#=- z>D}2;?SZ4GC;Z!)Keu{G>ti?Mhw|$48UGvTfdS8FX*zzy{t%M(IS@QQqbSC50h;)> z;%}#@q!Of}gmu_Kp{Jj3_tm87;mgXsEryzl+Z7Wu7jN-w*LW=fJs%8dbb8{qo*5dj z5k?-?ydW!&O-$P9bw9~Axs3RIBGKh1K%()I|tkr>9Q&BZ| zv9iXO?Y#RGwL=s@)6IvAtGlvgrNpo{eCnY-#tgG13%XYI@Ua8J!KU47$bhqLVL z@`^+`f_}j`(jY+%*%JG>qH-+K^7ZXavG9;qYZD6t80zpx77yYOZ)}K?RMB+8i|CjI;0O?)EP_NYZWP{f)hEAJyn1ML6U82u=ifMRS?D(Ia?o zWq-btc)R4QY~#*F8rKuDJV)l~n8clT(pNUTd&eXx2u}*JJ&u&3$w?RLqP}DWYoVEh zT?Ntn9ieLVu|n0k&;Dzkj|oOO^^-{Hik8yVraj&&D$DUFHz^S-;3bhvQY#W{Zws+$ zs{M+=a>{!PU-YWjf7S|v{y(>siamxoO)t&1OPr?5eBLdIj{LtUd+V^M-nLO21*Ag( zK{^CUX;6?5L=+^XduR|)kj@z-mF|?3?h+(Nq(QoK2+7@AH1|-uw8z z!{hKDW!7TNTKBr{E6!6!gv2oZdFi^3w435%N7(UIgO$dZSMs%j<{vt+bJW^ckR7s}50o7D zcC38rEG22krJc6T7Q{?Y5|_vMneZF)D?N~%V&&+#g~Op>{Q)P?65nvhOPi#qjj&1p zCUO|OZFE3&rWzhLxuu%J1>Y^@3Mhi>#<6p7rX3G#`VGVOO*`@!aJ#|Vce6h#kVs~z zZ+8kl=-O{)beFo1st#e-+V6B^J2Gq8Q!$3ziV@XT-B!{gOTz#`joP%p|D9ixQ4v@` zK>2S7>+tP+*sYU@_4exursRCYel-s2R7~kJlJ(4UyHMQ}x-dwUb&0EKAFhEcAjU&h*bmU22&1g{9OW(2=3-E!GIU+v~=bW6VjT&|QP zn>iC3ox^^+@q)bjLx2f#)TKaG$=&+9t5Pr_35BI$MFEfNLc~i{7Y#*EyKit($txV} z2du`4cRSgVCtOl{Cv5wH-q&4cq34cIb9lH^K9L^~0ApeNH2Ijo9A{74`JadGQOf^+ z$vn+KCGXj<#Bo8!fs>pPC;XWZzbmOqKVa#T!+{-D$WYwAM)Axw*YMI3142sR)hh

H_XKG27H~km|VK1&|&=AhPk5uP+ST954_FvKR0GUMAI2gZINI#vYVIr=6tcw%h$j za=7M_;}D7OI~JETecu}&mbm!=Wr}i1LWQP{IMqKYsR>^NMOy(&R-=zq{A;Vq?FU~z zELc$ZNEb*DG1fao&oE}J3T8x!!0NGhR#vzn$=@rAR;oFfE_qpsifi6^`IBdnPaL3B zJ<(l!m)BM=CH)1SGBo*kskX;a??yn_7G49beLSpOk@E8X&ImAxd(litvJzi)9 zMx$$+BwXWzX(OVUGT$6YRPOV>qiy<@h9ZLg#qM{uFpNsgTggACARC7sM4oE7&BHXhd}w;>ks2(aRt<4-qT+xAt$lXx?wy)^Ez7H!i;Ca)nXLNmVhm9hl6 z8ijcjZp|rPz0U% zgG>OCdqrH}R(t2M6L*gKO7zd984`pK}wXC@Qyoo`>Q@jJ2 z^+B6`kDt=<9BQwHS=^e=7VA*HL;VG|g-K-Uk?#2xKwm_Y$r`0u`0;!hoVxzQ6}?NW zPh31Hel&KKZ7`h>F@Y{03B4QE!>^Z)ENId_{Vur-IBHg_9kt8q#_d==l zFxE{RwcgbLMf$HrrQ~mojfVdID#kakG2lCW9uc7OXkiX79{h?98IiI4gG~X@IeMAd%#AGFr>j zj0Se*!dTgf_8t%2W*^T<)6wSTtMn8p<%cQdFG|B3a?e(-emDo$uQWW}<#!l7Pfa%x zS^Si{c4hhSPQXZ2k=U2b&>h)7Bx%V9C-@S(7QgQP3Tnwcnze+Cx}GTXzysX=VHXi* z^c9&t!SeqUu;%$(&IaJ;+aW#=1vmaXmM{mW|;t^ z#MIEZeDl&S-@@UR^+y6#f$X*UzOGN5)WJ=*cUklaNeX&zyR+VZBghN^*j*{sHjJy) zH>DZvzW5>^c3*n>!RDJ@*({q)z^ni?Q^kXVvh(`=u&w2ig}J&uR{u6%B>=A>$u53h z5^W1X65epqHT)r$yW0R;MTse+6AkM9HaKdZ+y;nAiIX5R0>oo%uo%s!$G87{B77M+ zEJyEj_)n?ev3u~}6u>h{JR6fJ!5cxt{5{ldtgAb`+OaXLSM_|=FExP|8!E~M9gL62 zY_>c;d!y722oWC;g6BhE)o_`%{|*UzZ{y3Yjcr=7Y^lNRCly8WWwv9WaPhb&1%#ht z;RR&Ly^ensN3CmH$95A!>gs#efX2SSl-akxrM~7B;J{(>gEz=5fGVaf<|Wqlzo=sM zV$cP#_k%!OhVQ@J5R7ENTq<{k89StW;A>z<0CBLQmG-fh-e6NCS?tS#A|0G+pT8_^ z&|Lh20E)ZO9>Db9@U(%?L6KB{bdk=`3aA8_Hdf$AdDo;w+Z1HL`+I2L1z-o2aO$!v zB(fH{f7&6jy&(=Oj*s8Ww%uTufd4dyI#H+b!`?V6-d^4%0vo0Rz?0II8_YJO{#(Jy zeS1o+W%1U3`zWjiLdl!<`Y*ym23}Uty0Wxa{&chkz+^1t;cAHscLO+!9)&Rf2}k@& zI(d#mZrMjp&-fxStBd#f$ZQEB$m-Ak63*OiUsyA2Z!GG&an3-h&i-{@;8PJit)G@O zeOK}#I`JtLsvaAfdrb&_9)B{RQf~~aS`f&2J6@nvKpr5F!#94;98^Qi{l{u9lT{h0 zivoDf&<=OMOpbpgJSlEJi{R}60Pjh=LHHT}FxmIm!SX>jAW)e5#&k!0xF3^b1%F>} z4a2xQa_0fi&iEI!LM_4t{XgTl35YjeyQu=ey#p)~48hLNWb%bkLmV9268cw8Z%}&I z6tt=KK!;WTmHDdIEf_PvGPebwp8KAXmtjrZH!M6KW@u)#AV*iOg+b=_54wi4^a4EO ziDkRv?&%HYg<6CMIQr9ZiTgwQq`S|l^?5U$ianpG*J;LToGA?Kzk2sCxZ@qH-bJ053asS3NB#o%@JH2^nmGO*kOLZ}NY_o0?u`EnoBGYH$HBuMXQWZU zasvs13IL}Or6mF>w(glz0`@1SVdPbJ!mdMbBp*r-(EU&)t^v?CrkEC5X(?ITGA6Qd zWt=A(YG zwTB4cpumLsEkJo-c0Ex2%}cy4bP4spCxYXBtf9DV*?Y!VwB^H~acuM`6RjBVSJLrT zp#=JsS*t|mMyb*0W26~cNT3z>{-$8gM7xEB3$Oc6bhnqzQMfr`7?8ol^7ZhfL~T;M z@X>SnF>*gXj7+P4lUjh642y>4kCk2~Zw`6>1gGy~SL>&lW{p8XO7OpG79jD?R&i!P zoV??BbBIkPOwt-vhrHl_8GimjK~5fGmZNAJza|lczkM6JxKL&Ve!{Avvdd;}WO@Ub zB1_Bm%^lMk0Kl}40E>*`hGHwYj0@Es!w0wjI8}Z`66#uSX$&Axg=PXDhkKAPJRnLA zEA;zm3E(8nW;?t;-$k_Gm6tkeXtL&A{%sgY-kBDilULae`)?f74kUx*Uu(wge>+9m zGdmBfmZprVzx*D5F>Q1JOH~kfEkuQ45?4x<4#UU;5E$ZSxt}@Y7eR3jBIv;t2p|i&L5-~~ zE2b}t1B|sB+S>avjBkvc_)N{{U0$)z+BzSK-1bU>*noAUJ6h~GnDSpAI~Dn#dM*^I z(zQG!$~0I(u6%`1^#7#?@qYmvso;?D^*T=W%PYPuFR&W z9g(+qY>~Fy(Dy(7CO8_vN>tTaC!-CIsdTWhJ9YK)v5Jd9$7Aj;^jLg(clpyx0o;O~$(+%19p%vRvPba46Ukqg6{y_oP=F5$H>lZ3OL%i65vLttonfi@Q zw&`80*iMTp0TFkFpzOZ9Eh!l-JXXgiZE6oGDR=R(m?%1O%})V04dB&~z7>ZPUJ%bO zQ9)hSahC|-Lu+lld5PO`3yYYNzK7_ZguN|Nt3#38px#g<;}ffj@X3RBw#d5M(9Ry& zqxrVK3(d_p@LC?&j~o56QJz%}sXnw|x~eJ24&tD|VkZ!MufNouJ9Gkh$&-3XqsWtg zTh^Sb&(2vcS|bhs;{jtxuf^IEEh)n8-6Jag8(GyB+E*t80CjokhQVWGgu6!k#}N%V z{G7GRG**&R=!yQCR{*SF&BGVC05`YdUBF|Y^$nAzabTKQfF~Hw1owmW)Dg2t4T1;c z^>~}acTM~D$n*pDBJVrhBKRBP;bW=ECXeAQ$>Q9Ec!~l7f04oza%SxJS<_e7mTi~* zW;y|xmwMyEk3_XV1W=EtdH9a-3hW>D?iQAaan2)7>JCSZadvG@MfyV4{xcem4_W+d zBF=n;%eoW)HdG|Cp_3n`MVwCvjN4;jv7WcFxSmu!9GAsnAg1}MZ0YpOZ96)f=;*B= zSWMv7Gz4FBvZU-W(eI(D#oB*sPPo;6L_uy=o!J3y`dhWXfk6D_QMll!D>8A~8w~Ey zp!Ls;FhGI*ZS7{u&}HZVY=AvdviM)UVAXCE-L-{vW5u z9*ZE({k_3l=)f6H-snulC}vYPWttJa(G$vd0O47oxcyMUpyA{4aeg|?dFa>mtXtDzwhC(b5Bm8BUMV+a6jk9yY$~R zWxtZ3x*>&Il-BfYqU=SWfl_ORsHPib6aX;1F;NszG!h`!Gal)`ROHRPmdTPP!6IvR zz00bhC9z9=RwkKLzQb0C|5U(uqph}34}Ix_1x49YRkIx51#pvpQIkGOXkbVv2{2sT zSS|op(Bt=Vy!%@8?;WEK-j>CgJLQ!#mgeBm-pqI0%o*KBJ&`)I{*z2@KHKJ)Ucdjq zA=zH(qT@cxMwq+CMaRane!cDH1u>W)#;T|&%&Lj)2!PN8g4iz@^&pD4z+w)#Ul<^m zStqPhl8M^(OA+#R7GZ=z_vgK(+?{%Ad!vo?P)b!ITff zLZFb5k1YnEAzfFsUrKtUdMq^v+2SYzQ*#Jy=fhNZgF9e&x{9Vf3I+fI&)G%Wf zj+X|b4h(w`Am8v-sX!h_P4O$ARfL8TZZ!}o0Nn&x$<_j|)_`^bR9uaIwhv$T;fD`e z{a^VUs8Lgc{1{=7lai3QT@AYuJ!aY>e=R1kwm5dcPnIsSCr!`UbpkH3o`rbGa|UhgjgIkkT=@~+9B zqXl~|P-fmpzm?bM5XS7C|%2rLT%dC`;A?t~A=$}OX8hNp{T;5!^Uyjwe zE=_$m{MS7T*6+=s*(@UdRd8oiDza@d(?A13s2$=NW#GD}LU_M)Q?+OaAL}9pr+2J+RZyuc>zbqVUZh zUrAO?%XR2wTV7Sc>ynDZ<1HtsS(7gdK!F|XKBT$4L0|@aTyGe&pX2-fCizG5RKR3) zaMjBUf)P`OsLK_Lzn&+c(#_tDivzV{hV>NZU4E;~JkL}^pT;PRM?G~;dh1jYM;#B6 z`&{y>**ol}@_e0H>`#m#cVGnTTRxl@Fz#^n@h&EulU8$N7bR^)FY4^3Q<+JoR*G(hC2#t$yj*o~pzswkTDcKU31!mx-7qpnx7p+a zRzthm_7gbb9_>hCzCEMW^T|2h^`>pk`~lt2GivN)QHRnC~JV? zVhWVD^X6hFMYQGccWC#Ov}3r_y`QMH`fZF4JEGxPCW!M*Rq!+}9+g+%I$CsP9yzN1 z)fN4xVO<>(hV_!VTxb1CGjX@Fxk~j8YWK2ee_HSVPzj135WPMEx(1Z)@oo%~wd@{! zr@Mrm7E69;y_T!@X6Ejcdjo#w??E7iUQP0nb}5bx#h2@WZ|)}oc&nl1 z6%NhU`NE}z_rkV47a0g%D-gfSvu6ItTlh@jb9E^6BD@EB9IvP*VR!y}`<=9uL7>k^ zbaW{Hj-$WX04okQ-zTYIao?gxTSsSpA)A+SSciVe;EOnvR&yuCT;ExVXZK0XsfWS#;-$mqFJ@t+posM_Sz1@20 zG+@8AAi;V>Jh1cxNNeccJ#i$(08W8J&r{`#`&9dmzUP)Iu@#q>=-G(-ZCKd>An5Th zqA&~QJ;5TJ{V>v3UxWbanx~RTCgXW|H@uJud~}9BKggU&91)>anyho~(?QDbe9RrU(C$hG4rd?ZPT(Z49V_;mFfzRS$q zJyu9q+49Cn9J+`6WRv-;AQp6O4wEPI4u1CH-cK5CXIKYj5ji|>>#e{}BOkQTwzPzi zHvO>hS&J&>L|&#Y?e1;%#)~$eg?&T64o+U5>Z5*ToV8DdjKi%6dgeULm!7Lk&xCHd zNZM%NrZBuRVgoCDs4L^sD~z4X)fWF(x1n|r3SdP8J_N}nl-w(E?Q2;Vvntd|fc0@`9aoRE-${l>@Vss1EEb-H2X zi*R~M@?v@(g6FH_#N3jjT#TeML6wSn3oamPotx>>2r&cL=IwO0>$R`~igtdvk&i7723HW6)b4Nt6a^8N zPXGO|$f<*7MK_|~WUHTu|4hp`Q-bQY0cI*Ei>kq}*y=nG39h6%pSV%Y>5 zKDc}(kgNkc5veovZzZrLnu#h~aLAPopaMQyW*S1p?rI!um4jb{86;pTRaq&Lm1|oT z@TaGr2PiizXP25%e~?bpjdil_y62xSGI1#(@lRB~o&KPBt1GVbFq?NEBg3EhX?$=A zN4^keM$$d5{L*w!lTOJtbU(E3=rzz07Q6q*I8XtKnMv9-d!$d!AQnwCw#)4&S%Z0X z1h`Corho3tD*-N&2MTya(sSBK*3O^47G3s92{fN^|KIX~T- zUK7DBDj^NUy7jQ#@W9~X%%^c7hS#;GujK=z8Vu2VcwMsib|sxzOm87TyRAZ|?--Z= zW9W%+D8p#1M)ju6`D`?)0`f`imjCZtc&5XJx`n$ibOl?qJ3W&pX@&?6)(=(dmE7OC z*q=7j6zEtQgVYL%UVEukrl$zXXFMf(P+!&`uja+jYBl|4a6Y{&)~PvK`pzvq&a~%_ zLuvg0>3;qMJ%D+vCO!Z(9n=p54ZW;8A;14u)siwH89{y`#H*I1o)V*rBTX&w?I8I7 zDr)Hn+A|0TMG$Dk?0cqgA4x>11d<>1i2cUozSfS@#^nmjv#)vh9L5$5@Hk9zw$9Gd z=DowP0^7d6)-^v8Vg(p=k31f2>`#8u;v6V4m8cI7b(ikW@hyt*QM(=qEC6p36&k@K zF-GYcQPK|97=QM}D?LHv`fZY3G16zqg(N0FxX5@NNjTw)@Al~YUl4q~dd04~hqko! zyXL_4O$4pV;yh?$yBj^Sx-#%iNg@gdOE>n%n1{5kt8sm=--uBYgt)!v@^ROe6@0fr4o;<@4x(fP=QV{x*AVioHJr*=b;C|K}hD$e%b=@-)o6wtn#KKr-} zMogEs5=&_LV7uvAG26W2`|#k#&?Hqz90g2=&YIJ9_&KVLU46a2BXLJ624n^BdGeo6}VBRKzg zDQSQj84VmO?!U5s<*>Bq5t3LK@1e-YgbzU`S|AUmMzm^Q0wwyuJ=zaz?z$+|i~Eq29ou=9<_=ZzJ4(t| W+4(kv0d@v$46S(Y$i1 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 z z3|VyhRg_H;1!oAEX|C%%1XLFy=Kpa(@FZn}(o%0kr+@z>@J*}_xe_49CrAm7&9#Kl zrzm1_1q+4^hguI`k2wTw2Q&}56R%|Avy1A!2qm!F{rhAfIBH{Pjo6s3RxZRcd7|cc z4ZBtcU67awp{loX~$5rmmmt1UL5*mnmH*)Rw5e5wfa} zA||KmlDH+g@0Uy?+=FByxiD{VopUinXqw9+zBq#W*qI~t_ zo3_zr1dgt%v#ik%gXRA|NZc=kp1eA%R%U;9P>Ou@hQL0p)wLYP55TS<#^GQ?ro6n> zVwOK$4;=2mMcyhfT`51~##jrcLD;#Rmhr&lMwV5%$nc3G{qdhfOp3uFol@Mr|Wn+#`#k;O83(1gjjfNIjpkgS8X8I^XxQKxy z`5KRXp87a4jaGK)2F$e-BQ<9zTaJv?Y9oQK#$>bh$5(%OXA_B!*(tg6ly=C@La9Os zG`*_xB4KL*(b;C1b4>A~3ki9(AfbWp+a@^a`%>D|vDYC$6EABqt;NYfep zCU;wCe{26U=PCth*wB+?^D4Jn?hJmi?%19#=~phb9`FVTj}B?8w7$z7BhxCkL6gY# zU5t@S0aATa0299H&U=GQ_&~_6G|}%CJoe(yHh1^6=Y}tl>X9oKp!rjd)N{_3gO-Co zVgZL`p(occ9fChz!aAXDon2X3#{|a==LsCYdX@L|p7U0q_F_B_t0Lk0N||7yQL%9H zr(5~u<;}-Rk1Ujf6J5KQ)frI{<*Um~B4qh8lCQh3J%N^SYLu5Sjg7>|kLbMX=8et% z@S^L7Gu24X5Pv%7bu%NS!(Ees^^FJHvc|xf3R6_s^`6)k2-cOwt19yd!(xgyV4*Ks zSC{QV)xTC+sp&d~4Jeo@b@&yCTU-fFC(g=V_Xkrkk);!NEYE&IrnSGdiN7nJRRI7QDA@)c=fu&3sswsPxE12kKR;5BuCq>$N zbiI6{`#H_Y+Vs}-K2;Q!m?^x#r-9K3kS9eIW{y&?MpAA;n>tCkK`Cjd4T31AYS|{T zy|nBya(qb3@@5@3n!Dzf1#CjdK|7@Ah5lSnTqOzAT1A!1{qaO=Hy@^ET&iFGAezOl zt6;)wV#ah!BCaVHw)07#Iwyq)G$XHjkA@^mF<8H0)d0iH-VD!wIlOsesoJ{mmVsIl z?w2=9zHV(lM-?40cdu=nG@$xCvXJSD)mbeH=g-y9vI{02-ZnFIjlko`W7#Od5Pjaf z^H?@u^{5oXTL~|uP?1S|3BOZ|A>E~J66m5KkXk8g<`C5M0$i<*o(-qwg9pwQE(@Q? z+gc*NwW5|i6Czi1g<6{h7p?WS)JiS%WE(C=$P0#jDs2Wmtl`z|PBlHzHc+}mFBao2 zdrR1u`nU`h?SwufhPh%PD~`aWQLsJWWr|Vj5lLp29A6*VeBsgdk4fv>)6UmzMn+S| zIhCbsP-i7jMG{!bV~9oPpkbuRY(NwA72BfwcVmeyxa3)_@20-gjz8Z;>y(2e?N9 z%;^soPKdp!m&@oI(oc%dhY zKI~=Fu~~^|mG22VcJW&m^_@;eUI~cvQhpxt^rIN#<(otf1bM}`q?FQpDAm&!@{aPY<_43SKN%nlE*v%5NNPoD1!DVI2o=KjvW_xb2(0vNlq)x+pSy z+@@>T>GhgF!7JH-guB%J%(+kKd<2n(OD>Of`DB9?Ds;^X1QDZVs@@MSkJ!0W=)luSf4ha?eNZ-cc{D9w@7}Nqo&{ z;CXgb1}H)?88y!G0BptrJ1S@BX-|JdebeVYVJl$de_ua%b~L!yqeS#FN#M8vI^let zDxd?5POV*@^~j%XH7{5R#g!iEBZZ~o_WaKZPxAEtu6sbx*ZMcFN0V)-O39>J?7r`_+Fqo+PucH{C`t?SgL z!4~goKR?tj2@_t7lGCaTQ|Au(wk0i~Y8>(HGZoB7Q@QHc^!)wg;p{z%+8aKx`0FEk z&h9(MrjvF9is)hky@NvKR^S4HJ{bTDAbD_Hb=1@njJG*=f-+H^B^q{TM#=HbMW1D7 zBnRF`F%-vST1OQ1jqt+eHXu>Lybu`W6H$OM2z zJs(P!-%+hr&kdp^9x|(Nn~xEiAZX}CAf_=M2v=(l^xBX&fY*#%ot=U8&aO1?1ZDD$Bscc&f+zgieuPu2SLjVxiX7h+{dNHTjYx?Qs@K}=vP z)fW{nWpM-Qm5d-ZG+Jt}ihM2Sn#r)C>Y8Wf-%3rPX9k<^GR!s-4xHtupxQf=6UV~P zB`Trg+Oa)L?Y@=tkb{W2;WJ`t&cl{AEk=PU{u!OeY&)HicBC!?&rHeBZ^TfUEU0r3 zd`Q(4xF&3`j(Xp<3zbF>&me{`$ObWqFDWz2#cZrf~n7k9yQccX9^ztTDIa?2-veEVa8gLOUC?HnutjJgTab7U$7~ z1_FQjPWa7K$^5wJ8d!&&^6e;he1M=ke%|pbLeqgs!nGp+%YaY?(*A6}* z#Fc`HtSVoA1RX4whH<+>OBbo3A!`cWQvLYjqHZeZSf;jCdWUKUms8DyKGrLPLz9Q1 zeLH&8B~%9bSFYa2Ig}TfGGVxb?_LEUy&+vD%nwJnE4}bCi>ntlzLmvGC64oN%`MHx zTiH(r)`!-3(?8PwAr~m=JEh6el_sBCSMoizp$|_yLB>pRU89N2PEdqHu*;3}MQ%|o z$(*Qx_`{yLaM%%B=iJAmh)tKlk1hpPt`gnt6wHd6%4(X539PS+b>HkzM!ERU*9>jG zqaC0^XJN3tUA+H_y^l&ahGHmkb0wCHf2AVTL4RV!@`JZ89+CG>wiedGvmD?yDBfAq zX`N&1MDJZ*5zjqvN43F;M|h}XLRDF%f_LaHOB9K~lb-Q6w?AHglbszLD00$nx+dVd zDO}Y4?*03Zw*#9!?fJSE1({Iy_PD~<^_Ij_T;Amtd~~uz>lg|Uo)>_^T5YM{eWESR zo;}KzeqSbr{T8-nY@BA!!FT7OFP-V(;cGG<^>F5vmcjHmh{Ak5Q9@p1v??l1mZZ9C zNl9fk-tA)Q2ZJaX_6KTRYi**6#2VNS%~zY4JX6rc$q6F$gXL~*tjtdxY;MvOpzE%$ znOSfCaALK&rHq&(GWYW2l$Q6QBisESA#J#Qqav?y;&rU( z`m_ViujQiXWO`DB#>&nG9j?c`lu>h(cXvq=Pbrj8GF)6>MQjz;sb5%l z%&>&*EB*$#fQdJ=lP1gY0k}83v@ZS;US|jo6OfYIJa^>Ob>(-5aUu%vT{|2TcDpx{ zQA=eRcQb7%OxrbHEKMVXnWkbGAVV~!F|R(p!ob3^T5dUVve=w9U{W6Kr6H$F?UwKw^x5*J<3i{9Vw zIly(D9_bzJRoK)ilJ#fK8^i&3hJTNcr{n!jx=YAX8&AjGKA2J}ssVW`8O?(Kra!K` qTbiTp=2DE!HTg-oY;_dK3CdzR4+rUhYzYMXdMNqmUcR`V*Z%@{B&t9F literal 0 HcmV?d00001 diff --git a/f22ed9-echo-pad/echo-pad/Screenshots/wave-morph-scene-7be2a1.png b/f22ed9-echo-pad/echo-pad/Screenshots/wave-morph-scene-7be2a1.png new file mode 100644 index 0000000000000000000000000000000000000000..629ed36b6ec6750ee3620e6bb9b59effcaaf3f74 GIT binary patch literal 86583 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 E!X-+6AspW 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 IMf5!W56?7!a{vGU literal 0 HcmV?d00001 diff --git a/f22ed9-echo-pad/echo-pad/Skill/echo-marker.json b/f22ed9-echo-pad/echo-pad/Skill/echo-marker.json new file mode 100644 index 00000000..69bc8b7a --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/Skill/echo-marker.json @@ -0,0 +1,17 @@ +{ + "data": { + "type": "card", + "attributes": { + "cardTitle": "Echo Marker", + "cardDescription": "The red pen that annotates an Echo Pad board: reads a circled region of handwriting or sketch and returns a margin note, an optional sketch drawn back onto the paper, and an optional manim animation scene.", + "instructions": "You are a red pen annotating a handwritten board. The image you are shown is a cropped region of that board — handwriting and rough sketches the user circled. It could be math, a question in words, a diagram, a list, or a half-formed idea.\n\nReply with the annotation text ONLY — no preamble, no markdown fences around the prose, no headings. If math is involved, write it in plain unicode (v₀, θ, ², ×, ÷, ≈, √), never LaTeX. Keep it under 8 short lines, sized for a margin note.\n\nMODES — the request names one:\n- solve: Solve the problem shown in the handwriting. Show the key steps briefly, then the final answer.\n- check: The handwriting contains the user's own worked solution or claim. Mark it like a kind but precise grader: if it is correct, reply with a short confirmation ending in ✓; if it is wrong, name the first incorrect step and give the corrected result ending in ✗ → the right answer.\n- complete: The sketch or working is unfinished. Infer the intent and supply the missing part.\n- explain: Explain what the handwriting and sketch describe, concisely, as an annotation.\n- animate: Compose a short animation that shows the idea in motion. Strongly prefer a scene block; keep the annotation text to at most 2 short lines.\n- auto: Respond helpfully to whatever the ink is reaching for: solve a problem, answer a question, complete a sketch or list, or briefly explain — whichever fits. If nothing clearly calls for a response, reply with exactly NOTHING.\n\nSKETCHING BACK: if a small sketch genuinely helps (completing a diagram, drawing the missing part, an arrow, a quick plot), append one fenced block exactly like ```draw {\"polylines\":[[x1,y1,x2,y2,...]]}``` — coordinates are PIXELS in the image you were shown (0,0 = its top-left), so your lines land exactly where you place them on the drawing. At most 6 polylines. NEVER form characters out of polylines — to write numbers, words or expressions on the paper, add \"write\" entries to the same block: {\"polylines\":[...],\"write\":[{\"text\":\"14\",\"at\":[x,y],\"size\":44}]} — at is the top-left of the text in image pixels, size its height in pixels; the board renders it in red handwriting exactly there. Use polylines only for shapes, arrows and plots.\n\nANIMATION: prefer composing your own clean, precise graphs and diagrams — that is what makes an animation valuable. Append ONE fenced block exactly like ```scene {\"title\":\"...\",\"steps\":[...]}```. Each step is one JSON object. Object steps: {\"add\":TYPE,\"id\":\"unique\",...props}. TYPE choices: ink{} — the user's circled strokes as one object — should ONLY be used as the starting shape of a transform into the ideal form you draw (rough sketch morphs into the true curve); never animate the raw ink for its own sake · axes{xRange:[a,b],yRange:[a,b]} · plane{xRange,yRange} · graph{fn:\"expr in x\",axes:\"axesId\",xRange:[a,b]} · circle{radius} · square{side} · rect{w,h} · line{from:[x,y],to:[x,y]} · arrow{from,to} · vector{to:[x,y]} · dot{at:[x,y]} · text{value,at} · mathtex{value:\"LaTeX\",at}. Optional props: color (hex), at:[x,y]. Coordinates are manim world units, roughly x -6..6, y -3.5..3.5, origin center. Animation steps: {\"play\":KIND,\"target\":\"id\",...}: create · write · fadeIn · fadeOut · transform{to:\"otherId\"} · rotate{angle:radians} · scale{factor} · wave{amplitude} · orbit{path:\"idOfCircleOrLine\"} · indicate · shear{matrix:[[a,b],[c,d]]} · wait{duration}. Every play may set duration in seconds (max 4). Max 16 steps. fn expressions may use x, sin, cos, tan, exp, log, sqrt, abs, pi — nothing else. Example: ```scene {\"title\":\"sine forms\",\"steps\":[{\"add\":\"axes\",\"id\":\"ax\",\"xRange\":[-5,5],\"yRange\":[-2,2]},{\"add\":\"graph\",\"id\":\"g\",\"fn\":\"sin(x)\",\"axes\":\"ax\"},{\"play\":\"create\",\"target\":\"g\",\"duration\":2},{\"play\":\"wave\",\"target\":\"g\",\"amplitude\":0.4,\"duration\":2}]}```", + "commands": [] + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/skill", + "name": "Skill" + } + } + } +} \ No newline at end of file diff --git a/f22ed9-echo-pad/echo-pad/Spec/04196a72-1b33-46cb-adc7-11f105c12fcc.json b/f22ed9-echo-pad/echo-pad/Spec/04196a72-1b33-46cb-adc7-11f105c12fcc.json new file mode 100644 index 00000000..34bf4bb2 --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/Spec/04196a72-1b33-46cb-adc7-11f105c12fcc.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "readMe": "The full board app: three-layer camera sandwich (canvas ink, SVG overlays, DOM slips), five-mode Select puck, ambient auto-scan, zoom cluster, drafting title block, and draft/accept/undo flows.", + "ref": { + "module": "../components/isolated", + "name": "EchoPadIsolated" + }, + "specType": "component", + "containedExamples": [], + "cardTitle": "EchoPadIsolated", + "cardDescription": null, + "cardInfo": { + "name": null, + "summary": null, + "cardThumbnailURL": null, + "notes": null + } + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/spec", + "name": "Spec" + } + } + } +} \ No newline at end of file diff --git a/f22ed9-echo-pad/echo-pad/Spec/09862dce-770f-4e34-b0fe-c0f0ae65e43d.json b/f22ed9-echo-pad/echo-pad/Spec/09862dce-770f-4e34-b0fe-c0f0ae65e43d.json new file mode 100644 index 00000000..b8b94ac2 --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/Spec/09862dce-770f-4e34-b0fe-c0f0ae65e43d.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "readMe": "Output of RecognizeInkCommand: annotation text, plus optional sketchJson/sceneJson payloads already validated by the pure helpers in utils.", + "ref": { + "module": "../commands/recognize-ink-command", + "name": "RecognizeInkOutput" + }, + "specType": "card", + "containedExamples": [], + "cardTitle": "RecognizeInkOutput", + "cardDescription": null, + "cardInfo": { + "name": null, + "summary": null, + "cardThumbnailURL": null, + "notes": null + } + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/spec", + "name": "Spec" + } + } + } +} \ No newline at end of file diff --git a/f22ed9-echo-pad/echo-pad/Spec/1535c33b-d0d6-4f89-9ed1-bd305c5ed882.json b/f22ed9-echo-pad/echo-pad/Spec/1535c33b-d0d6-4f89-9ed1-bd305c5ed882.json new file mode 100644 index 00000000..0b726b62 --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/Spec/1535c33b-d0d6-4f89-9ed1-bd305c5ed882.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "readMe": "Designed edit format: board name, read-only facts, per-echo removal, and a guarded erase — the raw ink/viewport JSON internals are never exposed.", + "ref": { + "module": "../components/edit", + "name": "EchoPadEdit" + }, + "specType": "component", + "containedExamples": [], + "cardTitle": "EchoPadEdit", + "cardDescription": null, + "cardInfo": { + "name": null, + "summary": null, + "cardThumbnailURL": null, + "notes": null + } + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/spec", + "name": "Spec" + } + } + } +} \ No newline at end of file diff --git a/f22ed9-echo-pad/echo-pad/Spec/2de99ec8-608e-4378-a9a4-ad4db70b3427.json b/f22ed9-echo-pad/echo-pad/Spec/2de99ec8-608e-4378-a9a4-ad4db70b3427.json new file mode 100644 index 00000000..c01ebc50 --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/Spec/2de99ec8-608e-4378-a9a4-ad4db70b3427.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "readMe": "Sends the circled ink (PNG data URL + mode + Skill-card instructions) through the request-forward proxy to a vision model and returns validated text/sketch/scene channels. Caches by capture hash so identical asks are never paid for twice.", + "ref": { + "module": "../commands/recognize-ink-command", + "name": "RecognizeInkCommand" + }, + "specType": "command", + "containedExamples": [], + "cardTitle": "RecognizeInkCommand", + "cardDescription": null, + "cardInfo": { + "name": null, + "summary": null, + "cardThumbnailURL": null, + "notes": null + } + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/spec", + "name": "Spec" + } + } + } +} \ No newline at end of file diff --git a/f22ed9-echo-pad/echo-pad/Spec/2e1b2b22-045a-4ae6-8684-a3eccfe78daf.json b/f22ed9-echo-pad/echo-pad/Spec/2e1b2b22-045a-4ae6-8684-a3eccfe78daf.json new file mode 100644 index 00000000..77ca6b44 --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/Spec/2e1b2b22-045a-4ae6-8684-a3eccfe78daf.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "readMe": "Embedded summary: ink glance beside the newest note and board facts.", + "ref": { + "module": "../components/formats", + "name": "EchoPadEmbedded" + }, + "specType": "component", + "containedExamples": [], + "cardTitle": "EchoPadEmbedded", + "cardDescription": null, + "cardInfo": { + "name": null, + "summary": null, + "cardThumbnailURL": null, + "notes": null + } + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/spec", + "name": "Spec" + } + } + } +} \ No newline at end of file diff --git a/f22ed9-echo-pad/echo-pad/Spec/3552a1a1-dfc4-4344-9270-dd7b683fb87b.json b/f22ed9-echo-pad/echo-pad/Spec/3552a1a1-dfc4-4344-9270-dd7b683fb87b.json new file mode 100644 index 00000000..c92bf270 --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/Spec/3552a1a1-dfc4-4344-9270-dd7b683fb87b.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "readMe": "Poster-first manim player: lazy-loads the vendored runtime, one active scene at a time, paper mode for ink scenes and darkroom for composed ones, full teardown on close.", + "ref": { + "module": "../components/scene-player", + "name": "EchoScenePlayer" + }, + "specType": "component", + "containedExamples": [], + "cardTitle": "EchoScenePlayer", + "cardDescription": null, + "cardInfo": { + "name": null, + "summary": null, + "cardThumbnailURL": null, + "notes": null + } + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/spec", + "name": "Spec" + } + } + } +} \ No newline at end of file diff --git a/f22ed9-echo-pad/echo-pad/Spec/5a94d17e-1a3c-47ab-95d8-59cb5104e30d.json b/f22ed9-echo-pad/echo-pad/Spec/5a94d17e-1a3c-47ab-95d8-59cb5104e30d.json new file mode 100644 index 00000000..6c22af2c --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/Spec/5a94d17e-1a3c-47ab-95d8-59cb5104e30d.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "readMe": "Input for RecognizeInkCommand: the ephemeral image crop, mode, board name, and the marker instructions resolved from the bundled Skill card by the board (plain realm commands cannot reach the store).", + "ref": { + "module": "../commands/recognize-ink-command", + "name": "RecognizeInkInput" + }, + "specType": "card", + "containedExamples": [], + "cardTitle": "RecognizeInkInput", + "cardDescription": null, + "cardInfo": { + "name": null, + "summary": null, + "cardThumbnailURL": null, + "notes": null + } + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/spec", + "name": "Spec" + } + } + } +} \ No newline at end of file diff --git a/f22ed9-echo-pad/echo-pad/Spec/5ebd1f7e-043d-4632-8866-b5c6c10eea7f.json b/f22ed9-echo-pad/echo-pad/Spec/5ebd1f7e-043d-4632-8866-b5c6c10eea7f.json new file mode 100644 index 00000000..d732ce4a --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/Spec/5ebd1f7e-043d-4632-8866-b5c6c10eea7f.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "readMe": "Pure validation core for model responses: splits text, draw polylines, write labels and scene blocks, clamping every channel. No card imports; unit-tested.", + "ref": { + "module": "../utils/index", + "name": "splitEchoResponse" + }, + "specType": null, + "containedExamples": [], + "cardTitle": "splitEchoResponse", + "cardDescription": null, + "cardInfo": { + "name": null, + "summary": null, + "cardThumbnailURL": null, + "notes": null + } + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/spec", + "name": "Spec" + } + } + } +} \ No newline at end of file diff --git a/f22ed9-echo-pad/echo-pad/Spec/75b1c152-d2cf-401d-8c66-dde32f735a7c.json b/f22ed9-echo-pad/echo-pad/Spec/75b1c152-d2cf-401d-8c66-dde32f735a7c.json new file mode 100644 index 00000000..131be09f --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/Spec/75b1c152-d2cf-401d-8c66-dde32f735a7c.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "readMe": "An accepted response from the marker: mode, red-pen text, board position, plus optional `sketchJson` ({polylines, labels} in world coordinates) and a validated `sceneJson` manim spec.", + "ref": { + "module": "../fields/echo-note", + "name": "EchoNoteField" + }, + "specType": "field", + "containedExamples": [], + "cardTitle": "EchoNoteField", + "cardDescription": null, + "cardInfo": { + "name": null, + "summary": null, + "cardThumbnailURL": null, + "notes": null + } + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/spec", + "name": "Spec" + } + } + } +} \ No newline at end of file diff --git a/f22ed9-echo-pad/echo-pad/Spec/b87dbcab-3f75-4de7-a690-af41c6cf9e2b.json b/f22ed9-echo-pad/echo-pad/Spec/b87dbcab-3f75-4de7-a690-af41c6cf9e2b.json new file mode 100644 index 00000000..b913aedf --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/Spec/b87dbcab-3f75-4de7-a690-af41c6cf9e2b.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "readMe": "Fitted views for all 16 preview sizes via container queries: badge (mark only), strips, tiles and cards, each with the ink glance and echo badge where space allows.", + "ref": { + "module": "../components/formats", + "name": "EchoPadFitted" + }, + "specType": "component", + "containedExamples": [], + "cardTitle": "EchoPadFitted", + "cardDescription": null, + "cardInfo": { + "name": null, + "summary": null, + "cardThumbnailURL": null, + "notes": null + } + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/spec", + "name": "Spec" + } + } + } +} \ No newline at end of file diff --git a/f22ed9-echo-pad/echo-pad/Spec/bb45a3c4-c96b-4a49-b903-2426be4001b5.json b/f22ed9-echo-pad/echo-pad/Spec/bb45a3c4-c96b-4a49-b903-2426be4001b5.json new file mode 100644 index 00000000..e7cb4d45 --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/Spec/bb45a3c4-c96b-4a49-b903-2426be4001b5.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "readMe": "# Echo Pad\n\n## Summary\n\nAn infinite drafting-vellum whiteboard where an AI marker answers in red pen, directly on the paper. Write or sketch in blue ink; circle a region with Select and ask for one of five things — Solve, Check, Complete, Explain, or Animate — or leave Auto on and the marker quietly follows along, proposing help when your ink pauses. Every response arrives as a draft you accept or dismiss: a margin note in red handwriting, an answer written back onto the page, a sketch drawn onto your diagram, or a short manim animation that plays inside a projection slip on the board.\n\n## How it works\n\n- **Ink model** — strokes are flat point arrays in a single `inkJson` field with velocity-based width and midpoint smoothing; saves are debounced, never per-point.\n- **The marker** — the circled region is cropped to a PNG and sent through the realm's request-forward proxy to a vision model. Prompt substance lives in the bundled `Skill/echo-marker` card, so the marker's voice can be read and remixed as data; a code fallback covers realms without the Skill. Identical asks are served from an in-session cache.\n- **Response channels** — plain text (margin note), `write` entries (text the board renders in its red hand at model-chosen coordinates), `draw` polylines (shapes anchored to your ink), and a `scene` block in a whitelisted grammar that a deterministic interpreter plays through the vendored manim-web runtime. The model never supplies executable code; every channel is validated data.\n- **Ambient mode** — pen-idle detection plus guards (minimum new strokes and area, suppression after silence) surfaces a pulsing dot; it auto-runs after a grace window and costs nothing until it fires.\n- **Theming** — the board's tokens chain through the Boxel theme system only when a Theme card is linked; unthemed boards keep their committed vellum-and-ballpoint identity.\n\n## Limitation\n\nOne open session per board: saves are whole-document last-writer-wins, so two simultaneous editors overwrite each other. Duplicate the board for parallel work.\n\n## Credits\n\nInspired by the open-source PenEcho whiteboard (independent reimplementation — no code reuse). Animation runtime: manim-web (MIT), vendored under `lib/` with license and manifest.", + "ref": { + "module": "../echo-pad", + "name": "EchoPad" + }, + "specType": "card", + "containedExamples": [], + "cardTitle": "Echo Pad", + "cardDescription": null, + "cardInfo": { + "name": null, + "summary": null, + "cardThumbnailURL": null, + "notes": null + } + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/spec", + "name": "Spec" + } + } + } +} \ No newline at end of file diff --git a/f22ed9-echo-pad/echo-pad/Spec/e565fb4c-1eb6-4e36-a5fd-ac51eeb2b934.json b/f22ed9-echo-pad/echo-pad/Spec/e565fb4c-1eb6-4e36-a5fd-ac51eeb2b934.json new file mode 100644 index 00000000..455609e3 --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/Spec/e565fb4c-1eb6-4e36-a5fd-ac51eeb2b934.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "readMe": "Whitelisted scene-grammar validator plus a recursive-descent math expression parser (no eval) for function graphs.", + "ref": { + "module": "../utils/scene", + "name": "validateSceneSpec" + }, + "specType": null, + "containedExamples": [], + "cardTitle": "validateSceneSpec", + "cardDescription": null, + "cardInfo": { + "name": null, + "summary": null, + "cardThumbnailURL": null, + "notes": null + } + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/spec", + "name": "Spec" + } + } + } +} \ No newline at end of file diff --git a/f22ed9-echo-pad/echo-pad/commands/recognize-ink-command.gts b/f22ed9-echo-pad/echo-pad/commands/recognize-ink-command.gts new file mode 100644 index 00000000..074c5441 --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/commands/recognize-ink-command.gts @@ -0,0 +1,138 @@ +import { CardDef, contains, field } from '@cardstack/base/card-api'; +import StringField from '@cardstack/base/string'; +import { Command } from '@cardstack/runtime-common'; +import SendRequestViaProxyCommand from '@cardstack/boxel-host/commands/send-request-via-proxy'; + +import { + buildEchoPrompt, + echoCacheKey, + splitEchoResponse, + type EchoModeKey, +} from '../utils/index'; + +export class RecognizeInkInput extends CardDef { + @field imageDataUrl = contains(StringField); // ephemeral PNG crop of the lassoed region, never persisted + @field mode = contains(StringField); + @field boardName = contains(StringField); + // the marker's prose, read from the bundled Skill card by the board (a plain + // realm Command has no store access); empty falls back to the local grammar + @field instructions = contains(StringField); +} + +export class RecognizeInkOutput extends CardDef { + @field content = contains(StringField); + @field mode = contains(StringField); + @field sketchJson = contains(StringField); // polylines the model drew back, if any + @field sceneJson = contains(StringField); // validated manim scene spec, if any +} + +const VISION_MODEL = 'anthropic/claude-sonnet-5'; +const CACHE_LIMIT = 24; +// Identical ink + mode must never be paid for twice: the region hash keys a +// small LRU of responses for the session. +const echoCache = new Map< + string, + { content: string; sketchJson: string; sceneJson: string } +>(); + +export class RecognizeInkCommand extends Command< + typeof RecognizeInkInput, + typeof RecognizeInkOutput +> { + static actionVerb = 'Read'; + static displayName = 'Read Circled Ink'; + + async getInputType() { + return RecognizeInkInput; + } + + protected async run(input: RecognizeInkInput): Promise { + let { imageDataUrl, mode, boardName, instructions } = input; + if (!imageDataUrl?.startsWith('data:image/')) { + throw new Error('No ink image was captured.'); + } + let modeKey = (mode ?? 'solve') as EchoModeKey; + + let cacheKey = echoCacheKey(imageDataUrl, modeKey, instructions ?? ''); + let hit = echoCache.get(cacheKey); + if (hit) { + // refresh recency + echoCache.delete(cacheKey); + echoCache.set(cacheKey, hit); + let cached = new RecognizeInkOutput(); + cached.content = hit.content; + cached.mode = modeKey; + cached.sketchJson = hit.sketchJson; + cached.sceneJson = hit.sceneJson; + return cached; + } + + let promptText = + instructions && instructions.trim().length > 40 + ? `${instructions.trim()}\n\nMode: ${modeKey}.${ + boardName ? ` The board is titled "${boardName}".` : '' + }` + : buildEchoPrompt(modeKey, boardName); + + let result = await new SendRequestViaProxyCommand( + this.commandContext, + ).execute({ + url: 'https://openrouter.ai/api/v1/chat/completions', + method: 'POST', + requestBody: JSON.stringify({ + model: VISION_MODEL, + messages: [ + { + role: 'user', + content: [ + { type: 'text', text: promptText }, + { type: 'image_url', image_url: { url: imageDataUrl } }, + ], + }, + ], + }), + }); + + if (!result.response.ok) { + let body = ''; + try { + body = await result.response.text(); + } catch { + // fall through to statusText + } + throw new Error( + `Echo request failed (${result.response.status}): ${ + body || result.response.statusText + }`, + ); + } + + let data = await result.response.json(); + let split = splitEchoResponse(data?.choices?.[0]?.message?.content); + if (!split.text && !split.polylines && !split.labels && !split.scene) { + throw new Error('The model returned an empty annotation.'); + } + + let output = new RecognizeInkOutput(); + output.content = split.text ?? ''; + output.mode = modeKey; + output.sketchJson = + split.polylines || split.labels + ? JSON.stringify({ + polylines: split.polylines ?? [], + labels: split.labels ?? [], + }) + : ''; + output.sceneJson = split.scene ? JSON.stringify(split.scene) : ''; + + echoCache.set(cacheKey, { + content: output.content, + sketchJson: output.sketchJson, + sceneJson: output.sceneJson, + }); + if (echoCache.size > CACHE_LIMIT) { + echoCache.delete(echoCache.keys().next().value as string); + } + return output; + } +} diff --git a/f22ed9-echo-pad/echo-pad/components/edit.gts b/f22ed9-echo-pad/echo-pad/components/edit.gts new file mode 100644 index 00000000..99df7ffd --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/components/edit.gts @@ -0,0 +1,220 @@ +import { on } from '@ember/modifier'; +import { fn } from '@ember/helper'; + +import { FieldContainer } from '@cardstack/boxel-ui/components'; +import { Component } from '@cardstack/base/card-api'; + +import { parseInk } from '../utils/index'; +import type { EchoPad } from '../echo-pad'; + +// The default edit form would expose inkJson / viewportJson as raw textareas — +// hostile to edit and easy to corrupt. This form offers only what a person +// would sensibly change, and summarizes the machine-owned state read-only. +export class EchoPadEdit extends Component { + get strokeCount(): number { + return parseInk(this.args.model?.inkJson).strokes.length; + } + + get echoes() { + return (this.args.model?.echoes ?? []).filter(Boolean); + } + + removeEcho = (index: number) => { + let model = this.args.model; + if (!model) { + return; + } + model.echoes = this.echoes.filter((_, i) => i !== index); + }; + + clearInk = () => { + let model = this.args.model; + if (!model) { + return; + } + model.inkJson = ''; + model.viewportJson = ''; + }; + + +} diff --git a/f22ed9-echo-pad/echo-pad/components/formats.gts b/f22ed9-echo-pad/echo-pad/components/formats.gts new file mode 100644 index 00000000..c7db1334 --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/components/formats.gts @@ -0,0 +1,547 @@ +import { Component } from '@cardstack/base/card-api'; + +import { parseInk, strokeBBox, unionBBox, type InkDoc } from '../utils/index'; +import type { EchoPad } from '../echo-pad'; + +function inkPaths(doc: InkDoc): { d: string; w: number }[] { + return doc.strokes.map((s) => { + let d = `M ${s.pts[0]} ${s.pts[1]}`; + for (let i = 2; i < s.pts.length; i += 2) { + d += ` L ${s.pts[i]} ${s.pts[i + 1]}`; + } + return { d, w: s.w }; + }); +} + +function inkViewBox(doc: InkDoc): string { + let box = unionBBox(doc.strokes.map(strokeBBox)); + if (!box) { + return '0 0 100 100'; + } + let pad = 24; + return `${box.minX - pad} ${box.minY - pad} ${ + box.maxX - box.minX + pad * 2 + } ${box.maxY - box.minY + pad * 2}`; +} + +class InkGlance { + paths: { d: string; w: number }[]; + viewBox: string; + constructor(json: string | undefined | null) { + let doc = parseInk(json); + this.paths = inkPaths(doc); + this.viewBox = inkViewBox(doc); + } +} + +export class EchoPadEmbedded extends Component { + get ink(): InkGlance { + return new InkGlance(this.args.model?.inkJson); + } + + get themed(): boolean { + return Boolean((this.args.model as any)?.cardInfo?.theme); + } + + get echoCount(): number { + return (this.args.model?.echoes ?? []).filter(Boolean).length; + } + + get strokeCount(): number { + return this.ink.paths.length; + } + + get echoLabel(): string { + let n = this.echoCount; + return `${n} ${n === 1 ? 'echo' : 'echoes'}`; + } + + get firstEchoText(): string { + let first = (this.args.model?.echoes ?? []).filter(Boolean)[0]; + let text = first?.content ?? ''; + return text.split('\n')[0] ?? ''; + } + + +} + +export class EchoPadFitted extends Component { + get ink(): InkGlance { + return new InkGlance(this.args.model?.inkJson); + } + + get themed(): boolean { + return Boolean((this.args.model as any)?.cardInfo?.theme); + } + + get echoCount(): number { + return (this.args.model?.echoes ?? []).filter(Boolean).length; + } + + get strokeCount(): number { + return this.ink.paths.length; + } + + get echoLabel(): string { + let n = this.echoCount; + return `${n} ${n === 1 ? 'echo' : 'echoes'}`; + } + + get firstEchoText(): string { + let first = (this.args.model?.echoes ?? []).filter(Boolean)[0]; + let text = first?.content ?? ''; + return text.split('\n')[0] ?? ''; + } + + +} diff --git a/f22ed9-echo-pad/echo-pad/components/isolated.gts b/f22ed9-echo-pad/echo-pad/components/isolated.gts new file mode 100644 index 00000000..c3587f12 --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/components/isolated.gts @@ -0,0 +1,2243 @@ +import { tracked } from '@glimmer/tracking'; +import { on } from '@ember/modifier'; +import { fn } from '@ember/helper'; +import { htmlSafe, type SafeString } from '@ember/template'; +import { modifier } from 'ember-modifier'; +import { restartableTask, timeout } from 'ember-concurrency'; + +import EraserIcon from '@cardstack/boxel-icons/eraser'; +import HandIcon from '@cardstack/boxel-icons/hand'; +import LassoIcon from '@cardstack/boxel-icons/lasso'; +import PencilIcon from '@cardstack/boxel-icons/pencil'; +import { eq } from '@cardstack/boxel-ui/helpers'; +import { Component } from '@cardstack/base/card-api'; + +import { + RecognizeInkCommand, + RecognizeInkInput, +} from '../commands/recognize-ink-command'; +import { EchoScenePlayer } from './scene-player'; +import { mapStrokesToManim } from '../utils/scene'; +import { EchoNoteField } from '../fields/echo-note'; +import { + clamp, + ECHO_MODES, + INK_COLOR, + mapLabelsToWorld, + mapPolylinesToWorld, + parseSketchJson, + type EchoLabel, + parseInk, + polylinesBBox, + polylinesToPaths, + serializeInk, + strokeBBox, + strokeInLasso, + strokeNearPoint, + unionBBox, + ZOOM_MAX, + ZOOM_MIN, + type BBox, + type EchoModeKey, + type InkStroke, +} from '../utils/index'; +import type { EchoPad } from '../echo-pad'; + +type Tool = 'pen' | 'eraser' | 'lasso' | 'pan'; + +type Draft = { + content: string; + mode: EchoModeKey; + sketchWorld: number[][] | null; // world-space polylines, ready to ink onto the board + labelsWorld: EchoLabel[] | null; // world-space write-backs, rendered in the red hand + sceneJson: string; // validated manim scene spec ('' when none) + x: number; + y: number; + width: number; +}; + +type EchoErrorSlip = { + message: string; + mode: EchoModeKey; + x: number; + y: number; +}; + +const ERASER_RADIUS = 10; // world units +const DRAFT_WIDTH = 340; +const TITLE_BLOCK_SCREEN = { w: 320, h: 96 }; // docked bottom-right, screen space +const DRAFT_MIN_SCREEN_H = 150; +const CROP_MARGIN = 48; +const CROP_MAX_DIM = 1024; +const UNDO_DEPTH = 30; +const AUTO_IDLE_MS = 3000; +const AUTO_MIN_STROKES = 3; +const AUTO_MIN_AREA = 900; // world px² — ignore tiny scribbles +const AUTO_GRACE_MS = 1800; // dot lingers, then fires by itself (Esc cancels) + +export class EchoPadIsolated extends Component { + @tracked tool: Tool = 'pen'; + @tracked zoom = 1; + @tracked panX = 0; + @tracked panY = 0; + @tracked strokeCount = 0; + @tracked lassoPts: number[] | null = null; // world coords, closed on pointer-up + @tracked lassoBBox: BBox | null = null; + @tracked thinkingLabel: string | null = null; + @tracked draft: Draft | null = null; + @tracked echoError: EchoErrorSlip | null = null; + @tracked clearArmed = false; + @tracked toast: { message: string; undo: () => void } | null = null; + @tracked spaceHeld = false; + @tracked noteDrag: { index: number; x: number; y: number } | null = null; + @tracked autoEnabled = true; + @tracked autoDot: { x: number; y: number; box: BBox } | null = null; + + strokes: InkStroke[] = []; + undoStack: string[] = []; + canvas: HTMLCanvasElement | null = null; + boardEl: HTMLElement | null = null; + resizeObserver: ResizeObserver | null = null; + activePointer: { + kind: 'draw' | 'erase' | 'lasso' | 'pan' | 'drag-draft' | 'drag-note'; + id: number; + lastX: number; + lastY: number; + noteIndex?: number; + } | null = null; + currentStroke: InkStroke | null = null; + lastEchoBBox: BBox | null = null; + echoBaselineCount = 0; // strokes already covered by a previous echo + autoSuppressedBelow = 0; // ignore auto until this many strokes exist + clearArmTimer: number | undefined; + toastTimer: number | undefined; + keydownHandler = (e: KeyboardEvent) => this.onKeyDown(e); + keyupHandler = (e: KeyboardEvent) => this.onKeyUp(e); + + inkLoaded = false; + + setupBoard = modifier((el: HTMLElement) => { + this.boardEl = el; + let canvas = el.querySelector('canvas.ink-layer') as HTMLCanvasElement; + this.canvas = canvas; + // one-shot: our own debounced save mutates inkJson, which re-runs this + // modifier — re-seeding from the model then would clobber live state + // (and reset the ambient-scan baseline before the scan can fire) + if (!this.inkLoaded) { + this.inkLoaded = true; + this.strokes = parseInk(this.args.model?.inkJson).strokes; + this.strokeCount = this.strokes.length; + this.echoBaselineCount = this.strokes.length; + this.restoreViewport(); + } + this.resizeObserver = new ResizeObserver(() => this.fitCanvas()); + this.resizeObserver.observe(el); + this.fitCanvas(); + window.addEventListener('keydown', this.keydownHandler); + window.addEventListener('keyup', this.keyupHandler); + return () => { + this.resizeObserver?.disconnect(); + this.resizeObserver = null; + window.removeEventListener('keydown', this.keydownHandler); + window.removeEventListener('keyup', this.keyupHandler); + }; + }); + + willDestroy(): void { + super.willDestroy(); + window.removeEventListener('keydown', this.keydownHandler); + window.removeEventListener('keyup', this.keyupHandler); + window.clearTimeout(this.clearArmTimer); + window.clearTimeout(this.toastTimer); + } + + // ---- camera ---- + + restoreViewport() { + try { + let v = JSON.parse(this.args.model?.viewportJson ?? ''); + if (v && typeof v === 'object') { + this.zoom = clamp(Number(v.zoom) || 1, ZOOM_MIN, ZOOM_MAX); + this.panX = Number(v.x) || 0; + this.panY = Number(v.y) || 0; + } + } catch { + // fresh board: defaults stand + } + } + + get worldTransform(): SafeString { + return htmlSafe( + `transform: translate(${this.panX}px, ${this.panY}px) scale(${this.zoom})`, + ); + } + + get zoomPercent() { + return Math.round(this.zoom * 100); + } + + toWorld(clientX: number, clientY: number): [number, number] { + let rect = this.boardEl?.getBoundingClientRect(); + let sx = clientX - (rect?.left ?? 0); + let sy = clientY - (rect?.top ?? 0); + return [(sx - this.panX) / this.zoom, (sy - this.panY) / this.zoom]; + } + + zoomBy(factor: number) { + let el = this.boardEl; + if (!el) { + return; + } + let cx = el.clientWidth / 2; + let cy = el.clientHeight / 2; + let next = clamp(this.zoom * factor, ZOOM_MIN, ZOOM_MAX); + this.panX = cx - ((cx - this.panX) / this.zoom) * next; + this.panY = cy - ((cy - this.panY) / this.zoom) * next; + this.zoom = next; + this.redraw(); + this.scheduleSave(); + } + + zoomIn = () => this.zoomBy(1.25); + zoomOut = () => this.zoomBy(0.8); + zoomReset = () => this.zoomBy(1 / this.zoom); + + onWheel = (event: Event) => { + let e = event as WheelEvent; + e.preventDefault(); + let rect = this.boardEl?.getBoundingClientRect(); + let sx = e.clientX - (rect?.left ?? 0); + let sy = e.clientY - (rect?.top ?? 0); + let factor = Math.exp(-e.deltaY * 0.0015); + let next = clamp(this.zoom * factor, ZOOM_MIN, ZOOM_MAX); + // keep the world point under the cursor fixed while zooming + this.panX = sx - ((sx - this.panX) / this.zoom) * next; + this.panY = sy - ((sy - this.panY) / this.zoom) * next; + this.zoom = next; + this.redraw(); + this.scheduleSave(); + }; + + // ---- pointer interaction ---- + + onPointerDown = (event: Event) => { + let e = event as PointerEvent; + if (e.button !== 0 && e.button !== 1) { + return; + } + let el = e.currentTarget as HTMLElement; + try { + el.setPointerCapture(e.pointerId); + } catch { + // synthetic events have no active pointer to capture + } + let panning = this.tool === 'pan' || this.spaceHeld || e.button === 1; + let [wx, wy] = this.toWorld(e.clientX, e.clientY); + + if (panning) { + this.activePointer = { + kind: 'pan', + id: e.pointerId, + lastX: e.clientX, + lastY: e.clientY, + }; + return; + } + if (this.tool === 'pen') { + this.pushUndo(); + this.autoDot = null; + this.currentStroke = { w: 2.5, pts: [wx, wy] }; + this.activePointer = { + kind: 'draw', + id: e.pointerId, + lastX: wx, + lastY: wy, + }; + return; + } + if (this.tool === 'eraser') { + this.pushUndo(); + this.eraseAt(wx, wy); + this.activePointer = { + kind: 'erase', + id: e.pointerId, + lastX: wx, + lastY: wy, + }; + return; + } + if (this.tool === 'lasso') { + this.dismissLasso(); + this.lassoPts = [wx, wy]; + this.activePointer = { + kind: 'lasso', + id: e.pointerId, + lastX: wx, + lastY: wy, + }; + } + }; + + onPointerMove = (event: Event) => { + let e = event as PointerEvent; + let ap = this.activePointer; + if (!ap || ap.id !== e.pointerId) { + return; + } + if (ap.kind === 'pan') { + this.panX += e.clientX - ap.lastX; + this.panY += e.clientY - ap.lastY; + ap.lastX = e.clientX; + ap.lastY = e.clientY; + this.redraw(); + return; + } + let [wx, wy] = this.toWorld(e.clientX, e.clientY); + if (ap.kind === 'draw' && this.currentStroke) { + let dx = wx - ap.lastX; + let dy = wy - ap.lastY; + if (dx * dx + dy * dy < 1) { + return; // drop sub-pixel jitter + } + this.currentStroke.pts.push(wx, wy); + ap.lastX = wx; + ap.lastY = wy; + this.drawSegment(this.currentStroke); + return; + } + if (ap.kind === 'erase') { + this.eraseAt(wx, wy); + return; + } + if (ap.kind === 'lasso' && this.lassoPts) { + this.lassoPts = [...this.lassoPts, wx, wy]; + return; + } + if (ap.kind === 'drag-draft' && this.draft) { + this.draft = { ...this.draft, x: wx - 20, y: wy - 12 }; + return; + } + if (ap.kind === 'drag-note' && ap.noteIndex !== undefined) { + this.noteDrag = { index: ap.noteIndex, x: wx - 20, y: wy - 12 }; + } + }; + + onPointerUp = (event: Event) => { + let e = event as PointerEvent; + let ap = this.activePointer; + if (!ap || ap.id !== e.pointerId) { + return; + } + this.activePointer = null; + if (ap.kind === 'draw' && this.currentStroke) { + if (this.currentStroke.pts.length >= 4) { + this.strokes.push(this.currentStroke); + this.strokeCount = this.strokes.length; + } + this.currentStroke = null; + this.redraw(); + this.scheduleSave(); + this.autoScanTask.perform(); + return; + } + if (ap.kind === 'erase') { + this.scheduleSave(); + return; + } + if (ap.kind === 'lasso') { + this.closeLasso(); + return; + } + if (ap.kind === 'drag-note' && this.noteDrag) { + this.commitNotePosition(this.noteDrag); + this.noteDrag = null; + } + }; + + onKeyDown(e: KeyboardEvent) { + if ( + e.target instanceof HTMLInputElement || + e.target instanceof HTMLTextAreaElement + ) { + return; + } + if (e.code === 'Space') { + this.spaceHeld = true; + e.preventDefault(); + return; + } + if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'z') { + e.preventDefault(); + this.undo(); + return; + } + let key = e.key.toLowerCase(); + if (key === 'p') this.tool = 'pen'; + if (key === 'e') this.tool = 'eraser'; + if (key === 'l' || key === 's') this.tool = 'lasso'; + if (key === 'v' || key === 'h') this.tool = 'pan'; + if (key === 'escape') { + if (this.echoTask.isRunning) { + this.cancelEcho(); + } else if (this.draft) { + this.dismissDraft(); + } else if (this.autoDot) { + this.dismissAutoDot(); + } else { + this.dismissLasso(); + } + } + } + + onKeyUp(e: KeyboardEvent) { + if (e.code === 'Space') { + this.spaceHeld = false; + } + } + + pickTool = (tool: Tool) => { + this.tool = tool; + }; + + // ---- ink ---- + + fitCanvas() { + let canvas = this.canvas; + let el = this.boardEl; + if (!canvas || !el) { + return; + } + let dpr = window.devicePixelRatio || 1; + canvas.width = Math.max(1, Math.round(el.clientWidth * dpr)); + canvas.height = Math.max(1, Math.round(el.clientHeight * dpr)); + this.redraw(); + } + + redraw() { + let canvas = this.canvas; + let ctx = canvas?.getContext('2d'); + if (!canvas || !ctx) { + return; + } + let dpr = window.devicePixelRatio || 1; + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.setTransform( + dpr * this.zoom, + 0, + 0, + dpr * this.zoom, + dpr * this.panX, + dpr * this.panY, + ); + ctx.lineCap = 'round'; + ctx.lineJoin = 'round'; + ctx.strokeStyle = INK_COLOR; + for (let s of this.strokes) { + this.strokePath(ctx, s); + } + if (this.currentStroke) { + this.strokePath(ctx, this.currentStroke); + } + } + + strokePath(ctx: CanvasRenderingContext2D, s: InkStroke) { + // ink feel: quadratic-through-midpoints smoothing, per-slice width driven + // by point spacing (a velocity proxy) — slow strokes run thick, fast thin + let p = s.pts; + let n = p.length / 2; + if (n < 2) { + return; + } + if (n === 2) { + ctx.beginPath(); + ctx.lineWidth = s.w; + ctx.moveTo(p[0], p[1]); + ctx.lineTo(p[2], p[3]); + ctx.stroke(); + return; + } + let ax = p[0]; + let ay = p[1]; + let prevW = s.w; + for (let i = 1; i < n - 1; i++) { + let cx = p[i * 2]; + let cy = p[i * 2 + 1]; + let mx = (cx + p[i * 2 + 2]) / 2; + let my = (cy + p[i * 2 + 3]) / 2; + let w = (prevW + velocityWidth(s.w, Math.hypot(mx - ax, my - ay))) / 2; + ctx.beginPath(); + ctx.lineWidth = w; + ctx.moveTo(ax, ay); + ctx.quadraticCurveTo(cx, cy, mx, my); + ctx.stroke(); + prevW = w; + ax = mx; + ay = my; + } + ctx.beginPath(); + ctx.lineWidth = prevW; + ctx.moveTo(ax, ay); + ctx.lineTo(p[n * 2 - 2], p[n * 2 - 1]); + ctx.stroke(); + } + + drawSegment(s: InkStroke) { + // incremental draw of the live stroke's newest segment; the pointer-up + // redraw replaces it with the smoothed rendering + let ctx = this.canvas?.getContext('2d'); + let n = s.pts.length; + if (!ctx || n < 4) { + return; + } + let d = Math.hypot( + s.pts[n - 2] - s.pts[n - 4], + s.pts[n - 1] - s.pts[n - 3], + ); + ctx.lineCap = 'round'; + ctx.strokeStyle = INK_COLOR; + ctx.lineWidth = velocityWidth(s.w, d); + ctx.beginPath(); + ctx.moveTo(s.pts[n - 4], s.pts[n - 3]); + ctx.lineTo(s.pts[n - 2], s.pts[n - 1]); + ctx.stroke(); + } + + eraseAt(wx: number, wy: number) { + let before = this.strokes.length; + this.strokes = this.strokes.filter( + (s) => !strokeNearPoint(s, wx, wy, ERASER_RADIUS / this.zoom + 4), + ); + if (this.strokes.length !== before) { + this.strokeCount = this.strokes.length; + this.redraw(); + } + } + + pushUndo() { + this.undoStack.push(serializeInk({ v: 1, strokes: this.strokes })); + if (this.undoStack.length > UNDO_DEPTH) { + this.undoStack.shift(); + } + } + + undo = () => { + let prev = this.undoStack.pop(); + if (prev === undefined) { + return; + } + this.strokes = parseInk(prev).strokes; + this.strokeCount = this.strokes.length; + this.redraw(); + this.scheduleSave(); + }; + + armClear = () => { + if (!this.clearArmed) { + this.clearArmed = true; + window.clearTimeout(this.clearArmTimer); + this.clearArmTimer = window.setTimeout(() => { + this.clearArmed = false; + }, 3000); + return; + } + window.clearTimeout(this.clearArmTimer); + this.clearArmed = false; + this.pushUndo(); + // "erase everything" means everything: ink, draft, AND accepted echoes + let model = this.args.model; + let prevInk = serializeInk({ v: 1, strokes: this.strokes }); + let prevEchoes = (model?.echoes ?? []).filter(Boolean); + this.strokes = []; + this.strokeCount = 0; + this.draft = null; + this.autoDot = null; + this.echoBaselineCount = 0; + this.autoSuppressedBelow = 0; + if (model && prevEchoes.length) { + model.echoes = []; + } + this.dismissLasso(); + this.redraw(); + this.commitBoardState(); + this.toast = { + message: 'Board cleared', + undo: () => { + this.strokes = parseInk(prevInk).strokes; + this.strokeCount = this.strokes.length; + this.echoBaselineCount = this.strokes.length; + if (model && prevEchoes.length) { + model.echoes = [...prevEchoes]; + } + this.redraw(); + this.commitBoardState(); + this.toast = null; + window.clearTimeout(this.toastTimer); + }, + }; + window.clearTimeout(this.toastTimer); + this.toastTimer = window.setTimeout(() => { + this.toast = null; + }, 8000); + }; + + // ---- persistence (debounced; never per-point) ---- + + saveTask = restartableTask(async () => { + await timeout(1500); + let model = this.args.model; + if (!model) { + return; + } + model.inkJson = serializeInk({ v: 1, strokes: this.strokes }); + model.viewportJson = JSON.stringify({ + x: Math.round(this.panX), + y: Math.round(this.panY), + zoom: Math.round(this.zoom * 100) / 100, + }); + }); + + scheduleSave() { + this.saveTask.perform(); + } + + // model writes that matter (accept/remove/move/clear) carry the FULL board + // state in one commit — a save-triggered card reload must be able to + // reconstitute everything, including ink still inside the debounce window + commitBoardState() { + let model = this.args.model; + if (!model) { + return; + } + this.saveTask.cancelAll(); + model.inkJson = serializeInk({ v: 1, strokes: this.strokes }); + model.viewportJson = JSON.stringify({ + x: Math.round(this.panX), + y: Math.round(this.panY), + zoom: Math.round(this.zoom * 100) / 100, + }); + } + + // ---- lasso + echo ---- + + closeLasso() { + let pts = this.lassoPts; + if (!pts || pts.length < 6) { + this.lassoPts = null; + return; + } + let captured = this.strokes.filter((s) => strokeInLasso(s, pts)); + let box = unionBBox(captured.map(strokeBBox)); + if (!box) { + // nothing inside — treat as a miss, quietly reset + this.lassoPts = null; + this.lassoBBox = null; + return; + } + this.lassoBBox = box; + } + + dismissLasso = () => { + this.lassoPts = null; + this.lassoBBox = null; + this.echoError = null; + }; + + get lassoPath(): string { + let pts = this.lassoPts; + if (!pts || pts.length < 4) { + return ''; + } + // the svg sits at (-4000, -4000) so ink at negative world coords still renders + let d = `M ${pts[0] + 4000} ${pts[1] + 4000}`; + for (let i = 2; i < pts.length; i += 2) { + d += ` L ${pts[i] + 4000} ${pts[i + 1] + 4000}`; + } + if (this.lassoBBox) { + d += ' Z'; + } + return d; + } + + get puckStyle(): SafeString { + let box = this.lassoBBox; + if (!box) { + return htmlSafe('display: none'); + } + return htmlSafe(`left: ${box.minX}px; top: ${box.maxY + 18}px`); + } + + get scanStyle(): SafeString { + let box = this.lassoBBox; + if (!box) { + return htmlSafe('display: none'); + } + return htmlSafe( + `left: ${box.minX - 8}px; top: ${box.minY - 8}px; width: ${ + box.maxX - box.minX + 16 + }px; height: ${box.maxY - box.minY + 16}px`, + ); + } + + // ambient scanning: after a pause in writing, quietly offer an echo on the + // fresh ink — the dot costs nothing; the request is only sent on click + autoScanTask = restartableTask(async () => { + await timeout(AUTO_IDLE_MS); + if ( + !this.autoEnabled || + this.draft || + this.echoError || + this.lassoBBox || + this.echoTask.isRunning || + this.strokes.length < this.autoSuppressedBelow + ) { + return; + } + let fresh = this.freshStrokes(); + if (fresh.length < AUTO_MIN_STROKES) { + return; + } + let box = unionBBox(fresh.map(strokeBBox)); + if (!box || (box.maxX - box.minX) * (box.maxY - box.minY) < AUTO_MIN_AREA) { + return; + } + this.autoDot = { x: box.maxX + 18, y: box.minY - 6, box }; + // grace window: help arrives on its own unless dismissed (or clicked sooner) + await timeout(AUTO_GRACE_MS); + if ( + this.autoDot && + this.autoEnabled && + !this.draft && + !this.echoError && + !this.echoTask.isRunning + ) { + this.expandAutoDot(); + } + }); + + freshStrokes(): InkStroke[] { + let base = Math.min(this.echoBaselineCount, this.strokes.length); + return this.strokes.slice(base); + } + + get autoDotStyle(): SafeString { + let d = this.autoDot; + if (!d) { + return htmlSafe('display: none'); + } + return htmlSafe(`left: ${d.x}px; top: ${d.y}px`); + } + + toggleAuto = () => { + this.autoEnabled = !this.autoEnabled; + if (!this.autoEnabled) { + this.autoDot = null; + } + }; + + dismissAutoDot = () => { + this.autoDot = null; + // stay quiet until a few more strokes of genuinely new ink arrive + this.autoSuppressedBelow = this.strokes.length + AUTO_MIN_STROKES; + }; + + expandAutoDot = () => { + let dot = this.autoDot; + if (!dot) { + return; + } + let b = dot.box; + this.lassoBBox = b; + this.lassoPts = [ + b.minX, + b.minY, + b.maxX, + b.minY, + b.maxX, + b.maxY, + b.minX, + b.maxY, + ]; + this.autoDot = null; + this.echoTask.perform('auto'); + }; + + echoTask = restartableTask(async (mode: EchoModeKey) => { + let box = this.lassoBBox; + let lasso = this.lassoPts; + let commandContext = this.args.context?.commandContext; + if (!box || !lasso || !commandContext) { + return; + } + this.echoError = null; + this.draft = null; + this.autoDot = null; + this.lastEchoBBox = box; + try { + this.thinkingLabel = 'Reading your ink…'; + let capture = this.captureRegion(box, lasso); + await timeout(350); // let the scan-line register before the request settles + this.thinkingLabel = 'Thinking…'; + let input = new RecognizeInkInput(); + input.instructions = await this.loadMarkerInstructions(); + input.imageDataUrl = capture.dataUrl; + input.mode = mode; + input.boardName = this.args.model?.title ?? ''; + let result = await new RecognizeInkCommand(commandContext).execute(input); + let sketchWorld: number[][] | null = null; + let labelsWorld: EchoLabel[] | null = null; + if (result.sketchJson) { + let parsed = parseSketchJson(result.sketchJson); + // basis detection must see every coordinate the model emitted + let allCoords = [ + ...parsed.polylines.flat(), + ...parsed.labels.flatMap((l) => [l.x, l.y]), + ]; + if (parsed.polylines.length) { + sketchWorld = mapPolylinesToWorld( + parsed.polylines, + box, + CROP_MARGIN, + capture.width, + capture.height, + allCoords, + ); + } + if (parsed.labels.length) { + labelsWorld = mapLabelsToWorld( + parsed.labels, + allCoords, + box, + CROP_MARGIN, + capture.width, + capture.height, + ); + } + } + let sceneJson = result.sceneJson ?? ''; + if (sceneJson) { + try { + let spec = JSON.parse(sceneJson); + if ( + Array.isArray(spec?.steps) && + spec.steps.some((st: any) => st?.add === 'ink') + ) { + let captured = this.strokes.filter((st) => + strokeInLasso(st, lasso), + ); + spec.ink = mapStrokesToManim(captured, box); + sceneJson = JSON.stringify(spec); + } + } catch { + // a malformed spec just plays without the ink object + } + } + let place = this.draftPlacement(box); + this.draft = { + content: result.content ?? '', + mode, + sketchWorld, + labelsWorld, + sceneJson, + x: place.x, + y: place.y, + width: DRAFT_WIDTH, + }; + this.echoBaselineCount = this.strokes.length; + this.lassoPts = null; + this.lassoBBox = null; + } catch (err: any) { + let empty = /empty annotation/i.test( + err instanceof Error ? err.message : String(err), + ); + if (empty) { + // the marker looked and had nothing to add — ambient silence, not an error + this.dismissLasso(); + this.autoSuppressedBelow = this.strokes.length + AUTO_MIN_STROKES; + } else { + let place = this.draftPlacement(box); + this.echoError = { + message: friendlyEchoError(err), + mode, + x: place.x, + y: place.y, + }; + } + } finally { + this.thinkingLabel = null; + } + }); + + startEcho = (mode: string) => { + this.echoTask.perform(mode as EchoModeKey); + }; + + cancelEcho = () => { + this.echoTask.cancelAll(); + this.thinkingLabel = null; + }; + + retryEcho = () => { + let err = this.echoError; + if (!err || !this.lastEchoBBox) { + return; + } + // restore the capture region so the retry has a lasso to read + this.lassoBBox = this.lastEchoBBox; + if (!this.lassoPts) { + let b = this.lastEchoBBox; + this.lassoPts = [ + b.minX, + b.minY, + b.maxX, + b.minY, + b.maxX, + b.maxY, + b.minX, + b.maxY, + ]; + } + this.echoError = null; + this.echoTask.perform(err.mode); + }; + + // The title block is docked bottom-right in SCREEN space; a slip placed in + // world space can slide under it. Place to the right of the ink by default, + // flip left when that would overflow, and lift clear of the docked block. + draftPlacement(box: BBox): { x: number; y: number } { + let el = this.boardEl; + let x = box.maxX + 30; + let y = box.minY; + if (!el) { + return { x, y }; + } + let toScreenX = (wx: number) => wx * this.zoom + this.panX; + let toScreenY = (wy: number) => wy * this.zoom + this.panY; + let widthOnScreen = DRAFT_WIDTH * this.zoom; + if (toScreenX(x) + widthOnScreen > el.clientWidth - 16) { + x = box.minX - DRAFT_WIDTH - 30; // flip to the ink's left + } + let blockTop = el.clientHeight - TITLE_BLOCK_SCREEN.h; + let blockLeft = el.clientWidth - TITLE_BLOCK_SCREEN.w; + let overlapsBlock = + toScreenY(y) + DRAFT_MIN_SCREEN_H > blockTop && + toScreenX(x) + widthOnScreen > blockLeft; + if (overlapsBlock) { + y = (blockTop - DRAFT_MIN_SCREEN_H - 12 - this.panY) / this.zoom; + } + return { x, y }; + } + + captureRegion( + box: BBox, + lasso: number[], + ): { dataUrl: string; width: number; height: number } { + let margin = CROP_MARGIN; + let w = box.maxX - box.minX + margin * 2; + let h = box.maxY - box.minY + margin * 2; + let scale = Math.min(1, CROP_MAX_DIM / Math.max(w, h)) * 2; + let off = document.createElement('canvas'); + off.width = Math.max(1, Math.round(w * scale)); + off.height = Math.max(1, Math.round(h * scale)); + let ctx = off.getContext('2d'); + if (!ctx) { + throw new Error('Could not capture the board region.'); + } + ctx.fillStyle = '#ffffff'; + ctx.fillRect(0, 0, off.width, off.height); + ctx.setTransform( + scale, + 0, + 0, + scale, + -(box.minX - margin) * scale, + -(box.minY - margin) * scale, + ); + ctx.lineCap = 'round'; + ctx.lineJoin = 'round'; + ctx.strokeStyle = '#1a1a3a'; + let padded = expandBBox(box, margin); + for (let s of this.strokes) { + let sb = strokeBBox(s); + let overlaps = + sb.maxX >= padded.minX && + sb.minX <= padded.maxX && + sb.maxY >= padded.minY && + sb.minY <= padded.maxY; + // include everything the user circled, plus nearby context inside the margin + if (overlaps || strokeInLasso(s, lasso)) { + this.strokePath(ctx, s); + } + } + return { + dataUrl: off.toDataURL('image/png'), + width: off.width, + height: off.height, + }; + } + + // ---- draft / accepted echoes ---- + + get echoNotes() { + let list = this.args.model?.echoes ?? []; + return list.filter(Boolean).map((note, index) => { + let override = + this.noteDrag && this.noteDrag.index === index ? this.noteDrag : null; + let parsed = parseSketchJson(note.sketchJson); + return { + note, + index, + sketchOverlay: sketchOverlay( + parsed.polylines.length ? parsed.polylines : null, + parsed.labels, + ), + style: htmlSafe( + `left: ${override?.x ?? note.x ?? 0}px; top: ${ + override?.y ?? note.y ?? 0 + }px; width: ${note.width ?? DRAFT_WIDTH}px`, + ), + }; + }); + } + + get draftStyle(): SafeString { + let d = this.draft; + if (!d) { + return htmlSafe('display: none'); + } + return htmlSafe(`left: ${d.x}px; top: ${d.y}px; width: ${d.width}px`); + } + + get errorStyle(): SafeString { + let s = this.echoError; + if (!s) { + return htmlSafe('display: none'); + } + return htmlSafe(`left: ${s.x}px; top: ${s.y}px; width: ${DRAFT_WIDTH}px`); + } + + get draftSketchOverlay(): { + style: SafeString; + viewBox: string; + paths: string[]; + texts: EchoLabel[]; + } | null { + return sketchOverlay( + this.draft?.sketchWorld ?? null, + this.draft?.labelsWorld ?? [], + ); + } + + get isEmpty(): boolean { + return ( + this.strokeCount === 0 && + (this.args.model?.echoes ?? []).length === 0 && + !this.draft + ); + } + + markerInstructions: string | null | undefined; + + // The marker's prose lives in the bundled Skill card so it can be read and + // remixed as data. Only the component can reach the store (a plain realm + // Command cannot), so the board resolves it and passes it to the command. + async loadMarkerInstructions(): Promise { + if (this.markerInstructions !== undefined) { + return this.markerInstructions ?? ''; + } + this.markerInstructions = null; + try { + // @ts-expect-error import.meta is valid ESM but TS reads .gts as CJS + let here: string = import.meta.url; + let url = new URL('../Skill/echo-marker', here).href; + let skill: any = await this.args.context?.store?.get?.(url); + let text = skill?.instructions; + if (typeof text === 'string' && text.trim().length > 40) { + this.markerInstructions = text.trim(); + } + } catch { + // unreachable skill (remixed realm, offline) — the local grammar stands in + } + return this.markerInstructions ?? ''; + } + + // a linked Theme card means the host has injected semantic tokens into this + // card's scope; only then may our tokens defer to them (otherwise the host's + // default palette would erase the board's own identity) + get themed(): boolean { + return Boolean((this.args.model as any)?.cardInfo?.theme); + } + + get lastInkLabel(): string { + let notes = (this.args.model?.echoes ?? []).filter(Boolean); + let latest = notes[notes.length - 1]?.acceptedAt; + if (!latest) { + return '—'; + } + try { + return new Date(latest as unknown as string).toLocaleDateString( + undefined, + { + month: 'short', + day: 'numeric', + }, + ); + } catch { + return '—'; + } + } + + get boardLabel(): string { + let echoes = (this.args.model?.echoes ?? []).length; + return `Whiteboard with ${this.strokeCount} ink strokes and ${echoes} AI notes`; + } + + acceptDraft = () => { + let d = this.draft; + let model = this.args.model; + if (!d || !model) { + return; + } + this.commitBoardState(); + let existing = (model.echoes ?? []).filter(Boolean); + let note = new EchoNoteField({ + label: `Echo № ${existing.length + 1}`, + mode: d.mode, + content: d.content, + sketchJson: + d.sketchWorld || d.labelsWorld?.length + ? JSON.stringify({ + polylines: d.sketchWorld ?? [], + labels: d.labelsWorld ?? [], + }) + : undefined, + sceneJson: d.sceneJson || undefined, + x: Math.round(d.x), + y: Math.round(d.y), + width: d.width, + acceptedAt: new Date(), + }); + model.echoes = [...existing, note]; + this.draft = null; + }; + + dismissDraft = () => { + this.draft = null; + }; + + startDraftDrag = (event: Event) => { + let e = event as PointerEvent; + e.stopPropagation(); + let el = e.currentTarget as HTMLElement; + try { + el.setPointerCapture(e.pointerId); + } catch { + // see onPointerDown + } + this.activePointer = { + kind: 'drag-draft', + id: e.pointerId, + lastX: e.clientX, + lastY: e.clientY, + }; + }; + + startNoteDrag = (index: number, event: Event) => { + let e = event as PointerEvent; + e.stopPropagation(); + let el = e.currentTarget as HTMLElement; + try { + el.setPointerCapture(e.pointerId); + } catch { + // see onPointerDown + } + this.activePointer = { + kind: 'drag-note', + id: e.pointerId, + lastX: e.clientX, + lastY: e.clientY, + noteIndex: index, + }; + }; + + commitNotePosition(drag: { index: number; x: number; y: number }) { + let model = this.args.model; + if (!model) { + return; + } + let notes = (model.echoes ?? []).filter(Boolean); + let target = notes[drag.index]; + if (!target) { + return; + } + this.commitBoardState(); + target.x = Math.round(drag.x); + target.y = Math.round(drag.y); + model.echoes = [...notes]; + } + + removeNote = (index: number) => { + let model = this.args.model; + if (!model) { + return; + } + let notes = (model.echoes ?? []).filter(Boolean); + let removed = notes[index]; + if (!removed) { + return; + } + this.commitBoardState(); + model.echoes = notes.filter((_, i) => i !== index); + let label = removed.label ?? 'Echo'; + this.toast = { + message: `${label} removed`, + undo: () => { + let current = (model.echoes ?? []).filter(Boolean); + let restored = [...current]; + restored.splice(Math.min(index, restored.length), 0, removed); + model.echoes = restored; + this.toast = null; + window.clearTimeout(this.toastTimer); + }, + }; + window.clearTimeout(this.toastTimer); + this.toastTimer = window.setTimeout(() => { + this.toast = null; + }, 6000); + }; + + undoToast = () => { + this.toast?.undo(); + }; + + stopEvent = (e: Event) => { + e.stopPropagation(); + }; + + echoModes = ECHO_MODES; + + +} + +function sketchOverlay( + polylines: number[][] | null, + labels: EchoLabel[] = [], +): { + style: SafeString; + viewBox: string; + paths: string[]; + texts: EchoLabel[]; +} | null { + let lineBox = polylines?.length ? polylinesBBox(polylines) : null; + let boxes: BBox[] = lineBox ? [lineBox] : []; + for (let l of labels) { + boxes.push({ + minX: l.x, + minY: l.y, + maxX: l.x + l.size * Math.max(1, l.text.length) * 0.62, + maxY: l.y + l.size * 1.25, + }); + } + let box = unionBBox(boxes); + if (!box) { + return null; + } + let pad = 6; + let w = Math.max(1, box.maxX - box.minX + pad * 2); + let h = Math.max(1, box.maxY - box.minY + pad * 2); + return { + style: htmlSafe( + `left: ${box.minX - pad}px; top: ${box.minY - pad}px; width: ${w}px; height: ${h}px`, + ), + viewBox: `${box.minX - pad} ${box.minY - pad} ${w} ${h}`, + paths: polylines?.length ? polylinesToPaths(JSON.stringify(polylines)) : [], + texts: labels, + }; +} + +function expandBBox(box: BBox, margin: number): BBox { + return { + minX: box.minX - margin, + minY: box.minY - margin, + maxX: box.maxX + margin, + maxY: box.maxY + margin, + }; +} + +function velocityWidth(base: number, dist: number): number { + return base * clamp(1.45 - dist / 28, 0.6, 1.35); +} + +function friendlyEchoError(err: unknown): string { + let raw = err instanceof Error ? err.message : String(err); + if (/402|credit/i.test(raw)) { + return "You're out of AI credits."; + } + if (/timeout|network|fetch/i.test(raw)) { + return 'The request did not make it through — check your connection and retry.'; + } + if (/empty annotation|could not read/i.test(raw)) { + return "I couldn't read that — try circling a little more context."; + } + return "I couldn't read that — try circling a little more context."; +} diff --git a/f22ed9-echo-pad/echo-pad/components/scene-player.gts b/f22ed9-echo-pad/echo-pad/components/scene-player.gts new file mode 100644 index 00000000..df99f5c3 --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/components/scene-player.gts @@ -0,0 +1,496 @@ +import Component from '@glimmer/component'; +import { tracked } from '@glimmer/tracking'; +import { on } from '@ember/modifier'; +import { modifier } from 'ember-modifier'; + +import PlayIcon from '@cardstack/boxel-icons/play'; +import { eq } from '@cardstack/boxel-ui/helpers'; + +import { + compileExpression, + validateSceneSpec, + type SceneAddStep, + type ScenePlayStep, + type SceneSpec, +} from '../utils/scene'; + +type ManimRuntime = Record; + +// only one scene plays at a time — a board full of projection slips must not +// hold a WebGL context per slip +let stopCurrent: (() => void) | null = null; + +const SCREEN_BG = '#0b0d12'; +const SCREEN_ACCENT = '#c8ff3d'; +const PAPER_BG = '#f7f4ec'; +const PAPER_ACCENT = '#c33d2e'; +const INK_BLUE = '#2b3f8c'; + +async function runScene( + M: ManimRuntime, + scene: { + add(...o: unknown[]): void; + play(...a: unknown[]): Promise; + wait(d?: number): Promise; + }, + spec: SceneSpec, +): Promise { + let objects = new Map(); + let introduced = new Set(); + + let accent = spec.background === 'paper' ? PAPER_ACCENT : SCREEN_ACCENT; + let build = (step: SceneAddStep): any => { + let color = + step.color === 'accent' || !step.color ? accent : (step.color as string); + switch (step.add) { + case 'ink': { + let lines = spec.ink; + if (!Array.isArray(lines) || !lines.length) { + return null; + } + let parts = lines + .map((l) => { + let pts: number[][] = []; + for (let i = 0; i + 1 < l.length; i += 2) { + pts.push([l[i], l[i + 1], 0]); + } + if (pts.length < 2) { + return null; + } + let v = new M.VMobject(); + v.setPointsAsCorners(pts); + // hand ink is a stroke, never a filled shape + (v as any).fillOpacity = 0; + (v as any).strokeWidth = 3; + return v; + }) + .filter(Boolean); + if (!parts.length) { + return null; + } + let g = new M.VGroup(...parts); + g.setColor?.( + step.color && step.color !== 'accent' + ? (step.color as string) + : INK_BLUE, + ); + return g; + } + case 'axes': + return new M.Axes({ + xRange: [...(step.xRange as number[]), 1], + yRange: [...(step.yRange as number[]), 1], + xLength: 10, + yLength: 5.5, + color: '#667080', + tips: false, + }); + case 'plane': + return new M.NumberPlane({ + xRange: step.xRange, + yRange: step.yRange, + xLength: 10, + yLength: 6, + color: '#596170', + backgroundLineStyle: { + color: '#303541', + opacity: 0.6, + strokeWidth: 1, + }, + }); + case 'graph': { + let fn = compileExpression(String(step.fn)); + if (!fn) { + return null; + } + let axes = step.axes ? objects.get(String(step.axes)) : undefined; + return new M.FunctionGraph({ + func: fn, + xRange: step.xRange, + color, + ...(axes ? { axes } : {}), + }); + } + case 'circle': + return new M.Circle({ + radius: step.radius, + color, + strokeWidth: 3, + fillOpacity: 0.1, + }); + case 'square': + return new M.Square({ + sideLength: step.side, + color, + fillOpacity: 0.12, + }); + case 'rect': + return new M.Rectangle({ + width: step.w, + height: step.h, + color, + fillOpacity: 0.12, + }); + case 'line': + return new M.Line({ + start: [...(step.from as number[]), 0], + end: [...(step.to as number[]), 0], + color, + }); + case 'arrow': + return new M.Arrow({ + start: [...(step.from as number[]), 0], + end: [...(step.to as number[]), 0], + color, + }); + case 'vector': + return new M.Vector({ + direction: [...(step.to as number[]), 0], + color, + }); + case 'dot': + return new M.Dot({ + point: [...(step.at as number[]), 0], + radius: step.radius, + color, + }); + case 'text': { + let t = new M.Text(String(step.value)); + t.setColor?.(color); + return t; + } + case 'mathtex': { + let t = new M.MathTex({ latex: String(step.value) }); + t.setColor?.(color); + return t; + } + default: + return null; + } + }; + + for (let step of spec.steps) { + if ('add' in step && typeof step.add === 'string') { + let s = step as SceneAddStep; + try { + let obj = build(s); + if (!obj) { + continue; + } + if (s.at && s.add !== 'dot') { + obj.moveTo?.([...(s.at as number[]), 0]); + } + objects.set(s.id, obj); + } catch { + // one bad mobject never kills the scene + } + continue; + } + let p = step as ScenePlayStep; + let d = Number(p.duration) || 1; + if (p.play === 'wait') { + await scene.wait(d); + continue; + } + let obj = p.target ? objects.get(p.target) : undefined; + if (!obj) { + continue; + } + try { + let intro = ['create', 'write', 'fadeIn'].includes(p.play); + if (!intro && !introduced.has(p.target!)) { + scene.add(obj); + introduced.add(p.target!); + } + switch (p.play) { + case 'create': + await scene.play(new M.Create(obj, { duration: d })); + break; + case 'write': + await scene.play(new M.Write(obj, { duration: d })); + break; + case 'fadeIn': + await scene.play(new M.FadeIn(obj, { duration: d })); + break; + case 'fadeOut': + await scene.play(new M.FadeOut(obj, { duration: d })); + break; + case 'transform': { + let to = objects.get(String(p.to)); + if (to) { + await scene.play(new M.Transform(obj, to, { duration: d })); + } + break; + } + case 'rotate': + await scene.play(new M.Rotate(obj, { angle: p.angle, duration: d })); + break; + case 'scale': + await scene.play( + new M.Scale(obj, { scaleFactor: p.factor, duration: d }), + ); + break; + case 'wave': + await scene.play( + new M.ApplyWave(obj, { + amplitude: p.amplitude, + duration: d, + direction: 'vertical', + }), + ); + break; + case 'orbit': { + let path = objects.get(String(p.path)); + if (path) { + await scene.play(new M.MoveAlongPath(obj, { path, duration: d })); + } + break; + } + case 'indicate': + await scene.play(new M.Indicate(obj, { duration: d })); + break; + case 'shear': { + let m2 = p.matrix as number[][]; + await scene.play( + new M.ApplyMatrix(obj, { + matrix: [ + [m2[0][0], m2[0][1], 0], + [m2[1][0], m2[1][1], 0], + [0, 0, 1], + ], + duration: d, + }), + ); + break; + } + } + if (intro) { + introduced.add(p.target!); + } + } catch { + // skip a failing step; the rest of the scene still plays + } + } +} + +interface Signature { + Args: { sceneJson?: string | null }; + Element: HTMLElement; +} + +export class EchoScenePlayer extends Component { + @tracked status: 'poster' | 'active' | 'error' = 'poster'; + + get spec(): SceneSpec | null { + try { + return validateSceneSpec(JSON.parse(this.args.sceneJson ?? '')); + } catch { + return null; + } + } + + get title(): string { + return this.spec?.title ?? 'Animation'; + } + + get background(): string { + return this.spec?.background ?? 'screen'; + } + + stopEvent = (e: Event) => { + e.stopPropagation(); + }; + + play = () => { + if (!this.spec) { + this.status = 'error'; + return; + } + stopCurrent?.(); + this.status = 'active'; + }; + + stop = () => { + this.status = 'poster'; + }; + + willDestroy(): void { + super.willDestroy(); + if (stopCurrent === this.stop) { + stopCurrent = null; + } + } + + mountPlayer = modifier((element: HTMLElement) => { + let active = true; + let player: { dispose(): void } | undefined; + stopCurrent = this.stop; + + void (async () => { + try { + // lazy: ink-only boards never pay for the manim bundle + // @ts-expect-error the pinned realm bundle ships as untyped browser JS + let M = (await import('../manim-web')) as unknown as ManimRuntime; + if (!active) { + return; + } + player = new M.Player(element, { + autoHideMs: 2600, + autoPlay: true, + loop: false, + backgroundColor: + this.spec!.background === 'paper' ? PAPER_BG : SCREEN_BG, + }); + await (player as any).sequence(async (scene: any) => + runScene(M, scene, this.spec!), + ); + } catch { + if (active) { + this.status = 'error'; + } + } + })(); + + return () => { + active = false; + player?.dispose(); + element.replaceChildren(); + if (stopCurrent === this.stop) { + stopCurrent = null; + } + }; + }); + + +} diff --git a/f22ed9-echo-pad/echo-pad/echo-pad.gts b/f22ed9-echo-pad/echo-pad/echo-pad.gts new file mode 100644 index 00000000..6b336822 --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/echo-pad.gts @@ -0,0 +1,42 @@ +import { + CardDef, + contains, + containsMany, + field, +} from '@cardstack/base/card-api'; +import StringField from '@cardstack/base/string'; +import TextAreaField from '@cardstack/base/text-area'; +import PencilRulerIcon from '@cardstack/boxel-icons/pencil-ruler'; + +import { EchoPadEdit } from './components/edit'; +import { EchoPadEmbedded, EchoPadFitted } from './components/formats'; +import { EchoPadIsolated } from './components/isolated'; +import { EchoNoteField } from './fields/echo-note'; + +export { EchoNoteField }; + +export class EchoPad extends CardDef { + static displayName = 'Echo Pad'; + static icon = PencilRulerIcon; + static prefersWideFormat = true; + + @field boardName = contains(StringField); + // serialized ink strokes ({v, strokes: [{w, pts}]}) — one field, written on + // a debounced idle, never per point + @field inkJson = contains(TextAreaField); + // camera ({x, y, zoom}) so a board reopens where it was left + @field viewportJson = contains(StringField); + // accepted AI annotations; unaccepted drafts never reach the model + @field echoes = containsMany(EchoNoteField); + + @field title = contains(StringField, { + computeVia: function (this: EchoPad) { + return this.boardName?.trim() || 'Echo Pad'; + }, + }); +} + +EchoPad.isolated = EchoPadIsolated; +EchoPad.embedded = EchoPadEmbedded; +EchoPad.fitted = EchoPadFitted; +EchoPad.edit = EchoPadEdit; diff --git a/f22ed9-echo-pad/echo-pad/fields/echo-note.gts b/f22ed9-echo-pad/echo-pad/fields/echo-note.gts new file mode 100644 index 00000000..cd0665a4 --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/fields/echo-note.gts @@ -0,0 +1,59 @@ +import { FieldDef, Component, contains, field } from '@cardstack/base/card-api'; +import DateTimeField from '@cardstack/base/datetime'; +import NumberField from '@cardstack/base/number'; +import StringField from '@cardstack/base/string'; +import TextAreaField from '@cardstack/base/text-area'; +import SparklesIcon from '@cardstack/boxel-icons/sparkles'; + +export class EchoNoteField extends FieldDef { + static displayName = 'Echo Note'; + static icon = SparklesIcon; + + @field label = contains(StringField); // e.g. "Echo № 2" + @field mode = contains(StringField); // solve | complete | explain + @field content = contains(TextAreaField); + @field x = contains(NumberField); // world coordinates on the board + @field y = contains(NumberField); + @field width = contains(NumberField); + @field acceptedAt = contains(DateTimeField); + @field sketchJson = contains(StringField); // red-pen sketch the AI drew back (world polylines) + @field sceneJson = contains(StringField); // manim scene spec (validated, deterministic) + + static embedded = class Embedded extends Component { + + }; +} diff --git a/f22ed9-echo-pad/echo-pad/utils/index.gts b/f22ed9-echo-pad/echo-pad/utils/index.gts new file mode 100644 index 00000000..2ec762f6 --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/utils/index.gts @@ -0,0 +1,482 @@ +// Pure ink-model, geometry, and echo-validation helpers. No card imports — +// keeps the module testable and lets the command's validation core run as +// plain functions. + +import { extractSceneBlock, SCENE_GRAMMAR, type SceneSpec } from './scene'; + +export type InkStroke = { + w: number; // base stroke width in world units + pts: number[]; // flat [x0, y0, x1, y1, ...] in world coordinates +}; + +export type InkDoc = { + v: 1; + strokes: InkStroke[]; +}; + +export type BBox = { + minX: number; + minY: number; + maxX: number; + maxY: number; +}; + +export type EchoModeKey = + | 'solve' + | 'check' + | 'complete' + | 'explain' + | 'animate' + | 'auto'; + +export const ECHO_MODES: { key: EchoModeKey; label: string; ask: string }[] = [ + { + key: 'solve', + label: 'Solve', + ask: 'Solve the problem shown in the handwriting. Show the key steps briefly, then the final answer.', + }, + { + key: 'check', + label: 'Check', + ask: "The handwriting contains the user's own worked solution or claim. Mark it like a kind but precise grader: if it is correct, reply with a short confirmation ending in ✓; if it is wrong, name the first incorrect step and give the corrected result ending in ✗ → the right answer.", + }, + { + key: 'complete', + label: 'Complete', + ask: 'The sketch or working is unfinished. Infer the intent and supply the missing part.', + }, + { + key: 'explain', + label: 'Explain', + ask: 'Explain what the handwriting and sketch describe, concisely, as an annotation.', + }, + { + key: 'animate', + label: 'Animate', + ask: 'Compose a short animation that shows the idea in motion. Strongly prefer a scene block; keep the annotation text to at most 2 short lines.', + }, +]; + +export const INK_COLOR = '#2b3f8c'; +export const ECHO_COLOR = '#c33d2e'; +export const ZOOM_MIN = 0.25; +export const ZOOM_MAX = 4; +export const ECHO_MAX_CHARS = 1200; + +export const EMPTY_INK: InkDoc = { v: 1, strokes: [] }; + +export function serializeInk(doc: InkDoc): string { + return JSON.stringify({ + v: 1, + strokes: doc.strokes.map((s) => ({ + w: round1(s.w), + pts: s.pts.map(round1), + })), + }); +} + +export function parseInk(json: string | undefined | null): InkDoc { + if (!json) { + return { v: 1, strokes: [] }; + } + try { + let raw = JSON.parse(json); + let strokes = Array.isArray(raw?.strokes) ? raw.strokes : []; + return { + v: 1, + strokes: strokes + .filter( + (s: any) => + s && + Array.isArray(s.pts) && + s.pts.length >= 4 && + s.pts.length % 2 === 0, + ) + .map((s: any) => ({ + w: clamp(Number(s.w) || 2.5, 0.5, 24), + pts: s.pts.map((n: any) => Number(n) || 0), + })), + }; + } catch { + return { v: 1, strokes: [] }; + } +} + +export function strokeBBox(stroke: InkStroke): BBox { + let minX = Infinity, + minY = Infinity, + maxX = -Infinity, + maxY = -Infinity; + for (let i = 0; i < stroke.pts.length; i += 2) { + let x = stroke.pts[i], + y = stroke.pts[i + 1]; + if (x < minX) minX = x; + if (x > maxX) maxX = x; + if (y < minY) minY = y; + if (y > maxY) maxY = y; + } + return { minX, minY, maxX, maxY }; +} + +export function unionBBox(boxes: BBox[]): BBox | null { + if (!boxes.length) { + return null; + } + return boxes.reduce((a, b) => ({ + minX: Math.min(a.minX, b.minX), + minY: Math.min(a.minY, b.minY), + maxX: Math.max(a.maxX, b.maxX), + maxY: Math.max(a.maxY, b.maxY), + })); +} + +export function pointInPolygon(x: number, y: number, poly: number[]): boolean { + // poly is a flat [x0, y0, x1, y1, ...] ring + let inside = false; + let n = poly.length / 2; + for (let i = 0, j = n - 1; i < n; j = i++) { + let xi = poly[i * 2], + yi = poly[i * 2 + 1]; + let xj = poly[j * 2], + yj = poly[j * 2 + 1]; + let intersects = + yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi; + if (intersects) { + inside = !inside; + } + } + return inside; +} + +export function strokeInLasso(stroke: InkStroke, lasso: number[]): boolean { + // A stroke counts as captured when most of its points fall inside the ring. + let total = stroke.pts.length / 2; + if (total === 0 || lasso.length < 6) { + return false; + } + let inside = 0; + for (let i = 0; i < stroke.pts.length; i += 2) { + if (pointInPolygon(stroke.pts[i], stroke.pts[i + 1], lasso)) { + inside++; + } + } + return inside / total >= 0.5; +} + +export function strokeNearPoint( + stroke: InkStroke, + x: number, + y: number, + radius: number, +): boolean { + let r2 = radius * radius; + for (let i = 0; i + 3 < stroke.pts.length; i += 2) { + if ( + segmentDistSq( + x, + y, + stroke.pts[i], + stroke.pts[i + 1], + stroke.pts[i + 2], + stroke.pts[i + 3], + ) <= r2 + ) { + return true; + } + } + return false; +} + +function segmentDistSq( + px: number, + py: number, + ax: number, + ay: number, + bx: number, + by: number, +): number { + let dx = bx - ax, + dy = by - ay; + let lenSq = dx * dx + dy * dy; + let t = lenSq === 0 ? 0 : ((px - ax) * dx + (py - ay) * dy) / lenSq; + t = clamp(t, 0, 1); + let cx = ax + t * dx, + cy = ay + t * dy; + return (px - cx) * (px - cx) + (py - cy) * (py - cy); +} + +export function clamp(n: number, min: number, max: number): number { + return Math.min(max, Math.max(min, n)); +} + +function round1(n: number): number { + return Math.round(n * 10) / 10; +} + +const AUTO_ASK = + 'Respond helpfully to whatever the ink is reaching for: solve a problem, answer a question, complete a sketch or list, or briefly explain — whichever fits. If nothing clearly calls for a response, reply with exactly NOTHING.'; + +const DRAW_HINT = + ' If a small sketch genuinely helps (completing a diagram, drawing the missing part, an arrow, a quick plot), append one fenced block exactly like ```draw {"polylines":[[x1,y1,x2,y2,...]]}``` — coordinates are PIXELS in the image you were shown (0,0 = its top-left), so your lines land exactly where you place them on the drawing. At most 6 polylines. NEVER form characters out of polylines — to write numbers, words or expressions on the paper, add "write" entries to the same block: {"polylines":[...],"write":[{"text":"14","at":[x,y],"size":44}]} — at is the top-left of the text in image pixels, size its height in pixels; the board renders it in red handwriting exactly there. Use polylines only for shapes, arrows and plots.'; + +export function buildEchoPrompt(mode: EchoModeKey, boardName?: string): string { + let ask = + mode === 'auto' + ? AUTO_ASK + : (ECHO_MODES.find((x) => x.key === mode) ?? ECHO_MODES[0]).ask; + return [ + 'You are a red pen annotating a handwritten board', + boardName ? ` titled "${boardName}"` : '', + '. The image shows handwriting and rough sketches — it could be math, a question in words, a diagram, a list, or a half-formed idea. ', + ask, + ' Reply with the annotation text ONLY — no preamble, no markdown fences, no headings.', + ' If math is involved, write it in plain unicode (v₀, θ, ², ×, ÷, ≈, √), never LaTeX.', + ' Keep it under 8 short lines, sized for a margin note.', + DRAW_HINT, + mode === 'animate' || mode === 'auto' ? ' ' + SCENE_GRAMMAR : '', + ] + .filter(Boolean) + .join(''); +} + +export function parseEchoResponse( + raw: string | undefined | null, +): string | null { + if (!raw) { + return null; + } + let text = String(raw).trim(); + // strip a wrapping code fence if the model ignored instructions + let fence = text.match(/^```[a-zA-Z]*\n([\s\S]*?)\n?```$/); + if (fence) { + text = fence[1].trim(); + } + // drop common chat preambles on the first line + text = text.replace(/^(sure|certainly|here('|')s)[^\n]*\n+/i, '').trim(); + if (!text) { + return null; + } + if (text.length > ECHO_MAX_CHARS) { + text = text.slice(0, ECHO_MAX_CHARS).trimEnd() + '…'; + } + return text; +} + +export const MAX_SKETCH_POLYLINES = 6; +const MAX_SKETCH_POINTS = 64; +export const MAX_SKETCH_LABELS = 4; +const MAX_LABEL_CHARS = 32; + +// Models cannot hand-write legible characters out of raw polylines, so text +// answers travel as write-labels: the model picks the words and the spot, the +// board renders them in its own red handwriting. +export type EchoLabel = { + text: string; + x: number; + y: number; + size: number; // text height, same coordinate space as x/y +}; + +export type EchoSplit = { + text: string | null; + polylines: number[][] | null; // image-space, flat [x, y, ...] per line + labels: EchoLabel[] | null; // image-space write-backs + scene: SceneSpec | null; // validated manim scene spec, if the model composed one +}; + +export function splitEchoResponse(raw: string | undefined | null): EchoSplit { + if (!raw) { + return { text: null, polylines: null, labels: null, scene: null }; + } + let extracted = extractSceneBlock(String(raw)); + let text = extracted.rest; + let scene = extracted.spec; + let polylines: number[][] | null = null; + let labels: EchoLabel[] | null = null; + let m = text.match(/```draw\s*([\s\S]*?)```/); + if (m) { + text = text.replace(m[0], '').trim(); + try { + let spec = JSON.parse(m[1]); + let lines = Array.isArray(spec?.polylines) ? spec.polylines : []; + let valid = lines + .filter( + (l: any) => + Array.isArray(l) && + l.length >= 4 && + l.length % 2 === 0 && + l.every((n: any) => typeof n === 'number' && isFinite(n)), + ) + .slice(0, MAX_SKETCH_POLYLINES) + .map((l: number[]) => + l.slice(0, MAX_SKETCH_POINTS * 2).map((n) => clamp(n, 0, 8192)), + ); + if (valid.length) { + polylines = valid; + } + let writes = Array.isArray(spec?.write) ? spec.write : []; + let validLabels = writes + .filter( + (w: any) => + w && + typeof w.text === 'string' && + w.text.trim().length && + Array.isArray(w.at) && + w.at.length >= 2 && + isFinite(Number(w.at[0])) && + isFinite(Number(w.at[1])), + ) + .slice(0, MAX_SKETCH_LABELS) + .map((w: any) => ({ + text: w.text.replace(/\s+/g, ' ').trim().slice(0, MAX_LABEL_CHARS), + x: clamp(Number(w.at[0]), 0, 8192), + y: clamp(Number(w.at[1]), 0, 8192), + size: clamp(Number(w.size) || 44, 10, 240), + })); + if (validLabels.length) { + labels = validLabels; + } + } catch { + // malformed draw block: keep the text, drop the sketch + } + } + let cleaned = parseEchoResponse(text); + if (cleaned && /^nothing[.!]?$/i.test(cleaned)) { + cleaned = null; // the auto mode's explicit "no response needed" signal + } + return { text: cleaned, polylines, labels, scene }; +} + +// sketchJson carries either the legacy bare polylines array or the current +// { polylines, labels } object — readers accept both. +export function parseSketchJson(json: string | undefined | null): { + polylines: number[][]; + labels: EchoLabel[]; +} { + if (!json) { + return { polylines: [], labels: [] }; + } + try { + let raw = JSON.parse(json); + if (Array.isArray(raw)) { + return { + polylines: raw.filter((l: any) => Array.isArray(l)), + labels: [], + }; + } + return { + polylines: Array.isArray(raw?.polylines) + ? raw.polylines.filter((l: any) => Array.isArray(l)) + : [], + labels: Array.isArray(raw?.labels) + ? raw.labels.filter( + (w: any) => + w && typeof w.text === 'string' && isFinite(w.x) && isFinite(w.y), + ) + : [], + }; + } catch { + return { polylines: [], labels: [] }; + } +} + +export function polylinesToPaths(json: string | undefined | null): string[] { + return parseSketchJson(json) + .polylines.filter((l) => l.length >= 4) + .map((l) => { + let d = `M ${l[0]} ${l[1]}`; + for (let i = 2; i < l.length; i += 2) { + d += ` L ${l[i]} ${l[i + 1]}`; + } + return d; + }); +} + +export function labelsFromSketchJson( + json: string | undefined | null, +): EchoLabel[] { + return parseSketchJson(json).labels; +} + +export function mapLabelsToWorld( + labels: EchoLabel[], + allCoords: number[], + box: BBox, + margin: number, + imageW: number, + imageH: number, +): EchoLabel[] { + let x0 = box.minX - margin; + let y0 = box.minY - margin; + let w = box.maxX - box.minX + margin * 2; + let h = box.maxY - box.minY + margin * 2; + let maxCoord = Math.max(...allCoords, 0); + let basisX = maxCoord <= 105 ? 100 : Math.max(1, imageW); + let basisY = maxCoord <= 105 ? 100 : Math.max(1, imageH); + return labels.map((l) => ({ + text: l.text, + x: x0 + (l.x / basisX) * w, + y: y0 + (l.y / basisY) * h, + size: (l.size / basisY) * h, + })); +} + +export function mapPolylinesToWorld( + polylines: number[][], + box: BBox, + margin: number, + imageW: number, + imageH: number, + basisCoords?: number[], +): number[][] { + // the capture image spans box ± margin in world units. Models are asked for + // image-pixel coordinates, but some reply normalized 0–100 — detect which. + let x0 = box.minX - margin; + let y0 = box.minY - margin; + let w = box.maxX - box.minX + margin * 2; + let h = box.maxY - box.minY + margin * 2; + let maxCoord = Math.max(...(basisCoords ?? polylines.flat()), 0); + let basisX = maxCoord <= 105 ? 100 : Math.max(1, imageW); + let basisY = maxCoord <= 105 ? 100 : Math.max(1, imageH); + return polylines.map((l) => + l.map((n, i) => + i % 2 === 0 ? x0 + (n / basisX) * w : y0 + (n / basisY) * h, + ), + ); +} + +export function polylinesBBox(polylines: number[][]): BBox | null { + let pts = polylines.flat(); + if (pts.length < 4) { + return null; + } + let minX = Infinity, + minY = Infinity, + maxX = -Infinity, + maxY = -Infinity; + for (let i = 0; i < pts.length; i += 2) { + if (pts[i] < minX) minX = pts[i]; + if (pts[i] > maxX) maxX = pts[i]; + if (pts[i + 1] < minY) minY = pts[i + 1]; + if (pts[i + 1] > maxY) maxY = pts[i + 1]; + } + return { minX, minY, maxX, maxY }; +} + +// A cheap deterministic key over the capture + mode. Not cryptographic — it +// only needs to distinguish one circled region from another within a session. +export function echoCacheKey( + imageDataUrl: string, + mode: string, + promptSource = '', +): string { + let h1 = 0x811c9dc5; + let h2 = 0x01000193; + let src = imageDataUrl + '\u0000' + promptSource; + for (let i = 0; i < src.length; i++) { + let c = src.charCodeAt(i); + h1 = ((h1 ^ c) * 0x01000193) >>> 0; + h2 = ((h2 + c) * 0x85ebca6b) >>> 0; + } + return `${mode}:${src.length}:${h1.toString(36)}${h2.toString(36)}`; +} diff --git a/f22ed9-echo-pad/echo-pad/utils/scene.gts b/f22ed9-echo-pad/echo-pad/utils/scene.gts new file mode 100644 index 00000000..6a84ef14 --- /dev/null +++ b/f22ed9-echo-pad/echo-pad/utils/scene.gts @@ -0,0 +1,515 @@ +// Pure scene-spec machinery: the whitelisted grammar the model writes, +// the validator that normalizes/rejects specs, and a safe math-expression +// parser for function graphs. The model NEVER supplies executable code — +// everything here is data, deterministically interpreted. + +import { clamp, type BBox, type InkStroke } from './index'; + +export const SCENE_MAX_STEPS = 16; +export const SCENE_MAX_DURATION = 4; + +export type SceneAddStep = { + add: string; + id: string; + [key: string]: unknown; +}; + +export type ScenePlayStep = { + play: string; + target?: string; + [key: string]: unknown; +}; + +export type SceneStep = SceneAddStep | ScenePlayStep; + +export type SceneSpec = { + title: string; + steps: SceneStep[]; + background: 'paper' | 'screen'; + ink?: number[][]; // the user's circled strokes in manim coords — injected by the board, never by the model +}; + +// ---- safe math expressions (recursive descent, no eval) ---- + +type Tok = + | { kind: 'num'; value: number } + | { kind: 'name'; value: string } + | { kind: 'op'; value: string }; + +const FN_NAMES = ['sin', 'cos', 'tan', 'exp', 'log', 'sqrt', 'abs'] as const; +const FNS: Record number> = { + sin: Math.sin, + cos: Math.cos, + tan: Math.tan, + exp: Math.exp, + log: Math.log, + sqrt: Math.sqrt, + abs: Math.abs, +}; + +function tokenize(src: string): Tok[] | null { + let toks: Tok[] = []; + let i = 0; + while (i < src.length) { + let c = src[i]; + if (c === ' ' || c === '\t') { + i++; + continue; + } + if (/[0-9.]/.test(c)) { + let j = i; + while (j < src.length && /[0-9.]/.test(src[j])) j++; + let n = Number(src.slice(i, j)); + if (!isFinite(n)) return null; + toks.push({ kind: 'num', value: n }); + i = j; + continue; + } + if (/[a-zA-Z]/.test(c)) { + let j = i; + while (j < src.length && /[a-zA-Z]/.test(src[j])) j++; + toks.push({ kind: 'name', value: src.slice(i, j).toLowerCase() }); + i = j; + continue; + } + if ('+-*/^()'.includes(c)) { + toks.push({ kind: 'op', value: c }); + i++; + continue; + } + return null; // anything else is rejected outright + } + return toks; +} + +type Evaluator = (x: number) => number; + +// grammar: expr → term ((+|-) term)* ; term → unary ((*|/|implicit) unary)* ; +// unary → -unary | power ; power → primary (^ unary)? ; +// primary → num | x | pi | e | fn(expr) | (expr) +export function compileExpression(src: string): Evaluator | null { + let toks = tokenize(src ?? ''); + if (!toks || !toks.length || toks.length > 64) { + return null; + } + let pos = 0; + let peek = () => toks![pos]; + let take = () => toks![pos++]; + let failed = false; + + function primary(): Evaluator { + let t = take(); + if (!t) { + failed = true; + return () => 0; + } + if (t.kind === 'num') { + let v = t.value; + return () => v; + } + if (t.kind === 'name') { + if (t.value === 'x') return (x) => x; + if (t.value === 'pi') return () => Math.PI; + if (t.value === 'e') return () => Math.E; + if ((FN_NAMES as readonly string[]).includes(t.value)) { + let fn = FNS[t.value]; + let open = take(); + if (!open || open.kind !== 'op' || open.value !== '(') { + failed = true; + return () => 0; + } + let inner = expr(); + let close = take(); + if (!close || close.kind !== 'op' || close.value !== ')') { + failed = true; + return () => 0; + } + return (x) => fn(inner(x)); + } + failed = true; + return () => 0; + } + if (t.kind === 'op' && t.value === '(') { + let inner = expr(); + let close = take(); + if (!close || close.kind !== 'op' || close.value !== ')') { + failed = true; + return () => 0; + } + return inner; + } + failed = true; + return () => 0; + } + + function unary(): Evaluator { + let t = peek(); + if (t && t.kind === 'op' && t.value === '-') { + take(); + let inner = unary(); + return (x) => -inner(x); + } + return power(); + } + + function power(): Evaluator { + let base = primary(); + let t = peek(); + if (t && t.kind === 'op' && t.value === '^') { + take(); + let exp = unary(); + return (x) => Math.pow(base(x), exp(x)); + } + return base; + } + + function startsPrimary(t: Tok | undefined): boolean { + return ( + !!t && + (t.kind === 'num' || + t.kind === 'name' || + (t.kind === 'op' && t.value === '(')) + ); + } + + function term(): Evaluator { + let left = unary(); + for (;;) { + let t = peek(); + if (t && t.kind === 'op' && (t.value === '*' || t.value === '/')) { + take(); + let right = unary(); + let op = t.value; + let l = left; + left = op === '*' ? (x) => l(x) * right(x) : (x) => l(x) / right(x); + continue; + } + if (startsPrimary(t)) { + // implicit multiplication: 2x, 2sin(x), x(x+1) + let right = unary(); + let l = left; + left = (x) => l(x) * right(x); + continue; + } + return left; + } + } + + function expr(): Evaluator { + let left = term(); + for (;;) { + let t = peek(); + if (t && t.kind === 'op' && (t.value === '+' || t.value === '-')) { + take(); + let right = term(); + let op = t.value; + let l = left; + left = op === '+' ? (x) => l(x) + right(x) : (x) => l(x) - right(x); + continue; + } + return left; + } + } + + let compiled = expr(); + if (failed || pos !== toks.length) { + return null; + } + let probe = compiled(0.5); + if (typeof probe !== 'number') { + return null; + } + return (x: number) => { + let v = compiled(x); + return isFinite(v) ? v : 0; + }; +} + +// ---- spec validation ---- + +const ADD_TYPES = [ + 'ink', + 'axes', + 'plane', + 'graph', + 'circle', + 'square', + 'rect', + 'line', + 'arrow', + 'vector', + 'dot', + 'text', + 'mathtex', +]; +const PLAY_TYPES = [ + 'create', + 'write', + 'fadeIn', + 'fadeOut', + 'transform', + 'rotate', + 'scale', + 'wave', + 'orbit', + 'indicate', + 'shear', + 'wait', +]; + +function asNum(v: unknown, min: number, max: number, dflt: number): number { + let n = Number(v); + return isFinite(n) ? clamp(n, min, max) : dflt; +} + +function asRange(v: unknown, fallback: [number, number]): [number, number] { + if (Array.isArray(v) && v.length >= 2) { + let a = asNum(v[0], -20, 20, fallback[0]); + let b = asNum(v[1], -20, 20, fallback[1]); + return a < b ? [a, b] : fallback; + } + return fallback; +} + +function asPoint(v: unknown): [number, number] | null { + if (Array.isArray(v) && v.length >= 2) { + let x = Number(v[0]); + let y = Number(v[1]); + if (isFinite(x) && isFinite(y)) { + return [clamp(x, -20, 20), clamp(y, -20, 20)]; + } + } + return null; +} + +function asColor(v: unknown): string | null { + if (typeof v === 'string' && /^#[0-9a-fA-F]{3,8}$/.test(v)) { + return v; + } + if (v === 'accent') { + return 'accent'; + } + return null; +} + +export function validateSceneSpec(raw: unknown): SceneSpec | null { + if (!raw || typeof raw !== 'object') { + return null; + } + let title = String((raw as any).title ?? 'Scene').slice(0, 80); + let steps = (raw as any).steps; + if (!Array.isArray(steps) || !steps.length) { + return null; + } + let out: SceneStep[] = []; + let ids = new Set(); + + for (let step of steps.slice(0, SCENE_MAX_STEPS)) { + if (!step || typeof step !== 'object') { + continue; + } + if (typeof step.add === 'string' && ADD_TYPES.includes(step.add)) { + let id = String(step.id ?? '').slice(0, 24); + if (!id || ids.has(id)) { + continue; + } + let s: SceneAddStep = { add: step.add, id }; + let at = asPoint(step.at); + if (at) s.at = at; + let color = asColor(step.color); + if (color) s.color = color; + switch (step.add) { + case 'axes': + case 'plane': + s.xRange = asRange(step.xRange, [-5, 5]); + s.yRange = asRange(step.yRange, [-3, 3]); + break; + case 'graph': { + let fn = String(step.fn ?? ''); + if (!compileExpression(fn)) { + continue; // unparseable function: drop the step + } + s.fn = fn.slice(0, 120); + s.xRange = asRange(step.xRange, [-5, 5]); + if (typeof step.axes === 'string') { + s.axes = String(step.axes).slice(0, 24); + } + break; + } + case 'circle': + s.radius = asNum(step.radius, 0.1, 12, 1.5); + break; + case 'square': + s.side = asNum(step.side ?? step.sideLength, 0.1, 12, 2); + break; + case 'rect': + s.w = asNum(step.w ?? step.width, 0.1, 14, 3); + s.h = asNum(step.h ?? step.height, 0.1, 10, 2); + break; + case 'line': + case 'arrow': { + let from = asPoint(step.from); + let to = asPoint(step.to); + if (!from || !to) { + continue; + } + s.from = from; + s.to = to; + break; + } + case 'vector': { + let to = asPoint(step.to); + if (!to) { + continue; + } + s.to = to; + break; + } + case 'dot': + s.at = asPoint(step.at) ?? [0, 0]; + s.radius = asNum(step.radius, 0.04, 1, 0.12); + break; + case 'ink': + break; // geometry arrives via spec.ink, injected by the board + case 'text': + case 'mathtex': { + let value = String(step.value ?? '').slice(0, 120); + if (!value.trim()) { + continue; + } + s.value = value; + break; + } + } + ids.add(id); + out.push(s); + continue; + } + if (typeof step.play === 'string' && PLAY_TYPES.includes(step.play)) { + let p: ScenePlayStep = { play: step.play }; + p.duration = asNum(step.duration, 0.2, SCENE_MAX_DURATION, 1); + if (step.play === 'wait') { + out.push(p); + continue; + } + let target = String(step.target ?? '').slice(0, 24); + if (!target || !ids.has(target)) { + continue; // plays must reference something already added + } + p.target = target; + switch (step.play) { + case 'transform': { + let to = String(step.to ?? '').slice(0, 24); + if (!to || !ids.has(to)) { + continue; + } + p.to = to; + break; + } + case 'rotate': + p.angle = asNum(step.angle, -6.4, 6.4, Math.PI); + break; + case 'scale': + p.factor = asNum(step.factor ?? step.scaleFactor, 0.1, 6, 1.5); + break; + case 'wave': + p.amplitude = asNum(step.amplitude, 0.05, 2, 0.4); + break; + case 'orbit': { + let path = String(step.path ?? '').slice(0, 24); + if (!path || !ids.has(path)) { + continue; + } + p.path = path; + break; + } + case 'shear': { + let m = step.matrix; + if ( + !Array.isArray(m) || + m.length !== 2 || + !m.every( + (row: unknown) => + Array.isArray(row) && + row.length === 2 && + row.every((n: unknown) => isFinite(Number(n))), + ) + ) { + continue; + } + p.matrix = m.map((row: number[]) => + row.map((n) => clamp(Number(n), -10, 10)), + ); + break; + } + } + out.push(p); + } + } + + if (!out.some((s) => 'play' in s && s.play !== 'wait')) { + return null; // a scene with nothing animated isn't a scene + } + let hasInk = out.some((s) => 'add' in s && (s as SceneAddStep).add === 'ink'); + let bg = (raw as any).background; + let background: 'paper' | 'screen' = + bg === 'paper' || bg === 'screen' ? bg : hasInk ? 'paper' : 'screen'; + let spec: SceneSpec = { title, steps: out, background }; + // pass through board-injected ink geometry, revalidated on every parse + let rawInk = (raw as any).ink; + if (hasInk && Array.isArray(rawInk)) { + let ink = rawInk + .filter((l: unknown) => Array.isArray(l) && (l as number[]).length >= 4) + .slice(0, 24) + .map((l: number[]) => + l.slice(0, 400).map((n) => clamp(Number(n) || 0, -8, 8)), + ); + if (ink.length) { + spec.ink = ink; + } + } + return spec; +} + +export function mapStrokesToManim(strokes: InkStroke[], box: BBox): number[][] { + // fit the lassoed region into a 10×6 patch of manim units, y flipped + let w = Math.max(1, box.maxX - box.minX); + let h = Math.max(1, box.maxY - box.minY); + let scale = Math.min(10 / w, 6 / h); + let cx = (box.minX + box.maxX) / 2; + let cy = (box.minY + box.maxY) / 2; + return strokes.slice(0, 24).map((s) => { + let out: number[] = []; + for (let i = 0; i + 1 < s.pts.length && out.length < 400; i += 2) { + out.push((s.pts[i] - cx) * scale, -(s.pts[i + 1] - cy) * scale); + } + return out; + }); +} + +export function extractSceneBlock(raw: string): { + rest: string; + spec: SceneSpec | null; +} { + let m = raw.match(/```scene\s*([\s\S]*?)```/); + if (!m) { + return { rest: raw, spec: null }; + } + let rest = raw.replace(m[0], '').trim(); + try { + return { rest, spec: validateSceneSpec(JSON.parse(m[1])) }; + } catch { + return { rest, spec: null }; + } +} + +// the grammar the model writes against — proven verbatim in the v3 spike +export const SCENE_GRAMMAR = [ + 'If motion would explain the idea better than words, append ONE fenced block exactly like ```scene {"title":"...","steps":[...]}``` after your text.', + ' Each step is one JSON object. Object steps: {"add":TYPE,"id":"unique",...props}. TYPE choices:', + ' Prefer composing your own clean, precise graphs and diagrams — that is what makes the animation valuable. ink{} — the user\'s circled strokes as one object — should ONLY be used as the starting shape of a transform into the ideal form you draw (rough sketch morphs into the true curve); never animate the raw ink for its own sake · axes{xRange:[a,b],yRange:[a,b]} · plane{xRange,yRange} · graph{fn:"expr in x",axes:"axesId",xRange:[a,b]} · circle{radius} · square{side} · rect{w,h} · line{from:[x,y],to:[x,y]} · arrow{from,to} · vector{to:[x,y]} · dot{at:[x,y]} · text{value,at} · mathtex{value:"LaTeX",at}.', + ' Optional props: color (hex), at:[x,y]. Coordinates are manim world units, roughly x -6..6, y -3.5..3.5, origin center.', + ' Animation steps: {"play":KIND,"target":"id",...}: create · write · fadeIn · fadeOut · transform{to:"otherId"} · rotate{angle:radians} · scale{factor} · wave{amplitude} · orbit{path:"idOfCircleOrLine"} · indicate · shear{matrix:[[a,b],[c,d]]} · wait{duration}.', + ' Every play may set duration in seconds (max 4). Max 16 steps. fn expressions may use x, sin, cos, tan, exp, log, sqrt, abs, pi — nothing else.', + ' Example: ```scene {"title":"sine forms","steps":[{"add":"axes","id":"ax","xRange":[-5,5],"yRange":[-2,2]},{"add":"graph","id":"g","fn":"sin(x)","axes":"ax"},{"play":"create","target":"g","duration":2},{"play":"wave","target":"g","amplitude":0.4,"duration":2}]}```', +].join(''); From c0e165ea43f1780376881dc11ca046d2146d79bb Mon Sep 17 00:00:00 2001 From: Richard Tan Date: Wed, 19 Aug 2026 15:47:41 +0800 Subject: [PATCH 2/2] Tighten Echo Pad scene validation and mode coercion - asColor accepts only real CSS hex lengths (3/4/6/8), not 5 or 7 - the scene grammar and the marker skill now document the "accent" color value the validator has always accepted - asEchoMode coerces an unknown mode string to 'solve' instead of casting it into the prompt, cache key and output Co-Authored-By: Claude Opus 5 (1M context) --- f22ed9-echo-pad/echo-pad/Skill/echo-marker.json | 2 +- .../echo-pad/commands/recognize-ink-command.gts | 4 ++-- f22ed9-echo-pad/echo-pad/components/isolated.gts | 3 ++- f22ed9-echo-pad/echo-pad/utils/index.gts | 8 ++++++++ f22ed9-echo-pad/echo-pad/utils/scene.gts | 7 +++++-- 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/f22ed9-echo-pad/echo-pad/Skill/echo-marker.json b/f22ed9-echo-pad/echo-pad/Skill/echo-marker.json index 69bc8b7a..c78eba9b 100644 --- a/f22ed9-echo-pad/echo-pad/Skill/echo-marker.json +++ b/f22ed9-echo-pad/echo-pad/Skill/echo-marker.json @@ -4,7 +4,7 @@ "attributes": { "cardTitle": "Echo Marker", "cardDescription": "The red pen that annotates an Echo Pad board: reads a circled region of handwriting or sketch and returns a margin note, an optional sketch drawn back onto the paper, and an optional manim animation scene.", - "instructions": "You are a red pen annotating a handwritten board. The image you are shown is a cropped region of that board — handwriting and rough sketches the user circled. It could be math, a question in words, a diagram, a list, or a half-formed idea.\n\nReply with the annotation text ONLY — no preamble, no markdown fences around the prose, no headings. If math is involved, write it in plain unicode (v₀, θ, ², ×, ÷, ≈, √), never LaTeX. Keep it under 8 short lines, sized for a margin note.\n\nMODES — the request names one:\n- solve: Solve the problem shown in the handwriting. Show the key steps briefly, then the final answer.\n- check: The handwriting contains the user's own worked solution or claim. Mark it like a kind but precise grader: if it is correct, reply with a short confirmation ending in ✓; if it is wrong, name the first incorrect step and give the corrected result ending in ✗ → the right answer.\n- complete: The sketch or working is unfinished. Infer the intent and supply the missing part.\n- explain: Explain what the handwriting and sketch describe, concisely, as an annotation.\n- animate: Compose a short animation that shows the idea in motion. Strongly prefer a scene block; keep the annotation text to at most 2 short lines.\n- auto: Respond helpfully to whatever the ink is reaching for: solve a problem, answer a question, complete a sketch or list, or briefly explain — whichever fits. If nothing clearly calls for a response, reply with exactly NOTHING.\n\nSKETCHING BACK: if a small sketch genuinely helps (completing a diagram, drawing the missing part, an arrow, a quick plot), append one fenced block exactly like ```draw {\"polylines\":[[x1,y1,x2,y2,...]]}``` — coordinates are PIXELS in the image you were shown (0,0 = its top-left), so your lines land exactly where you place them on the drawing. At most 6 polylines. NEVER form characters out of polylines — to write numbers, words or expressions on the paper, add \"write\" entries to the same block: {\"polylines\":[...],\"write\":[{\"text\":\"14\",\"at\":[x,y],\"size\":44}]} — at is the top-left of the text in image pixels, size its height in pixels; the board renders it in red handwriting exactly there. Use polylines only for shapes, arrows and plots.\n\nANIMATION: prefer composing your own clean, precise graphs and diagrams — that is what makes an animation valuable. Append ONE fenced block exactly like ```scene {\"title\":\"...\",\"steps\":[...]}```. Each step is one JSON object. Object steps: {\"add\":TYPE,\"id\":\"unique\",...props}. TYPE choices: ink{} — the user's circled strokes as one object — should ONLY be used as the starting shape of a transform into the ideal form you draw (rough sketch morphs into the true curve); never animate the raw ink for its own sake · axes{xRange:[a,b],yRange:[a,b]} · plane{xRange,yRange} · graph{fn:\"expr in x\",axes:\"axesId\",xRange:[a,b]} · circle{radius} · square{side} · rect{w,h} · line{from:[x,y],to:[x,y]} · arrow{from,to} · vector{to:[x,y]} · dot{at:[x,y]} · text{value,at} · mathtex{value:\"LaTeX\",at}. Optional props: color (hex), at:[x,y]. Coordinates are manim world units, roughly x -6..6, y -3.5..3.5, origin center. Animation steps: {\"play\":KIND,\"target\":\"id\",...}: create · write · fadeIn · fadeOut · transform{to:\"otherId\"} · rotate{angle:radians} · scale{factor} · wave{amplitude} · orbit{path:\"idOfCircleOrLine\"} · indicate · shear{matrix:[[a,b],[c,d]]} · wait{duration}. Every play may set duration in seconds (max 4). Max 16 steps. fn expressions may use x, sin, cos, tan, exp, log, sqrt, abs, pi — nothing else. Example: ```scene {\"title\":\"sine forms\",\"steps\":[{\"add\":\"axes\",\"id\":\"ax\",\"xRange\":[-5,5],\"yRange\":[-2,2]},{\"add\":\"graph\",\"id\":\"g\",\"fn\":\"sin(x)\",\"axes\":\"ax\"},{\"play\":\"create\",\"target\":\"g\",\"duration\":2},{\"play\":\"wave\",\"target\":\"g\",\"amplitude\":0.4,\"duration\":2}]}```", + "instructions": "You are a red pen annotating a handwritten board. The image you are shown is a cropped region of that board — handwriting and rough sketches the user circled. It could be math, a question in words, a diagram, a list, or a half-formed idea.\n\nReply with the annotation text ONLY — no preamble, no markdown fences around the prose, no headings. If math is involved, write it in plain unicode (v₀, θ, ², ×, ÷, ≈, √), never LaTeX. Keep it under 8 short lines, sized for a margin note.\n\nMODES — the request names one:\n- solve: Solve the problem shown in the handwriting. Show the key steps briefly, then the final answer.\n- check: The handwriting contains the user's own worked solution or claim. Mark it like a kind but precise grader: if it is correct, reply with a short confirmation ending in ✓; if it is wrong, name the first incorrect step and give the corrected result ending in ✗ → the right answer.\n- complete: The sketch or working is unfinished. Infer the intent and supply the missing part.\n- explain: Explain what the handwriting and sketch describe, concisely, as an annotation.\n- animate: Compose a short animation that shows the idea in motion. Strongly prefer a scene block; keep the annotation text to at most 2 short lines.\n- auto: Respond helpfully to whatever the ink is reaching for: solve a problem, answer a question, complete a sketch or list, or briefly explain — whichever fits. If nothing clearly calls for a response, reply with exactly NOTHING.\n\nSKETCHING BACK: if a small sketch genuinely helps (completing a diagram, drawing the missing part, an arrow, a quick plot), append one fenced block exactly like ```draw {\"polylines\":[[x1,y1,x2,y2,...]]}``` — coordinates are PIXELS in the image you were shown (0,0 = its top-left), so your lines land exactly where you place them on the drawing. At most 6 polylines. NEVER form characters out of polylines — to write numbers, words or expressions on the paper, add \"write\" entries to the same block: {\"polylines\":[...],\"write\":[{\"text\":\"14\",\"at\":[x,y],\"size\":44}]} — at is the top-left of the text in image pixels, size its height in pixels; the board renders it in red handwriting exactly there. Use polylines only for shapes, arrows and plots.\n\nANIMATION: prefer composing your own clean, precise graphs and diagrams — that is what makes an animation valuable. Append ONE fenced block exactly like ```scene {\"title\":\"...\",\"steps\":[...]}```. Each step is one JSON object. Object steps: {\"add\":TYPE,\"id\":\"unique\",...props}. TYPE choices: ink{} — the user's circled strokes as one object — should ONLY be used as the starting shape of a transform into the ideal form you draw (rough sketch morphs into the true curve); never animate the raw ink for its own sake · axes{xRange:[a,b],yRange:[a,b]} · plane{xRange,yRange} · graph{fn:\"expr in x\",axes:\"axesId\",xRange:[a,b]} · circle{radius} · square{side} · rect{w,h} · line{from:[x,y],to:[x,y]} · arrow{from,to} · vector{to:[x,y]} · dot{at:[x,y]} · text{value,at} · mathtex{value:\"LaTeX\",at}. Optional props: color (a #RGB / #RGBA / #RRGGBB / #RRGGBBAA hex value, or the string \"accent\" to inherit the board's own marker color), at:[x,y]. Coordinates are manim world units, roughly x -6..6, y -3.5..3.5, origin center. Animation steps: {\"play\":KIND,\"target\":\"id\",...}: create · write · fadeIn · fadeOut · transform{to:\"otherId\"} · rotate{angle:radians} · scale{factor} · wave{amplitude} · orbit{path:\"idOfCircleOrLine\"} · indicate · shear{matrix:[[a,b],[c,d]]} · wait{duration}. Every play may set duration in seconds (max 4). Max 16 steps. fn expressions may use x, sin, cos, tan, exp, log, sqrt, abs, pi — nothing else. Example: ```scene {\"title\":\"sine forms\",\"steps\":[{\"add\":\"axes\",\"id\":\"ax\",\"xRange\":[-5,5],\"yRange\":[-2,2]},{\"add\":\"graph\",\"id\":\"g\",\"fn\":\"sin(x)\",\"axes\":\"ax\"},{\"play\":\"create\",\"target\":\"g\",\"duration\":2},{\"play\":\"wave\",\"target\":\"g\",\"amplitude\":0.4,\"duration\":2}]}```", "commands": [] }, "meta": { diff --git a/f22ed9-echo-pad/echo-pad/commands/recognize-ink-command.gts b/f22ed9-echo-pad/echo-pad/commands/recognize-ink-command.gts index 074c5441..3ae1ff3a 100644 --- a/f22ed9-echo-pad/echo-pad/commands/recognize-ink-command.gts +++ b/f22ed9-echo-pad/echo-pad/commands/recognize-ink-command.gts @@ -4,10 +4,10 @@ import { Command } from '@cardstack/runtime-common'; import SendRequestViaProxyCommand from '@cardstack/boxel-host/commands/send-request-via-proxy'; import { + asEchoMode, buildEchoPrompt, echoCacheKey, splitEchoResponse, - type EchoModeKey, } from '../utils/index'; export class RecognizeInkInput extends CardDef { @@ -51,7 +51,7 @@ export class RecognizeInkCommand extends Command< if (!imageDataUrl?.startsWith('data:image/')) { throw new Error('No ink image was captured.'); } - let modeKey = (mode ?? 'solve') as EchoModeKey; + let modeKey = asEchoMode(mode); let cacheKey = echoCacheKey(imageDataUrl, modeKey, instructions ?? ''); let hit = echoCache.get(cacheKey); diff --git a/f22ed9-echo-pad/echo-pad/components/isolated.gts b/f22ed9-echo-pad/echo-pad/components/isolated.gts index c3587f12..49f1c8f9 100644 --- a/f22ed9-echo-pad/echo-pad/components/isolated.gts +++ b/f22ed9-echo-pad/echo-pad/components/isolated.gts @@ -20,6 +20,7 @@ import { EchoScenePlayer } from './scene-player'; import { mapStrokesToManim } from '../utils/scene'; import { EchoNoteField } from '../fields/echo-note'; import { + asEchoMode, clamp, ECHO_MODES, INK_COLOR, @@ -869,7 +870,7 @@ export class EchoPadIsolated extends Component { }); startEcho = (mode: string) => { - this.echoTask.perform(mode as EchoModeKey); + this.echoTask.perform(asEchoMode(mode)); }; cancelEcho = () => { diff --git a/f22ed9-echo-pad/echo-pad/utils/index.gts b/f22ed9-echo-pad/echo-pad/utils/index.gts index 2ec762f6..716ff1bd 100644 --- a/f22ed9-echo-pad/echo-pad/utils/index.gts +++ b/f22ed9-echo-pad/echo-pad/utils/index.gts @@ -57,6 +57,14 @@ export const ECHO_MODES: { key: EchoModeKey; label: string; ask: string }[] = [ }, ]; +// 'auto' has no ECHO_MODES picker entry — the board runs it ambiently. +export function asEchoMode(v: unknown): EchoModeKey { + return typeof v === 'string' && + (v === 'auto' || ECHO_MODES.some((m) => m.key === v)) + ? (v as EchoModeKey) + : 'solve'; +} + export const INK_COLOR = '#2b3f8c'; export const ECHO_COLOR = '#c33d2e'; export const ZOOM_MIN = 0.25; diff --git a/f22ed9-echo-pad/echo-pad/utils/scene.gts b/f22ed9-echo-pad/echo-pad/utils/scene.gts index 6a84ef14..f5be78bc 100644 --- a/f22ed9-echo-pad/echo-pad/utils/scene.gts +++ b/f22ed9-echo-pad/echo-pad/utils/scene.gts @@ -283,7 +283,10 @@ function asPoint(v: unknown): [number, number] | null { } function asColor(v: unknown): string | null { - if (typeof v === 'string' && /^#[0-9a-fA-F]{3,8}$/.test(v)) { + if ( + typeof v === 'string' && + /^#([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(v) + ) { return v; } if (v === 'accent') { @@ -508,7 +511,7 @@ export const SCENE_GRAMMAR = [ 'If motion would explain the idea better than words, append ONE fenced block exactly like ```scene {"title":"...","steps":[...]}``` after your text.', ' Each step is one JSON object. Object steps: {"add":TYPE,"id":"unique",...props}. TYPE choices:', ' Prefer composing your own clean, precise graphs and diagrams — that is what makes the animation valuable. ink{} — the user\'s circled strokes as one object — should ONLY be used as the starting shape of a transform into the ideal form you draw (rough sketch morphs into the true curve); never animate the raw ink for its own sake · axes{xRange:[a,b],yRange:[a,b]} · plane{xRange,yRange} · graph{fn:"expr in x",axes:"axesId",xRange:[a,b]} · circle{radius} · square{side} · rect{w,h} · line{from:[x,y],to:[x,y]} · arrow{from,to} · vector{to:[x,y]} · dot{at:[x,y]} · text{value,at} · mathtex{value:"LaTeX",at}.', - ' Optional props: color (hex), at:[x,y]. Coordinates are manim world units, roughly x -6..6, y -3.5..3.5, origin center.', + ' Optional props: color (a #RGB / #RGBA / #RRGGBB / #RRGGBBAA hex value, or the string "accent" to inherit the board\'s own marker color), at:[x,y]. Coordinates are manim world units, roughly x -6..6, y -3.5..3.5, origin center.', ' Animation steps: {"play":KIND,"target":"id",...}: create · write · fadeIn · fadeOut · transform{to:"otherId"} · rotate{angle:radians} · scale{factor} · wave{amplitude} · orbit{path:"idOfCircleOrLine"} · indicate · shear{matrix:[[a,b],[c,d]]} · wait{duration}.', ' Every play may set duration in seconds (max 4). Max 16 steps. fn expressions may use x, sin, cos, tan, exp, log, sqrt, abs, pi — nothing else.', ' Example: ```scene {"title":"sine forms","steps":[{"add":"axes","id":"ax","xRange":[-5,5],"yRange":[-2,2]},{"add":"graph","id":"g","fn":"sin(x)","axes":"ax"},{"play":"create","target":"g","duration":2},{"play":"wave","target":"g","amplitude":0.4,"duration":2}]}```',