diff --git a/diagrams/tutorials/web/low-level-html/add-element-code.drawio b/diagrams/tutorials/web/low-level-html/add-element-code.drawio new file mode 100644 index 0000000000..2f545c09a1 --- /dev/null +++ b/diagrams/tutorials/web/low-level-html/add-element-code.drawio @@ -0,0 +1 @@ +7Zpbc5s4FMc/jSfJQxnu4MfgS7azyW6m7ky3+6aCDNoK5BHybT99JSTMLYnJxMW7bvJgoyPpIJ3/7xzLOCNrku7uKFglDySCeGTq0W5kTUemaeiGzt+EZS8tnm9IQ0xRpAZVhgX6F5YzlXWNIpg3BjJCMEOrpjEkWQZD1rABSsm2OWxJcPOuKxDDjmERAty1fkERS6TVd/TK/htEcVLe2dBVTwrKwcqQJyAi25rJmo2sCSWEyat0N4FYBK+Mi5w3f6b3sDAKM9Znwv7vYP37HQnRH7dw9f0BZZ/T6IMlvWwAXqsNq8WyfRkBStZZBIUTfWQF2wQxuFiBUPRuuebclrAU85bBL5ckY3OQIizk/kS+EUa4tweSEdW5IGtazE0Y4xKajnXLX/iixYsYkGsxITGGYIVyLSRp0RHmxdD5UrrmlwfnjhnU3UuADFu0EcYTggkt9mEF1syZT7gdYBRn3IbhkgcuyBkl32E5MCMZdxB0g6vivYGUwV3NpIJ9B0kKGeVr01WvbfpyiiLf1k3NdcbVnye7txVWpqtsSQ2pkh+gSI4Pd6rE5hdK71dobw+g/c8R/ajWE3/mTsbn09rynWNaG547oNbO5Wo994OgWHIfrXO+I5TF3OCeRnnXs5rKu95R5cf6gMq7F6z8fDYJrOGy3HFfrfWgUnsdqS2Ntyc84lScmxIoPGSrNePvEMOUh+IqP8y4FCyGLv5j3WkVf+voB70xJBd+hwtbcPFYcCCpyOC2YqKg5NA1/fPhYtAY+gzYRsPmkXfdLg6mMyAO4w4OpsBhAQvhmSgIfHuisaQi5E8Xjoth4rznh07xsJ8mxB6SkLI61RAxik8SCgETLIBuybgUGgY+U3jjlv7l84P6gdEd8tPCMDrij0wXiyBEaMMvY1ZsvWPaEO6XLyiKPpMp+chgej3byI8TeMNfRt5hFl/Yy774O0gFJdm3fFW09SXKAJbcCf/CoVicfv9xJhm8vtE0VbhkDxPLEFVLU3t50/3b3sq7XF2dwPE9ypkWJghHnCWNh/BabfPmVc696ctj29Znk9bokbS1xFH50MqZTqqd8eFQVbgN80Tf+ctMPVTububa/hOZaxg/LXW73+1gFMOFahLKEhITnkazyho0K3U15p6QlZL6H8jYXikJ1kUZrYEAd4j9JaZrjmp9rfVMd8pz0dirxrPxz0sEjpUnBmgMWY+BIgIv6kkhBgxtmg98T6+Ndfna+D2l8f9byvR4EAqz6Fb8msBbIQZ5jsJmnJtCDXmeqRQ2+0vMlaV7Ocsel+2v0otnlYZqbtFqTH6EFPHwQ/r2hNZPndC1Auw8UX9LW2+61B0eCSoOM+XJ3Wie3ByrVdblztWs+g8zbUdu60ui33IkI9NxVMB+2PYb+O/xcPh/wH8N/qraHcV/rLtn5n/8jv958e/xhPxi8bdNr4m/7fvD4u+9439e/Lu/Gvw6+LuG08Tftdxh8e97ZH7H/7X482b1zzVyePUvStbsBw== \ No newline at end of file diff --git a/diagrams/tutorials/web/low-level-html/anagram-move.drawio b/diagrams/tutorials/web/low-level-html/anagram-move.drawio new file mode 100644 index 0000000000..8bc4272928 --- /dev/null +++ b/diagrams/tutorials/web/low-level-html/anagram-move.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/diagrams/tutorials/web/low-level-html/anagram-newletters.drawio b/diagrams/tutorials/web/low-level-html/anagram-newletters.drawio new file mode 100644 index 0000000000..38857ef7de --- /dev/null +++ b/diagrams/tutorials/web/low-level-html/anagram-newletters.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/diagrams/tutorials/web/low-level-html/css-code.drawio b/diagrams/tutorials/web/low-level-html/css-code.drawio new file mode 100644 index 0000000000..8a21cb5750 --- /dev/null +++ b/diagrams/tutorials/web/low-level-html/css-code.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/diagrams/tutorials/web/low-level-html/css-property-value.drawio b/diagrams/tutorials/web/low-level-html/css-property-value.drawio new file mode 100644 index 0000000000..f9456ef81f --- /dev/null +++ b/diagrams/tutorials/web/low-level-html/css-property-value.drawio @@ -0,0 +1 @@ +7VhRb9owEP41qE+gJCZAH0sKazdVqhptbffmJiax6tiRYwrdr985sUlCoFtHWaVuL8j+fD7b9313duihIFt/kjhPr0RMWM9z4nUPnfc873Tiw68Gng3gogpIJI0ryK2BkP4gBnQMuqQxKVqGSgimaN4GI8E5iVQLw1KKVdtsIVh71RwnpAOEEWZd9JbGKq3Qie/U+AWhSWpXdh0zkmFrbIAixbFYNSA066FACqGqVrYOCNOxs3Gp5s33jG42JglXvzMByXtMwy88UZxFX2/uvo6Ht33X0POE2dKc2OxWPdsQSLHkMdFenB6arlKqSJjjSI+ugHPAUpUx6LnQXAiu5jijTPN9Ix6EEgYNxVKWk1KlgDzPR2fwA9vVP9qgGCRCJIzgnBaDSGTlQFSUpvNF5ROaW14rxbhD6BdKiscNTZ62oIwFgglZngQFk9koOAUcM5pwwCKIHZGbqdaUCw5Op90Im6A/EanIugGZiH8iIiNKwjYdM+o7Jp5G/kNkAr6qxTQcVVDa1JExw0a+ycZzzTA0DMmvIXz4LxE+nwfBNPibhA9tZXiJcOc4hJ9dXi5vZ2GI0oCs+MX3mf/5uu97OwgfMVh2GtMnaCaqPDm6ofk3zG8pfwQdQC0ZT60drNsy3TF7hDOtC/5Q5GXf0VT1i5IrYN2BqK4bc//Yo1FF6fOk0sVJzwu0fjEv+gWRdHHgOkC06hu96GU2kjnEaYZlQnlfifzN4vGAo8ekTNV+VMlYOw4ZVmRaUn2Q94bLe1CZvrhe4W98vs92b6lx/6zUeM6V4Hsqjt49VJs9taasNJs6UzucWoeNUmLqg60ijCz0aQrYKeUJABPo5aA9SFkiww3sHLPQoHahQbaqNAqNN9lVaezEN79bum+Jb2Xz494v7/CgQKct2v0d98vI67LujQcIHYn3UYf3aykgHdTzB6b+HZ4WluoXqB/vSHhvfKy3ZJf4DuGEx2f6M0wHiOGioFGb47YgXlvhDyYeRqdN9y8qgKyputM7Hfimd2/2rdvn62bn2XY4RLqa5A6RBcp5gwm8/A1QTy57rdnX9mIx4F4pFTY4v0hUBY8Ron7jzUji1sdxV5kN5fk7lGcxSeBVQp/an9S75GhWuBYUjlbXvJGzJfytG6w6uJnV/ATecjRytx7nky1HVWQ6jsrs2Bz7gIQZ/0+YVyQM8tx3Thj/f8IcKWGgW//1VZnX/x+i2U8= \ No newline at end of file diff --git a/diagrams/tutorials/web/low-level-html/css-rule-explained.drawio b/diagrams/tutorials/web/low-level-html/css-rule-explained.drawio new file mode 100644 index 0000000000..485d8dff36 --- /dev/null +++ b/diagrams/tutorials/web/low-level-html/css-rule-explained.drawio @@ -0,0 +1 @@ +7Vhdc5s4FP01nj45Awj88WgTp+3udKYTppumbwrIoImQWCHHzv76vQKB+WzTOPbsZPbFRldXV+Keo6OLJshPDx8lzpIvIiJs4ljRYYKuJ45jW7YFf9ryXFrmjlsaYkkj43Q0BPQfUo001h2NSN5yVEIwRbO2MRSck1C1bFhKsW+7bQVrz5rhmPQMQYhZ33pHI5WU1oVnHe2fCI2TambbMj0prpyNIU9wJPYNE9pMkC+FUOVTevAJ08mr8lKOuxnprRcmCVcvGYDkPabBnzxWnIXfbr9/m7t303kZ5QmznXlhs1j1XGVAih2PiA5iTdB6n1BFggyHuncPmIMtUSmDlg2PW8HVDU4p03DfigehhLEGYieLQYlSgJ3joRX8wGr1j3bIr2IhYkZwRvOrUKRFR5gXrjfbMiY8dqKWhLFdaOdKiscaJUd7UMZ8wYQs3gRt7PVmMwc7ZjTmYAshdUTWQytXLjgEXfcTbHL+RKQih4bJJPwjESlREpZpmV4XLcohhv3INe39kUtLk/KkQaOKM9iwN64jHwGGB4Pxb+Dtvmu8K1wZ2ao+/L7nrzbLc6JdqUKF9szroe1UPk24F97pcK8+f97dbYIAJT7Z808/Nt4fX6eeM4D3jOnkRPQJHmNVvDq6pdlfmN9R/gg0APbN15UfzNtyHRg9w6mmBX/Is6JtaaSmeQEVgG5BWg+Nsa+OaEhRxPxQ0uLDxPE1fTHPpzmRdHviPIC0mhoa6WlqhTglaIplTPlUiezN8vGAw8e42KnTsOSxDhwwrMi6gPqk6I2Q98AyfWr9Rrz59ZjvqNLYr1Max/oi+Ijg6NWD2IxITSE0tcwcA66rgA3pMALREZccVkp5DIYFtDLgHmxZIoPabJ31XOkojWv1lWYxoDQ2OtfJYg8oTQdvqIAy/RjuJHteS6AwUb8Gvs2Svui/QTrR0munE/WFGw1l0z1XNsd1W/O5ldbZ3ztRdTRE13ZBZOrOag/6QQB9cqdVvt6jZciRTaoVsQ3IIKl/smFqDdWAUCitV6YjpVGkpxlkQLsMuWSd8RaEsjuEWvb359D2PNvu9Hp8uiYhwxIrKnj+nmrAsaLvYjX/3Opos9XHfnlJ7Gc97EsVyAmDL2Z4+/eL/uW/+LzOyQx06KFf3xFcBP7lrw9mwqOVvivRCWI4z2k4dgSPafHPKrGTgYfedTN8gwHkQNV3va4rz7TuzZr18/XBLLloPLeKsheVECRq3Q71UW+gOvRhV9kkgcqcPrXvlIaQNjN8FbQ45StJcd1OfdIhS15k3Ixq3gF1As3cZTvQrPPlqeBThaheoIJ49WufUCS+oEr8n4z/bTJ6i05tY72SjO6ic1B61huREZrHe9XS/Xg7jTb/Ag== \ No newline at end of file diff --git a/diagrams/tutorials/web/low-level-html/dart-html-connect.drawio b/diagrams/tutorials/web/low-level-html/dart-html-connect.drawio new file mode 100644 index 0000000000..f81447150b --- /dev/null +++ b/diagrams/tutorials/web/low-level-html/dart-html-connect.drawio @@ -0,0 +1 @@ +7VjJkts2EP0WH1SyD6PiquWobTKTZFITM+WJc0lBJEShBiRoENr89WmQAEmIlEdOLCepGh0k9kOjsfR7aAo9d54cfuAo2zywCNOeY0WHnrvoOc5k7MO3BI4KsN0SiDmJSsiugYB8xgq0FLolEc4NR8EYFSQzwZClKQ6FgSHO2d50WzNqjpqhGLeAIES0jT6RSGxKdOxbNX6HSbzRI9uWakmQdlZAvkER2zcgd9lz55wxUT4lhzmmcu/0vpT9bs+0VhPjOBWXdJiOw18eP/x6Txar0U/L6dH+0wluvDLKDtGtWrCarDjqHeBsm0ZYBrF67my/IQIHGQpl6x5SDthGJBQsGx4pWmE6Q+FzXHSbM8o4NKUsBf/ZmqXiFiWESjK8ZysmGIz1wFKmGgO25UXkjRCQYMd3p/AFS5Jf0iEfxIzFFKOM5IOQJUVDmBeut+syNDxWwX1n1gxf0sseKltPr+e4VvEBPBecPePTiRNKG85Le7ZcjgBHlMQpYBSvIQezHeaCAHemCk5IFMltnKldhmZ8OJs+uyIFiAmzBAsOi7FUB3c8LrsoIXn+sLT3NS0r8m0alNT8Q0oJcRW6Jgs8KL58BXfcV+78T7jjeyZ33Ind5o59Le7c32+flkHgbuZ4n979sfR/fLxxhx3kGVKhNlee1CVNAP20lUfkTKdF27KoIIFupP9NzkPDueSAZADk/0z2i9xXma/zXg8wjNVvMTGigQXiQoMQhpw6qhFr+EQVkEhxCVsU1JBIFxEDFdj+Eok02UJgDIbYM1OZ31Z6f2/bm2LrEtcZ0ndI46wOPNcydaA539DBsEMG7rVk4DsvyaCmjaZlyfeCBLDPlu1khzZnSZIxSVKrH0myulNJon6Doyt+ytoa2TGYtHyDIenbd/DQG3V3Q4k8wdNVnpVy/LTF/BhgCu9hjL/tQ/Lek+wDSp9I+kxx/92bQcF8CCjXY/Wf0DOG323Wc+ZyqRTj7FhsPYrenJnsaHGpymqG2y/Xnu9M8bbIT6pBDjMlaQyAB1aGOQHCYR5UcLvcRHiNtlRcSSleWyneuEMqk2u9bdgvKeU/XDDufnv4+bVg/DsF45+9dHumDDznOxaMLhWcrxcR2bWO5qIhq2NWymgcywZ9y26n3DRDnx2tLgRmfLnfKJa3A4OvD6rds8tm91oDjBrwbcnvX1gDhtdif9efhpOM4zSaymsfeXRRlOckNJNsHmP4QMTv8nng+p6yPxb2aDRW9uLQcF4cG8ajTomRC31N5EivFJZdDgClUQMfdQxp1OEL69i0TgcoV4uj1pXViyltpMzvyJjGOKZIkJ0ZviuNaoRHRoraq/9nTsaDiWNVH9vkj20PLMeMmReSUmGal1cnkT3P+lJkf2SGFYjHWLTCFqSrdqWLh2DWN3Kle32t6S7/Ag== \ No newline at end of file diff --git a/diagrams/tutorials/web/low-level-html/dynamic-dart.drawio b/diagrams/tutorials/web/low-level-html/dynamic-dart.drawio new file mode 100644 index 0000000000..7be8cf5404 --- /dev/null +++ b/diagrams/tutorials/web/low-level-html/dynamic-dart.drawio @@ -0,0 +1 @@ +7H1Xt6NMsuVvmYded+ahe+HNo0B4CW+E3vAgvEf8+snUqfr81266b/e9c2utOkckkJCRO3bsiExV/QHn20OaoqG892nW/AFD0uMP+PUPGIaiJAt+wZb3txaEJr5aiqlKv7X92OBUZ/b9wm+ta5Vm888uXPq+Warh541J33VZsvysLZqmfv/5ZXnf/PypQ1Rkv2pwkqj5dWtQpUv51cqQyI/tclYV5fcno8i3M230/eJvDXMZpf3+kyZc+APOT32/fH1qDz5roPW+2+XrPvF3zv7wYlPWLX/NDXv/zGTrmLI/VoMtX9NL0uZ//DYZW9Ss3wb87WWX93cLTP3apRnsBPkDzu1ltWTOECXw7A4mHbSVS9uAIxR8bKI4a7goqYvPbXzf9BM41fUduJ7L+24Ro7ZqIBrsPu6XHjzr3nf9t5NOv06fnstlAROMkfgF/ABDgj/gBfOfir4vmiwaqvlPSd9+TiTz51Ix/+oafPyhcxLjftr9F7xQ6tvx99f7A4Yjnz+gfV6mvs5++eJV0/zkYp7kLwIL2qOmKjrQ1mQ5mANuy6alAti5fGtuqzSFZuS+WRmczo7fnT70B1AAd8r6NlsmMBjk2w0EQX3d8s2TcPZbF/uPsCSob1grfwLJ7/iLvnlC8UPXP4IFfPiGl9/GzkVR1kBwHLzks72TnwKpmn/EfgM7VLN8sy10ti+UgNZxhSjnvs/K92NIDNES/RFe/8d5Sn528RcEIADA9P/O5H+m/oeJ/3Haf3wAVcDfV+MOiWPKsg8HTHBoANTHnz7Q/fbW357y/Z5fOQKYu+WvAci3pp94xW9hz/nWMfrncPMdXwkASQb65n7ujP9Yb/v7TP1T//otf/odnP+GN/wu9LHvnPod+t+PfwJ9lPkN6OP/LOjjxK/QkaUgbnw7/DYBP5+s19oO30AAMdBPS9kXfRc1t74fvgHhlS3L+9tF0br0P4dRdlTLA/b2J/LbUfiTM9fj24M+B+/vBx0Y709ugofhT8/9eNvn6Pt9vwWefw5H/9w9iM+bpBcYun+0JGgRKzhF1x8p+ns4xv4cyObvL/t7M0l+0xTRVGTLn7nuG/nCWf6zkJ2yJlqq7efq4R+OP/K/AvX+xDu+N3497TPVoHMEJYbj12Sd9snaZh8i/qt4+W8SKL9B1P8IhmJ+wVDErxnqtwiK+KfFZvIvmOl/2OjfkY2ov5KN6H8rNsKo/4mG/3/hj/m3wh/13zka/i0Zyr9hJCR+Q6v/p0ZC+r81OLIo/a8EDvwX4KD+xeDA6T8buX6MSsKPrf9mgexnYezHqPb/eSBj/spAhqL/VpGM+e9MVnGfvv8LkRX+K7L6dcH1PzenY/6VMvv755/wzP+w09/JTt9Z5y/TE/ZvRU84/u+CwL8rOv4P+v429OH/Xuj7/t7/PaPj8E8PjT9duPxHxMfvC5Df4iOJ/4vF/Hey/Dk+vpk5iGq49rcCM/PQnk2WDe/Pm0Xp//rpbPyutdG/wtr/Qgb5J8408VfM9A/7Hv5z8rZfT7Vy/XVsappqmLO/PG8/n+T/X2aR/ZfP4n+Jwt0XDbdR1f0pjaa/elXqf3YL/It2CxDf177+zG4B9j9zswD5m3HppzD/y5IB+y3JULVDDwGJ/McHmPgFgug/vi74dB9PP8Lzly1bD14ablOruv/9f8CHP9C/fVvUQrLs4nn4crdxzaa3kzVZsvTT//4PMHl2NfhRF1Rd3WT/8X/+158+yAcdwvEg//FnA+/vvCx9/dvF0N8Znv+JEP+1k/9iu9gM3rTqCtAAqX/IpgoALpucH5p/vR8tzfJobZZ/kKfgf3nVmvgtCcf+A1zlN7cjYn82v/xPKsf+zhrhD+f+G6WPv8jsfhNPf91i9P9DUvjtVrOvPmT4fa2A/jk4yV/uY/zKc7/d9SPufqOjX+ge8hcdfQ3wVx0Bg0bvn1w2wAvmv/2Ff/SHrx5/9I4fjPX3Owz+G6HlFx40l9EAP1btZ6vzT6H+SyWxQBf5ofUG9YLZz9VS9fAswN4CsPm7QgKEgvzz5xOawMMu8/C1JRtCMPp+kFcH9Fbu2/v8gmuTtMP+VCV9l8MNmtM3qoUaD/yC7fM3Qv5jtGczsB84RGkW2vlL7lfzH0uQCjJ/GiCF/q6g/hd5649a/v9pMzBGYb/AGvZrLc/8mri/t/3Difu3NqT9ksl/5Kikiea5Sn4vCftXsin2k4Ij8ieUov/w07I3TTN/vvAIDszvcfwPvyxG/on4aTz5I/In5C8VxD9Hv+zw52SO/0ojAJjTLEPx3N9E8395pyT2V8aDrzrMPzwg4PTvLB7/rQGB+Esd/U5A+Edx9l/Mev+6CuJHOf+YBic/zP6PjR8cJPGvM4cfNPff+bRvu+rfHfAmECmgQyFJGXVFNkOEfBKAHwR8/Mun/iVRD+H6CT6QFTLwIlH8OYX8nDB+le7+bmL8r5Rmv6ff/3yl59vXmb4N/A8/fInjL0SN3+fm/4Si/W8+/LdWtP/LB4b/jLXQfxHL/5PImyLZP5HMzzXL38vfNPkLof1XCvp/FH+z/y35+8cizP9Dj+sAlPonBsTwq5fZ9A/q93+iyd8ZTb5StX4CqdQvalG/k8T9ssD0jwxEzL8yEH3/QvFP3ZbH/nBB/oaffym1/kdkzr+dk/929vyzBPt7Pv3JlfHL1yEmwjQY4yufM+wd0aSiv4A/uuOVgleAT5UCfogZfwnBb57YZEuHF3Cyzju+pfCXQskvZV19GhvE9kvEw9g2ldMyab3LEyO3OPCWBNPfz8BfE6zcUoO5bicBurtcHM/mfLlKaBUlc+7h4zl01ztuPib1IsyDfgH4LyeltyzxeskTM2CB+fBscJb4gVLp/Q8YR9VsnPvjEtG+P7aVr1REMSovre9VT+B4oZRR81I4b7xF23MFN5gtvpw1u9c65pCFkbNZLa/ntTnJ1+q2ZwvegXsAFS6Sx1s868dAmrqqcppq8+pgRtrpLpa9r5yAkVZlO5rt8I5zrrpweBFdDS5Gm/sr9mbt2jeCMoiK2xCVaE+LUr8irRgiYyMFbEj57/e+wL2cYN8O8r1rRqvchYGuuPtgV5ZTeVYVPZhKsI5FsLFFrJyFzvl4XJgojJSLqLux73FXbWy9sLaq2ivqugurbit2pRWfrQBGox93R+UV8EnhvGYytmVPnbutVjK/g3GCiCWaT8mmv2osZTqtDaNyChzzoOq7wR3g1jnmsRj4EZcGYhc0V2545bziKG9ETQRk0pIXc6sBmLibfLmd70iw9+xFpaqB22mzqyK0hKoq7iFph87XCi0/6Z5WrSJTHuq8Xvp7Vhu++LbaW22bd7QtlXKxtNrtdkTkCA5JJW9Xr7z1/ma18T6E9i3EUT4xuN0QnEFrtgYyEzciQfhG9ElCUEupO/MCxi4G7+hZ3ePr3bB+tNRTQmhb6mvORzPAHJynyo6nVoj3vCCa94y6wI2S23xptFBwBG7nZEKyhfQSXRxsJRJk7Nf6mG9Cc1eFrxHegn5s9TJMRc3aVo3CWcm+vC6R4GAXShHCDViit1UJcRRSMoqixR9ZIr4j1gMjLvrsdtUFpFGuA1JHFhh51Y4Gk97te5whcy18MCUh18lPJifhfe0B3noZn6NScZazCbfa52xksIrKh+Hwfd2c6CU4TFQ9uGXRLj6n5svlhgz7xXFFXfVtgrvYsiVVQtnmfBn0l5LjnEYoPs8SKgl4kgvM6EhhoeUXRGkU8cLvq63whFafr/XtV+eps60jgVPV1aKlPrSETMl8nbkJ1XDJr1SODQh1Esng8r6XXdyRdwRPCS3Hx1e+rFWhEovB4r/wbniCN8QjBC5lB7noluJ75vZIG8ei8NVxrKr+UmhWMPvj/Byl7AgEi6WZsi2xUnpd3UkMGrW62VF5dZHiYsGZY3he8gJeHE0mDxiSF7IXzmcecLP99J3Pk11HGIdbnB0kb0oWd/flyUoFLxrFETxzbaIQeKlqIcCaKo94ISBMxImEN6BKXUt4UyZzaXAuu1RRdK+F6thKzX0y6xO8v1uIx84VthySWFFdefN6PyCjaPYiHG5oNzidU4UgS4MVQj/tq5L3fafU9KA6KlZwL/ztCDSJH5T34B3h5Ecn5wrOrRdQWkpvEUXc+ArGPmE5UGV2Jzbq9c3hqGKkomFsw3XshFYLI0am+2EUtN5ZW+TNCpdevUqCYhuKWh0aNyCOLAK6+fiHmxoeLwoe4PXru3wk1iTFl23nbV/wCDtpr6vgtaBvNAQWGlUJReVXxNwx8VmqUakED7KhbDEQo2fP3zURayUGMsktvATacy9exqS1MoYSz5qqY7nk7qVc6fY1D/hSHi5XXbcuJGGuWDtaG6DQN6wCHzdmobpGjAWlh6x0Mxw+475sqSu14xYcsevbRaJuwObgBi6nK7GvXnxPDe0uGtX47J9UJahsSIfLQzkFbTyw4Gijiwp0qKgPhOeuwTDWlutXpqPe0/wig/dmA5G3vbIohXfP6/IrdR8FmIP7gPWKd4r6w0IUQb9bYyXPVcnx99AD3T2lO+raPj0lF8sqJNpE9yt/Mw4WAej+hvjoOexyKYtjUd7m+36tKsUT5NfFP1bes4N4dCptvozmuAw6Qhnj0F1U2w/SoTF6a9bF/bpUY+yE0HpuJCem9hyU5T1TF896c4kavSMwRU6DKAdfkNx9J3fr4VjDsF1JOyyeSq3erdNLymHMuiGzG3UiudNqtS64hu+vd6yf75oXfC8MC78JfGAQkS5xemdo/Za2xXAPH7pzGZN8GseHE6595eQy+W6cCQ2mcS0o4ZqKlzsmRYmg1d3YD/2NwDnzuMYX/OopmjqGDZB3nHPRba96oMreNOnDfzyAsuJkRBU2ftzhLEP21zShd4bTjwbEbkmLuS3YQwfX4VZvI3LiGb10FVw3Cfq7atV62L2OTSqIS5m+b1Ex+1ntZZSCDXvK3ZASRj1Et06NO0Q7RdlAUmZ7bduBd9ZpezPbbcVH9lE1/JcOUEjb5njC9CnNYTb6GHNkQ6FBtGiQCvqKM0nsvh6SLvopinqs5Sc6QjITv/lo0TC0KHCWS1idIgA+rIpiu2b1rbJd/UwV6xCr9hrr5EM1WT73nG8qwEi93Q3lmH42fXuNlt4u7OVh8G0Cg1u0xB1DtZzj1azcw8UQEMV9pxqmhrir1a7ppqPpnFeHMVLicLVps9uwbcOykqiXdUdtpwVczbu67uVxn8FL4lgBYRuOWBUnIpdHPkhXnGMcRQNwj+xqDMHfNqvM+uI+6narAe8KZoTbvlS0khqqzTE7jBL360hL/Crlw31H/HgZxjHaR+o5jGXsIpJF2NXXrHrHDIIPaLufkbnQa3ewd9FRg8p+8CYG+NhP6vl+WVC5EYNiAroseVlV4L8sQiOVKKxyynoZXe4XhtuYta77fikwGHZ7fo2D1O0LptgjiB8XJmFuz6GSpPpl8nIperMygxBpOITrkCZIC8bLu8OHa7qujOLSIozKfvEShZukCbeh0hHcF+TYF5XnuFidr2tQnYEYNWhx5zVM+DqOOZbDWI8DvZJsR+/ViU1l3/d00fZ8WqfoxztKnLcFbB3WR+lHCPbIoITy3i/+tr5bGMIrQduOTHjm1XWu/Xt4vgBm7yFfbrs/MQi5irunuW20i5YUpEIc3NDeM9AdR0swOk8B0Fk8xE8NZByfwyKMyiA/zR52nePlPpvzzSbYx2ziltcxbO/ad6eKrHT2ezQsd4O+hrHARGbobWVaD7cX4sY3BSiDwr8DeeVPdxWG6t4pRy0cSqmn3FTfJWqs2rsCXFd0jUk6Aimshla57i6zPR2L0x37UuMz1u+v0ojk/Qa6UEXfpIPUbgFqiAK1XUnqxxIVW0E7qrm83rFmGCMbo5kYPGN+mZCVHtZuDiy3RkwEovCLzN25DqNxLK1Hg8TPO9AwyNKEpX/RS76bNS02fWlllXa6aG9NWEkyMMSYNqJLSfT1AzXa+y7BNGTvFr1zLWQo71QaLMVbombBpMuVDkjFEjcQxJfxxZrqVSnrpWfLjE49tkKXs3qvbzDf2o2fJlwcNB8b8BUnpSqGCtEoG5eXgebmKqnxp1BACWw4be+wx70Z99PgQkRDLVwnlQrTSqDti3y3xsvmojwa+vR66WxU9IxZn/0hfnC65PsPis1wnZ6Q5uYHUM10F3fDxatR5Afj2Q5NqqrMjDcuEqPZGkcem0Cuyu2ZhF7E/SLYM3vJXdkRJUl0BMFtLBO4k0zLmjSRbGS0paActt1Wb62z8VCC9zJpPLYR5MIqhQTKXC/s/DJecfgUlLURXFGOF3JtnRbLb4RtyRck6Avs3hXdw64FN3YzlhLxpeLaniEuQlXfTmu/xf6ie24gurvIC6IVnFTWJBeQFajdFQlE/4Y6lvP2WuGTk7xGb+GXO2Y5+ngXjOuBgmQFxa791g2N2M/++r5LLYs/VehWRZiVBH59EBtH3kNLK7RyCMYdi3eiE5Eptvt4Whk63xjsEqlAT/s28KaQToXQ9KN2cUEfb5mAYSZMbauKw5fPjqNMAGfisAXZbTRzlHKdpXxWe3O64HlyMyaaeN78CyY8L0BtUrWyg+SS02ZBX+pxqHhlGYUQl4VXUt9eUZBbmbk0QMoMUmLrDmEadj14cXxV2tp9VpLbPprEOlMbG5yrYcgsZctrB3qEic8NF5voSFLi6szdLaHLqSLotYqafjrffD+Nk0BAtulyLatVUkuEPh2steNC0spHJl6mOV4rXmj1UfbDOlEsD0U5m8Sv7tN/gqhs36ZYtngvW47Z8EljSDLxzMJCrwjbDvAYFakAm+hUK063v8Umyz6aKruiPKldEEot93G6EsHLp6aNeKIWixt2Wlk6s3jqFZViji8qKVI0IOWjHYvOfi3flUZKibNWlJLlRP08nVZ7qnYOTCTg5dQuUqLXZB6LPetuYwYTd5UkUbPCASo5uuvHN9x25SC89/RD9P66FICpeqaEWwWm8AHNdh3uqyQMb5gJD9lhYvRruw4ZdNLjic9DOQpuR149/iVXMQz0eDZUQZ3IZPDshMgMaOYYrk9wOXQNcN7Z2VSpNH7AhNKwsOopW9sCY2qN99HOgVhbJ3utK8rCrssh3ou9wMv46fuFLZyCfBX5i5dwgFtgar6M5Scz57Smvp90+AjU0F9FlNRP9tvjjOcCfhFYBCKx1TrPr2jHAU7elHAsVHByfTDVzNALjlTCRSyQJtoMCsrxnH6zFx9o3Sbz7AVl3UcomxCiEvMG9xkk+HGPj5dnAdqLTVH7qo0ckptVN3rTHQ+9g1AetNjI8iw+EvMj3ab5VCPH5i+SgvC0/k7o9khBNH9E2Uh1L4EOs2Zpmce+sgigxD1R3L5IR8u9WHbtXyr55blQwRmibC0tX1Uf6+1HtK9BYDrieqhy8iJDbaJk2YQvpDBPexzNMIYA73Bl3WCxYtGIQVOqviIFOcc9k0T2gbpdKRUZus5LQJZTGmp3ZFd6Mt8M9ri2sbffrIAimKy5R0Bag94kaAKzYPAhmqC5Fcwu2NlhX9Cu6baM1KjN71B/qrCklpr7qvXHFc7YyVrCfWeuy9g+R7t4vlbcn+acDuOqTWqSMs5jBbARPcSmdeOqObD4ZMIXF1RtlaLeuDxfL9tzDf1a9PcdaxRFnDH7ggy8tII0xk0FS0FGEhPuqa5sMN/IhO3ehag7+CDk7w+TuIse7UxX4dBNth7WXe2cQXRMEPVXlGJbNvoIbBTmnR5+4shFM98lSEdNwzSleX7uRISsJ+I4bvmBG8cuOcNuMEjyU/SsSyOk90zEhcMfCSpGrpCbxaM+Cq7q/Ih5NKlAp3MiVs/0zr+rpfRFIj1vMFndvKzZ0ToONm1452LeKUtunDPND1pJmhB/IW4/ke4Qp0mKurN4WYlhGwWf4Vb0sfAb5Ll3W9e5GCuThydhl8t1vihS04UPpVBE2xZDDkwgJ0pXXr3a4NNq3XS4YcgJQMJ1gdmsVfb1ciukhWSb3nwfIkPXSpdqi/qYsNOA2V/25Wo1Rj/ye76iORGAwGNSvvQ0OiaCmSP+dpdsCy4sv8WwHr2um9lN5jHqAQRQB4XeBQG8wwVL1kcBCufLVjrEvNxlVoIwLkJjhkjn2Br3qtVnHMex7pQOA6xE2UCDPhmzYrvrvAlxP0P/Te0SOQpWU/CG2kkJuVHyJbm/k+QpmE3f6PH9Nj6b1BCPxPbeNzqen41ahHp5uuJNisqcUqvHkctdQ4yuEBzhqDo+mkPq8VDrcjkR3+6P8BqWTeLMj6pXEV7wlNOy1dDg57nn5aNH+AAaST2QEERaEenlG25Wu2G8Y9BMqN5g3cRxlcYRkfZjvOGG2sYy/3LY0Xaio9hjYwDASOfQlIoCQJwHcUinZlc8fDXzku5S5BhvjWD6xI0mPb+xHPlIHpOcb3icnemCUv54MsZUsdEGxe2bY46XfiZyafl0xvvY4767sQlclms3qB3IJ8QCiLemG/iDt0KsGXCjGPjrQ3WBeT7ieABycd7NQeeKxWU1ZYa67DnWA0UnXojkJsWGhN8H04Z3dEMkkWR95PYAEk4Yj8fqNWO3Vk7BAYTcCfvF8brC4wUJDe2S1/tkkF32VXvFobHwEE0zBE8nfNu2AUMjNjnzu23dl5uL3bSmukKW0C3oielQJg4chsOuIGE88fvRY3Frmp8xbgtEWDxqR02l1wsEmDmAHz0IEbaukjCS+lMe+tCxH63d57lA4BhNrsgVeznUFrsM3ltzyzV9wEfPqjae2BLDMFmGhnGEb/QRK89PWYbuYVxA2RxDnwJK2epY4dcaD2VVCpp195UJxsfVRe+DH5NBdZMR2uvG6s7ZeWYb1ZgfIkFKEoU/EGHg+57nFWmMimrjDyl25WDj7VfQdHYrB8ldTtTuQb2LYX6KcIwUu7NAshFosxPxJrlOkZ9XN/MgirfxzFelJVYDzgDJpdldRcXqhKOoIYvh6g0/k7JmRrPFAT26w3nDuzyDzJyO8UO+wbl87nTsfijWQPxmxJmqn7eOa+cF8ycl1uGkHCkEkFmavuj7CSOTJPJEtgdOk528oveaYZkbvC5FcrnNXbJkd8Cs0Iu3KsfAK4tDCHVJqABcw+Qp9DxFl7+oZxhId79uJ5hGjj/MkxRp+p25PBHi1PB28vVIMr09euJ5xP7jcXQJRB3u+6eKnXyBxcue2Mlcm9hz3bZGiqduONr4NtEdBd0CxczisVMOcqv6J5FauviK+M33+HORSaSag9HOQtVTSmOtJcKcUA5nWUU6nUILcBC/EK0BQnzsxshDLikBUhrdhQsujUiFZpn1oVG0eK7LtX45RUZPIV6kXnSUwhK9w/Q9CyGDsRtENOHqJ/Vwh3rmsdjdwnkKrNC7SyWFPQRoCvlsUJoxG4a9vwylItZXRabC0kSrghNi7yoiswRzt5lm1Y9aVa+GdzheczvZJ5yhIxKvanaGs637ft707yD1fDF6h0yy1oNBceuyYDTl1oPqaFU/YTF3CFiXrkiKnB7gV0K+kOzjyCaU2YJe1yNaCUEEwSHATICNYlfEa6NmDzi1GMVae6RrnE8+b1jIUHGCduwZgzTeViwlWr/U3TMkY4bSl6515He7tuVkdC/gWtzEVTB+ZWHcPjiYt9FUMnLhbd1JbzFH4pFvGuIo4Tauo9gT+RSQsI6G+fLYXK8vnRzwGyk5oWuSKKfhBoFdWXaZx118pJyzt5OQ92s7tLseow9Z1UCO0s2lfAGZyr72mlGFQ93htXO/jHqFSgxeMvd58gi+KjQVMsdyFC9sxWiL667cxi8t8pkbMKwb39QaCIOqA4PaieQI9d6swHwR3dVfQdJAWYl0zQbTyZpyKcMAEPvTCYACm93XmN9nXtf7u3MJRqg7diXmllYCfJglpPno9zBRCG/QXEc4lON6ebWU3iA7G2Oxf+pfjPrZ+7uEkA1FuukorLvhNFunSCxs+BtyAFD24OTLZnoixF7soWfBu3osDsLtLw5hhdJqxupWL3B5jE2fd1J56FmHolvGrMHNPeGMcEYaPqO6xrsXmNf9mK09DFWQ/Z3MC80uRim9wzV4bKbcBl+eNmz6Ho+Lau8kXWmNg1nlqzLlh3w8AmXy8Unt8GBE5xY/9+BqhJXrofIrXOA3SHZxnF/FFi8xX28DE1sKQ7hj+kSXIXqEtCHxcP6RookROnwOmuCE5WJgYxrzyL0nvGjb1S2Ruj21IjgvqlYUtsjraFcKYtSgfTVql7668qTcCgTxLgu2ZRYg5vfxthz3WEK0pTuRGCVa/TU+Yp8xcbw9amS+MtcvrvIbKCrDxRdz4LGzW7CTFGRH5ODqG2bLFAkzjMwT1fzNonk7S69DPYQ8gmm6lOP4qj6h6mbAtIzzxG70291EihRsJKZykMuJVmPcH0f1tG9YAT3I4RIORldpKID2pGm3pfFPoLK9adsPym4pcvQoAXoovk20O63ZgakneWXut4S1BaBpz5hiRb1IcXsu+cMIFOBMjnaNFtxeYN/N8QWqQpKA9FF7HCNx4nUX+bfOBJYdzjIE/WMxBbGW6Vsq2PnjTT87FWH1HeRiXBlIirWvjCrcYdX22qxCxQkKE+5QNUlCpIDcR5CVQUua+jk+zyPyHkkSNOL+wK/HTLUGQlMT6VWjYklHeksfng61Q74MOBBClY3TyUjL74P3bKiVsmC/N88gXQjSoOkDiljZSYcns+2nLT5v8p0rrSCOsj26rh/JyqxlgcR7T6Urttz2KfGBvbXpAU7OgW641GR7t7am+0wIi5v4sgsBcdrrcuVImv6sNrOFxyhpmsFvlHJpHBL1u7AEmwFKsoTDvfq6pCWJAy2alAkphU2SM/LlucI3WNqLK0MdxFbkKzyUsvULbPZy095uQc0iRavHJnnoD57eISfA2HlfgE8Zy+UVdL6AXr30LguzKTtKp/fUgftaNAEZKo6MBF/QxC1lZfFnvG7GIqe5fFwqlT16kEw+XpsjcMrruYXTm77q9pQi9tBLFRwXtIB4UatDKmq7uG250AsxTn44D+h2OTPeZr53a4seuz7ctbOF2jfbt5FWAAuc7zHC+j1V7nm+lBr6JtMxotZrMb7W2yt0S69qnr5/XKt00JzaE1HfTcA4iPb28nwfhEiXMEVidrdlsTRoqgnvUWd9xAvqBLd0vaAYpaq8h6reCwai9ySgvucvwssgTFi1uhZWMY/jupSdaqYTei/sGHAwH+bXPXsxxOO9M4ZOkRg1PHSoCHTVc4UaOZRBEoSqZ4xaEzgZ5HcA/1z1FbayE41TMoUKiXxc3wKlT2jaxbgg3ug327X+BIsUOnKs6m6vpF4prT7Qt0q6QTk6987TPDqdMN+J3QrRfnJQdeVNYALRePGDU+CMWLqBeNmUdyh5M59Ot9BDcfjwtHke11BBUHcyig2jYTnjtIgcJHjPYLEZlU5dXCOufX8TFjk021uVriwyeXLZ9vprbReQi4yV4Fmzozh5aivBTaDri/1sER7a8H6Xzp4wOAvfbxMq0R1SF5tyzmSN08S1uDKzQrgXPzPynH8idAFyKtF9oNzlASsHnLfohr8wuxnsE5ktXiRPr0089s1gaOZ6kjU1WHDbwZZPbxC3+KY9mHZet+4i3YYsXoJtelAgehB7ZoTq7Xb2uWi+1pVAGTb3x4sawcCmqnE8vbnPNg2i3L08ny0oRbgxcLFzyAsRqBv7fb7ZVXnH0tuFojdItvGjWQcfmq1J6o6+B6dSC2GlmhyJqZfyFARN8DqE8gpOqIf5wStBRT4a/FNZq06fplLjpbHdkL8kwOMXEUbbJLNRAQ1Xgw5vGR5P1dyPL0HFnWaYRjja6FNYCyexhWwPl1yVtUYv9h2azN4Tt4kBxuGSQCxEsRmG4apHMPJVaV+9hIMPqqiMArFkq8yr1cuhuFRG9Y/cNejgecvcJkOoI/X5r3KF68xKetraG1YcivRFk1W3WgHVrlPzRB9+ypgDE9HE9mAvdsrmDdPWOh7dxjI6oviklNjvl1Z33lLv1whCX8K2jW1X16tIG5uMYbnHmeJMXQMt4C7lqCkvC7074xNxIjl2YdZfQgJpNSIaOJBNgwaRj5H95egI/P7Sg0hhVsbf0dXeS27vJrI30Ls0kz6yDO930sA3n+Bw8pv0CTHsdn9ZLyp4C3dTpMzPqtGViksX1g4e/gWL0VAW4zpdwj1dqSud0OXAPGp2l0vV92M5okGcc6t3sPT+7aqbF4IiORbvDzdGsKcni1EHLjhf1mI+n/1NRSCZh6eemN7Vf/jgtwV+u3qCW5/CZxucTj5167LWwQmyuBtGc9EURs3eqkFQzfrI+mNQ7YFgz3F09pjB2BFahLwYCjBJYCxWGWPXN151+TCud+qSmIx2GA+mZbOYRuIBsx85aYk+/6wLW+EcSlSOFmi5bI/RRULGqcH5wOGd9HxGSwCEdLHaMiz1YgZu+N3MKuDNAsA+H/jtzg3H/BALW7mMOlVDi1NKh/6GHwrBDp5yesZKeQn3mOHUONvJqmyF42G43I7NgdSwljdFOF5t81q0mrRffudnjuBUnv0mevsWqr6iagk+kLt1CYaXfpmyujA/X1Bb3KeOMibRs7XHMXZV8B5rrSmVhhAahANkQ1fVBfWK8i8I11r8rrxP37DMoI98KSgqfDOq2rKDIiW6pfDx8VbDquQ/eyEcgcCMLg8mm5v1agGpypm4vEKKuUjlaTXTz7ugkqKSL4fghsCrGN8hiIGx/bdqy7e3Z+jvha6IHoF7QWweVRy4nMe19VrFTDQSTpWBBGmOmz1r5sxH7p+dDGHb8085y+Laa8inCHM8C64n6qKaZD2eZvHk6rVQ1MMu2oKjXrmCLVCSvCJuhcIddhxhWbROPvaB4wg/Nxu4T6t+DSkvvFMZast3tY6GH2dZtu5w1Zhd85DxJm1E97vk7gU2PhVVVd32QuRbu55B2JoV8xhSXaFvJBAmO3lsmtb2CDPVXkEVmdmgTqW9Z+c8aKAID2p8ONSojRtk1NVRDLjeWdapVlut6+4uXMdNQ+xGlT1Onc+VYl6uA/5o8nXO+If8fm9Dt2g+qdp12BpJoKGBuyroUlngqvUJlNVZ0o+097Rat7YI3usdSdkb7j4HVaw8RcWtpUpvB+mzqwzuOrj09mcfBrCH5901IfzaXaiK8gsVccQtFb/k+LDsxYEyaXMv9tXiK9sRR7UfL8APxrHX+mhsn1ztQ+atS+bp9aWi1HclvxIbXBGBu/eIso4t12ov2gXZd0SQCCTasZsYx5HDKrlKRKnK3K4fJh9GbeD7gaJgzfq8XwIqDLToMvuVRZtSePPIHsMDJ0Q8ZVCC+8NKO4bRi5pwlEhxz3dg68rd6oXrkh+Y2bfX3iyO9MDGs0cbY0IyRLioOPsQ5qpMSld451e4/qKYzH3vMbRqWQERo82nNhaugTW8KMJsbrs0eJjcbczIEJHsAUQ7/KZmmEFvAAp4T7EEK1flVX2HWlUqlX3WIEWJq51/zcFIYafL0ivPi7tvszKLutUszmQyWvdHmr1iP5JDrmjLVeboiIxR3a/mJ+/U9dFgLjGzhV0R0yAgieZe342gSoJtjRxt2pWEb7X26HsLcLrQ3CgTZFqQuuldUTya9BSMHsrTny5i6Ym3qoPhFIiOq7XAf94PKp7tMdmYWonszUF2oTc7R2G220vkQO7c2F51z5fXGA90qK3UYT0akg9bhRv91Vj97iqoNZAK6l3SPKsOXUGXkzthpmwI/YX3TLyP+rGdvSj2dYMXUxT4mfhm5Tc/HdkNj+SCBYnayY2sWCVunb0gIXQDFYHYzhqwNrZzye310RexEekBpHbDQQQHvAnnRvHraXnaCVQuUanUMSw1QmikyaWOc4frJB0b24nnaHZ6gYt2056forwfjDwkAPC+TTDZNRytiKLIV1G7PKNptRISnUW0Ln8WbbuuUEOQ/ZpTQ6HnQHRVdk+V7dWnzIec6APH27pwKRi5SRH3eVXANO1GesB/24ArjJdnWSs/GP3tQe2YVl+3dbvOYVG0TWIsgdjRu1lACs/Uz+qHD+gvypoBN+XukeV6e/usrz4qNp92n2PFt1Gb7ohbL90cSIOEhuHeF/Okj1S05/edya8zL7H2Zl8j3T3XBjGGxrurVGntkd09PXW/0SzIhTAEp8nycrkoF061BdGLneyjoAmvYeZN1ig2K58nPpzx0JnDZw1p6nAfA1rRBnmsveCp6TUGffE5Jxmqio434qSTmJErJo5VNenUg5wqO9P3DO1oPI9t3cga1VkHLW4J7O3BNYQB6zRdfi/VCetojLo4j/0FnnQeVx1/5KkD1yGzLJBv1QQeoMFsG1ZMMQHDnw+Z0dcF5RyvjJESuH8xHsnW775GhvJypit+5wXevpMZpgKgD8YAlamusyQ0qmupCOm4zQBUF2juw3suqogbdmP7IhhGuAb+Reslx+qzV5omj455t23kjODvgCEUFaXN/QACA2252Ecuhy8gClpGgBABa3ii7/Ni0BdQy2jt4GQZptOS3VsKyDFa3w78TW4AzXz2pTZB/ZRstzuSm4i59atMsrI6C/Yxt1fhtWYG1h4F0sNaiMpbHQxaYa3yuTu3iUkwgTHAknwyy88Xh5w1yG7zdGyhh3f5Wqnd24C3PuRO5DIXfa9y0dswH8NuY7rlswGkc/+6lq+7lCX352ukSpAxwgwPGRdEpieY5Z/3/Z5vZelQqxG9Ef3EzUV32fINQm4O54QdCoKlqU5gJOkquSIj6CtG73Fx3mTS4A4MzOBiajKWtXaX3LMFEq+JUlCxxmyA75tUu+9sfb4JCiT743LG4R630P/qd5Q5D2Ad5TnUg5YcIJe4MK+hToKv8pCVH1mHLXFzD+1pNftOInHJbp6pG0MAjXHMdnDlNQBp9bUkrBaLhkKkVA+E6laK1DZLMzuC2mHw77BokG4yBhfZwGvIn7W2F3aXgX2c3bRFO8lflDzRenMm29vYT3l6z5t6CmV3MGR6S5/oeuLCkQ62zmcatoWXIzwHhH51UzNzZYDHKe2Qm3/VgNpi+mIo+dqDtSCX9T00EDUPUJoI1LBo+5HybKmxX3UBccc68R8zDtcGqfeISTsWus1M2LwsTT7rdKVg1Q9YCCruchb3ujYBm4gwsa4B11x5Dwbk4Vk+93Px4DiVL3zRYxDClY09v4rz8JgnHNmfkt/etSbIL+64cA/3DuSDgbkKYVKJid01NfLl1sTN9WkD+R5OLvJWSFq9PeEXTLgX3xKmTWFxsJHX04yO+0MExh7bW7nsiaWmxhqctwPH28UbqkLb8K4A1qE3kcghqdHTGy1mqTSlFyVuHUoQ8oXGaB036xpC2UP9tAAZQBQr99BwlB5A5b5rNzQZDTlennNnkXTTm/5Db/rcvZ9R36kGLFfN9IWNkZUmHhbBuA5IaF3mdRcR1zsLWF3385QuFoKJW4QGKBiXIGc2HOqbgb96jfp41gjjnUZ3tn7KsjEq9YeyQet10RihFYnlm6kvpOPLgTm3qoyyI5sxbzxeBpSAS4TPA0yqWkT0BBzMsHsik+hn5oC+awwDPx2rJs04gj6lIIFJDuXjsyUOrp5nacoeGn5SLHDQNUwkucK7BoXVNKBD/Ps5YwITZO9nMJfOSbPTPaDWkboK8itp3PKFnVQNV3FiZEykvDrZCFljzOhX16xBxn4p1JLXqiIgwm+4ScaRGi/hHLuu9Ra8gTVV8plm/P06xQzZnMNyFm9FCOEiElcwB5m8SZGOSio4de0AScQ9eLwzYdBeMFSN1eVFnp9sh7jCOiPTZT0JydCcAJIcT27lluW7kP5kKvmlXBR3pmvaRRYpnjaTbnPuU8ft6gziRIUH2/loDpGvQXpU6v74zAgaOu2txb6yHbvlXmaW3rWL2i8SC3e1X3fPPTZZRcoHA9+D5LP1gYWmVs9oP0dIZcpDNxuzuO9zI0RbWtfDnc4Hm4cQKIs9228DKhH36qmfYa5qztqoQdofptlgEh6Qr7cBAisLt3iNLh+drgPBJcMEoE6DLaaZVkDvrjBsa87d3X1nt9TtUyB64ttboYcaS/cFlgiz8PaAg3zfqqdpEmTywUUcAidHzpyBK8yLJNO4/ClNGDx8pEinV9kdakKNKxCH4QKXU8Hn78/F0/ABCqv0dUEgavmbgdHNeAT5nI/TDYcSDItSxUXYFxLeSFfdicJfYH2w7D46DHMw/RWKLfz3nLjHrsw4zqPEMpqZdsPW4kljhxHBPcPK23nyl8IVHCGl7Cr0OwG7I0w3xjTdfJ+cq7912Lh0ut3lpi0JUtyxPRJlRaqXsHQHU9iAIVX4PSpxDVuYAbLuIL3c9xVImShBNCyKJs2203xXi6OnuTgOYC04tLYvjbukydguY7EGj0fX2z2SmXs7orMsv9SNRtmJPVb2vLcykT1JBH2tbn0bAKuZt7Ikluca34YFU3U0fr3f8xzqWIigAfGYMYics6cX4228Q+b2fJ7i6+g6QWVsO7+B3AkuvnLhhlOv/BxeMKJa9aDwO799NJ/4eOBYOtFkhmavZGhrjG+SRKvoxpPFIbmte8Tn1xIMas7OvY4MBt53cT+zEV4TvpX3/nnXOLPCgnKQ460cn09DdnZ6xtG62EwYPU10Nl+vG3GLjyiQqxA97h13kc89k4n5axL6k4VhdF8DoFtad2pic8IpBEV99xFLhG1MYnhD3k+zh+sdW7eViMyy2611Gx+bLevFw52hcDfDmMMVINRNJu29tmnDrI1I4jL+ZasY2OfYniPVj947So+Mh499gFxGPgkkSBJDvN5p9yuovyq4jCwu1zbGWVQF/YPIJLkhCELLeu2m7umLzwDNDUHlky6Mc/rwD993fdF2tx6hkkfEpkssP+gpr+mXHWrqQkZKquGQLhnATY8F6b8piHwA90GOSk+ROrmKSqUm0s14QWH+p0tngsSEUTE6BwTT47zR553ooUtdguuE1hoWV9idvd6I7Z1kPfaK0w9SGRRkEs9J4RmGPTNrQI76/eTgBgdYaPXaG4zl7wEmuxnICG/PmurWaYxaO82Ozfz4urcE+0LSffBQXqMMkZ1fh+lhOuxUvcgo8QbKuvDZAmOLXYuOwBlLD+B89soFJtXBLXzHZov6DDuSArloFKain7IRQhpV7M5xGdwhm3IqKUMXh8XFx0S/q3nU0hGraYpNPpsHlnpe1/AFPCh+78W8MWyRd2+L1MI2x/HBnc2zqt5sjWqVvZnnG8r183jhbIvTNJtJQ6cv7yN5pyfeVXD3l0jTYUw+t/A5TTTQZJrTyrj2sqE+h3HeFN9yRyOQk854JtinjxJBbSPPNmsSSAgIehNp5m4x38iEgYCWL8e4QsO620ntMNwdsV5rKFSa4VtBcDx5Ph4UU90dCWhriu1a8crVT0ZGVacuC2aGi3KhO9kl9hReT08qLw8eoeXXbrBDEjgVCQuAGJ7th//uZyZuPLR5ntn5IBsx8WbNez8eWWN1rwMEs/RNniSOX7IdZnqKs55bk/e4fG/rpUALP807ZkvSI3xHEpczfU4ze4vFOi7hEyIb5na/O5VmAXUfoh16xuOuFHYRmh+1Ij58xhg+ijCqycurc7ne3C/ztiUUxaYfw+XzKndbtVqEq1hX1fGxYQKZDQyflNW6pqE47aBBc8PtplC+XR/EXh/3LPXMbTGTsXLJ6tE+rnTQG61gOkpqdE5+f5VVtXRJHglV7va1Z5idCJTRi7fH1PzsjonCYdqbPrDb58AHzdw/3uhTiLtCAXoIJ5njCIF+adJkvypG45ys3PIx9LjEUCtivnIShXN0Hp/xSdKobBNiHWouBXeTcQCYYU2XpBko+M18xJnTwO9B3yfthPkOnMPN3ismBzMFs3Hci13SSEz1pNZnnEaFcgmDeMNWPISJNHeNgIvat2vUAWHvdpMLRd8TCLEwqO7XOi9i7m6douN1owckKdU9ubQd+3eWqwLeDROwMUZfHkX3yHPyTEy8ZqOoGuXrwbbM4KinuuHxi+PGs6jZ5ggDzmU2wMxq8k6MJ4YsV1d795RowlmTXp+5e947hzCy/CH7jS2H9WFu+QrXIqnoPQ+KLpF97sMKGRBm05n7bGoNT9L0Fmvz9U8K90Vvxy1d3yNz0HdDYt7PfU/feszTjze9bHQcynpzeUztcxI7nBCDJnu0z5s6sTTZTrteoBTJ5ub9s7cp/YqpBMW66vJOp+v8kkCuHKOUnHgNpO23K8Il+ZV4jvnjAhjRka4fmn/Rj/o2RtV8WXn5ls4hcmNMnH1S/Ek+116L46EUrdQjpms4jWi0xalm0O7yGQQeLi2Q/+5MVZTeHDD7sx6E6dvYSiDnQZA1LG5FqXztRki89DO+hgxe6udBZ9117rTz8mrF0Hon4PTg6S2doIZ7Dm9vbsveU8ZmOMPkdXGe95vCq3Wc5HFR7tZ+MxFVdSBZmcVrWVYiInP8Ql8suIODvnwZ+J5DYq4IFi4GUPSjMOH+1xt413jBiDkwizJis+XJypCSnZNkr3qW5R6qtxCcSq7c+LvcMeDV1Lf3hqqnR0A0yN+jZpovrDH5ezfZF1Lw6EZ7cua1pg0mO8DFQC0/QF6rvSYNBpbArK4u0tzsq43JeCJneSaf0k0757PEsVdbD1FezvrMtZufoanrqdEclWWTCLHVGOcTkpQKh5bfgGCCQ3zH03O9BTcfJEPzY8Lat5uH77EfHx3dnNkV2+TkAZcEgZBHxcg8oSn4j+IUm/KZt55ovtjdgqplK09/ZEGO75zHdnPHN912MFCaPB2nDw7AcGQy0nxoJKBoqd8ewzx4vuNNGnnf/MlirBnx61fZt+1zDzqnQxAKasqyx7xyybbZqd+Kjfr+bVqIbLlO/dgAZcp2QVof6Ijnx+1lK/hrK6BzAIhIlPkA+dUoYin/lF8l8coZ1woFAn6/3ch0Q74hkpIYUF1vMBWlZifhizSzDRU14J43OO9fu96cjaZoYe4aJ6P0p5WxxZYfd1t48AR+QpOCfOHLJdkLE2xXZutXYxq3E2LCALkz8UDTBm4iepzJGa9Hn3c3v0kOlsIDuJuBE1p0JGMcJx7JRUvGuR1VCrGyfHxue8Aq24bBzX0vxCRKxeTmwLW2toLVplgv82x7bR4G6wwMx80v5Xzfp3tkSsthNEiy4r5Pw4XBXZOwPK95Hj9ES+gGwddoFcmTVJrwpzBERujg5/hujcPgrMuq8JNx0GGr8vk5Fp+tskd8azbzEWxUu46Z5Of0GSqPUFHyVwzlIcm9Dvr54uqzbeE6bFZ6V25zO5DU5xX1YuN0m0zhyPMpkJJAl2q1zY4pTNN8uwHae25BmJo0vFNsMFptuMBfyCrwBk0o0zThiRvc+SpG78vmPcRGyqpR6uOUomSvT727s+Ofmn5n3k8Z7UKX7wZRiKtaDexXj97KlMzcZtY+mxD27YlwkNkNs0eCu+dyL7keH4DHxpGcdTFN2itnm5JgM/kBYsENRo22iZ7DDUPQL66pByPuJqYy3qvbgtDJzBTNo1O61Aw+A6+SlEiu11s1i4S9sIvoBUJZhoHYcNbDQ+n1SieN2oWl+s7kTj8S+PbxVDJmGcv27DzEowLyCP5/KdwF2Eez18gk7roo75Ke0LwgiCXvvyoMy0aJPxgiu5QpetRIcuEnv8/N2F/RrMAmf/xkeY8vSnun9jkUjuhICzAgGmj0UCIlBU95Xp7bE1Kph9bdHFt75rcj/VKrOMvtlNM9HyoO98gQhkd2BNCEy6XoLKBLQQ52PWbsYmItUFufbE7QpKuN3pOXTl5JqVgkTUUiFSY53CsejgwgS1jQGr1XWgockCyts7UT0+4loARetHM3unTO2mdRRLvzKk8UFiydZ/2UbUp/Zdujtz8biWom08wxogYrwK+BiQX0pfrIQ6ikyBmLT0IxxVNs2XtJXd++X2Un4w+zaPsyTKTKkabpBWOTPNkCSZLPcKbYvqmfbJI4ArAe2UaYzArA2RpLrknJOf5ve9+x7SiwbPk1b9oLb4YSwntvZljhhRfw9Z2pU+92/0L3ejVRSQcQZGbs2DsiMpQgv5A6T3Wo4NKMNTNsJfP2zkpB5BvaUkqLfA14VYyv585/sX6klwuQ0SVumXOglpTnd4nNrv3ZeWIUtaqXh9YtetfHugzxZYZz6FTAQzIlrPVhzY2OZ0llAbS86pVSVWW8KJeDpHj0YHo3IuU5tkMV/8EZTjB5RgKcwBezJBOSrYlYtlRuycXarh9m1APqQuS2DuzpfuQMHCceTwc0em4G7AlQaRcOpUQPJOERr95XJxqjCSWeeVnznRfA+jRuVvg2f71zXDrwsYrU+UfOn1XjwVDFKIxZ6Q1K/SjHT3rQ9yh8OV2UCLFHT0aOUnp0CHZdR53RmO/j/G4qZr2/D75TrhwdgGv9ijMaT+8t+Ozy6TAbEVOAqjf9wQlf/r06pjQCUVRqvPUY52yaI/lb6KR83q7bt3V361ODYH0c4MpMcgCq6GjJJZhFiyJPZc9sBq+f18ZUr4qmACtHk6jUgXbgnzVjmrHzXkM65UTAoxVPv+GJXpdwFM2KMpZtJ++G3QSWDuA4RQXx4NdR7DkGOlkh7MsdPMh3xU/zzmccfZMxE7erNRHqvGhrjngB1CR7MV1Bus4GTt/f/djf3D4G2ieAuwYyhEZYJQ3H76u8CaY0umRI7XEiRa8jMAagAy55r8C+PzhRMlGLxWVJdgAs6a5+VCfgcfxdY4vyfT2RNa7Y5KPNtVHyp0qty8fPrV+VKPMOkii4k7hXdO9G0C5aS4nWwrv0P56X5tW0qfrsLpBJKnSigWkFyxCaFbCo6xQ4SuEywErXC6LlM995Xr1pejzE9gnkVB+LXCWc7XO93xNFYvaLP1/vaXhxZuJuYU41RM+h2TZKu+kYjqBGMKAQ7/y8TjMcC7kdSBUDOibGTFjvJ4SpSpOX63+2qhp/IS+Kq1BTh0JnmucZFjSVzBYf1rCABZhI1rArvC4WV0V0OvBf1i6PQB7kpf21zViU5EPuAN2E6YqdlmxqT+Mgh1mFIt8s9FfRuAMSaTcvO+cDkyjcFdjN10a871tayuwXdzUy1xHFJUsE7k+ixHd63BL1r7wYh3sxBAvtyZ90fjJVUowXoAMo3C0qQOS3vpp2Czv9/C3RA9awkY4fLNa+VyMd/Ou684vCAK2yqm57Vte578d7VoCRLBDJojMvdV7vodo/ucoajpUfXTK+IH0VjsfrNbZZJVNs6LEsSQ7fsf3C85QXA1sjyR/aYwSA/bwLXA3nPGyYdAAMIdzslrfvbOsS+e0x6I0fhx3AfQOCvy7LRgF9cZeHJDCQB73iBGZlq0qOzWuu1tCQHhVFOuuiXtO0rF3ge7lly+T2vkrrXA/31m4oMc4axjqKAwtuGOg9ZOazqPvaz248nJKVKIUBliDNQdLGbNkW+DSzR1pZUhR0ODWzrjsRIziOZXAVWbnzfaGAVPUChGtYgs7AeWUoCqNGOQU6lR4v4J0L9iRFcp6B/qJv752/xmzHVpyr450k1kXbzabh0AbLHtHfLJg5EHxf8v0XZhNCg/5YHO6MT0BQi6BLVO/+5TT37ym1sVmaeHVv0G0ysrRszRnkuujN8d/FxiJjG2qL2yia9tcXG6VkMb9QZuQwsbF7aLxlvYBxN1bUOME9jxvdH8u+r0AbP2cgJXMrCATKnNXlwGkxmhKUeRrCiuX8o+Jr3RPhaA6qnlamO31OYj1uSqgO+jtcBFFoTAHrEpIuTyT3pmDEX6pCQYFBySfxSUgEHw6KqpxidGLqppIaiyJUxgvGUmHSGQ3s3RqZdOiiFu5nEIxQBDMWjXyUgLlfFxuXFqudRRwCIsH6unSnMTTBp8lWinThhF1dzKiRWBTemGbhD34PtZnFDwMdzlL4fri3OsxLkxvNF+tIxhzDA2WqtHCO12sTii36bMW0G9WIs/gn69XzY5EhpW4dORTH0AOZ7HED7/j3Pvrh7hIXHorCi7mZiPt06rD3+BM45A97Ga79Yc8dRXyhg1m1p1UaBsvuzMDSdLag3mse6SGa0WI40Gs/ZnBX+AFxFC8bgr6LjVzY/XgF68DuGI29UvaxttvKAuvS0hD4UodRp2G+Zl5MVRa/L2Be7w1ViijF532miepFoHhdHpQ9UNRhkYZc7Yj2xRYmGERl2kMOS9HsEdewtlA3mlSZBB3BtE86hPiqj9u2+nVHjStKm+7Li8DDfXhHU1dAxnYrHVf8JdYS+93FhXnP4bT7SfoGkJwHkYdtfXCT3SV9qsIbJOfVfSzpG75LuoBRuyMymJ/2W63m9jElDPyusCLzHqSxBJIb33BWxEjPGz6yQvxYnkGw/UX/FJc+MQ7yXTdO1bHpNY74cKF5SaT9nf+FHmBsxxHOipOlrzSbHaawIxK9tkH2qwPiaGNxj2f9Jorz7UeRc+fZ8sbudNDR8FNPwToLQ6HutA157rKzBEVI2BwZDwMK1BCnhmRqqE86gxUMXsOZmuqBIgoDgaCVeUcyDRgYaTxETxFNFzR7+qF+qikV1FswGQ3jN/FgtF5eDDXaauEv1NZ9e8QwVT8M14ERYyIXoVgX+FCh+s8dwQTfgZwpq14deevzEeyWV4RKM3J2d5rmnGfCcqNkWNEmUNks3bEYzdKZtlcXOb+V2qmpr8Yh7HesFoPiM2UaktT+5ohc5tLUxfXa49Rd3d9YAQwPYbGGxlxvtrTPoADpHhhJ/1CHrirgICQeFvRBbjeOZsRv2uTGptnFOn8975i9gjdh9c13MFBahh7EVOWZg1opb4Gg66FvJSbZZQ6FQhkIuI8Kp1im2lfNuGG1qn7bkAIVRUN5E/n1cI6YtCE7HWL9sgqcwmLrZcqgWJHImq+obKZn56I9/e1Pf7onpRqWRw1o0hFJSzRddz64llrFPJFNMgnkav5+VKPJ14KPu+jkOE78WCMBv1Z4ulFPATuU3j9nkgch47f60Se7JdJXm4b1Oy937AsTVAB9TvZVf6nDuEMGfoI3e1gCfERD/A0rBDC+chqYFTHbJZ74QnSkCXDBruCRtftwfUpLIbPAgJgIO2kUDRPtphjwnNWw8pLGCn9aQ8RwBl1mJAko+LAfh0cQo1FNxes53K9WbEVoVmlWdrvyJnOUoDPflfGQluIlbMzkU1oH2hKzXRquqbzmabDDY5zyuOfXQYnpKIG7YzLNjMMvliCylqQ+YIfrFirdPd1RqPWMGJL49dVNXCQilcwP6DtR3hUUl+9U7Qx/+eimtbuvNPGJyJ/hjMqxq5TJwsdN6PpnZMRdeI9W+xnDtm1NjJvpOa91m4dZfbKM+kVozhEaQ1jxMHF5HPgHo34FyNmEcNGkuJ9ZMyOaMflQCK9uVdtzez5a4nvzIcxR5s+H17Ov6+Ex7q/2Sh4NsntGldUw9EoVvzoleeZvQwP3qPhL5Vw8DzTcC2azIx9mR0ZNVMoXgjFK6PZTpnauITFZW2TGRcil5uhUfgXzLpCm00UiYQ2NoZSdnMpyKE9CtwbNrs776y63Cd9SfPCVZ+NIyiXzTuasc2kCa7hL8sN8m6T7DhkejwH6NnA2El0gYh/8b/t/8LeUKyQgvZaPHS8wwZD+1FQzqA1kDAgPq4d8dSt4DtaUX1hUPJs06YQ7bJ+IFOD4NkwETQy1Y1a1RvLIpOj0yw8CxD1DTS2+qhqTAh89xbKs2O0ei5SfjLSZBarwvqk6fW1/8LCQV4uHwaPm49P3zuIJccaT5s2ykJ5dnNBwTmPIK/ha5cnJwiQqzdC2vx0s1zzyn6FD3Wau5888qx8hKGDnrADOswZG3oPQhiMvQczLYRQQ31d5f1h8xxM0ZOlQJP/VoGa+beJk8Feb+pRROLt/ffRs10htGx7z6yDY+pQBw2hCiR8tmTI9/68v5mN0P7wBwy9ktpuZQPyuy3fd2Cl7gGHCdrGc/t8dv2ZO/E9fum5+13Vc/+u4qH7kOJT/vzvOElueU/bt3AQ/a//lR/Y282dpxaMlqB2ByMZx/OyYCutY9MaB3FXfpoGxPM+jdIBmO559MEx1wBxZaiubE0eaaZYxSbMGzyIKfi0IqMQY0Idf+3lZpp6jh+CrOf7QIAjdnuIxDdcdGlI4gkj93UeVfIa/PpyjEvCRvFtSy+Tfl5GuYWDAa5Jy736f8T4601EhZUtUKMUWN9r3Y5HMRlczxzBn0Kiu4fe8bBPNdmO/VSHdwj7472sQjdGGEUptEXpw0YLO8JebgDq5quMmvCXwmN3guVpUHE6bQlXeHWnB6Q6d0+HDAnQANLMh8yaKonHdfl47EoA+fepbuKCE4cNAk3wrv9o7Gma7ZY9HjCFpYhyXHi/F9fs7ofH9vzMz4GDIgMZD+m3wN7D9y9v28YI/UIcJ3oQwFdwe/P7GRrxSuZljmI633/jxUbl92QAHgGBCzA1jNm37VewgCIVP82ZY4/mKpKooXHtUTt3jGQsB+AiZtnTd+VQbGF3cxoI2p+ujhuJ2SzNKlpm6XvM9pPM8GYlGBaz47f2C5oYeTNUzbDn5geB9G4hUzHtxEQPAQdy8P6rajnO1fL9f1hFkwOmx/E7yjx8PSuMCPCG3JMu+mHomRVXVveAncK8OpAZb/c+xi7zvlCJN0+SCrpTAwVyxWdsjD0tyY53Idcuizkjax0NVtMORetL81btgOQsG+tsBDePAat4aSMh1nP6hiOu2cDUARRpNkn2PXn9NEXho53tdGI6oW7TgSz0U4RKQpt/r7uNh64/SNA2Dbhlm3RSPv7s5LUviE2fZ8AISts/ztesHNU7Y8aTZ/azJ9UomtRwZhpdgFP75NR8cAXw6vZv/mW7yfSU2TNey+N+wOmgSCltRFCd6HJYg7ug9EgRcP95wrhrMyLKsk1pWFcdw478SmIMnDr7E6gDng8BTCGYIwJ2PEuzpfCK8bq2RNXpA8A25NtzJngFe8ydArVEfX7C+A6OZ1fa8+9meb5itYVVIrvNi27Zv9Kv3hHJ/6q7kW2/HoUsWjEuQtzTiiB/PWkN2SOooguNHKLYc992uJE3fd2mBFUePGDZsJJWGkOqI4pcjWEPR1uC9HlZVQskdmmHmfHgPpdnBIxhTMLC+9wPYeIXF+RvQEkgn0aPqjCR0+iiSeOH5ZUqACAop5T4VVc0KVDyUxtmKJSdNL91vzUsvkhl0gDzUVXqBKkMf4uYAMJ55p86PZz/e1xLr4ivTenKPKRhsGNVhmjOR7fDPSJrZUKyjfvO36TL4Mk5YMSZi1CVi0ZGLt6JFGMCcT84q3+cRqHe9Ox35uAGBjFm1AWuevOTuXwIaHsdwgIGAkZJl2SEJ4iE6w/SZPUP3N5ak5vNNFWLzzcYE29p/uGyZL+ws8lwWY0McXP3xbX9ryHFOwnkbzZXEq22/m+i6/EdesCxLDNfaymesv9679IZtttO963k7sB9dorrykmzYGTPJAczNVxzBkroOYUSWHAY1Tw3xAsr6UNNNwu0PLzTE6ipslQF8KayHqf6+137XThh000OSBCGo/PkucLr/PhuzrKqbguKIdggmlJ/Nw9eEt4fDvoSc//jNi/1+1xtYjfL7ddKaZXGNyDPSzMqtjwYwA54ZZfj9V8ehPgGORSuWGRLHSbzOMIyMOoFQsAyDYF9v6KfZr2X3+cDxsWl5XpVre43qJcLBCt554hUf0gC3G8pzYI7N6vGOKaHlx9rgxhVY0fw3O0KTHpr3Y6D3O2+HRwZG9Uz0zgXKOYpwNOCeEklfjUsj7puOjuPIylIKwNz4IQtYofyI35IEmLNbrICJjF3B5aOOFflCe6vvdYmZG/QUxsblj5ZYPBaV2ixvmMybvvQWtiYyL/0wXIYGem3IB3LP+qJsKtTrasOLceNapwt8OJhvuBQ8TWEZNRRn1OmeuMqVgnPZdvLuCQcsiTBXAdxQ2qep9eFODfpfMHBcTemFWx+Ek8CEbpF2XXesAwkCvSKToy5K97L4cmB11/OFVB+nEb9hGEV5CrcDx6v4AKL+wF9TZgx3br0f677Lr4YYVBUslUl1+xqZHYU2mvPXsrsh2qRKCKa0yml7snTaX2gmbNIJvNn5hsUbT7j/zzofBjd6J4tEZVXXJ2OWzH2RObziWAPJuXMCGeURf8JLnbdjHAdNpd/XcE+49pX5FzCd1qE5M3YaYNIip8EnBoA9LoBCAOQRORSX+j4ogOajTQFlmUf+as54Pb3E0rRlX7FyzQzxbT++ufkCbF/0ZP6tAVz6qlCqEgRc1z78NRFgM9LDOIGx4Wj2au/7pWdYGs7z4f6hjF3UTRY/HzoY7SsflE96/OhQyjAE3RJIBgmz9gsUM+lbHzwFxuImcMG6w4Yv9sY/7wS5HagPqigqy6Hv2QbLnA2QA8Lo311NTejI7ncCe4Ho+OttW9oNbWYPfuFlCNwuD9VoBWYLO1qobVx+01KyWl4pN6stoE3m6/G2dQd14ENV7Q1saD08mHZmDc0YIfSmec7Q9ecDEHYDHCyXvn5nYhkLhNnjKgzTkzvXepaN3yupO053OXfklePqWVjRgT0fdXlSYP2s07axuFj+S3qftDMhaIOkTzEBq10XPX347KseaxJxkNQzUhIZkDun4iqwTnfpDuNWucrR8VbESwzux2Vfs9whqgz3wDkfprzTKZhRgIj8aPNf1R6UVqYMsQ2BolRhNXXRbkUHEK72GfYDPPPOTRNJN/RyHOQuStIVk2Yy9hdZ3Rf6B9nrJpDXemgmdHq/UNb4hfFvuBdMgG38fn2XTMs6iZXB3wysBMBHHMezB+ZsSj3a9b7Rh9C2lA9XwN1r7PkfCoD9AzmKrixNgSWO95rA0W8RP6+ScnQnwAheUm2OI45h0af8PLhn9NwtYCAxYNPE969vxBNRGxMNp41x5sdHeOpuNzXXZE+H9ff3P6d/owvO9lci9398sFGBIEfrxnJxlO/wL2RiHx8wM8f+62NPtZPBNfKrgv3SoJ+AOg8Ly0oPF6AW5oKB84gDC/Aq5WK2FmoFzESx75Odywp4BzhikwcZjuojDCuk3yo3fZxU52XZVbAm6IZZ14MkunEcgDUr41PnWcA1470n1tomUntIumQtEGygcIdSDDnP4Ia8Cj9w4TKiqILJecGy2BFu0kbWrX8UjPZ5fmFTbOkWbU6Wo/AhZc/neq6x9oRTKVgvK+F0L7ni9KME7mAY39Tf1Drv5E9sE6Zid+j6GEemPz+e8VRfnDu7oRbZfUvR0AGXOXyokjQlAITrbdIr7aIwveEeAqtApgAVgRka7Qgn3qLyofA1jf5+i3Z6j7C8gqVhyWk6JnigJEX+mRC6wJYRIBqF/rYST1kJjsEoyByL384a9mKJ++NHUVMr5l7mOe2A9ZoIEEkOjoPT9FtnNLpcfrWS9aCHK11r0NsTQNLV3K+nx45WAEjIsuinkVckVuogOmUwa9HgXnM+hp+Y0DTzONaVLBicBWYI0SVNKYKkS116cBeibKnsSqFcaFsheScg5ZLC6IAXs85939j4L/dBoYjl6Tu1z/MHgY6Otd7V359amGeAI4Ubbnk8T5KwRRas6gP52CzrcoU1TnaXFTvmJRpCuvC2yvJN/i1rQEPp4D8OnPxV7e5Nc9Hu+stQYycTdC8XwTNg+b8aLbx4nABPcI+G97HUdb2GVYXBmuQnRTpkUZb7aGNTiR+mD4QcODSGU/UkcDDNBWQL1QJ4LsBG9tm2NcHOgEEXh9+m245l0bLvZYUwum697l87T5qEt+ziXhuWZRlmMI6CsQxxHuo6nL94sA6s4Gq8uWxhJSTUoGDwoFMMKJrUmTFHKNjuQ1mCHXcnGdxhU3/y0qBrzp1egIdIVhM+7MeiX6noiCS7TYvga7YLd3SzG/fklwX4ygHPd0GS2hrJzFnqy5QEnC6bYGsbgXiHFMsGSVHuA4yb7b1VUQucIzPGu9kF/AcsQWkv/sYJHkHiB7VuIZ19dIiFZPskodwpcl03sIVkYfAYsEYqB+eeTkgnK2Kvx6G+AD/fLBRF8dGjsRUmrYwxmAhoTUc5EboEScFU0PgcbQNdzH9E+MnEDBC9rwdm5WxhNvbvbwMYsb37KZIGjMRowIGaXfeinSWrSnWGSDEqb/w4RHBXxTHC4it4raO0iKJgr5rG79FkZ6bM9D+czHuLmq/73uS2va8GK/oEj7IsC60KrinwFzYtgW9DKB9ObdgDDZv5f+fqvKWu6ee3jg10D24wxMYTmC823vi/5wAvUFax8EaOF/yU+OILRaUVSrY/RfRL+5GwzhCFGo5yN1iUmi92o3OAhR1I/+M2TshSCHkg59OwKMBIJLaQrEN2oug+zwqXoIY3owU8HRxQGJ6/O4VeWHbboiSc2g7eRutWrJEZFBN6wCMoBkZvFxB7hUWtn2VhXYDAFbKELPvrn8RetOYDhVpM6LbvfgDvS5cj79hwoDP08NZbuV7BpHj9r+P+7gHtT6VAvZWHDReazKD3UTI2lWCxov3FPsAygTmA37Xskf3ztf75DyGWqMh56EeerfLb4+MLgHN/ftSJ+HVCPDYWaEWskzyw3Ixf99AlNqX2+3GjhSDiAmVZFIidfhzZEMw5NUGGl+qlKUXLuuZ5GEHc/r5tlrGhdM7+eiMIJlTCFPIbfSDnyzJOrEqTZUyvMPQbQWuJClgoVQHVDxW7VY1d913DxKWwYhev66I96PWmHLBk5PdE5RTB8Suo7sO1wKeLFmt4UYuD6QN3gwC/jxpe2Gs4fQJiAvjYht5eFFHPvz6OTzkyf7lsxq3+G12B5uo/v2vXEpv/anN77vf+HIsSkNgSrw6UxfEoihDz2KCW+hXwLhEd3CRCsGzhwJ0WmztacwTt8/hW2w6wq+j6pA/n+LzgCDmTxQw/3V+g/4fDAOAgabaicfAdf/e4mVW9xYZbBf5NAJvf6gp9rI9QwKG/2/5hdzMVSWRGNztMPlVwYZKEAh/FvnjL11ZGH8BOMjXNrwzQh+iaZ6DOqd1JJgb8b93v0AyCfg+SVhqCurpJgYRGgePQbLBtOa9mP1LdFF/VkpM3NULVoh0zQeP4UYJH3LYDwf7dcNADFZdDT8I83iND/cbQb48KHMlWLdTiz2MYMLZkDwHM9e2gNI0ZFc7SOFsVK788xNe2Hw3XQPg25r4O5cRJgiQILv2zzsw8g1dGZaYdSBAPBypIg5GDxZxQs4ebm2SCGc0rXTwqtxnAw6HNHsFJHvlddY4UCRpQAwpzx5dsa/9E6wFGfPn5cx8VL/4TOClgtfhp/56R6OyHzjXo+k35wtXk+bds1sWvcSEFw+nSUNOXrS17/wJQlq5ph28++EcmZ6p4mDlLIz3LqeU2N8sGzDqCTGR5EwCIn8gU2I8HHzvywTwTEiD6R91OlRUMFmhzGhYznKzn9zyAbYuvzEZ+fMW1SBF41uOqH2/wCqQ/ePPQO1sGb+Vnzz0BkCi8KcOf8Uoebwe82i+O58CrK/v/c+7/nPs/5/7Puf9vnJv6Gg+9ys1jJecmYrJ3W1FleXg8vo9H1G46uQM+dDufdx3OI73Pzjd/PLQHN59E4znI8yE/blgNA4TSiz0b0a7h1rXb8Pzbezye37rlkutKqnMR3aRvz4Zv6HqK1w+u9ssXfImRdkpOTzxePeUp1jvvthT8gI47gc5YAw9X8ljGGFA6RvyuvxIeMOVX1zGnWWYbtS9IoTO4OURTOg3O/HxzDx3REotmYHWWsOwX38hY2v12K+zalofqNGQcE0dZTqTcZJVoqA/aA5xnpAy54UXGEljW1GPEdWsCvi+womEvvk+US3ot73sHZWVVWHwwwBx6USd+O48l0gHnwj+GrlVX4Qqv9mRwudWQ9+u2rHyFDVef6L/6OML+To2gVkHXOeH8IpVCB0MxPgWKxL1jLK0AlqyVuDx7xXPpipndaqKa7drVP+o92LEuZsa5+IhwHiHCLm3cbJmyWmDE4y/ybeFz14NV1nmJJrxs21YxTp5+GmRStjG1Pz+/gqIgEYhLfgO/9xxq1Hy2kbJoO7K/nhMnYtijF96D8yXnZKikiSqhVhHPcwMinRvITuJOcrBheXY5G/v2ouVvwyBUFxQkmPpH/EAn9JP7ySb55i8ech9sDZ5D0DP4dIs+OuhojhNVsMmQiVNutL/CVEQ7hF0mtuDOFhRFlD05BCSq18dD/RpJndDw6bLnntHBQ61u7LNLlyKFb0RljcbWhrhqb7eV54qcsSJl/PIy+s4O56/8yMX4y+b0hrZHBBSD+pIyC93yiGMKenEeYop8+pcXCbPG1/lSozuNN1vRkQh9PqvL4SHfxqchfNRFE+Lr8OSfwKp0ggucEjCL3zY8E7/3jEq64Xh+aFrZDMarnYCkEUd02DqyhwZjkOE13mp3Uog3m6m71+ezWXlOhhbzfL/D+P2u59bfEJSo8nlWuoIyh0LcdmQrVg+trpjP+8w9C3pPxlbMmKqzicmzBnYH6gPDgVb/fkeVJrVfxSNkcjGJjsgg+qVNXGWZJP3gXQSkl8RHx8LrfqEElHWmoWidlXVAPitHBu7nbVZR2paZR22fSJxR/AicwU+iPHgFmorJfYMCEmnXYeAkzSpwwjrfKi8qg+NelBzG9Sm+7twjO73ccftFIXsa3u/dWGui1vQjxIn6woZkWCJFU9cF0nyzlizrCRRjG8P4MM3YlQJuPqyK7DVRHCdSKMX7mlDX2YRdvaXkfWqvjjSslpiQuTTKt2zQL2BMThk5pBvjFy7jOtLvR9XIea0DqHw9av7+7U0frOjjgAfCfsGT6Y6Zpbz49PNg7LWeZ11oLkym7G+DDqzV2Jh8WUbKN2FSwdCQfTyYWppY95Uy1uB0J3Euq4HiurlfpMiejqH1QL3oYZICATGOTFJH2yKizmyjaq8ZQzH4AhLKZVp+P8alikao8jnjT+nsRwLdD/4aUhc33ZzruZlwwTiYQiW8u3XOY3QAxodCtnxm9XW7Zl+zr8o1leHrbkmvD+CLtEPfqXPtHwJHi0r3fHKb8OI/7/fJGqn4gjvHxMRCp6Ga1XlCqcV/30Zm8XYfTq9JGBTRk2N/jFLCstKc+v3wxIn9YicWb90rPjfy8tOjs9wOk9VP29WjwITUxJX6MVDcZaT0wrggJj3pXa70+FCXPKqCj2sSQ0+Ped6aHtX4g43qVyt/Ho8Xp+i/VpF8b2MSIzR5s2e+I5D6d3JbfPZ1xz6NmnftfggclzXttjLr83Xv7jl8HMLgcnQf3PuuiOw9xHE0h7T9hCKJOSV+N1yt6eZv6de9fiMAU6/ZJfFuvVA1SeqAxRaVhP17DMJ/O1XQnoZ3IrOBu0f1maKjZMJ3CONMG68JRT/vH7lLvQ8FI2ey+mQSwQYe+KmfQ7TfHu/2CZvkfBHkdkDN0Bz57jn1WZg7b9lJa+NEvKZt5O7JvcL8HtahfVr6NsTfd02OXYlRes1RRa9w+PnJZq3266M33W9hulDaH64OwI+OvHVOAz1enj5JAvn4HS4fHWAt3lPZTQZVY3otZCDmiD06JilmHasPAj366Hgv+sV1q4sHYKUkdykx8sBBKt+/FTAV33SqmZX/dqUKKwU4eciGsJwXsp6dkF2yBbmNIQmdl7V4eY7wnlK1RMrzmv4VETYh+37J/OZ2X5GVw2hI2bdjLul4LD47o0uFaVj11NNZ3UNYWr8Wl4qcJqq/2h3MjigaR9MkhDFVAjCPSEexKhi9O3UZDca6WscE8vRJ7uqUV+9sEzSw+gJyp4f8MM2y0RvJWXFu1UwR8Ii+rfZ0zgeGudSyczvfYl609lGzlWeGsd9ZJys+/Sq5Rqx24ndv0f4YMOht3DlFjdkD2tfDUrlBKM0DFEPqF++QxtIpzOF7H5AFqeRFVXBbavpxNSN0uNxno3nS+MNI+2zZeNr5YL05QER2JjAxmrKdMG2X9HyBsavaTTSCa54wJuIXhb+p8Dw2fZGnIDTb99WlgLWFsGaNnskF/3TScr8A77BfGqqxR7mjdcJwN1KsxefeV/mK5lZehTEElgV9QMckg0BkfutxLaxqlNjPpiMUi4umgjN6j4WiIZ2hM4nWOYiMOpyu5TAMju6bkLThgjLBB2mX5JB6fDq0yXwy665s1k5vWZg1pKXNEfDiPXn4u0yaA1mSYRqdiM7JwE2+LqFGHKpi12if2GYgCokcsluz7B0wq9vPYX5QGOwzOxP+VAaKCac7m20cUBfdOwYwJqhcqBySPILF4RPJQRLzmtx+DlPVmfoBU87j0bLiS7yLZIYVVvjijYJDMNp7x0ZvLVvEAEutAqtQcEumST6BgkwunUbL+nZ4+GPe65dJ4bCbZZ9BY73jDLbj/Wz+YG1zlCWMFdrX/fX0+0bk8PZpMlMyITYTo5bcyxtO6/K/hLiAr1RSet0Xe5broR7ZuJ+Dkhqdxne+2kArxupNzhAQx+nU272e7fjADlhM2e4UhaUzInuKSRaQT/ODNX5aeVqmFq/9NzakRGzUzsN+vEW4HATfyz19lqxWwJeF4svyP+Gvzlhh3JiRXCGW3Beidmu5FpQI6TRvw+MuvZZPyaUVNyleDh+2LRfzR77tG3r4ZFkU2kDuyVqNdHktKrI23+0casGPHeNYhzkURiSVhHZ7tnTFaEvcejjrxKzRbh1pEiHKQK6Z+UMaujbWQDnCxbjRJf4TqWiSQcezjfCnDZ+cUx72cO19vVvod7NX7anXzp0RRBxE/hY0G5rH8qYoURjcPZtHprMDDJlnWmObTVIdWfoL4cHY4k7DGugNMQaTd8TsLtP4p4xWbcWk9b1FDuBhEpoMBQWJ7SerVq8o1me37Wc5CDONajttNw7VDMnLWwCjTPPi0+hVyzotX7u+49UVP7S2qwXInRg9X6OFcgclYUEaWEUs9e0gIw+bAtq7sMKZDIOWat7JE/kQlut8jE41XRhjy36hY7HmL9bCCOjlcV5P1WWyYqQNHABuvtJsvMMP3fexySY8IovyBCZWnm/SSbNx4kW9kM0X1n3tVqbAUczWDzY2USbiSBPqu/JmvfdeD4dUWQ46mhSwyJLOTluZ1ThZ7k7sGFgBayQ31RVB7GwVoGZs+cjq8sZ7tpxazjsp8AvJX4WGs9EULKcvgAcfyVtH+FBuA5Dz1+lOYlzZO9IxnV3BdmXDaa95rhcYfTzusCHTX+ZeOttHrMEFET3Tqw62oWTgMPL1y09E7ACvHt1MDvL2Wz1YKVkWq4rttqofJI+9BM42DB31a6RDmqeIAVoxENNkv4EyUyHgKa0jtnECHRee0E/VLWsgBWQTPOfxpN18q2TxbkRF7KhfY7LidmQwjL6rGzWyZFCt/UYgRGLM/PUYL0SLiSU4QryrGMUcuWSodKxG17yjKB8UDl2lqKrMP+RXsKI14+qWg4RtY6MT8hSBlxs0fCkbLmk2EteUp9yGrSIbGe3VEwBrH/pc+vZv/TblWpUAxs9R+mSgzmoFqqQi/BX0yoO/qFUK/1L1wlFFN4tANu+naMwEYES/6Tt1kCghbg5VOoJdFwtya9ldWSJlu7zcl9JlOKhfKppV5EEkz+tGGaJrnNfM8n9CdXL0frZsqPm/FM9UXK2zJPwFsSeuNn9dbfoRBh7QOVF+2+6Cp1+3Rmk+fAdYukBlwbghiQhzlLPzeJvgw9JEk76o4+tgXmUxJevncFiReMB/rh+YjkpysSz/F/76L/ib9sCMkaNctvKEn2AY+vfRlC7luP1fH+H8f+HccIrlZyi3BUw/8u+E3y5WeMr1956AcQH4/tsUW/33GU7g/wv7+7Qum3f978IY9u/UdP374P2fq8PdlX/fCZ3WyZV9/5+3y+ez/V9/ExdAovRPUcIj/jc= \ No newline at end of file diff --git a/diagrams/tutorials/web/low-level-html/event-listener-exp.drawio b/diagrams/tutorials/web/low-level-html/event-listener-exp.drawio new file mode 100644 index 0000000000..db2bc0a8d2 --- /dev/null +++ b/diagrams/tutorials/web/low-level-html/event-listener-exp.drawio @@ -0,0 +1 @@ +xVdRb9owEP41SO3DopCEAI9AYdXUTlPRunUvk5uYxK3jixynQH/9zolDEkJXpsH2Ar7Pd+fzfZ+N6bmzZPNRkjS+hZDynmOHm5571XMcx/Yd/NLItkT6/bFBIslCg9XAkr1SA9oGzVlIs5ajAuCKpW0wACFooFoYkRLWbbcV8PaqKYloB1gGhHfRbyxUcYmOBnaNX1MWxdXKfdvMJKRyNkAWkxDWDcid99yZBFDlKNnMKNfdq/pSxi3emN0VJqlQxwT4+dD/rCY/7u7TT69P9ujr9Sr+YLK8EJ6bDZti1bbqgIRchFQnsXvudB0zRZcpCfTsGklHLFYJR6uPwxUItSAJ45rvO3gEBZjtFgSYySXksoiNlUIKnYE7wQ8sWn9oh8yKACJOScoyK4CkmAiywnWxKlPjcJd84Eyb6UsB9T1tM85nwEEW+3AXi/ls6iJOOIsEYpyusHHTTEl4ppWjAIEJpqYtVCq6ebPf/R2LqH8KCVUSa7NNwGBgQoz0Pc/0dl3ryPHHJRY3NFQJhhjpRrvUNbs4MAT/AdnOAbJ9rnsQshccRsWQcqrohHMLxIyz4NniLFNUXFz8vMTgIs4niea98C8O5BXcoJMVxIyH2B8rQP7kxeVlMV8u8SirFSoE99BY90Apx4e+Kdn+EZJtyMSwv6eQjrD+o8gz3AcTkS7FOaN4XdfeE6/dEe+wuuqa4vXOJV63I96J0OvgnrcJ5Jm+3HMRKAYaDumKCVYap77PzsPxae+vWib+aQTh7QnCHXcFsbu5/slt5nWYpSH+dBsTpIohAkH4vEanbe5rnxuA1DD+RJXaGhpIXhDT0APdMPVdh1sDYz00Zq42JnNhbI1R1qmL+33vcS+Vpt65wRWREVXv+XW5lJQTxV7adZycGP/9NwUV4UQ/ztAKOMkyFrTb3Oapbvrw+K5jb+W2QZU2H5pzdVhhnYEt9+/YapyswYGDVWFHk2pW+AIMN7I72COvfbBH+we23KaJar4v9xON24mGw71EZR86iQqN7bZ9SHZo1s/k0r3+t+HOfwE= \ No newline at end of file diff --git a/diagrams/tutorials/web/low-level-html/paragraph-dom.drawio b/diagrams/tutorials/web/low-level-html/paragraph-dom.drawio new file mode 100644 index 0000000000..3c48fadac1 --- /dev/null +++ b/diagrams/tutorials/web/low-level-html/paragraph-dom.drawio @@ -0,0 +1 @@ +zVjbUtswEP2azLQPYXyJneYRgtNAywzTzJTSl45iK7aKbLmyQpJ+fSVL8t2E0BDggXiPVytp92hX64E9jbefKUijGxJAPLCMYDuwLweW5bg2/y+AnQKEJICQokBCZgks0F+oQEOhaxTArKbICMEMpXXQJ0kCfVbDAKVkU1dbEVyfNQUhbAELH+A2eocCFkn0k2OU+ByiMNIzm4Z6EwOtrIAsAgHZVCDbG9hTSgiTT/F2CrHwnfaLHDfreVssjMKEPWdAPL/6Nc9mK+uLeZleLyfzaLgequhkbKc3DAO+fyUSyiISkgRgr0QvKFknARRWDS6VOl8JSTlocvA3ZGynggnWjHAoYjFWb+EWsR9i+JmjpPvKm8utspwLOy0kjO4qg4R4X31XDsslPW5FEjYlmNB8d7aR/3E8Y5Q8FCG18nHBuSAMFxOSQInMEMbKkvSUcE9vABSUkTX1ldb51dX6zlss7GgKN8n8p+dc3w5NzWRAQ8ieUrQKovADBkkM+d74QAoxYOixvhKgqB4WeiUb+IMixAHkGL0lOcwKNUqi7CNHjRolUw4kxz4qtMnzFuSwT0WOJ5f5CPBaTTWwXMyUW0WuBWqf7p+1SHIX38iS8HAXsigLgIGh0B9m1K8pR4yJFH8uVmnNhEp2FhISYghSlJ35JOawn3GV2QrECIuYdkxQkleDcracfty4YY7SbXWEG4rfVO9Fza3x1omo830TIQYXqdz4hhfEOrdXnEKab4pYvTx5hJTBbQVqB1q9tceqwugSq0vQplKwFBRVatXIeC1qWF3U0CRA6XeQ3KHkgbtQOXlJC78DCkJxkTirxqTX5+YzfM6jN2sQRKILfRIl1SxH8MERdHP6COdIynFVTTr+2LAqE5s5asSb55epMz33JkcKutsIutsOenEXOUnU7XbUry7bFQRjfnWD++NWD/I7iqJnXnje+DhRHD3j6J44ik5vWg/QY2dC5XtlQ4BRmMiMiuGKtTMq/wWxiDFW+dXQdrMUJJ2Gl8B/CHMeDH3pf2GehssP3FO5galI4BOjeLZs82N7arXhngxUKuuELxfUWHbYUMq94dbQIzkoWWapLF7/4SFzMi69YlgVD9kdHqq7xKhl4R6vvL4f9AxpKwYNPzWLSN/qjl1GLOOGJD156GUXlwttsH1RkHfO498eHLuRgpx2CrK6UtD4CCmos+0Yd2SgZhUpL+g+BlmG/L7icWAPWHSmZrU15eLIfroD4cItpIh7ANJ2y+pW+xJzT1eSS01jR2wwdIp/cYNRYYbTQQyNPbsPUTPcEpT3Dbo2Gj3E1CbkRtWo6oePpiGnp8hqQ9IRLUM5eYttv5zPkzfks6agOTioMa6cg3obPt7zlabjGLwFc/u+m5yIuZM64cbuu2MuF8svj1K9/Hxre/8A \ No newline at end of file diff --git a/diagrams/tutorials/web/low-level-html/remove-all-code.drawio b/diagrams/tutorials/web/low-level-html/remove-all-code.drawio new file mode 100644 index 0000000000..7024a3a2da --- /dev/null +++ b/diagrams/tutorials/web/low-level-html/remove-all-code.drawio @@ -0,0 +1 @@ +7Vlbd9o4EP41nCQP+PgOPGICtD3JblJykmZfchRb2NrIEiuLW3/9SraMLzgJpJB20+UBrNFoJM33zWhkWtYgXo0ZmEWXNIC4ZerBqmWdt0zT7Bmm+JGSdSYxjJ6dSUKGAiUrBBP0HSqhrqRzFMCkosgpxRzNqkKfEgJ9XpEBxuiyqjaluDrrDIRwSzDxAd6W3qGAR5m06+iF/BNEYZTPbOiqJwa5shIkEQjosiSyhi1rwCjl2VO8GkAsvZf7JRs3eqZ3szAGCd9lwLr7qF/rT70vXfxguk/X1CXnbSezsgB4rjasFsvXuQcYnZMASiN6y/KWEeJwMgO+7F0K0IUs4jEWLUM8TinhIxAjLPH+Sh8pp8LaJSVUdU7onKVjI84FhKZj9cWXWLT8kgqJFlIaYghmKNF8GqcdfpKqjqaZafG4Me6YXtl8RiDDlm2E8YBiytJ9WJ41dEYDIQcYhUTIMJwKx3kJZ/QJ5oqEEmHA23au8vcCMg5XJZFy9hjSGHIm1qZvyK+YrqjvdBURlgWPTEPpRCUO5YQBirrhxnSBrnhQADeDfRmCiz9619dj79PdLe/f3uAH1DZ/H7BHXc9Lt7AL2InYISKhELgHgj6HOofesLagt3KdQ0PfGOfubwT9aDjwrHeMc/f1MNePFOaNWNsNWLtYuiBAC/EYykcUzyjjQu0kAOLX6ktwT1KPZLpi6pJ6gwVN03bWnSIC5Lq9OeeUDDGMpb9FWQAx5LCf7ildqv7PHLL1RIh9TtnpicAz02kDjE/OMnfV7eyx6Fz0yOqSV4cuqPC6PNcROZULaXX2mhbEMoTIYzJL26KKOaefyWzONUoGESAh1DBKOCSnIAhuZCeH8dmee6tPsvGvnAQj/ymf4/ThLHe5GqRMpOu6EEqaHyEciLjQfBGk7PRsv7V0zo9CpN3xeza7GTtkt1JGUYmilky2ctBPzIfF8SWq7R9LaSqH2Z3tHNbRG84ro3eAJNZJvk7w5+unTvztr/vh+Lt9dzVqqFX+JLLMlyRumcKmzmBMF1DOnVqDWTKQ2WHKpPt0HsleSfgPe9btVdMevMwxzGqZ4zYcfUcrcxpZY22xph/IpA0kd+AiO3REsg0wZOltUH7HdJ7AnFvJh+XKXnXRwbnStuxaTdxEFutIZGm8DhlbUMNA3P1VU1RHEQ2pqFuGhdSrkqHQuaB0pijwN+R8rXAAc06rBIErxL/J4ZqjWvelnvOVspw21qrxrPuTnEyvlIIcsBDy1/Xk/l8Ek0EMOFpU340cHJjtAnYM+SahP6a1X5HxP27A/tQ7bNt0qgFrN15s3jNgd7jEQhL05Vs/0fIxSBLkV+GuciMPRqMUikVgNgej8ChbZxFs581snOl2ckExNG1Vxl5BhoQ/INsnul+Kk4NFdwlYpwHXXLZzElAzXFGUnrv5fbnGq01hmZvI9q1GlV9o1gxZeq38cGqGMsdsGUq5t9n22+nY+cXoqNtWlZCuZR6NkC+VX/8T8uiEvF/cLd3pXXzTRbdfxnHMh+D2v1bQ1OB/W4Xj7Eg5550KmkZgdnjxXsoU6kR/NU1UPa7vmibcTreaJpy3J4l9IXzpqv9WCN8nSbTrl92e8cYsYXdszemVPhWzjuscKGeIZvHnYqZe/EdrDf8F \ No newline at end of file diff --git a/diagrams/tutorials/web/low-level-html/remove-element-code.drawio b/diagrams/tutorials/web/low-level-html/remove-element-code.drawio new file mode 100644 index 0000000000..ca495ac7aa --- /dev/null +++ b/diagrams/tutorials/web/low-level-html/remove-element-code.drawio @@ -0,0 +1 @@ +7Vlbb9s2FP41Ru2HCbrLeowVOyuWbMVcYOteCkaiJS4UaVD0bb9+pEhZtyR1a0dBghqwLH4kD8nzfTxHokdOlO9vGFhndzSBeGSbyX7kXI9s2zZ9W/xI5KAQy3I0kjKUaKwGlug/qEFToxuUwKLVkFOKOVq3wZgSAmPewgBjdNdutqK4PeoapLAHLGOA++hfKOGZQqeeWeO/QpRm1ciWqWtyUDXWQJGBhO4akDMfORGjlKu7fB9BLL1X+UX1WzxRe5wYg4Sf0uHwz2zz2w2N0e9XcP1wh8jnPPnFUVa2AG/0gvVk+aHyAKMbkkBpxBw5s12GOFyuQSxrd4J0gWU8x6JkidsVJXwBcoQl33/Se8qpsHZHCdWVS7phZd+Mc0Gh7TlX4iImLS+yQWGklKYYgjUqjJjmZUVclE0XK2Va3B6Ne/asaV4JyHJlGWEcUUxZuQ4nms79KBQ4wCglAsNwJRw3KzijD7BqSCgRBmZ952p/byHjcN+AtLNvIM0hZ2Jupq71g6nqoqXvTH3D9xW0q6VkOYHCsoaMKs0Ard70aL0mWNxojr+Db28Avl+G6G/yu5jOZuWUT+G3ECtCJBWAfxm2Xfs0tqdDsu2/Y7YX82jmDLebPd9p8+sHhu+F9SfocR2aA1Id9Kj+g8i0iFH8MLIjmTYzKK4Qw1x6wTYZzOlWpFZhmBcQr96NNIYO9GFF6lEaj259oaEB9RD29HCVJHIgqQq4VRLIAEkwZOVzkbzmdFPASjXFuxHE62YGy+3Io+K8qQ1vyFhRPVs3xBExCLikHogvgbtmpHgvKhg4YwSh1+bd7PNuuUPGBMvq8T6yfSydkKCtuE15ufQetKWojB1J8ple048c5uO5DiFwIi6j4NhLTOx5W+IX5FIl5L5Yl2VzhQjASnfSvjQoJ2fefpwrDY4nhiG8zo81XE6DrDfc0Gs5a3w9rkFJJAOfgVHBIRmPv06qAXUXbeDYQaXQ8WTSGOqedQf/kSl1F1gt/MOHCxi+Fesz4gzhRMjbEKyO9YIm32U8uH6+bRd9Mo5YJ8SRxl7WW7SzjXu7/xXfROscYtkXer0wO0nE6wcTd/pIErGsF4sm/ZcJmKRwqYuU8YymVOzseY3O2smjbnNL6VpT/S/k/KCZBJsysjeEAPeI/y27G54ufWnUXO+15bJw0IUn/V9UEvhWxOSApZCf0FB64Fk+GcSAo237dOny3DhvnpvLeVJ3/URRmbGq/WZagdHO0K7rigd38/jp2FRq0WaaB21nW1by6lkuqT+u+Aw1uI/k/a48SHIlj0tFKcagKFDc5rYtjiEf62pV2afLSqiJHVQvN6zKX5SVwKmAum9ZanX+BBkSjofs/CBiXjqINIL+Yy8OFXbmDgmttog9p5NKTt0Qod/ZDdOOoZfW/wmnnm9B/8EP6d/0nfYGcD1v2A0Q/tT/6+r/hHPgN6D/hvjrJ4xLP/EF71OC0+4ZZeheSIKiWP+HqZrXfwU78/8B \ No newline at end of file diff --git a/diagrams/tutorials/web/low-level-html/simple-dom-tree.drawio b/diagrams/tutorials/web/low-level-html/simple-dom-tree.drawio new file mode 100644 index 0000000000..9857a5f3e2 --- /dev/null +++ b/diagrams/tutorials/web/low-level-html/simple-dom-tree.drawio @@ -0,0 +1 @@ +7Vxbc+I2FP41PIaxLV/gMRDobqc7zTSdbrdvClZAu8JyjUhIf30lW/JVBicBjFnzAOjoap1P3zm6eQCm690vEQxXX6iPyMAy/N0A3A0sazxy+LcQvEqBCRLBMsJ+IjIzwQP+D0mhIaVb7KNNISGjlDAcFoULGgRowQoyGEX0pZjsiZJirSFcoorgYQFJVfoV+2yVSEeOkck/IbxcqZpNQ8asoUosBZsV9OlLTgRmAzCNKGXJv/VuiojoO9UvSb55TWzasAgFrEmG28+ft19nDw9gNUUvwad/Zs6v9ze2nRTzDMlWPrFsLXtVXRDRbeAjUYo5AJOXFWboIYQLEfvCdc5lK7YmMjp9SoMHCHxEZAIXP5ZxGVNKaBSXCWbmZDbzeJInGrA5XGMi8PEHfaSMSukD3UZxJSvGuLItB9zyL/544ksk2AyXlC4JgiHeDBd0HUcsNnHS+VNSJv9bKjVBmGmLtrKI/kC5Vs3nd449T2OUwi2RFxNSSDmbTgCXU94TmInGj8QTy95EEUO7Wj2Zqfb5qEF0jVjEW2qoDApBcsQ4aii8ZPhLQbXKYc+VMighv0yLzlDB/0hgvAUkoAdJ1qrbie1Npk1Akrb/+CABo4sDidWDJGuVM3UnU6MJSKbO9HY2Pg9IRg1BYlqnQokOJC5hskuFgU7gwKX/boVlnMg+T8PCl4AM3oj0N5toUUicKFiolyu3RrWxYlO1pkrNVeAuxe/d71+EsxEhFPsNkXg0jt7dMMaobLWsReWpIJ4rj1XwEdAAlYAgRTn45yHmqrAsWMQLZGDup9wSvAy4bI19X0ROoBQsOEoQL3uSjbo9I0m1STOILOMLDWrG0vu6epIrMDcUjPhzHOxbJSsKjCr2zZEG++BU0Ad2BR3I576mDEoFFJX1fbsOJQgEBmjEVnRJA0h+ozSUQPiOGHuVieA2pqccjNAOs79FaUNHhr7lYu52sqI48KoCAX/eXCYR/JaPy7LFIZWvTQZGgX8r3P2sJ7lkjoWK7vQ8nGhDqGA/xLjGVOvrVCvnOAxGS8T2pHP1kI0QgQw/F9txdPw5XaDe3OhQwqS2WNW8cMO0w12VrH262K5RTMSNeLk4zA54IhqiPgZDlawzsKsMpSMo+2S22TnQTT0bdYKN3IZs5LXJRpbbW8OfHH+jNvHnXrM1fMsM5QItoa3x1c9rCatLF3lyyohnlkl7ruoiV3kNuWrcJld5V81VCPpd4ipQ4iq3Za4CXue5qsBUGXH1XKXxlxpwlVmD4POQ1eiayeqR+q8dIitQISuzZbIyKt10zllfjpsypjrATmbPTo3YadyUnew22Wl8zezEMOPZukNPZV/Ksdqe9+33pU5MT+r/m+ipd56a0ZM6H3GYn0Cb/ARGl+TNvwGQPzmwPoAXmfWe4tgAKdfNK3FjmfQSIMtcJdSlzXg/ENV4uU5LuTI7ZCbB2LwwM7mfpHoz2WE2U2esD5pJq1UzCS4Fge9a4+rR90H0gVbRp5p5nbYx7LJpHLdsGk1LBw0FAhz+BYOvOPiRTdMfo7TfYQSX4g7NMK+T2j5vcIK6TR45jb7tBvpO70+cR+G6uxFKfb+hZ0RuxNOL1kAfRb1qG6tW4+WeWbW6u1FKfffi3phl/CmX3Hql6u8ymYdX+M6rVFAl6M93VWeSEBxu0GGVFfV7fQosj0rXaV2BXT25VfW0+usknblO4oy9wjjQXScZa4bByW6T2Lrj/GUWy+ZyCwI3G7yoI6+2Z53FWSWoztZzB0xMUFgA8rzR/ik4D9yjCPNuF/D90OZu/TW/QeNJ8MG5rV0zt80hzdEgTck+uO7sWcbQNMfZpwB72zOGBsjFusXykxl+ZVG6Uotb8gvSE59nWt22dUbkikfPO4+F1t99PibeazbczoN31y4hsXz1tSmkU9c23bBxzwtp3SnRK4Z0ahBMb1wwCNbxDMJbh0f6/ohjDo+a8zJnGh5gPFQkr1yf0XFsQPl2usstj2Gfd8zojgN9ZJXz0rzhssev844PTibyLylQswGCnti+WcMRXO4KMwPN1FPnc59s6qnGVA+XA3BJ38nRJlw0b0TRwuVk77pwdNtEPVyqcElfptQiXNLzNu3BpboyqZaFfPysXVISy0E3stPEhl7cb5VlJv4L1wJKhCk8KYmKV4tPcUVuQXqkuoPHTZisjJWak1z/uYDmpKKaMMkfsc21t7QTkEvMn0CTvrrz16oCeKWXo4OkY5JLFhfQnEaQiM+S5Rqr3fQrdbjZoecLM+Kq2cjOaiw+0zvqvchuyLIUH9wobNlfZNNVo8J3KKdDonb5syXCStlEZ9EbddCxN6tP6G6eZHfTLb8kTDPFTKeThRfkjd7uBfJg9rLXZAUje2MumP0P \ No newline at end of file diff --git a/diagrams/tutorials/web/low-level-html/simple-html.drawio b/diagrams/tutorials/web/low-level-html/simple-html.drawio new file mode 100644 index 0000000000..e71c584cb6 --- /dev/null +++ b/diagrams/tutorials/web/low-level-html/simple-html.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/diagrams/tutorials/web/low-level-html/todo-dart.drawio b/diagrams/tutorials/web/low-level-html/todo-dart.drawio new file mode 100644 index 0000000000..7c01cca784 --- /dev/null +++ b/diagrams/tutorials/web/low-level-html/todo-dart.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/src/_tutorials/web/images/0-mini-code-walk-through.png b/src/_tutorials/web/images/0-mini-code-walk-through.png deleted file mode 100644 index 40d326584f..0000000000 Binary files a/src/_tutorials/web/images/0-mini-code-walk-through.png and /dev/null differ diff --git a/src/_tutorials/web/images/add-element-code.png b/src/_tutorials/web/images/add-element-code.png index 06ab0abf3d..fd4da9f995 100644 Binary files a/src/_tutorials/web/images/add-element-code.png and b/src/_tutorials/web/images/add-element-code.png differ diff --git a/src/_tutorials/web/images/add-element.png b/src/_tutorials/web/images/add-element.png index 11bb9b6bc1..956c306e32 100644 Binary files a/src/_tutorials/web/images/add-element.png and b/src/_tutorials/web/images/add-element.png differ diff --git a/src/_tutorials/web/images/anagram-move.png b/src/_tutorials/web/images/anagram-move.png index 0c9ea7d701..430dcb8291 100644 Binary files a/src/_tutorials/web/images/anagram-move.png and b/src/_tutorials/web/images/anagram-move.png differ diff --git a/src/_tutorials/web/images/anagram-newletters.png b/src/_tutorials/web/images/anagram-newletters.png index a13ce79ac7..f7ebb348ab 100644 Binary files a/src/_tutorials/web/images/anagram-newletters.png and b/src/_tutorials/web/images/anagram-newletters.png differ diff --git a/src/_tutorials/web/images/child-references.png b/src/_tutorials/web/images/child-references.png index 5d5528a83c..7a38b148d3 100644 Binary files a/src/_tutorials/web/images/child-references.png and b/src/_tutorials/web/images/child-references.png differ diff --git a/src/_tutorials/web/images/css-code.png b/src/_tutorials/web/images/css-code.png index 77292d47fb..e4b1bf2090 100644 Binary files a/src/_tutorials/web/images/css-code.png and b/src/_tutorials/web/images/css-code.png differ diff --git a/src/_tutorials/web/images/css-property-value.png b/src/_tutorials/web/images/css-property-value.png index 9041074f57..de6994e5b7 100644 Binary files a/src/_tutorials/web/images/css-property-value.png and b/src/_tutorials/web/images/css-property-value.png differ diff --git a/src/_tutorials/web/images/css-rule-explained.png b/src/_tutorials/web/images/css-rule-explained.png index 2a41358fde..dcf5398ff6 100644 Binary files a/src/_tutorials/web/images/css-rule-explained.png and b/src/_tutorials/web/images/css-rule-explained.png differ diff --git a/src/_tutorials/web/images/dart-html-connect.png b/src/_tutorials/web/images/dart-html-connect.png index 86ed8a3951..7a00f7601b 100644 Binary files a/src/_tutorials/web/images/dart-html-connect.png and b/src/_tutorials/web/images/dart-html-connect.png differ diff --git a/src/_tutorials/web/images/dynamic-dart.png b/src/_tutorials/web/images/dynamic-dart.png index 95cf56bfee..602731b1ce 100644 Binary files a/src/_tutorials/web/images/dynamic-dart.png and b/src/_tutorials/web/images/dynamic-dart.png differ diff --git a/src/_tutorials/web/images/event-handler-idiom.png b/src/_tutorials/web/images/event-handler-idiom.png index 34d66f7317..142c3ed13f 100644 Binary files a/src/_tutorials/web/images/event-handler-idiom.png and b/src/_tutorials/web/images/event-handler-idiom.png differ diff --git a/src/_tutorials/web/images/event-handler-todo.png b/src/_tutorials/web/images/event-handler-todo.png index 35ef554521..5875f34065 100644 Binary files a/src/_tutorials/web/images/event-handler-todo.png and b/src/_tutorials/web/images/event-handler-todo.png differ diff --git a/src/_tutorials/web/images/event-listener-exp.png b/src/_tutorials/web/images/event-listener-exp.png index 831adef25b..669a7daabf 100644 Binary files a/src/_tutorials/web/images/event-listener-exp.png and b/src/_tutorials/web/images/event-listener-exp.png differ diff --git a/src/_tutorials/web/images/paragraph-dom.png b/src/_tutorials/web/images/paragraph-dom.png index 1e173e7d18..e8f501b300 100644 Binary files a/src/_tutorials/web/images/paragraph-dom.png and b/src/_tutorials/web/images/paragraph-dom.png differ diff --git a/src/_tutorials/web/images/parent-reference.png b/src/_tutorials/web/images/parent-reference.png index 0e36766336..bf1ba6a83d 100644 Binary files a/src/_tutorials/web/images/parent-reference.png and b/src/_tutorials/web/images/parent-reference.png differ diff --git a/src/_tutorials/web/images/relationships.png b/src/_tutorials/web/images/relationships.png index c9f157d4d9..7b96804ee0 100644 Binary files a/src/_tutorials/web/images/relationships.png and b/src/_tutorials/web/images/relationships.png differ diff --git a/src/_tutorials/web/images/remove-all-code.png b/src/_tutorials/web/images/remove-all-code.png index ea5aedb955..bdd32d8b82 100644 Binary files a/src/_tutorials/web/images/remove-all-code.png and b/src/_tutorials/web/images/remove-all-code.png differ diff --git a/src/_tutorials/web/images/remove-all-elements.png b/src/_tutorials/web/images/remove-all-elements.png index af7d4b43e4..8ff3e79fcf 100644 Binary files a/src/_tutorials/web/images/remove-all-elements.png and b/src/_tutorials/web/images/remove-all-elements.png differ diff --git a/src/_tutorials/web/images/remove-element-code.png b/src/_tutorials/web/images/remove-element-code.png index ad563b42b9..2b47a07a4c 100644 Binary files a/src/_tutorials/web/images/remove-element-code.png and b/src/_tutorials/web/images/remove-element-code.png differ diff --git a/src/_tutorials/web/images/remove-element.png b/src/_tutorials/web/images/remove-element.png index 2d53093f66..cd0b86b1b0 100644 Binary files a/src/_tutorials/web/images/remove-element.png and b/src/_tutorials/web/images/remove-element.png differ diff --git a/src/_tutorials/web/images/simple-dom-tree.png b/src/_tutorials/web/images/simple-dom-tree.png index f3825a96b7..54d1cd63ff 100644 Binary files a/src/_tutorials/web/images/simple-dom-tree.png and b/src/_tutorials/web/images/simple-dom-tree.png differ diff --git a/src/_tutorials/web/images/simple-html.png b/src/_tutorials/web/images/simple-html.png index 0b1cbd230b..d69b959604 100644 Binary files a/src/_tutorials/web/images/simple-html.png and b/src/_tutorials/web/images/simple-html.png differ diff --git a/src/_tutorials/web/images/todo-dart.png b/src/_tutorials/web/images/todo-dart.png index e120a51bc5..23296b5851 100644 Binary files a/src/_tutorials/web/images/todo-dart.png and b/src/_tutorials/web/images/todo-dart.png differ diff --git a/src/_tutorials/web/images/todo-dom.png b/src/_tutorials/web/images/todo-dom.png index ee915cf9bd..ad312fb1a5 100644 Binary files a/src/_tutorials/web/images/todo-dom.png and b/src/_tutorials/web/images/todo-dom.png differ diff --git a/src/_tutorials/web/images/todo-html.png b/src/_tutorials/web/images/todo-html.png index 1deff7d4e2..ba8c087c42 100644 Binary files a/src/_tutorials/web/images/todo-html.png and b/src/_tutorials/web/images/todo-html.png differ diff --git a/src/_tutorials/web/low-level-html/add-elements.md b/src/_tutorials/web/low-level-html/add-elements.md index 61f3e99e47..9ec205e7ab 100644 --- a/src/_tutorials/web/low-level-html/add-elements.md +++ b/src/_tutorials/web/low-level-html/add-elements.md @@ -1,6 +1,7 @@ --- title: Add elements to the DOM -description: You have an Element object, now what? +description: Learn how to add created elements to the DOM. +js: [{url: 'https://dartpad.dev/inject_embed.dart.js', defer: true}] nextpage: url: /tutorials/web/low-level-html/remove-elements @@ -10,17 +11,15 @@ prevpage: title: Connect Dart and HTML --- -{% include not-null-safe.md %} -
#### What's the point? -* In Dart, page elements are of type Element. -* An Element knows its parent. -* An Element keeps its children in a List <Element>. +* In Dart, page elements are of type `Element`. +* An `Element` knows its parent. +* An `Element` keeps its children in a `List`. * Change the DOM by adding or removing children of elements. -* Respond to user input with an EventListener. +* Respond to user input with an `EventListener`.
@@ -36,7 +35,7 @@ Each node in the tree represents an item on the page. Each node in the tree keeps track of both its parent and its children. In Dart, the -Node +[`Node`]({{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-html/Node-class.html){:target="_blank" rel="noopener"} class contains the methods and properties that implement a node's tree functionality. @@ -48,11 +47,11 @@ button elements, and so on. In Dart, elements are implemented by the -Element -class, which is a subclass of Node. +[`Element`]({{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-html/Element-class.html){:target="_blank" rel="noopener"} +class, which is a subclass of `Node`. Because the nodes you care about most are usually elements, -this tutorial focuses on Element, -rather than on Node. +this tutorial focuses on `Element`, +rather than on `Node`. ## Running the Todo app {#try-app} @@ -68,12 +67,69 @@ Then type in the app's text field, and press return. The app adds an item to the list. Enter a few items into the input field. - +```dart:run-dartpad:mode-html:ga_id-running_the_todo_app:null_safety-true +{$ begin main.dart $} +import 'dart:html'; + +final InputElement toDoInput = querySelector('#to-do-input') as InputElement; +final UListElement toDoList = querySelector('#to-do-list') as UListElement; + +void main() { + toDoInput.onChange.listen(addToDoItem); +} + +void addToDoItem(Event e) { + final newToDo = LIElement()..text = toDoInput.value; + toDoInput.value = ''; + toDoList.children.add(newToDo); +} +{$ end main.dart $} +{$ begin index.html $} +

Procrastinator's Todo

+ +
+ +
+ +
+ +
+{$ end index.html $} +{$ begin styles.css $} +body { + font-family: 'Roboto', sans-serif; + background-color: WhiteSmoke; + margin: 15px; + color: black; +} + +h2 { + color: black; +} + +#to-do-input { + font-family: 'Roboto', sans-serif; + font-size: 14px; + font-weight: normal; + padding: 5px 0px 5px 5px; + width: 100%; + border: 1px solid Silver; + background-color: White; +} + +#to-do-list { + padding: 0; + margin: 0; + list-style-position: inside; +} + +#to-do-list li { + padding: 5px 0px 5px 5px; + border-bottom: 1px dotted Silver; +} +{$ end styles.css $} +``` This is the beginning of an app to manage a list of things to do. Right now, this app is for procrastinators only @@ -82,9 +138,9 @@ but not remove them. ## About parent and child Elements in Dart {#tree-structure} -The Node class in Dart implements the basic treeing behavior +The `Node` class implements the basic treeing behavior for nodes in the Dart DOM. -The Element class is a subclass of Node that implements +The `Element` class is a subclass of `Node` that implements the behavior specific to page element nodes. For example, an element knows the width and height of @@ -94,66 +150,65 @@ and it can receive events. You can manipulate the DOM tree by adding and deleting nodes. However, many Dart apps are concerned only with page elements. So for convenience and code simplicity, -the Element class implements API +the `Element` class implements API for interacting with a subset of the DOM that includes -only the nodes that are Elements. -You can work with a virtual tree of Elements -rather than the more complex tree of Nodes. +only the nodes that are elements. +You can work with a virtual tree of elements +rather than the more complex tree of `Node` objects. This tutorial shows you how to manipulate the -DOM through the Element class. +DOM through the `Element` class. -An Element has a parent Element -and maintains references to its child Elements in a list. +An `Element` object has a parent `Element` +and maintains references to its children elements in a list. An element with multiple child elements and a parent element -An Element has at most one parent Element. -An Element's parent is final and cannot be changed. -So you cannot move an Element by changing its parent. -Get an Element's parent with the getter `parent`. -For example, if you have an Element with the name `anElement` +An `Element` object has at most one parent `Element`. +An `Element` object's parent is final and cannot be changed. +So you cannot move an `Element` by changing its parent. +Get an `Element`'s parent with the getter `parent`. +For example, if you have an `Element` with the name `anElement` you would refer to its parent element with `anElement.parent`. Dart code reference to anElement's parent -An Element maintains references to its child elements in a list. -List -is a class in the dart:core library +An `Element` object maintains references to its child elements in a list. +[`List`]({{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-core/List-class.html){:target="_blank" rel="noopener"}is a class in the dart:core library that implements an indexable collection with a length. A list can be of fixed size or extendable. -List is an example of a _generic_ (or _parameterized_) type—a type +`List` is an example of a _generic_ (or _parameterized_) type—a type that can declare formal type parameters. This means that a list can be declared to contain only objects of a particular type. For example: -| List declaration | List description| -|---|---| -| List\ | list of strings | -| List\ | list of integers | -| List\ | list of elements| +| List declaration | List description | +|------------------|------------------| +| `List` | List of strings | +| `List` | List of integers | +| `List` | List of elements | {: .table} -An Element maintains references to its child element in a List\, +An `Element` maintains references to its child element in a `List`, which your Dart code can refer to with the getter `children`. -The List class has various methods and operators -whereby you can refer to each child Element individually, +The `List` class has various methods and operators +whereby you can refer to each child element individually, iterate over the list, and add and remove elements. Dart code references to anElement's list of children and individual child Elements You can change the tree structure by adding children to -and removing children from an Element's list of children. +and removing children from an element's list of children. Add a child element -When you change an Element or its child Elements in your Dart program, +When you change an `Element` or its child elements in your Dart program, you change the DOM and therefore the web page. The browser re-renders the page automatically. @@ -178,10 +233,10 @@ The following diagram shows a partial DOM tree for the todo app. The todo app and part of its DOM tree -Of interest are the two page elements that have IDs: +Of interest are the two-page elements that have IDs: `to-do-input` and `to-do-list`. -The first identifies the <input> element into which the user types. -The second identifies the <ul> (unordered list) element +The first identifies the `` element into which the user types. +The second identifies the `
    ` (unordered list) element containing the task items. Dart code adds elements to this list whenever the user enters text into the input element. @@ -194,11 +249,12 @@ the Dart code for the todo app. todo app and its corresponding Dart code -The main() function uses dart:html's top-level querySelector() -function to get the interesting elements from the DOM. -Because calling querySelector() isn't free, +The top-level variables are initialized using +the `dart:html` library's top-level `querySelector()` function +to get the interesting elements from the DOM. +Because calling `querySelector()` isn't free, if a program refers to an element more than once -it should stash a reference to the element. +it should stash a reference to the element if possible. This program stashes a reference to the input element @@ -206,17 +262,17 @@ in a top-level variable called `toDoInput`. The unordered list is in the top-level variable `toDoList`. -Note the types of these variables: InputElement and UListElement. -These are both subclasses of Element. -The dart:html library has dozens of Element subclasses, +Note the types of these variables: `InputElement` and `UListElement`. +These are both subclasses of `Element`. +The `dart:html` library has dozens of `Element` subclasses, many of which correspond to certain HTML tags. This program uses three: -| HTML tag | Dart class | -|---|---| -| \ | InputElement | -| \
      | UListElement | -| \
    • | LIElement | +| HTML tag | Dart class | +|-----------|-------------------------------------------------------------------------------------------------------------------------------------------| +| `` | [`InputElement`]({{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-html/InputElement-class.html){:target="_blank" rel="noopener"} | +| `
        ` | [`UListElement`]({{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-html/UListElement-class.html){:target="_blank" rel="noopener"} | +| `
      • ` | [`LIElement`]({{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-html/LIElement-class.html){:target="_blank" rel="noopener"} | {: .table} ## Registering an event handler {#event-handler} @@ -224,54 +280,53 @@ This program uses three: When a user enters text into the input field, a _change_ event fires, indicating that the value in the input field has just changed. -The todo app defines a function, addToDoItem(), +The todo app defines a function, `addToDoItem()`, that can handle these change events. -The following code connects addToDoItem() to the input field: +The following code connects `addToDoItem()` to the input field: Add an event handler to the toDoInput element Rather than dissect this busy line of code, think of it as a Dart idiom -for adding an event handler to an Element. +for adding an event handler to an `Element` object. Dart idiom: Add an event handler to an Element -A change event is just one of many different types of events +A change event is just one of many types of events that an input element can generate. For example, you can use `click` to handle mouse clicks, or `keyDown` for when the user presses a key on the keyboard. ## About EventListener functions {#about-event-listeners} -The argument passed to the listen() method is a _callback function_ +The argument passed to the `listen()` method is a _callback function_ of type -EventListener. -EventListener is a typedef defined in the dart:html library as follows: +[`EventListener`]({{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-html/EventListener.html){:target="_blank" rel="noopener"}. +`EventListener` is a typedef defined in the `dart:html` library as follows: -{% prettify dart tag=pre+code %} +```dart typedef void EventListener(Event event) -{% endprettify %} +``` -As you can see, an EventListener returns no value (void) and takes an -Event -object as an argument. -Any function with this signature is an EventListener. -Based on its signature, the addToDoItem() function is an EventListener. +As you can see, an EventListener returns no value (`void`) and takes an +[`Event`]({{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-html/Event-class.html){:target="_blank" rel="noopener"}object as an argument. +Any function with this signature is an `EventListener`. +Based on its signature, the `addToDoItem()` function is an `EventListener`. -{% prettify dart tag=pre+code %} +```dart void addToDoItem(Event e) { ... } -{% endprettify %} +``` -The Event object passed into an EventListener function -carries information about the Event that occurred. -For example, the Event object knows which Element fired the event, +The `Event` object passed into an `EventListener` function +carries information about the `Event` that occurred. +For example, the `Event` object knows which `Element` fired the event, and when. For location-specific events such as mouse clicks, -the Event object also knows where the event occurred. +the `Event` object also knows where the event occurred. -The addToDoItem() function ignores the Event object passed to it. +The `addToDoItem()` function ignores the Event object passed to it. ## Adding an element to the DOM tree {#add-elem} @@ -282,7 +337,8 @@ The change event handler has the following code: The final line of code is where the DOM gets changed. -An Element keeps references to all of its children in a list called `children`. +An `Element` object keeps references to all of its children +in a list called `children`. By adding and removing elements to and from this list, the code changes the DOM. When the DOM changes, the browser re-renders the browser page. @@ -297,18 +353,18 @@ Let's take a look at the CSS file for this app. alt="The effect of CSS styles"> This code uses three different kinds of CSS selectors. -The first is an HTML element selector that matches the \ element +The first is an HTML element selector that matches the `` element and sets some basic style attributes, such as the background color, for the entire page. Next in the file are two ID selectors: -#to-do-input controls the appearance of the input field -and #to-do-list sets the appearance of the unordered list element +`#to-do-input` controls the appearance of the input field +and `#to-do-list` sets the appearance of the unordered list element in general. The elements in the list are controlled by the final rule, which uses both an ID selector and an HTML selector. -This rule matches all \
      • elements in the -element with the ID to-do-list, thus styling +This rule matches all `
      • ` elements in the +element with the ID `to-do-list`, thus styling each item in the to do list. ## Moving elements within the DOM tree {#moving-elements} @@ -318,111 +374,132 @@ The Anagram app shows how to move an element within the DOM. **Try it!** Click **Run** to start the web app. Then form a word by clicking the app's letter tiles. -You might prefer to -open -the app in DartPad -to have more space for the app's code and UI. - -{% comment %} -https://gist.github.com/Sfshaza/0532bfcb70bf5e4a900c - -main.dart: -// Copyright (c) 2012, the Dart project authors. Please see the -// AUTHORS file for details. All rights reserved. Use of this -// source code is governed by a BSD-style license that can be -// found in the LICENSE file. +```dart:run-dartpad:mode-html:ga_id-moving_elements_within_the_dom_tree +{$ begin main.dart $} import 'dart:html'; import 'dart:math'; -// Should remove tiles from here when they are selected otherwise -// the ratio is off. - -String scrabbleLetters = 'aaaaaaaaabbccddddeeeeeeeeeeeeffggghhiiiiiiiiijkllllmmnnnnnnooooooooppqrrrrrrssssttttttuuuuvvwwxyyz**'; - -List buttons = new List(); -Element letterpile; -Element result; -ButtonElement clearButton; -Element value; -int wordvalue = 0; - -Map scrabbleValues = { 'a':1, 'e':1, 'i':1, 'l':1, 'n':1, - 'o':1, 'r':1, 's':1, 't':1, 'u':1, - 'd':2, 'g':2, 'b':3, 'c':3, 'm':3, - 'p':3, 'f':4, 'h':4, 'v':4, 'w':4, - 'y':4, 'k':5, 'j':8, 'x':8, 'q':10, - 'z':10, '*':0 }; +// Should remove tiles from here when they are selected +// otherwise the ratio is off. +const String scrabbleLetters = + 'aaaaaaaaabbccddddeeeeeeeeeeeeffggghhiiiiiiiiijkllllmmnnnnnnooooooooppqrrrrrrssssttttttuuuuvvwwxyyz**'; +const Map scrabbleValues = { + 'a': 1, 'e': 1, 'i': 1, 'l': 1, 'n': 1, + 'o': 1, 'r': 1, 's': 1, 't': 1, 'u': 1, + 'd': 2, 'g': 2, 'b': 3, 'c': 3, 'm': 3, + 'p': 3, 'f': 4, 'h': 4, 'v': 4, 'w': 4, + 'y': 4, 'k': 5, 'j': 8, 'x': 8, 'q': 10, + 'z': 10, '*': 0 +}; + +final List buttons = []; +final Element letterpile = querySelector('#letterpile') as Element; +final Element result = querySelector('#result') as Element; +final Element value = querySelector('#value') as Element; +final ButtonElement clearButton = + querySelector('#clear-button') as ButtonElement; +int wordValue = 0; void main() { - letterpile = querySelector("#letterpile"); - result = querySelector("#result"); - value = querySelector("#value"); - - clearButton = querySelector("#clearButton"); - clearButton.onClick.listen(newletters); - + clearButton.onClick.listen(newLetters); generateNewLetters(); } -void moveLetter(Event e) { - Element letter = e.target; +void moveLetter(MouseEvent e) { + final letter = e.target; + if (letter is! Element) { + return; + } if (letter.parent == letterpile) { result.children.add(letter); - wordvalue += scrabbleValues[letter.text]; - value.text = "$wordvalue"; + wordValue += scrabbleValues[letter.text] ?? 0; + value.text = '$wordValue'; } else { letterpile.children.add(letter); - wordvalue -= scrabbleValues[letter.text]; - value.text = "$wordvalue"; + wordValue -= scrabbleValues[letter.text] ?? 0; + value.text = '$wordValue'; } } -void newletters(Event e) { +void newLetters(Event e) { letterpile.children.clear(); result.children.clear(); generateNewLetters(); } -generateNewLetters() { - Random indexGenerator = new Random(); - wordvalue = 0; - value.text = ''; +void generateNewLetters() { + final indexGenerator = Random(); + wordValue = 0; + value.text = '0'; buttons.clear(); for (var i = 0; i < 7; i++) { - int letterIndex = - indexGenerator.nextInt(scrabbleLetters.length); + final letterIndex = indexGenerator.nextInt(scrabbleLetters.length); // Should remove the letter from scrabbleLetters to keep the // ratio correct. - buttons.add(new ButtonElement()); - buttons[i].classes.add("letter"); - buttons[i].onClick.listen(moveLetter); - buttons[i].text = scrabbleLetters[letterIndex]; - letterpile.children.add(buttons[i]); + final button = ButtonElement(); + button.classes.add('letter'); + button.onClick.listen(moveLetter); + button.text = scrabbleLetters[letterIndex]; + buttons.add(button); + letterpile.children.add(button); } } -{% endcomment %} +{$ end main.dart $} +{$ begin index.html $} +

        Anagram

        + +

        Pile:

        +
        +
        +

        Word:

        +
        +
        + +

        Scrabble Value:

        +

        + + +{$ end index.html $} +{$ begin styles.css $} +body { + background-color: #F8F8F8; + font-family: 'Roboto', sans-serif; + font-size: 14px; + font-weight: normal; + line-height: 1.2em; + margin: 15px; +} + +h1, h3, p { + color: black; +} - +.letter { + width: 48px; + height: 48px; + font-size: 32px; + background-color: Lavender; + color: purple; + border: 1px solid black; + margin: 2px 2px 2px 2px; +} +{$ end styles.css $} +``` When the program starts, it creates one button element for each of seven randomly selected letters. The program adds each button to a DOM element—a simple -<div> element identified by the CSS selector `letterpile`—with -a call to letterpile.children.add(). +`
        ` element identified by the CSS selector `letterpile`—with +a call to `letterpile.children.add()`. Dart code populates the letter pile with buttons Each button element in the letter pile -has a mouse click handler called moveLetter(). -If the button is in the letterpile, +has a mouse click handler called `moveLetter()`. +If the button is in the letter pile, the mouse click handler moves the button to the end of the word. If the button is in the word, the mouse click handler moves the button back to the letter pile. @@ -441,7 +518,7 @@ The `+=` operator is a compound assignment operator, which combines an operation (`+`) with an assignment. The `scrabbleValues` variable is a -Map—a +[`Map`]({{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-core/Map-class.html){:target="_blank" rel="noopener"}—a data structure that contains key/value pairs. Use the square bracket syntax to retrieve a value by its key and the `length` property to get the number of pairs it contains. diff --git a/src/_tutorials/web/low-level-html/connect-dart-html.md b/src/_tutorials/web/low-level-html/connect-dart-html.md index 1b4c836833..899e246cff 100644 --- a/src/_tutorials/web/low-level-html/connect-dart-html.md +++ b/src/_tutorials/web/low-level-html/connect-dart-html.md @@ -1,13 +1,11 @@ --- title: Connect Dart and HTML -description: Shows basic scaffolding of a Dart web app. +description: Learn how to set up basic scaffolding of a Dart web app. nextpage: url: /tutorials/web/low-level-html/add-elements title: Add elements to the DOM --- -{% include not-null-safe.md %} - This tutorial is the first of a series on basic, low-level web programming with the dart:html library. If you use a web framework, @@ -23,7 +21,7 @@ but you might not need to use the dart:html library at all. * Compile a web app's Dart code to JavaScript to run the app in any modern browser. * An HTML file hosts your Dart code in a browser page. * The DOM models a browser page in a tree/node structure. -* Use querySelector() with an ID to get an element from the DOM. +* Use `querySelector()` with an ID to get an element from the DOM. * CSS selectors are patterns used to select matching elements in the DOM. * Use CSS rules to style elements. @@ -31,7 +29,7 @@ but you might not need to use the dart:html library at all. To write a low-level web app with Dart, you need to understand -several topics—the DOM tree, nodes, elements, +several topics—the DOM tree, nodes, elements, HTML, and the Dart language and libraries. The interdependencies are circular, @@ -54,17 +52,17 @@ for more interesting and useful web apps. ## About the Dart, HTML, and CSS triumvirate {#source-files} If you've used -DartPad, -you've already seen the DART, HTML, and CSS tabs +[DartPad]({{site.dartpad}}){:target="_blank" rel="noopener"}, +you may have already seen the Dart, HTML, and CSS tabs that let you write the code for a web app. Each of these three languages is responsible for a different aspect of the web app. -| Language | Purpose | -|---|---| -| Dart | Implements the interactivity and dynamic behavior of the web app | -| HTML | Describes the content of the web app's page (the elements in the document and the structure) | -| CSS | Governs the appearance of page elements | +| Language | Purpose | +|----------|----------------------------------------------------------------------------------------------| +| Dart | Implements the interactivity and dynamic behavior of the web app | +| HTML | Describes the content of the web app's page (the elements in the document and the structure) | +| CSS | Governs the appearance of page elements | {: .table} A Dart program can @@ -104,12 +102,11 @@ the resulting web browser page in Chrome. HTML uses tags to describe the document. For example, the simple HTML code above -uses the \ tag for the page title, -\<h1> for a level-one header, -and \<p> for a paragraph. +uses the `<title>` tag for the page title, +`<h1>` for a level-one header, +and `<p>` for a paragraph. Some tags in the HTML code, -such as -\<head> and \<body>, +such as `<head>` and `<body>`, are not visible on the web page, but do contribute to the structure of the document. @@ -123,9 +120,9 @@ text nodes, and attribute nodes. Here is the DOM tree for the simple HTML file above. <img class="scale-img-max" src="/tutorials/web/images/simple-dom-tree.png" - alt="The DOM tree for a simple HTML file"> + alt="A Dart dynamically changing the DOM"> -Notice that some tags, such as the \<p> paragraph tag, +Notice that some tags, such as the `<p>` paragraph tag, are represented by multiple nodes. The paragraph itself is an element node. The text within the paragraph is a text node @@ -153,7 +150,7 @@ or even insert an entire subtree of nodes. ## Create a new Dart app {#create-dart-app} -1. Go to <a href="{{site.dartpad}}" target="_blank" rel="noopener">DartPad.</a> +1. Go to the [DartPad]({{site.dartpad}}){:target="_blank" rel="noopener"}. 2. Click the **New Pad** button to undo any changes you might have made the last time you visited DartPad. 3. Click **Dart**. @@ -162,27 +159,27 @@ or even insert an entire subtree of nodes. {{site.alert.note}} These instructions feature DartPad, - which hides some of the HTML boilerplate code. + which hides some HTML boilerplate code. If you want to use any other editor, then we recommend starting with a small Dart web app sample - and modifying the non-script tags inside the \<body> section. + and modifying the non-script tags inside the `<body>` section. [HTML and Dart connections](#connections) shows the full HTML code. {{site.alert.end}} ## Edit the HTML source code {#create-html} 1. Click **HTML**, at the upper left of DartPad. - The view switches from Dart code to the (non-existent) HTML code. + The view switches from Dart code to the (currently non-existent) HTML code. 2. Add the following HTML code: - {% prettify html tag=pre+code %} + ```html <p id="RipVanWinkle"> RipVanWinkle paragraph. </p> - {% endprettify %} + ``` -3. Click **HTML OUTPUT** to see how a browser would render your HTML. +3. Expand the output pane to see how a browser would render your HTML. ## About the HTML source code {#about-html-code} @@ -191,41 +188,39 @@ This HTML code is similar to the HTML code in the various diagrams earlier in this tutorial, but it's even simpler. -In DartPad you need only the tags you really care about—in -this case, \<p>. -You don't need surrounding tags such as -\<html> and \<body>. +In DartPad you need only the tags you really care about—in this case: `<p>`. +You don't need surrounding tags such as `<html>` and `<body>`. Because DartPad knows where your Dart code is, -you don't need a \<script> tag. +you don't need a `<script>` tag. {{site.alert.info}} [HTML and Dart connections](#connections) shows the full HTML code - that you need to run your web app outside of DartPad. + that you need to run your web app outside DartPad. {{site.alert.end}} -The paragraph tag has the identifier "RipVanWinkle". +The paragraph tag has the identifier `RipVanWinkle`. The Dart code you create in the next step uses this ID to get the paragraph element. ## Edit the Dart source code {#dart-editor-happiness} -1. Click **DART**, at the upper right of DartPad. +1. Click **Dart** at the upper right of DartPad. The view switches from HTML code to Dart code. 2. Change the Dart code to the following: - {% prettify dart tag=pre+code %} + ```dart import 'dart:html'; void main() { - querySelector('#RipVanWinkle').text = 'Wake up, sleepy head!'; + querySelector('#RipVanWinkle')!.text = 'Wake up, sleepy head!'; } - {% endprettify %} + ``` 3. Click **Run** to execute your code. -The text in the HTML OUTPUT tab changes to "Wake up, sleepy head!" +The text in the output pane changes to "Wake up, sleepy head!" ## About the Dart source code {#about-dart-code} @@ -235,64 +230,106 @@ Let's step through the Dart code. ### Importing libraries The import directive imports the specified library, -making all of the classes and functions +making all the classes and functions in that library available to your program. -<pre class="prettyprint lang-dart allow-scroll"> -<a href="#" class="dart-popover" data-toggle="popover" data-html="true" data-trigger="hover focus" data-content="Imports Dart's HTML classes and functions">import 'dart:html';</a> -</pre> +The following `import` statement imports Dart's HTML library, +which contains key classes and functions for programming the DOM: + +```dart +import 'dart:html'; +``` This program imports Dart's HTML library, which contains key classes and functions for programming the DOM. Key classes include: -| Dart class | Description | -|---|---| -| <a href="{{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-html/Node-class.html" target="_blank" rel="noopener">Node</a> | Implements a DOM node. | -| <a href="{{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-html/Element-class.html" target="_blank" rel="noopener">Element</a> | A subclass of Node; implements a web page element. | +| Dart class | Description | +|------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------| +| <a href="{{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-html/Node-class.html" target="_blank" rel="noopener">Node</a> | Implements a DOM node. | +| <a href="{{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-html/Element-class.html" target="_blank" rel="noopener">Element</a> | A subclass of Node; implements a web page element. | | <a href="{{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-html/Document-class.html" target="_blank" rel="noopener">Document</a> | Another subclass of Node; implements the document object. | {: .table} -The Dart core library contains another useful class: -<a href="{{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-core/List-class.html" target="_blank" rel="noopener">List,</a> +The `dart:core` library, which is automatically imported, +contains many other useful classes, such as: +[`List`]({{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-core/List-class.html){:target="_blank" rel="noopener"}, a parameterized class that can specify the type of its members. -An instance of Element keeps its list of child Elements -in a List\<Element>. +An instance of `Element` keeps its list of child Element objects +in a `List<Element>`. ### Using the querySelector() function -This app's main() function contains a single +This app's `main()` function contains a single line of code that is a little like a run-on sentence with multiple things happening one after another. Let's deconstruct it. -querySelector() is a top-level function provided by the Dart HTML library -that gets an Element object from the DOM. +`querySelector()` is a top-level function provided by the `dart:html` library +that gets an `Element` object from the DOM. -<pre class="prettyprint lang-dart allow-scroll"> -<a href="#" class="dart-popover" data-toggle="popover" data-html="true" data-trigger="hover focus" data-content="Returns the matching Element">querySelector('#RipVanWinkle')</a>.text = 'Wake up, sleepy head!'; -</pre> +{% prettify dart tag=pre+code %} +[!querySelector!]('#RipVanWinkle')!.text = 'Wake up, sleepy head!'; +{% endprettify %} -The argument to querySelector(), a string, -is a CSS selector that identifies the object. +The argument to `querySelector()` is a string +containing a CSS selector that identifies the object. Most commonly CSS selectors specify classes, identifiers, or attributes. We'll look at these in more detail later, when we add a CSS file to the mini app. In this case, RipVanWinkle is the unique ID for a paragraph element declared in the HTML file, -and #RipVanWinkle specifies that ID. - -<pre class="prettyprint lang-dart allow-scroll"> -querySelector(<a href="#" class="dart-popover" data-toggle="popover" data-html="true" data-trigger="hover focus" data-content="ID from HTML file">'#RipVanWinkle'</a>).text = 'Wake up, sleepy head!'; -</pre> +and `#RipVanWinkle` specifies that ID. Another useful function for getting elements from the DOM -is querySelectorAll(), -which returns multiple Element objects via -a list of elements—List<Element>—all +is `querySelectorAll()`, +which returns multiple `Element` objects via +a list of elements—`List<Element>`—all of which match the provided selector. +### Handling nullable elements + +Because DOM elements might be missing, +the `querySelector()` function returns a nullable result, +as indicated by the `?` in the function's return type (`Element?`). +A `null` return value means that +no element matches the specified CSS selector. + +To use the `text` property of a returned `Element?`, +the type must be promoted to `Element`. +Because we wrote the HTML and know that the element is always present, +we can use the +[null assertion operator](/null-safety/understanding-null-safety#null-assertion-operator) (`!`) +when referring to the element's properties: + +{% prettify dart tag=pre+code %} +querySelector('#RipVanWinkle')[!!!].text = 'Wake up, sleepy head!'; +{% endprettify %} + +If the element with the `#RipVanWinkle` ID +isn't guaranteed to be present in the DOM, +you can instead use the conditional member access operator (`?.`) +to set `text` only if the returned element is not `null`: + +{% prettify dart tag=pre+code %} +querySelector('#RipVanWinkle')[!?!].text = 'Wake up, sleepy head!'; +{% endprettify %} + +If you plan to access the element multiple times +and know its type, +another option is to +[typecast](/guides/language/language-tour#type-test-operators) +the queried element to the expected type: + +{% prettify dart tag=pre+code %} +final paragraph = querySelector('#RipVanWinkle') [!as ParagraphElement!]; +paragraph.text = 'Wake up, sleepy head!'; +{% endprettify %} + +To learn more about nullable types and null safety in general, +see [Sound null safety](/null-safety). + ### Setting the text of an Element In the DOM, the text of a page element is contained @@ -312,12 +349,12 @@ would be represented with a subtree of text nodes and other objects. In Dart, you can simply use the Element `text` property, -which has a getter -that walks the subtree of nodes for you and extracts their text. +which has a getter and setter +that walk the subtree of nodes for you and extract or set their text: -<pre class="prettyprint lang-dart allow-scroll"> -querySelector('#RipVanWinkle')<a href="#" class="dart-popover" data-toggle="popover" data-html="true" data-trigger="hover focus" data-content="Convenience API to the Element's text">.text</a> = 'Wake up, sleepy head!'; -</pre> +{% prettify dart tag=pre+code %} +querySelector('#RipVanWinkle')![!.text!] = 'Wake up, sleepy head!'; +{% endprettify %} However, if the text node has styles (and thus a subtree), getting text and then setting it immediately is likely @@ -325,17 +362,17 @@ to change the DOM, as a result of losing subtree information. Often, as with our RipVanWinkle example, this simplification has no adverse effects. -The assignment operator (=) sets the text -of the Element returned by the querySelector() function +The assignment operator (`=`) sets the text +of the `Element` returned by the `querySelector()` function to the string "Wake up, sleepy head!". -<pre class="prettyprint lang-dart allow-scroll"> -querySelector('#RipVanWinkle').text <a href="#" class="dart-popover" data-toggle="popover" data-html="true" data-trigger="hover focus" data-content="Dynamically changes the DOM">=</a> 'Wake up, sleepy head!'; -</pre> +{% prettify dart tag=pre+code %} +querySelector('#RipVanWinkle')!.text [!=!] 'Wake up, sleepy head!'; +{% endprettify %} This causes the browser to immediately re-render -the browser page containing this app, thus -dynamically displaying the text on the browser page. +the browser page containing this app, +thus dynamically displaying the text on the browser page. ## HTML and Dart connections {#connections} @@ -350,27 +387,24 @@ from a Dart app to a browser page. In DartPad, the only visible connection between the Dart code and the HTML code -is the RipVanWinkle ID. +is the `RipVanWinkle` ID. <img class="scale-img-max" src="/tutorials/web/images/dart-html-connect.png" alt="The RipVanWinkle ID is used by both Dart and HTML"> -To run your app outside of DartPad, you need to compile your Dart -code to JavaScript. [Use the **webdev build** command][build] +To run your app outside DartPad, +you need to compile your Dart code to JavaScript. +Use the [`webdev build`][build] command to compile your app to deployable JavaScript. Then you need to make another connection between the HTML and -generated JavaScript: you must add a \<script> tag to the HTML +generated JavaScript: +you must add a `<script>` tag to the HTML to tell the browser where to find the compiled Dart code. -{% comment %} -PENDING: We should include or link to instructions -on how to convert a DartPad app into one you can run in the browser. -{% endcomment %} - Here's the full HTML code for this app, assuming that the Dart code is in a file named `main.dart`: -```dart +```html <!DOCTYPE html> <html> @@ -394,26 +428,26 @@ Most HTML uses cascading style sheets (CSS) to define _styles_ that control the appearance of page elements. Let's customize the CSS for the mini app. -1. Click **CSS**. +1. Click **CSS** at the upper left of DartPad. The view switches from Dart code to the (non-existent) CSS code. 2. Add the following CSS code: - {% prettify none tag=pre+code %} + ```css #RipVanWinkle { font-size: 20px; - font-family: 'Open Sans', sans-serif; + font-family: 'Roboto', sans-serif; text-align: center; margin-top: 20px; background-color: SlateBlue; color: Yellow; } - {% endprettify %} + ``` -The display under HTML OUTPUT immediately changes +The display in the output pane immediately changes to reflect the new styles, which apply only to the page element -that has the ID RipVanWinkle. +that has the ID `RipVanWinkle`. ## About CSS selectors {#about-css-selectors} @@ -421,7 +455,7 @@ that has the ID RipVanWinkle. IDs, classes, and other information about elements are established in HTML. Your Dart code can use this information -to get elements using a CSS selector—a pattern +to get elements using a CSS selector—a pattern used to select matching elements in the DOM. CSS selectors allow the CSS, HTML, and Dart code to refer to the same objects. @@ -431,27 +465,27 @@ a class, or an attribute. Selectors can also be nested. CSS selectors are important in Dart programs -because you use them with querySelector() and querySelectorAll() +because you use them with `querySelector()` and `querySelectorAll()` to get matching elements from the DOM. -Most often Dart programs use ID selectors with querySelector() -and class selectors with querySelectorAll(). +Most often Dart programs use ID selectors with `querySelector()` +and class selectors with `querySelectorAll()`. Here are some examples of CSS selectors: -| Selector type | Example | Description | -|---|---| -| ID selector | #RipVanWinkle | Matches a single, unique element | -| HTML element | p | Matches all paragraphs | -| HTML element | h1 | Matches all level-one headers | -| Class | _.classname_ | Matches all items with the class _classname_ | -| Asterisk | * | Matches all elements | -| Attribute | input[type="button"] | Matches all button input elements | +| Selector type | Example | Description | +|---------------|----------------------------------|----------------------------------------------| +| ID selector | `#RipVanWinkle` | Matches a single, unique element | +| HTML element | `p` | Matches all paragraphs | +| HTML element | `h1` | Matches all level-one headers | +| Class | <code>.<em>classname</em></code> | Matches all items with the class _classname_ | +| Asterisk | `*` | Matches all elements | +| Attribute | `input[type="button"]` | Matches all button input elements | {: .table} {{site.alert.tip}} As you saw, the mini app used a CSS selector, - the ID `#RipVanWinkle`, + the ID `RipVanWinkle`, even when there was no CSS file. You do not need a CSS file for a Dart program. Nor do you need a CSS file to use CSS selectors. @@ -467,19 +501,19 @@ A CSS rule has two main parts: a selector and a set of declarations. <img class="scale-img-max" src="/tutorials/web/images/css-rule-explained.png" alt="The parts of a CSS rule"> -In the mini app, the selector #RipVanWinkle is an ID selector, -as signaled by the hash tag (#); +In the mini app, the selector `#RipVanWinkle` is an ID selector, +as signaled by the hashtag (`#`); it matches a single, unique element with the specified ID, -our now tired RipVanWinkle paragraph element. -RipVanWinkle is the ID in the HTML file. +our now tired `RipVanWinkle` paragraph element. +`RipVanWinkle` is the ID in the HTML file. It is referred to in the CSS file and in the Dart code -using a hash tag(#). -Classnames are specified in the HTML file without a period (.) -and referred to in the CSS file and in Dart code with a period (.). +using a hashtag(`#`). +Classnames are specified in the HTML file without a period (`.`) +and referred to in the CSS file and in Dart code with a period (`.`). Between the curly brackets of a CSS rule is a list of declarations, -each of which ends in a semi-colon (;). +each of which ends in a semi-colon (`;`). Each declaration specifies a property and its value. Together the set of declarations define the _style sheet_ for all matching elements. @@ -489,20 +523,18 @@ of the matching element(s) on the web page. <img class="scale-img-max" src="/tutorials/web/images/css-property-value.png" alt="A declaration specifies an attribute and its value"> -The CSS rule for the RipVanWinkle paragraph +The CSS rule for the `RipVanWinkle` paragraph specifies several properties; for example, it sets the text color to Yellow. ## Other resources -{% comment %} -PENDING: Link to WebStorm docs? DartPad docs? -{% endcomment %} - -* The <a href="/guides/language/language-tour">language tour</a> +* The [language tour](/guides/language/language-tour) provides thorough coverage of the Dart language. -* <a href="/tools">Dart tools page</a> +* The Dart [tools page](/tools) lists IDEs and editors that have Dart plugins. +* The [DartPad documentation](/tools/dartpad) + walks through the basics of using the DartPad web editor. ## What next? diff --git a/src/_tutorials/web/low-level-html/remove-elements.md b/src/_tutorials/web/low-level-html/remove-elements.md index 06c134f0f9..4c808410c7 100644 --- a/src/_tutorials/web/low-level-html/remove-elements.md +++ b/src/_tutorials/web/low-level-html/remove-elements.md @@ -1,25 +1,30 @@ --- title: Remove DOM elements -description: Remove a child element from the DOM. +description: Learn how to set up basic scaffolding of a Dart web app. +js: [{url: 'https://dartpad.dev/inject_embed.dart.js', defer: true}] prevpage: url: /tutorials/web/low-level-html/add-elements title: Add elements to the DOM --- -{% include not-null-safe.md %} - <div class="panel" markdown="1"> #### <a id="whats-the-point" class="anchor" href="#whats-the-point" aria-hidden="true"><span class="octicon octicon-link"></span></a>What's the point? -* Use _element_.remove() to remove an element from the DOM. -* Remove all children from an element with _element_.children.clear(). +* Use `element.remove()` to remove an element from the DOM. +* Remove all children from an element with `element.children.clear()`. * Function expressions are a convenient way to define single-use functions. -* => is a shorthand syntax for defining functions that contain just one expression. +* `=>` is a shorthand syntax for defining functions that contain just one expression. </div> + +{{site.alert.note}} + This page uses embedded DartPads to display runnable examples. + {% include dartpads-embedded-troubleshooting.md %} +{{site.alert.end}} + This tutorial shows you how to delete elements from the DOM. A new and improved version of the todo app from [the previous tutorial](add-elements) @@ -31,92 +36,128 @@ either one at a time, or all at once. Below is a revised version of the todo app from the previous tutorial that allows you to delete items. -Stop procrastinating and remove items from your to do list. - -{% comment %} -https://gist.github.com/Sfshaza/582b9a8d36786566ba08 ------------------------------------------------------------------- -main.dart: ------------------------------------------------------------------- - -// Copyright (c) 2012, the Dart project authors. -// Please see the AUTHORS file for details. -// All rights reserved. Use of this source code -// is governed by a BSD-style license that can be -// found in the LICENSE file. +**Try it!** +Click **Run** to start the web app. +Then type in the app's input field, and press the return key; +a new item appears in the list. +Enter a few more items. +Point the mouse cursor at one of the items in the list; +the item turns red and gets slightly larger. +Click it and it disappears from the list. +Use the **Delete All** button +to remove all the items in the list at once. +```dart:run-dartpad:mode-html:ga_id-try_the_app +{$ begin main.dart $} import 'dart:html'; -InputElement toDoInput; -UListElement toDoList; -ButtonElement deleteAll; +final InputElement toDoInput = querySelector('#to-do-input') as InputElement; +final UListElement toDoList = querySelector('#to-do-list') as UListElement; +final ButtonElement deleteAll = querySelector('#delete-all') as ButtonElement; void main() { - toDoInput = querySelector('#to-do-input'); - toDoList = querySelector('#to-do-list'); toDoInput.onChange.listen(addToDoItem); - deleteAll = querySelector('#delete-all'); - deleteAll.onClick.listen((e) => - toDoList.children.clear()); + deleteAll.onClick.listen((_) => toDoList.children.clear()); } void addToDoItem(Event e) { - var newToDo = new LIElement(); - newToDo.text = toDoInput.value; - newToDo.onClick.listen((e) => newToDo.remove()); + final newToDo = LIElement()..text = toDoInput.value; + newToDo.onClick.listen((_) => newToDo.remove()); toDoInput.value = ''; toDoList.children.add(newToDo); } -{% endcomment %} +{$ end main.dart $} +{$ begin index.html $} +<h2>Todo</h2> + +<div> + <input id="to-do-input" type="text" placeholder="What needs to be done?"> +</div> + +<div> + <ul id="to-do-list"> + </ul> +</div> -**Try it!** -Click **Run** to start the web app. -Then type in the app's input field, and press the return key; -a new item appears in the list. -Enter a few more items. -Point the mouse cursor at one of the items in the list; -the item turns red and gets slightly larger. -Click it and it disappears from the list. -Use the **Delete All** button -to remove all of the items in the list at once. +<button id="delete-all" type="button" style="float:right">Delete All</button> +{$ end index.html $} +{$ begin styles.css $} +body { + font-family: 'Roboto', sans-serif; + background-color: WhiteSmoke; + margin: 15px; + color: black; +} -{{site.alert.note}} - {% include dartpad-embedded-troubleshooting.md %} -{{site.alert.end}} +h2 { + color: black; +} + +#to-do-input { + font-family: 'Roboto', sans-serif; + font-size: 14px; + font-weight: normal; + padding: 5px 0px 5px 5px; + width: 100%; + border: 1px solid Silver; + background-color: White; +} -<iframe -src="{{site.dartpad-embed-html}}?id=582b9a8d36786566ba08&ga_id=try_the_app" - width="100%" - height="500px" - style="border: 1px solid #ccc;"> -</iframe> +#to-do-list { + padding: 0; + margin: 0; + list-style-position: inside; +} + +#to-do-list li { + padding: 5px 0px 5px 5px; + border-bottom: 1px dotted Silver; +} + +#to-do-list li:hover { + color: blue; + cursor: pointer; +} + +#delete-all { + margin-top: 8px; + background-color: #F8F8F8; + border: 1px dotted #ccc; + border-radius: 1em; + float: right; +} + +#delete-all:hover { + background-color: #ddd; +} +{$ end styles.css $} +``` The remaining sections describe key aspects of the code added to the todo app for this tutorial. Specifically, they look at the Dart code that removes one or more elements from the DOM -and the CSS code that makes the text red and larger. +and the CSS code that makes the text blue and larger. ## Changing the appearance when cursor is over an element -As you saw, an item in the list turns red and gets bigger +As you saw, an item in the list turns blue and gets bigger when the user points at it. The mouse cursor also changes shape. These visual clues are an important part of the user interface in this example because they are the only indication to the user that something will happen when the item is clicked. -This behavior is coded in the todo_with_delete app's CSS file with this rule: +This behavior is coded in the app's CSS file with this rule: -{% prettify dart tag=pre+code %} +```css #to-do-list li:hover { - color: red; - font-size: 18px; - cursor:pointer; + color: blue; + cursor: pointer; } -{% endprettify %} +``` We've used this CSS trick instead of providing a familiar user interface, @@ -128,25 +169,24 @@ to keep the code simpler. An element is removed from the DOM when it is removed from its parent's list of children. The -<a href="{{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-core/List-class.html" target="_blank" rel="noopener">List</a> -class provides functions for finding an item in the list +[`List`]({{site.dart_api}}/{{site.data.pkg-vers.SDK.channel}}/dart-core/List-class.html){:target="_blank" rel="noopener"}class provides functions for finding an item in the list and removing it. But, in this case, -using the element's remove() function +using the element's `remove()` function is shorter and more concise than -using functions from the List class. +using functions from the `List` class. <img class="scale-img-max" src="/tutorials/web/images/remove-element.png" alt="Use element.remove() to remove an element from the DOM"> -In the todo_with_delete app, +In the app, the user clicks an item to delete it. This is achieved with one line of Dart code. When a new to do item is created, the code registers a mouse click handler on the new element. When the user clicks that new element, its event handler causes the element to remove itself from the DOM -with remove(). +with `remove()`. <img class="scale-img-max" src="/tutorials/web/images/remove-element-code.png" alt="Registering an event handler to delete an item"> @@ -163,78 +203,72 @@ all elements are removed from the list. <img class="scale-img-max" src="/tutorials/web/images/remove-all-elements.png" alt="Use element.children.clear() to remove all of an element's children"> -In this case, using the List class's clear() function +In this case, using the `List` class's `clear()` function yields the most concise code. -Here's the code from the todo_with_delete app +Here's the code from the app that implements the **Delete All** button. -<ol> -<li markdown="1"> -The HTML code creates a button with the ID delete-all. -(The CSS styles it.) - -{% prettify dart tag=pre+code %} -<button id="delete-all" type="button" style="float:right"> Delete All </button> -{% endprettify %} +1. The HTML code creates a button with the ID `delete-all`. + (The CSS styles it.) -</li> + ```html + <button id="delete-all" type="button" style="float:right">Delete All</button> + ``` -<li markdown="1"> -The Dart code gets the button element from the DOM -using querySelector() and the button's ID, #delete-all. -The code registers a mouse click handler on the button; -the handler removes all of the child elements from the to do list. -Here is all of the Dart code related to the **Delete All** button. +2. The Dart code gets the button element from the DOM + using `querySelector()` and the button's ID, `delete-all`. + The code registers a mouse click handler on the button; + the handler removes all of the child elements from the to do list. + Here is all the Dart code related to the **Delete All** button. -<img class="scale-img-max" src="/tutorials/web/images/remove-all-code.png" - alt="Remove all child elements from an Element"> - -</li> -</ol> + <img class="scale-img-max" src="/tutorials/web/images/remove-all-code.png" + alt="Remove all child elements from an Element"> ## About function expressions and => -The todo_with_delete app uses +The app uses some interesting Dart syntax when adding an event listener to the **Delete All** button. -The argument passed into the listen() function +The argument passed into the `listen()` function is an example of a _function expression_, which is a shorthand way of defining functions -and it uses the => syntax to define the function concisely. +and it uses the `=>` syntax to define the function concisely. +For more details, +see the language tour's coverage of +[functions](/guides/language/language-tour#functions). <img class="scale-img-max" src="/tutorials/web/images/event-listener-exp.png" alt="A one-line function definition"> It is equivalent to writing this: -{% prettify dart tag=pre+code %} -deleteAll.onClick.listen((e) { +```dart +deleteAll.onClick.listen((_) { toDoList.children.clear(); }); -{% endprettify %} +``` or even this: -{% prettify dart tag=pre+code %} +```dart ... void main() { ... deleteAll.onClick.listen(deleteAllElements); } - void deleteAllElements(Event e) { toDoList.children.clear(); } ... -{% endprettify %} +``` Function expressions are often used when registering event handlers on an element and can extend over multiple lines. When registering event handlers, -the function must be an EventListener. +the function must be an `EventListener`. That is, -it returns no value and takes an Event object as a parameter. +it returns no value and takes an `Event` object as a parameter. ## What next?